Allow full circle rotation with 2degs step for plantlike drawtype.
[oweals/minetest.git] / src / rollback.cpp
index 4dc462af618f7b0ac455454c935a5188a4f22527..0af7aa4f7b980c890dcda383d4b804ed9002e8f0 100644 (file)
@@ -36,17 +36,17 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #define POINTS_PER_NODE (16.0)
 
-std::string dbp;
-sqlite3* dbh;
-sqlite3_stmt* dbs_insert;
-sqlite3_stmt* dbs_replace;
-sqlite3_stmt* dbs_select;
-sqlite3_stmt* dbs_select_range;
-sqlite3_stmt* dbs_select_withActor;
-sqlite3_stmt* dbs_knownActor_select;
-sqlite3_stmt* dbs_knownActor_insert;
-sqlite3_stmt* dbs_knownNode_select;
-sqlite3_stmt* dbs_knownNode_insert;
+static std::string dbp;
+static sqlite3* dbh                        = NULL;
+static sqlite3_stmt* dbs_insert            = NULL;
+static sqlite3_stmt* dbs_replace           = NULL;
+static sqlite3_stmt* dbs_select            = NULL;
+static sqlite3_stmt* dbs_select_range      = NULL;
+static sqlite3_stmt* dbs_select_withActor  = NULL;
+static sqlite3_stmt* dbs_knownActor_select = NULL;
+static sqlite3_stmt* dbs_knownActor_insert = NULL;
+static sqlite3_stmt* dbs_knownNode_select  = NULL;
+static sqlite3_stmt* dbs_knownNode_insert  = NULL;
 
 struct Stack {
        int node;
@@ -429,7 +429,7 @@ bool SQL_registerRow(ActionRow row)
        */
        sqlite3_reset(dbs_do);
 
-       int bind [20 + (((bool) row.id) ? 1 : 0)], ii = 0;
+       int bind [22], ii = 0;
        bool nodeMeta = false;
 
        bind[ii++] = sqlite3_bind_int(dbs_do, 1, row.actor);
@@ -1091,10 +1091,39 @@ public:
 
                SQL_databaseCheck();
        }
+#define FINALIZE_STATEMENT(statement)                                          \
+       if ( statement )                                                           \
+               rc = sqlite3_finalize(statement);                                      \
+       statement = NULL;                                                          \
+       if ( rc != SQLITE_OK )                                                     \
+               errorstream << "RollbackManager::~RollbackManager():"                  \
+                       << "Failed to finalize: " << #statement << ": rc=" << rc << std::endl;
 
        ~RollbackManager() {
                infostream << "RollbackManager::~RollbackManager()" << std::endl;
                flush();
+
+               int rc = SQLITE_OK;
+
+               FINALIZE_STATEMENT(dbs_insert)
+               FINALIZE_STATEMENT(dbs_replace)
+               FINALIZE_STATEMENT(dbs_select)
+               FINALIZE_STATEMENT(dbs_select_range)
+               FINALIZE_STATEMENT(dbs_select_withActor)
+               FINALIZE_STATEMENT(dbs_knownActor_select)
+               FINALIZE_STATEMENT(dbs_knownActor_insert)
+               FINALIZE_STATEMENT(dbs_knownNode_select)
+               FINALIZE_STATEMENT(dbs_knownNode_insert)
+
+               if(dbh)
+                       rc = sqlite3_close(dbh);
+
+               dbh = NULL;
+
+               if (rc != SQLITE_OK) {
+                       errorstream << "RollbackManager::~RollbackManager(): "
+                                       << "Failed to close database: rc=" << rc << std::endl;
+               }
        }
 
        void addAction(const RollbackAction &action) {