Browse Source

Good optimisation for SQL, thanks to Alex Malinsky

Gi1dor (Ivan Arkhipov) 7 years ago
parent
commit
2d5b951e75
2 changed files with 14 additions and 19 deletions
  1. 12 17
      Database.cpp
  2. 2 2
      Database.h

+ 12 - 17
Database.cpp

@@ -25,7 +25,7 @@ namespace LOTRO_DAT {
 
     Database::~Database() {
         if (query_size_ != 0) {
-            ExecSql("END TRANSACTION", 0);
+            ExecSql("END_TRANSACTION");
         }
 
         if (db_ != nullptr) {
@@ -48,6 +48,11 @@ namespace LOTRO_DAT {
         ExecSql(CreateTextTableCommand_);
         ExecSql(CreateMetadataTableCommand_);
 
+        ExecSql("PRAGMA synchronous = OFF");
+        ExecSql("PRAGMA count_changes = OFF");
+        ExecSql("PRAGMA journal_mode = MEMORY");
+        ExecSql("PRAGMA temp_store = MEMORY");
+
         sqlite3_prepare_v2(db_, InsertBinaryCommand_, strlen(InsertBinaryCommand_), &insert_binary_, nullptr);
         sqlite3_prepare_v2(db_, InsertTextCommand_, strlen(InsertTextCommand_), &insert_text_, nullptr);
 
@@ -56,26 +61,17 @@ namespace LOTRO_DAT {
 
     }
 
-    void Database::ExecSql(const char *sql, bool to_query) {
-        if (query_size_ == 0)
-            sqlite3_exec(db_, "BEGIN_TRANSACTION", nullptr, nullptr, nullptr);
-
+    void Database::ExecSql(const char *sql) {
         char *error;
         if (sqlite3_exec(db_, sql, nullptr, nullptr, &error) != SQLITE_OK)
             throw DatException((std::string("Bad Database::ExecSql() - unable to perform request")
                                            + std::string(sql) + std::string(". Database returned message: ")
                                            + std::string(error)).c_str(), DATABASE_EXCEPTION);
-
-        query_size_ += to_query;
-        if (query_size_ >= QUERY_MAX_SIZE) {
-            sqlite3_exec(db_, "END_TRANSACTION", nullptr, nullptr, nullptr);
-            query_size_ = 0;
-        }
     }
 
     void Database::PushTextFile(long long file_id, long long gossip_id, char *text, char *args, int dat_id) {
         if (query_size_ == 0)
-            sqlite3_exec(db_, "BEGIN_TRANSACTION", nullptr, nullptr, nullptr);
+            ExecSql("BEGIN TRANSACTION");
 
         sqlite3_bind_int(insert_text_, 1, (int)file_id);
         sqlite3_bind_int(insert_text_, 2, (int)gossip_id);
@@ -92,7 +88,7 @@ namespace LOTRO_DAT {
 
         query_size_++;
         if (query_size_ >= QUERY_MAX_SIZE) {
-            sqlite3_exec(db_, "END_TRANSACTION", nullptr, nullptr, nullptr);
+            ExecSql("END TRANSACTION");
             query_size_ = 0;
         }
     }
@@ -101,9 +97,8 @@ namespace LOTRO_DAT {
 
     void Database::PushBinaryFile(long long file_id, const BinaryData &data) {
         if (query_size_ == 0)
-            sqlite3_exec(db_, "BEGIN_TRANSACTION", nullptr, nullptr, nullptr);
+            ExecSql("BEGIN TRANSACTION");
 
-        ///sqlite3_prepare_v2(db_, InsertBinaryCommand_, strlen(InsertBinaryCommand_), &insert_binary_, nullptr);
         sqlite3_bind_int(insert_binary_, 1, (int)file_id);
         sqlite3_bind_blob(insert_binary_, 2, data.data(), data.size(), SQLITE_TRANSIENT);
 
@@ -114,10 +109,10 @@ namespace LOTRO_DAT {
                     , DATABASE_EXCEPTION);
         }
         sqlite3_reset(insert_binary_);
-        //sqlite3_finalize(insert_binary_);
+
         query_size_++;
         if (query_size_ >= QUERY_MAX_SIZE) {
-            sqlite3_exec(db_, "END_TRANSACTION", nullptr, nullptr, nullptr);
+            ExecSql("END TRANSACTION");
             query_size_ = 0;
         }
     }

+ 2 - 2
Database.h

@@ -33,7 +33,7 @@ namespace LOTRO_DAT
         void AddMetadata();
 
     private:
-        void ExecSql(const char *sql, bool to_query = true);
+        void ExecSql(const char *sql);
 
         sqlite3* db_;
         sqlite3_stmt* insert_text_;
@@ -43,7 +43,7 @@ namespace LOTRO_DAT
         sqlite3_stmt* get_binary_;
 
         unsigned long long query_size_;
-        const unsigned long long QUERY_MAX_SIZE = 30000;
+        const unsigned long long QUERY_MAX_SIZE = 320000;
 
         const char* CreateBinaryTableCommand_ = "CREATE TABLE IF NOT EXISTS `binary_data` ( "
             "`file_id` INTEGER NOT NULL DEFAULT '0', "