3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 Dummy "database" class
25 #include "database-dummy.h"
28 #include "mapsector.h"
30 #include "serialization.h"
35 Database_Dummy::Database_Dummy(ServerMap *map)
40 int Database_Dummy::Initialized(void)
45 void Database_Dummy::beginSave() {}
46 void Database_Dummy::endSave() {}
48 void Database_Dummy::saveBlock(MapBlock *block)
50 DSTACK(__FUNCTION_NAME);
52 Dummy blocks are not written
59 // Format used for writing
60 u8 version = SER_FMT_VER_HIGHEST_WRITE;
62 v3s16 p3d = block->getPos();
65 [0] u8 serialization version
69 std::ostringstream o(std::ios_base::binary);
70 o.write((char*)&version, 1);
72 block->serialize(o, version, true);
73 // Write block to database
74 std::string tmp = o.str();
76 m_database[getBlockAsInteger(p3d)] = tmp;
77 // We just wrote it to the disk so clear modified flag
78 block->resetModified();
81 MapBlock* Database_Dummy::loadBlock(v3s16 blockpos)
83 v2s16 p2d(blockpos.X, blockpos.Z);
85 if(m_database.count(getBlockAsInteger(blockpos))) {
87 Make sure sector is loaded
89 MapSector *sector = srvmap->createSector(p2d);
93 std::string datastr = m_database[getBlockAsInteger(blockpos)];
94 // srvmap->loadBlock(&datastr, blockpos, sector, false);
97 std::istringstream is(datastr, std::ios_base::binary);
98 u8 version = SER_FMT_VER_INVALID;
99 is.read((char*)&version, 1);
102 throw SerializationError("ServerMap::loadBlock(): Failed"
103 " to read MapBlock version");
105 MapBlock *block = NULL;
106 bool created_new = false;
107 block = sector->getBlockNoCreateNoEx(blockpos.Y);
110 block = sector->createBlankBlockNoInsert(blockpos.Y);
114 block->deSerialize(is, version, true);
115 // If it's a new block, insert it to the map
117 sector->insertBlock(block);
119 Save blocks loaded in old format in new format
122 //if(version < SER_FMT_VER_HIGHEST || save_after_load)
123 // Only save if asked to; no need to update version
124 //if(save_after_load)
126 // We just loaded it from, so it's up-to-date.
127 block->resetModified();
130 catch(SerializationError &e)
132 errorstream<<"Invalid block data in database"
133 <<" ("<<blockpos.X<<","<<blockpos.Y<<","<<blockpos.Z<<")"
134 <<" (SerializationError): "<<e.what()<<std::endl;
135 // TODO: Block should be marked as invalid in memory so that it is
136 // not touched but the game can run
138 if(g_settings->getBool("ignore_world_load_errors")){
139 errorstream<<"Ignoring block load error. Duck and cover! "
140 <<"(ignore_world_load_errors)"<<std::endl;
142 throw SerializationError("Invalid block data in database");
147 return srvmap->getBlockNoCreateNoEx(blockpos); // should not be using this here
152 void Database_Dummy::listAllLoadableBlocks(std::list<v3s16> &dst)
154 for(std::map<u64, std::string>::iterator x = m_database.begin(); x != m_database.end(); ++x)
156 v3s16 p = getIntegerAsBlock(x->first);
157 //dstream<<"block_i="<<block_i<<" p="<<PP(p)<<std::endl;
162 Database_Dummy::~Database_Dummy()