X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Frollback.h;h=c57e38ab0bbc7330c1b78dd0cbb07a1c7726801a;hb=ba15c98e4d5d7f4bc515e351d6af1a084d46092e;hp=8da03b5885404d057736d55c2be137bd9c52a4a6;hpb=497ff1ecd64c8908f988e15ca879824f2781e3fd;p=oweals%2Fminetest.git diff --git a/src/rollback.h b/src/rollback.h index 8da03b588..c57e38ab0 100644 --- a/src/rollback.h +++ b/src/rollback.h @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2012 celeron55, Perttu Ahola +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -24,31 +24,84 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irr_v3d.h" #include "rollback_interface.h" #include +#include +#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 - // in history - virtual std::string getLastNodeActor(v3s16 p, int range, int seconds, - v3s16 *act_p, int *act_seconds) = 0; - // Get actions to revert of history made by - virtual std::list 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 getEntriesSince(time_t first_time); + std::list getNodeActors(v3s16 pos, int range, + time_t seconds, int limit); + std::list 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(); + void initDatabase(); + bool registerRow(const ActionRow & row); + const std::list actionRowsFromSelect(sqlite3_stmt * stmt); + ActionRow actionRowFromRollbackAction(const RollbackAction & action); + const std::list rollbackActionsFromActionRows( + const std::list & rows); + const std::list getRowsSince(time_t firstTime, + const std::string & actor); + const std::list getRowsSince_range(time_t firstTime, v3s16 p, + int range, int limit); + const std::list getActionsSince_range(time_t firstTime, v3s16 p, + int range, int limit); + const std::list 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); + IGameDef * gamedef; + + std::string current_actor; + bool current_actor_is_guess; + + std::list action_todisk_buffer; + std::list 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 knownActors; + std::vector knownNodes; +}; #endif