Skip to content

Commit

Permalink
Merge commit '708337d'
Browse files Browse the repository at this point in the history
Conflicts:
	src/database-dummy.cpp
	src/database-dummy.h
	src/database-leveldb.cpp
	src/database-leveldb.h
	src/database-redis.cpp
	src/database-sqlite3.cpp
	src/database-sqlite3.h
	src/database.h
	src/main.cpp
	src/map.cpp
	src/map.h
  • Loading branch information
proller committed Mar 7, 2015
2 parents 9145892 + 708337d commit d2eecb5
Show file tree
Hide file tree
Showing 17 changed files with 408 additions and 572 deletions.
60 changes: 24 additions & 36 deletions src/client.cpp
Expand Up @@ -49,10 +49,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "config.h"
#include "version.h"
#include "drawscene.h"
#include "subgame.h"
#include "server.h"
#include "database.h"
#include "database-sqlite3.h"
#include "serialization.h"

extern gui::IGUIEnvironment* guienv;

Expand Down Expand Up @@ -268,16 +266,13 @@ Client::Client(
m_time_of_day_update_timer(0),
m_recommended_send_interval(0.1),
m_removed_sounds_check_timer(0),
m_state(LC_Created)
m_state(LC_Created),
m_localdb(NULL)
{
/*
Add local player
*/
{
Player *player = new LocalPlayer(this, playername);
// Add local player
m_env.addPlayer(new LocalPlayer(this, playername));

m_env.addPlayer(player);
}
m_cache_save_interval = g_settings->getU16("server_map_save_interval");

m_cache_smooth_lighting = g_settings->getBool("smooth_lighting");
m_cache_enable_shaders = g_settings->getBool("enable_shaders");
Expand All @@ -287,10 +282,10 @@ void Client::Stop()
{
//request all client managed threads to stop
m_mesh_update_thread.Stop();
if (localdb != NULL) {
actionstream << "Local map saving ended" << std::endl;
localdb->endSave();
delete localserver;
// Save local server map
if (m_localdb) {
infostream << "Local map saving ended." << std::endl;
m_localdb->endSave();
}
}

Expand Down Expand Up @@ -681,6 +676,13 @@ void Client::step(float dtime)
Send(pkt);
}
}

// Write server map
if (m_localdb && m_localdb_save_interval.step(dtime,
m_cache_save_interval)) {
m_localdb->endSave();
m_localdb->beginSave();
}
}

bool Client::loadMedia(const std::string &data, const std::string &filename)
Expand Down Expand Up @@ -815,34 +817,19 @@ void Client::initLocalMapSaving(const Address &address,
const std::string &hostname,
bool is_local_server)
{
localdb = NULL;

if (!g_settings->getBool("enable_local_map_saving") || is_local_server)
if (!g_settings->getBool("enable_local_map_saving") || is_local_server) {
return;
}

const std::string world_path = porting::path_user
+ DIR_DELIM + "worlds"
+ DIR_DELIM + "server_"
+ hostname + "_" + to_string(address.getPort());

SubgameSpec gamespec;

if (!getWorldExists(world_path)) {
gamespec = findSubgame(g_settings->get("default_game"));
if (!gamespec.isValid())
gamespec = findSubgame("minimal");
} else {
gamespec = findWorldSubgame(world_path);
}

if (!gamespec.isValid()) {
errorstream << "Couldn't find subgame for local map saving." << std::endl;
return;
}
fs::CreateAllDirs(world_path);

localserver = new Server(world_path, gamespec, false, false);
localdb = new Database_SQLite3(&(ServerMap&)localserver->getMap(), world_path);
localdb->beginSave();
m_localdb = new Database_SQLite3(world_path);
m_localdb->beginSave();
actionstream << "Local map saving started, map will be saved at '" << world_path << "'" << std::endl;
}

