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.
25 #include "exceptions.h"
31 class Database_SQLite3
: public Database
34 virtual ~Database_SQLite3();
39 bool initialized() const { return m_initialized
; }
41 Database_SQLite3(const std::string
&savedir
, const std::string
&dbname
);
43 // Open and initialize the database if needed
44 void verifyDatabase();
47 inline void str_to_sqlite(sqlite3_stmt
*s
, int iCol
, const std::string
&str
) const
49 sqlite3_vrfy(sqlite3_bind_text(s
, iCol
, str
.c_str(), str
.size(), NULL
));
52 inline void str_to_sqlite(sqlite3_stmt
*s
, int iCol
, const char *str
) const
54 sqlite3_vrfy(sqlite3_bind_text(s
, iCol
, str
, strlen(str
), NULL
));
57 inline void int_to_sqlite(sqlite3_stmt
*s
, int iCol
, int val
) const
59 sqlite3_vrfy(sqlite3_bind_int(s
, iCol
, val
));
62 inline void int64_to_sqlite(sqlite3_stmt
*s
, int iCol
, s64 val
) const
64 sqlite3_vrfy(sqlite3_bind_int64(s
, iCol
, (sqlite3_int64
) val
));
67 inline void double_to_sqlite(sqlite3_stmt
*s
, int iCol
, double val
) const
69 sqlite3_vrfy(sqlite3_bind_double(s
, iCol
, val
));
72 inline std::string
sqlite_to_string(sqlite3_stmt
*s
, int iCol
)
74 const char* text
= reinterpret_cast<const char*>(sqlite3_column_text(s
, iCol
));
75 return std::string(text
? text
: "");
78 inline s32
sqlite_to_int(sqlite3_stmt
*s
, int iCol
)
80 return sqlite3_column_int(s
, iCol
);
83 inline u32
sqlite_to_uint(sqlite3_stmt
*s
, int iCol
)
85 return (u32
) sqlite3_column_int(s
, iCol
);
88 inline s64
sqlite_to_int64(sqlite3_stmt
*s
, int iCol
)
90 return (s64
) sqlite3_column_int64(s
, iCol
);
93 inline u64
sqlite_to_uint64(sqlite3_stmt
*s
, int iCol
)
95 return (u64
) sqlite3_column_int64(s
, iCol
);
98 inline float sqlite_to_float(sqlite3_stmt
*s
, int iCol
)
100 return (float) sqlite3_column_double(s
, iCol
);
103 inline const v3f
sqlite_to_v3f(sqlite3_stmt
*s
, int iCol
)
105 return v3f(sqlite_to_float(s
, iCol
), sqlite_to_float(s
, iCol
+ 1),
106 sqlite_to_float(s
, iCol
+ 2));
109 // Query verifiers helpers
110 inline void sqlite3_vrfy(int s
, const std::string
&m
= "", int r
= SQLITE_OK
) const
113 throw DatabaseException(m
+ ": " + sqlite3_errmsg(m_database
));
116 inline void sqlite3_vrfy(const int s
, const int r
, const std::string
&m
= "") const
118 sqlite3_vrfy(s
, m
, r
);
121 // Create the database structure
122 virtual void createDatabase() = 0;
123 virtual void initStatements() = 0;
125 sqlite3
*m_database
= nullptr;
130 bool m_initialized
= false;
132 std::string m_savedir
= "";
133 std::string m_dbname
= "";
135 sqlite3_stmt
*m_stmt_begin
= nullptr;
136 sqlite3_stmt
*m_stmt_end
= nullptr;
138 s64 m_busy_handler_data
[2];
140 static int busyHandler(void *data
, int count
);
143 class MapDatabaseSQLite3
: private Database_SQLite3
, public MapDatabase
146 MapDatabaseSQLite3(const std::string
&savedir
);
147 virtual ~MapDatabaseSQLite3();
149 bool saveBlock(const v3s16
&pos
, const std::string
&data
);
150 void loadBlock(const v3s16
&pos
, std::string
*block
);
151 bool deleteBlock(const v3s16
&pos
);
152 void listAllLoadableBlocks(std::vector
<v3s16
> &dst
);
154 void beginSave() { Database_SQLite3::beginSave(); }
155 void endSave() { Database_SQLite3::endSave(); }
157 virtual void createDatabase();
158 virtual void initStatements();
161 void bindPos(sqlite3_stmt
*stmt
, const v3s16
&pos
, int index
= 1);
164 sqlite3_stmt
*m_stmt_read
= nullptr;
165 sqlite3_stmt
*m_stmt_write
= nullptr;
166 sqlite3_stmt
*m_stmt_list
= nullptr;
167 sqlite3_stmt
*m_stmt_delete
= nullptr;
170 class PlayerDatabaseSQLite3
: private Database_SQLite3
, public PlayerDatabase
173 PlayerDatabaseSQLite3(const std::string
&savedir
);
174 virtual ~PlayerDatabaseSQLite3();
176 void savePlayer(RemotePlayer
*player
);
177 bool loadPlayer(RemotePlayer
*player
, PlayerSAO
*sao
);
178 bool removePlayer(const std::string
&name
);
179 void listPlayers(std::vector
<std::string
> &res
);
182 virtual void createDatabase();
183 virtual void initStatements();
186 bool playerDataExists(const std::string
&name
);
189 sqlite3_stmt
*m_stmt_player_load
= nullptr;
190 sqlite3_stmt
*m_stmt_player_add
= nullptr;
191 sqlite3_stmt
*m_stmt_player_update
= nullptr;
192 sqlite3_stmt
*m_stmt_player_remove
= nullptr;
193 sqlite3_stmt
*m_stmt_player_list
= nullptr;
194 sqlite3_stmt
*m_stmt_player_load_inventory
= nullptr;
195 sqlite3_stmt
*m_stmt_player_load_inventory_items
= nullptr;
196 sqlite3_stmt
*m_stmt_player_add_inventory
= nullptr;
197 sqlite3_stmt
*m_stmt_player_add_inventory_items
= nullptr;
198 sqlite3_stmt
*m_stmt_player_remove_inventory
= nullptr;
199 sqlite3_stmt
*m_stmt_player_remove_inventory_items
= nullptr;
200 sqlite3_stmt
*m_stmt_player_metadata_load
= nullptr;
201 sqlite3_stmt
*m_stmt_player_metadata_remove
= nullptr;
202 sqlite3_stmt
*m_stmt_player_metadata_add
= nullptr;
205 class AuthDatabaseSQLite3
: private Database_SQLite3
, public AuthDatabase
208 AuthDatabaseSQLite3(const std::string
&savedir
);
209 virtual ~AuthDatabaseSQLite3();
211 virtual bool getAuth(const std::string
&name
, AuthEntry
&res
);
212 virtual bool saveAuth(const AuthEntry
&authEntry
);
213 virtual bool createAuth(AuthEntry
&authEntry
);
214 virtual bool deleteAuth(const std::string
&name
);
215 virtual void listNames(std::vector
<std::string
> &res
);
216 virtual void reload();
219 virtual void createDatabase();
220 virtual void initStatements();
223 virtual void writePrivileges(const AuthEntry
&authEntry
);
225 sqlite3_stmt
*m_stmt_read
= nullptr;
226 sqlite3_stmt
*m_stmt_write
= nullptr;
227 sqlite3_stmt
*m_stmt_create
= nullptr;
228 sqlite3_stmt
*m_stmt_delete
= nullptr;
229 sqlite3_stmt
*m_stmt_list_names
= nullptr;
230 sqlite3_stmt
*m_stmt_read_privs
= nullptr;
231 sqlite3_stmt
*m_stmt_write_privs
= nullptr;
232 sqlite3_stmt
*m_stmt_delete_privs
= nullptr;
233 sqlite3_stmt
*m_stmt_last_insert_rowid
= nullptr;