Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add dummy and LevelDB database backends
  • Loading branch information
Ilya Zhuravlev authored and sfan5 committed Sep 9, 2013
1 parent 71a8769 commit 58841ef
Show file tree
Hide file tree
Showing 148 changed files with 26,766 additions and 242 deletions.
26 changes: 26 additions & 0 deletions src/CMakeLists.txt
Expand Up @@ -174,6 +174,9 @@ find_package(Sqlite3 REQUIRED)
find_package(Json REQUIRED)
find_package(OpenGLES2)

SET(LEVELDB_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/leveldb/include)
SET(LEVELDB_LIBRARY leveldb)

if(USE_FREETYPE)
find_package(Freetype REQUIRED)
set(CGUITTFONT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cguittfont")
Expand Down Expand Up @@ -201,6 +204,16 @@ endif(LUA_LIBRARY AND LUA_INCLUDE_DIR)
mark_as_advanced(LUA_LIBRARY)
mark_as_advanced(LUA_INCLUDE_DIR)

set(USE_LEVELDB 0)

OPTION(ENABLE_LEVELDB "Enable LevelDB backend")

if(ENABLE_LEVELDB)
set(USE_LEVELDB 1)
message(STATUS "LevelDB backend enabled")
include_directories(${LEVELDB_INCLUDE_DIR})
endif(ENABLE_LEVELDB)

configure_file(
"${PROJECT_SOURCE_DIR}/cmake_config.h.in"
"${PROJECT_BINARY_DIR}/cmake_config.h"
Expand Down Expand Up @@ -261,6 +274,10 @@ set(common_SRCS
mapblock.cpp
mapsector.cpp
map.cpp
database.cpp
database-dummy.cpp
database-leveldb.cpp
database-sqlite3.cpp
player.cpp
test.cpp
sha1.cpp
Expand Down Expand Up @@ -414,6 +431,9 @@ if(BUILD_CLIENT)
${CGUITTFONT_LIBRARY}
)
endif(USE_FREETYPE)
if (USE_LEVELDB)
target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
endif(USE_LEVELDB)
endif(BUILD_CLIENT)

if(BUILD_SERVER)
Expand All @@ -428,6 +448,9 @@ if(BUILD_SERVER)
${LUA_LIBRARY}
${PLATFORM_LIBS}
)
if (USE_LEVELDB)
target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
endif(USE_LEVELDB)
if(USE_CURL)
target_link_libraries(
${PROJECT_NAME}server
Expand Down Expand Up @@ -612,4 +635,7 @@ else (JSON_FOUND)
add_subdirectory(json)
endif (JSON_FOUND)

if (USE_LEVELDB)
add_subdirectory(leveldb)
endif (USE_LEVELDB)
#end
1 change: 1 addition & 0 deletions src/cmake_config.h.in
Expand Up @@ -11,6 +11,7 @@
#define CMAKE_USE_SOUND @USE_SOUND@
#define CMAKE_USE_FREETYPE @USE_FREETYPE@
#define CMAKE_STATIC_SHAREDIR "@SHAREDIR@"
#define CMAKE_USE_LEVELDB @USE_LEVELDB@

#ifdef NDEBUG
#define CMAKE_BUILD_TYPE "Release"
Expand Down
3 changes: 3 additions & 0 deletions src/config.h
Expand Up @@ -15,6 +15,7 @@
#define USE_FREETYPE 0
#define STATIC_SHAREDIR ""
#define BUILD_INFO "non-cmake"
#define USE_LEVELDB 0

#ifdef USE_CMAKE_CONFIG_H
#include "cmake_config.h"
Expand All @@ -36,6 +37,8 @@
#define STATIC_SHAREDIR CMAKE_STATIC_SHAREDIR
#undef BUILD_INFO
#define BUILD_INFO CMAKE_BUILD_INFO
#undef USE_LEVELDB
#define USE_LEVELDB CMAKE_USE_LEVELDB
#endif

#endif
Expand Down
155 changes: 155 additions & 0 deletions src/database-dummy.cpp
@@ -0,0 +1,155 @@
/*
Dummy "database" class
*/


#include "map.h"
#include "mapsector.h"
#include "mapblock.h"
#include "main.h"
#include "filesys.h"
#include "voxel.h"
#include "porting.h"
#include "mapgen.h"
#include "nodemetadata.h"
#include "settings.h"
#include "log.h"
#include "profiler.h"
#include "nodedef.h"
#include "gamedef.h"
#include "util/directiontables.h"
#include "rollback_interface.h"

#include "database-dummy.h"

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

int Database_Dummy::Initialized(void)
{
return 1;
}

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

void Database_Dummy::saveBlock(MapBlock *block)
{
DSTACK(__FUNCTION_NAME);
/*
Dummy blocks are not written
*/
if(block->isDummy())
{
return;
}

// Format used for writing
u8 version = SER_FMT_VER_HIGHEST;
// Get destination
v3s16 p3d = block->getPos();

/*
[0] u8 serialization version
[1] data
*/

std::ostringstream o(std::ios_base::binary);
o.write((char*)&version, 1);
// Write basic data
block->serialize(o, version, true);
// Write block to database
std::string tmp = o.str();

m_database[getBlockAsInteger(p3d)] = tmp;
// We just wrote it to the disk so clear modified flag
block->resetModified();
}

MapBlock* Database_Dummy::loadBlock(v3s16 blockpos)
{
v2s16 p2d(blockpos.X, blockpos.Z);

if(m_database.count(getBlockAsInteger(blockpos))) {
/*
Make sure sector is loaded
*/
MapSector *sector = srvmap->createSector(p2d);
/*
Load block
*/
std::string datastr = m_database[getBlockAsInteger(blockpos)];
// srvmap->loadBlock(&datastr, blockpos, sector, false);

try {
std::istringstream is(datastr, std::ios_base::binary);
u8 version = SER_FMT_VER_INVALID;
is.read((char*)&version, 1);

if(is.fail())
throw SerializationError("ServerMap::loadBlock(): Failed"
" to read MapBlock version");

MapBlock *block = NULL;
bool created_new = false;
block = sector->getBlockNoCreateNoEx(blockpos.Y);
if(block == NULL)
{
block = sector->createBlankBlockNoInsert(blockpos.Y);
created_new = true;
}
// Read basic data
block->deSerialize(is, version, true);
// If it's a new block, insert it to the map
if(created_new)
sector->insertBlock(block);
/*
Save blocks loaded in old format in new format
*/

//if(version < SER_FMT_VER_HIGHEST || save_after_load)
// Only save if asked to; no need to update version
//if(save_after_load)
// saveBlock(block);
// We just loaded it from, so it's up-to-date.
block->resetModified();

}
catch(SerializationError &e)
{
errorstream<<"Invalid block data in database"
<<" ("<<blockpos.X<<","<<blockpos.Y<<","<<blockpos.Z<<")"
<<" (SerializationError): "<<e.what()<<std::endl;
// TODO: Block should be marked as invalid in memory so that it is
// not touched but the game can run

if(g_settings->getBool("ignore_world_load_errors")){
errorstream<<"Ignoring block load error. Duck and cover! "
<<"(ignore_world_load_errors)"<<std::endl;
} else {
throw SerializationError("Invalid block data in database");
//assert(0);
}
}

return srvmap->getBlockNoCreateNoEx(blockpos); // should not be using this here
}
return(NULL);
}

void Database_Dummy::listAllLoadableBlocks(core::list<v3s16> &dst)
{
for(std::map<unsigned long long, std::string>::iterator x = m_database.begin(); x != m_database.end(); ++x)
{
v3s16 p = getIntegerAsBlock(x->first);
//dstream<<"block_i="<<block_i<<" p="<<PP(p)<<std::endl;
dst.push_back(p);
}
}

Database_Dummy::~Database_Dummy()
{
m_database.clear();
}
26 changes: 26 additions & 0 deletions src/database-dummy.h
@@ -0,0 +1,26 @@
#ifndef DATABASE_DUMMY_HEADER
#define DATABASE_DUMMY_HEADER

#include "map.h"
#include "mapsector.h"
#include "mapblock.h"
#include "main.h"
#include "filesys.h"
#include "database.h"

class Database_Dummy : public Database
{
public:
Database_Dummy(ServerMap *map);
virtual void beginSave();
virtual void endSave();
virtual void saveBlock(MapBlock *block);
virtual MapBlock* loadBlock(v3s16 blockpos);
virtual void listAllLoadableBlocks(core::list<v3s16> &dst);
virtual int Initialized(void);
~Database_Dummy();
private:
ServerMap *srvmap;
std::map<unsigned long long, std::string> m_database;
};
#endif

0 comments on commit 58841ef

Please sign in to comment.