Expand Down Expand Up @@ -1665,7 +1652,8 @@ void Client::makeScreenshot(IrrlichtDevice *device)
if (image) {
raw_image->copyTo(image);
irr::c8 filename[256];
snprintf(filename, sizeof(filename), "%s" DIR_DELIM "screenshot_%u.png",
snprintf(filename, sizeof(filename),
(std::string("%s") + DIR_DELIM + "screenshot_%u.png").c_str(),
g_settings->get("screenshot_path").c_str(),
device->getTimer()->getRealTime());
std::ostringstream sstr;
Expand Down
6 changes: 4 additions & 2 deletions src/client.h
Expand Up @@ -622,8 +622,10 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
LocalClientState m_state;

// Used for saving server map to disk client-side
Database *localdb;
Server *localserver;
Database *m_localdb;
IntervalLimiter m_localdb_save_interval;
u16 m_cache_save_interval;
Server *m_localserver;

// TODO: Add callback to update these when g_settings changes
bool m_cache_smooth_lighting;
Expand Down
48 changes: 10 additions & 38 deletions src/database-dummy.cpp
Expand Up @@ -21,63 +21,35 @@ along with Freeminer. If not, see <http://www.gnu.org/licenses/>.
*/

/*
Dummy "database" class
Dummy database class
*/


#include "database-dummy.h"

#include "map.h"
#include "mapblock.h"
#include "serialization.h"
#include "main.h"
#include "settings.h"
#include "log.h"

Database_Dummy::Database_Dummy(ServerMap *map)
{
srvmap = map;
}

int Database_Dummy::Initialized(void)
bool Database_Dummy::saveBlock(const v3s16 &pos, const std::string &data)
{
return 1;
}

void Database_Dummy::beginSave() {}
void Database_Dummy::endSave() {}

bool Database_Dummy::saveBlock(v3s16 blockpos, std::string &data)
{
m_database.set(getBlockAsString(blockpos), data);
m_database.set(getBlockAsString(pos), data);
return true;
}

std::string Database_Dummy::loadBlock(v3s16 blockpos)
std::string Database_Dummy::loadBlock(const v3s16 &pos)
{
if (m_database.count(getBlockAsString(blockpos)))
return m_database.get(getBlockAsString(blockpos));
if (m_database.count(getBlockAsString(pos)))
return m_database.get(getBlockAsString(pos));
else
return "";
}

bool Database_Dummy::deleteBlock(v3s16 blockpos)
bool Database_Dummy::deleteBlock(const v3s16 &pos)
{
m_database.erase(getBlockAsString(blockpos));
m_database.erase(getBlockAsString(pos));
return true;
}

void Database_Dummy::listAllLoadableBlocks(std::vector<v3s16> &dst)
{
for(auto &x : m_database)
{
v3s16 p = getStringAsBlock(x.first);
//dstream<<"block_i="<<block_i<<" p="<<PP(p)<<std::endl;
dst.push_back(p);
for(auto &x : m_database) {
dst.push_back(getStringAsBlock(x.first));
}
}

Database_Dummy::~Database_Dummy()
{
m_database.clear();
}
17 changes: 6 additions & 11 deletions src/database-dummy.h
Expand Up @@ -29,22 +29,17 @@ along with Freeminer. If not, see <http://www.gnu.org/licenses/>.
#include "irrlichttypes.h"
#include "util/lock.h"

class ServerMap;

class Database_Dummy : public Database
{
public:
Database_Dummy(ServerMap *map);
virtual void beginSave();
virtual void endSave();
virtual bool saveBlock(v3s16 blockpos, std::string &data);
virtual std::string loadBlock(v3s16 blockpos);
virtual bool deleteBlock(v3s16 blockpos);
virtual bool saveBlock(const v3s16 &pos, const std::string &data);
virtual std::string loadBlock(const v3s16 &pos);
virtual bool deleteBlock(const v3s16 &pos);
virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
virtual int Initialized(void);
~Database_Dummy();

private:
ServerMap *srvmap;
shared_map<std::string, std::string> m_database;
};

#endif

52 changes: 23 additions & 29 deletions src/database-leveldb.cpp
Expand Up @@ -25,66 +25,63 @@ along with Freeminer. If not, see <http://www.gnu.org/licenses/>.
#if USE_LEVELDB

#include "database-leveldb.h"
#include "map.h"
#include "mapblock.h"
#include "serialization.h"
#include "main.h"
#include "settings.h"
#include "log_types.h"
#include "filesys.h"
#include "exceptions.h"
#include "util/string.h"

#include "leveldb/db.h"


#define ENSURE_STATUS_OK(s) \
if (!(s).ok()) { \
throw FileNotGoodException(std::string("LevelDB error: ") + (s).ToString()); \
throw FileNotGoodException(std::string("LevelDB error: ") + \
(s).ToString()); \
}

Database_LevelDB::Database_LevelDB(ServerMap *map, std::string savedir)

Database_LevelDB::Database_LevelDB(const std::string &savedir)
{
m_database = new KeyValueStorage(savedir, "map");
//srvmap = map;
}

int Database_LevelDB::Initialized(void)
Database_LevelDB::~Database_LevelDB()
{
return 1;
delete m_database;
}

void Database_LevelDB::beginSave() {}
void Database_LevelDB::endSave() {}

bool Database_LevelDB::saveBlock(v3POS blockpos, std::string &data)
bool Database_LevelDB::saveBlock(const v3s16 &pos, const std::string &data)
{
if (!m_database->put(getBlockAsString(blockpos), data)) {
if (!m_database->put(getBlockAsString(pos), data)) {
errorstream << "WARNING: saveBlock: LevelDB error saving block "
<< blockpos <<": "<< m_database->get_error() << std::endl;
<< pos <<": "<< m_database->get_error() << std::endl;
return false;
}
m_database->del(i64tos(getBlockAsInteger(blockpos))); // delete old format
m_database->del(i64tos(getBlockAsInteger(pos))); // delete old format

return true;
}

std::string Database_LevelDB::loadBlock(v3POS blockpos)
std::string Database_LevelDB::loadBlock(const v3s16 &pos)
{
std::string datastr;

m_database->get(getBlockAsString(blockpos), datastr);
m_database->get(getBlockAsString(pos), datastr);
if (datastr.length())
return datastr;

m_database->get(i64tos(getBlockAsInteger(blockpos)), datastr);
m_database->get(i64tos(getBlockAsInteger(pos)), datastr);

return datastr;

}

bool Database_LevelDB::deleteBlock(v3s16 blockpos)
bool Database_LevelDB::deleteBlock(const v3s16 &pos)
{
auto ok = m_database->del(
(getBlockAsString(blockpos)));
auto ok = m_database->del(getBlockAsString(pos));
if (ok) {
errorstream << "WARNING: deleteBlock: LevelDB error deleting block "
<< (blockpos) << std::endl;
<< (pos) << ": "<< m_database->get_error() << std::endl;
return false;
}

Expand All @@ -103,8 +100,5 @@ void Database_LevelDB::listAllLoadableBlocks(std::vector<v3s16> &dst)
#endif
}

Database_LevelDB::~Database_LevelDB()
{
delete m_database;
}
#endif
#endif // USE_LEVELDB

24 changes: 11 additions & 13 deletions src/database-leveldb.h
Expand Up @@ -31,28 +31,26 @@ along with Freeminer. If not, see <http://www.gnu.org/licenses/>.
#include "key_value_storage.h"
#include <string>

class ServerMap;

class Database_LevelDB : public Database
{
public:
Database_LevelDB(ServerMap *map, std::string savedir);
virtual void beginSave();
virtual void endSave();
virtual bool saveBlock(v3s16 blockpos, std::string &data);
virtual std::string loadBlock(v3s16 blockpos);
virtual bool deleteBlock(v3s16 blockpos);
virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
virtual int Initialized(void);
Database_LevelDB(const std::string &savedir);
~Database_LevelDB();

virtual void open() { m_database->open(); };
virtual void close() { m_database->close(); };

virtual bool saveBlock(const v3s16 &pos, const std::string &data);
virtual std::string loadBlock(const v3s16 &pos);
virtual bool deleteBlock(const v3s16 &pos);
virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);

private:
//ServerMap *srvmap;
//leveldb::DB *m_database;
KeyValueStorage *m_database;
//leveldb::DB* m_database;
};

#endif // USE_LEVELDB

#endif
#endif

0 comments on commit d2eecb5

Please sign in to comment.