/* Minetest 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 the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #pragma once #include #include "irr_v3d.h" #include "rollback_interface.h" #include #include #include "sqlite3.h" class IGameDef; struct ActionRow; struct Entity; class RollbackManager : public IRollbackManager { public: 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(); bool 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); IGameDef *gamedef = nullptr; std::string current_actor; bool current_actor_is_guess = false; 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; };