CSM: Fix crashing minetest.get_item_def()
[oweals/minetest.git] / src / rollback.h
index 46a76f5830e5233f418c922d52681d1ca78555a1..1d9949d1520676094d5c548dc0a9dc3de8ee5f26 100644 (file)
@@ -17,38 +17,88 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef ROLLBACK_HEADER
-#define ROLLBACK_HEADER
+#pragma once
 
 #include <string>
 #include "irr_v3d.h"
 #include "rollback_interface.h"
 #include <list>
+#include <vector>
+#include "sqlite3.h"
 
 class IGameDef;
 
-class IRollbackManager: public IRollbackReportSink
+struct ActionRow;
+struct Entity;
+
+class RollbackManager: public IRollbackManager
 {
 public:
-       // IRollbackReportManager
-       virtual void reportAction(const RollbackAction &action) = 0;
-       virtual std::string getActor() = 0;
-       virtual bool isActorGuess() = 0;
-       virtual void setActor(const std::string &actor, bool is_guess) = 0;
-       virtual std::string getSuspect(v3s16 p, float nearness_shortcut,
-                       float min_nearness) = 0;
-
-       virtual ~IRollbackManager(){}
-       virtual void flush() = 0;
-       // Get last actor that did something to position p, but not further than
-       // <seconds> in history
-       virtual std::string getLastNodeActor(v3s16 p, int range, int seconds,
-                       v3s16 *act_p, int *act_seconds) = 0;
-       // Get actions to revert <seconds> of history made by <actor>
-       virtual std::list<RollbackAction> getRevertActions(const std::string &actor,
-                       int seconds) = 0;
-};
+       RollbackManager(const std::string & world_path, IGameDef * gamedef);
+       ~RollbackManager();
+
+       void reportAction(const RollbackAction & action_);
+       std::string getActor();
+       bool isActorGuess();
+       void setActor(const std::string & actor, bool is_guess);
+       std::string getSuspect(v3s16 p, float nearness_shortcut,
+                       float min_nearness);
+       void flush();
+
+       void addAction(const RollbackAction & action);
+       std::list<RollbackAction> getEntriesSince(time_t first_time);
+       std::list<RollbackAction> getNodeActors(v3s16 pos, int range,
+                       time_t seconds, int limit);
+       std::list<RollbackAction> getRevertActions(
+                       const std::string & actor_filter, time_t seconds);
+
+private:
+       void registerNewActor(const int id, const std::string & name);
+       void registerNewNode(const int id, const std::string & name);
+       int getActorId(const std::string & name);
+       int getNodeId(const std::string & name);
+       const char * getActorName(const int id);
+       const char * getNodeName(const int id);
+       bool createTables();
+       bool initDatabase();
+       bool registerRow(const ActionRow & row);
+       const std::list<ActionRow> actionRowsFromSelect(sqlite3_stmt * stmt);
+       ActionRow actionRowFromRollbackAction(const RollbackAction & action);
+       const std::list<RollbackAction> rollbackActionsFromActionRows(
+                       const std::list<ActionRow> & rows);
+       const std::list<ActionRow> getRowsSince(time_t firstTime,
+                       const std::string & actor);
+       const std::list<ActionRow> getRowsSince_range(time_t firstTime, v3s16 p,
+                       int range, int limit);
+       const std::list<RollbackAction> getActionsSince_range(time_t firstTime, v3s16 p,
+                       int range, int limit);
+       const std::list<RollbackAction> getActionsSince(time_t firstTime,
+                       const std::string & actor = "");
+       void migrate(const std::string & filepath);
+       static float getSuspectNearness(bool is_guess, v3s16 suspect_p,
+               time_t suspect_t, v3s16 action_p, time_t action_t);
 
-IRollbackManager *createRollbackManager(const std::string &filepath, IGameDef *gamedef);
 
-#endif
+       IGameDef *gamedef = nullptr;
+
+       std::string current_actor;
+       bool current_actor_is_guess = false;
+
+       std::list<RollbackAction> action_todisk_buffer;
+       std::list<RollbackAction> action_latest_buffer;
+
+       std::string database_path;
+       sqlite3 * db;
+       sqlite3_stmt * stmt_insert;
+       sqlite3_stmt * stmt_replace;
+       sqlite3_stmt * stmt_select;
+       sqlite3_stmt * stmt_select_range;
+       sqlite3_stmt * stmt_select_withActor;
+       sqlite3_stmt * stmt_knownActor_select;
+       sqlite3_stmt * stmt_knownActor_insert;
+       sqlite3_stmt * stmt_knownNode_select;
+       sqlite3_stmt * stmt_knownNode_insert;
+
+       std::vector<Entity> knownActors;
+       std::vector<Entity> knownNodes;
+};