Allow an optional readonly base database (#7544)

* Allow an optional readonly base database

* Added basic documentation
This commit is contained in:
lhofhansl 2018-07-25 17:54:23 +02:00 committed by GitHub
parent 9537cfd3f8
commit 7454deb1bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 3 deletions

@ -98,8 +98,15 @@ See Player File Format below.
world.mt world.mt
--------- ---------
World metadata. World metadata.
Example content (added indentation): Example content (added indentation and - explanations):
gameid = mesetint 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 Player File Format
=================== ===================

@ -1159,7 +1159,10 @@ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef,
} }
std::string backend = conf.get("backend"); std::string backend = conf.get("backend");
dbase = createDatabase(backend, savedir, conf); 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())) if (!conf.updateConfigFile(conf_path.c_str()))
errorstream << "ServerMap::ServerMap(): Failed to update world.mt!" << std::endl; errorstream << "ServerMap::ServerMap(): Failed to update world.mt!" << std::endl;
@ -1230,6 +1233,8 @@ ServerMap::~ServerMap()
Close database if it was opened Close database if it was opened
*/ */
delete dbase; delete dbase;
if (dbase_ro)
delete dbase_ro;
#if 0 #if 0
/* /*
@ -1869,6 +1874,8 @@ void ServerMap::listAllLoadableBlocks(std::vector<v3s16> &dst)
<< "all blocks that are stored in flat files." << std::endl; << "all blocks that are stored in flat files." << std::endl;
} }
dbase->listAllLoadableBlocks(dst); dbase->listAllLoadableBlocks(dst);
if (dbase_ro)
dbase_ro->listAllLoadableBlocks(dst);
} }
void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst) void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
@ -2107,6 +2114,11 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos)
dbase->loadBlock(blockpos, &ret); dbase->loadBlock(blockpos, &ret);
if (!ret.empty()) { if (!ret.empty()) {
loadBlock(&ret, blockpos, createSector(p2d), false); 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 { } else {
// Not found in database, try the files // Not found in database, try the files

@ -469,6 +469,7 @@ private:
*/ */
bool m_map_metadata_changed = true; bool m_map_metadata_changed = true;
MapDatabase *dbase = nullptr; MapDatabase *dbase = nullptr;
MapDatabase *dbase_ro = nullptr;
}; };