From 7454deb1bf04ab3478b4e2dc6b2821ae86f4514f Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Wed, 25 Jul 2018 17:54:23 +0200 Subject: [PATCH] Allow an optional readonly base database (#7544) * Allow an optional readonly base database * Added basic documentation --- doc/world_format.txt | 11 +++++++++-- src/map.cpp | 14 +++++++++++++- src/map.h | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/doc/world_format.txt b/doc/world_format.txt index 976d14fd5..9b0a1ef07 100644 --- a/doc/world_format.txt +++ b/doc/world_format.txt @@ -98,8 +98,15 @@ See Player File Format below. world.mt --------- World metadata. -Example content (added indentation): - gameid = mesetint +Example content (added indentation and - explanations): + gameid = mesetint - name of the game + enable_damage = true - whether damage is enabled or not + creative_mode = false - whether creative mode is enabled or not + backend = sqlite3 - which DB backend to use for blocks (sqlite3, dummy, leveldb, redis, postgresql) + player_backend = sqlite3 - which DB backend to use for player data + readonly_backend = sqlite3 - optionally readonly seed DB (DB file _must_ be located in "readonly" subfolder) + server_announce = false - whether the server is publicly announced or not + load_mod_ = false - whether is to be loaded in this world Player File Format =================== diff --git a/src/map.cpp b/src/map.cpp index 801027ae2..0114867e0 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1159,7 +1159,10 @@ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, } std::string backend = conf.get("backend"); dbase = createDatabase(backend, savedir, conf); - + if (conf.exists("readonly_backend")) { + std::string readonly_dir = savedir + DIR_DELIM + "readonly"; + dbase_ro = createDatabase(conf.get("readonly_backend"), readonly_dir, conf); + } if (!conf.updateConfigFile(conf_path.c_str())) errorstream << "ServerMap::ServerMap(): Failed to update world.mt!" << std::endl; @@ -1230,6 +1233,8 @@ ServerMap::~ServerMap() Close database if it was opened */ delete dbase; + if (dbase_ro) + delete dbase_ro; #if 0 /* @@ -1869,6 +1874,8 @@ void ServerMap::listAllLoadableBlocks(std::vector &dst) << "all blocks that are stored in flat files." << std::endl; } dbase->listAllLoadableBlocks(dst); + if (dbase_ro) + dbase_ro->listAllLoadableBlocks(dst); } void ServerMap::listAllLoadedBlocks(std::vector &dst) @@ -2107,6 +2114,11 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos) dbase->loadBlock(blockpos, &ret); if (!ret.empty()) { loadBlock(&ret, blockpos, createSector(p2d), false); + } else if (dbase_ro) { + dbase_ro->loadBlock(blockpos, &ret); + if (!ret.empty()) { + loadBlock(&ret, blockpos, createSector(p2d), false); + } } else { // Not found in database, try the files diff --git a/src/map.h b/src/map.h index f5c7671ae..7e1624e60 100644 --- a/src/map.h +++ b/src/map.h @@ -469,6 +469,7 @@ private: */ bool m_map_metadata_changed = true; MapDatabase *dbase = nullptr; + MapDatabase *dbase_ro = nullptr; }; -- 2.25.1