Replace usage of long long with u64/s64
[oweals/minetest.git] / src / database-dummy.cpp
1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
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.
9
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.
14
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.
18 */
19
20 /*
21 Dummy "database" class
22 */
23
24
25 #include "database-dummy.h"
26
27 #include "map.h"
28 #include "mapsector.h"
29 #include "mapblock.h"
30 #include "serialization.h"
31 #include "main.h"
32 #include "settings.h"
33 #include "log.h"
34
35 Database_Dummy::Database_Dummy(ServerMap *map)
36 {
37         srvmap = map;
38 }
39
40 int Database_Dummy::Initialized(void)
41 {
42         return 1;
43 }
44
45 void Database_Dummy::beginSave() {}
46 void Database_Dummy::endSave() {}
47
48 void Database_Dummy::saveBlock(MapBlock *block)
49 {
50         DSTACK(__FUNCTION_NAME);
51         /*
52                 Dummy blocks are not written
53         */
54         if(block->isDummy())
55         {
56                 return;
57         }
58
59         // Format used for writing
60         u8 version = SER_FMT_VER_HIGHEST_WRITE;
61         // Get destination
62         v3s16 p3d = block->getPos();
63
64         /*
65                 [0] u8 serialization version
66                 [1] data
67         */
68
69         std::ostringstream o(std::ios_base::binary);
70         o.write((char*)&version, 1);
71         // Write basic data
72         block->serialize(o, version, true);
73         // Write block to database
74         std::string tmp = o.str();
75
76         m_database[getBlockAsInteger(p3d)] = tmp;
77         // We just wrote it to the disk so clear modified flag
78         block->resetModified();
79 }
80
81 MapBlock* Database_Dummy::loadBlock(v3s16 blockpos)
82 {
83         v2s16 p2d(blockpos.X, blockpos.Z);
84
85         if(m_database.count(getBlockAsInteger(blockpos))) {
86                 /*
87                         Make sure sector is loaded
88                 */
89                 MapSector *sector = srvmap->createSector(p2d);
90                 /*
91                         Load block
92                 */
93                 std::string datastr = m_database[getBlockAsInteger(blockpos)];
94 //                srvmap->loadBlock(&datastr, blockpos, sector, false);
95
96                 try {
97                         std::istringstream is(datastr, std::ios_base::binary);
98                         u8 version = SER_FMT_VER_INVALID;
99                         is.read((char*)&version, 1);
100
101                         if(is.fail())
102                                 throw SerializationError("ServerMap::loadBlock(): Failed"
103                                                      " to read MapBlock version");
104
105                         MapBlock *block = NULL;
106                         bool created_new = false;
107                         block = sector->getBlockNoCreateNoEx(blockpos.Y);
108                         if(block == NULL)
109                         {
110                                 block = sector->createBlankBlockNoInsert(blockpos.Y);
111                                 created_new = true;
112                         }
113                         // Read basic data
114                         block->deSerialize(is, version, true);
115                         // If it's a new block, insert it to the map
116                         if(created_new)
117                                 sector->insertBlock(block);
118                         /*
119                                 Save blocks loaded in old format in new format
120                         */
121
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)
125                         //      saveBlock(block);
126                         // We just loaded it from, so it's up-to-date.
127                         block->resetModified();
128
129                 }
130                 catch(SerializationError &e)
131                 {
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
137
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;
141                         } else {
142                              throw SerializationError("Invalid block data in database");
143                              //assert(0);
144                         }
145                 }
146
147                 return srvmap->getBlockNoCreateNoEx(blockpos);  // should not be using this here
148         }
149         return(NULL);
150 }
151
152 void Database_Dummy::listAllLoadableBlocks(std::list<v3s16> &dst)
153 {
154         for(std::map<u64, std::string>::iterator x = m_database.begin(); x != m_database.end(); ++x)
155         {
156                 v3s16 p = getIntegerAsBlock(x->first);
157                 //dstream<<"block_i="<<block_i<<" p="<<PP(p)<<std::endl;
158                 dst.push_back(p);
159         }
160 }
161
162 Database_Dummy::~Database_Dummy()
163 {
164         m_database.clear();
165 }