Fix rollback.txt migration
authorShadowNinja <shadowninja@minetest.net>
Fri, 12 Feb 2016 23:39:03 +0000 (18:39 -0500)
committerShadowNinja <shadowninja@minetest.net>
Mon, 23 May 2016 15:48:30 +0000 (11:48 -0400)
Broken by b1965ac20922e3722392114bd63a22b403dcbe98.
This also prepares the begin and commit statements only once.

src/rollback.cpp
src/rollback.h

index 2367c3a210427a96674346d0425366e57d4a2d06..ac4324cabd25efd4ff9e858b9723effbbe9e9eca 100644 (file)
@@ -93,10 +93,10 @@ RollbackManager::RollbackManager(const std::string & world_path,
        std::string migrating_flag = txt_filename + ".migrating";
        database_path = world_path + DIR_DELIM "rollback.sqlite";
 
-       initDatabase();
+       bool created = initDatabase();
 
-       if (fs::PathExists(txt_filename) && (fs::PathExists(migrating_flag) ||
-                       !fs::PathExists(database_path))) {
+       if (fs::PathExists(txt_filename) && (created ||
+                       fs::PathExists(migrating_flag))) {
                std::ofstream of(migrating_flag.c_str());
                of.close();
                migrate(txt_filename);
@@ -250,15 +250,15 @@ bool RollbackManager::createTables()
 }
 
 
-void RollbackManager::initDatabase()
+bool RollbackManager::initDatabase()
 {
        verbosestream << "RollbackManager: Database connection setup" << std::endl;
 
-       bool needsCreate = !fs::PathExists(database_path);
+       bool needs_create = !fs::PathExists(database_path);
        SQLOK(sqlite3_open_v2(database_path.c_str(), &db,
                        SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL));
 
-       if (needsCreate) {
+       if (needs_create) {
                createTables();
        }
 
@@ -374,6 +374,8 @@ void RollbackManager::initDatabase()
                );
        }
        SQLOK(sqlite3_reset(stmt_knownNode_select));
+
+       return needs_create;
 }
 
 
@@ -672,23 +674,27 @@ void RollbackManager::migrate(const std::string & file_path)
 
        std::streampos file_size = fh.tellg();
 
-       if (file_size > 10) {
+       if (file_size < 10) {
                errorstream << "Empty rollback log." << std::endl;
                return;
        }
 
        fh.seekg(0);
 
+       sqlite3_stmt *stmt_begin;
+       sqlite3_stmt *stmt_commit;
+       SQLOK(sqlite3_prepare_v2(db, "BEGIN", -1, &stmt_begin, NULL));
+       SQLOK(sqlite3_prepare_v2(db, "COMMIT", -1, &stmt_commit, NULL));
+
        std::string bit;
        int i = 0;
-       int id = 1;
        time_t start = time(0);
        time_t t = start;
-       sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
+       SQLRES(sqlite3_step(stmt_begin), SQLITE_DONE);
+       sqlite3_reset(stmt_begin);
        do {
                ActionRow row;
-
-               row.id = id;
+               row.id = 0;
 
                // Get the timestamp
                std::getline(fh, bit, ' ');
@@ -758,17 +764,24 @@ void RollbackManager::migrate(const std::string & file_path)
                ++i;
 
                if (time(0) - t >= 1) {
-                       sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
+                       SQLRES(sqlite3_step(stmt_commit), SQLITE_DONE);
+                       sqlite3_reset(stmt_commit);
                        t = time(0);
                        std::cout
                                << " Done: " << static_cast<int>((static_cast<float>(fh.tellg()) / static_cast<float>(file_size)) * 100) << "%"
                                << " Speed: " << i / (t - start) << "/second     \r" << std::flush;
-                       sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
+                       SQLRES(sqlite3_step(stmt_begin), SQLITE_DONE);
+                       sqlite3_reset(stmt_begin);
                }
        } while (fh.good());
+       SQLRES(sqlite3_step(stmt_commit), SQLITE_DONE);
+       sqlite3_reset(stmt_commit);
+
+       SQLOK(sqlite3_finalize(stmt_begin));
+       SQLOK(sqlite3_finalize(stmt_commit));
 
        std::cout
-               << " Done: 100%                                   " << std::endl
+               << " Done: 100%                                  " << std::endl
                << "Now you can delete the old rollback.txt file." << std::endl;
 }
 
index c57e38ab0bbc7330c1b78dd0cbb07a1c7726801a..a05ef8b78c80647681c8b9d3325d402963ed2e40 100644 (file)
@@ -61,7 +61,7 @@ private:
        const char * getActorName(const int id);
        const char * getNodeName(const int id);
        bool createTables();
-       void initDatabase();
+       bool initDatabase();
        bool registerRow(const ActionRow & row);
        const std::list<ActionRow> actionRowsFromSelect(sqlite3_stmt * stmt);
        ActionRow actionRowFromRollbackAction(const RollbackAction & action);