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 bool Database_Dummy::saveBlock(MapBlock *block)
50 DSTACK(__FUNCTION_NAME);
52 Dummy blocks are not written
56 v3s16 p = block->getPos();
57 infostream<<"Database_Dummy::saveBlock(): WARNING: Not writing dummy block "
58 <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;
62 // Format used for writing
63 u8 version = SER_FMT_VER_HIGHEST_WRITE;
65 v3s16 p3d = block->getPos();
68 [0] u8 serialization version
72 std::ostringstream o(std::ios_base::binary);
73 o.write((char*)&version, 1);
75 block->serialize(o, version, true);
76 // Write block to database
77 std::string tmp = o.str();
79 m_database[getBlockAsInteger(p3d)] = tmp;
80 // We just wrote it to the disk so clear modified flag
81 block->resetModified();
85 MapBlock* Database_Dummy::loadBlock(v3s16 blockpos)
87 v2s16 p2d(blockpos.X, blockpos.Z);
89 if(m_database.count(getBlockAsInteger(blockpos))) {
91 Make sure sector is loaded
93 MapSector *sector = srvmap->createSector(p2d);
97 std::string datastr = m_database[getBlockAsInteger(blockpos)];
98 // srvmap->loadBlock(&datastr, blockpos, sector, false);
101 std::istringstream is(datastr, std::ios_base::binary);
102 u8 version = SER_FMT_VER_INVALID;
103 is.read((char*)&version, 1);
106 throw SerializationError("ServerMap::loadBlock(): Failed"
107 " to read MapBlock version");
109 MapBlock *block = NULL;
110 bool created_new = false;
111 block = sector->getBlockNoCreateNoEx(blockpos.Y);
114 block = sector->createBlankBlockNoInsert(blockpos.Y);
118 block->deSerialize(is, version, true);
119 // If it's a new block, insert it to the map
121 sector->insertBlock(block);
123 Save blocks loaded in old format in new format
126 //if(version < SER_FMT_VER_HIGHEST || save_after_load)
127 // Only save if asked to; no need to update version
128 //if(save_after_load)
130 // We just loaded it from, so it's up-to-date.
131 block->resetModified();
134 catch(SerializationError &e)
136 errorstream<<"Invalid block data in database"
137 <<" ("<<blockpos.X<<","<<blockpos.Y<<","<<blockpos.Z<<")"
138 <<" (SerializationError): "<<e.what()<<std::endl;
139 // TODO: Block should be marked as invalid in memory so that it is
140 // not touched but the game can run
142 if(g_settings->getBool("ignore_world_load_errors")){
143 errorstream<<"Ignoring block load error. Duck and cover! "
144 <<"(ignore_world_load_errors)"<<std::endl;
146 throw SerializationError("Invalid block data in database");
151 return srvmap->getBlockNoCreateNoEx(blockpos); // should not be using this here
156 void Database_Dummy::listAllLoadableBlocks(std::list<v3s16> &dst)
158 for(std::map<u64, std::string>::iterator x = m_database.begin(); x != m_database.end(); ++x)
160 v3s16 p = getIntegerAsBlock(x->first);
161 //dstream<<"block_i="<<block_i<<" p="<<PP(p)<<std::endl;
166 Database_Dummy::~Database_Dummy()