Allow an optional readonly base database (#7544)
authorlhofhansl <lhofhansl@yahoo.com>
Wed, 25 Jul 2018 15:54:23 +0000 (17:54 +0200)
committerGitHub <noreply@github.com>
Wed, 25 Jul 2018 15:54:23 +0000 (17:54 +0200)
* Allow an optional readonly base database

* Added basic documentation

doc/world_format.txt
src/map.cpp
src/map.h

index 976d14fd5f0e8ec16b473220dcef614968c29a50..9b0a1ef07a21abbac5f8b24ed462350809e33626 100644 (file)
@@ -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_<mod> = false        - whether <mod> is to be loaded in this world
 
 Player File Format
 ===================
index 801027ae2e6a2f9df84e15eb1ff51899e47e0fa8..0114867e09e23478748f53e6da3cda0d69cbc7cf 100644 (file)
@@ -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<v3s16> &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<v3s16> &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
 
index f5c7671aee5c2eced040e31674e97b7744e28a84..7e1624e607581bbec48a88f5d565d763bf2f82f0 100644 (file)
--- 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;
 };