X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Frollback.h;h=ff96e513f5453938cc4df0bcd4f73f3351801855;hb=refs%2Fheads%2Fmaster;hp=b5428c451426347678382cad0c8c76adc1c72c0b;hpb=0190f9b077dcb2b8cb41c622dd91ffc1e04dacac;p=dragonfireclient.git diff --git a/src/rollback.h b/src/rollback.h index b5428c451..ff96e513f 100644 --- a/src/rollback.h +++ b/src/rollback.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2012 celeron55, Perttu Ahola +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 @@ -17,35 +17,87 @@ 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 #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 void setActor(const std::string &actor) = 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 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); -IRollbackManager *createRollbackManager(const std::string &filepath, IGameDef *gamedef); -#endif + 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; +};