Skip to content

Commit fa427d6

Browse files
sapiersapier
sapier
authored and
sapier
committedAug 16, 2014
Add sqlite3 backend hack for android
1 parent 6c5f79f commit fa427d6

File tree

3 files changed

+45
-9
lines changed

3 files changed

+45
-9
lines changed
 

‎src/database-sqlite3.cpp

+41-3
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,24 @@ void Database_SQLite3::verifyDatabase() {
120120
errorstream<<"SQLite3 read statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
121121
throw FileNotGoodException("Cannot prepare read statement");
122122
}
123-
124-
d = sqlite3_prepare(m_database, "REPLACE INTO `blocks` VALUES(?, ?)", -1, &m_database_write, NULL);
123+
#ifdef __ANDROID__
124+
d = sqlite3_prepare(m_database, "INSERT INTO `blocks` VALUES(?, ?);", -1, &m_database_write, NULL);
125+
#else
126+
d = sqlite3_prepare(m_database, "REPLACE INTO `blocks` VALUES(?, ?);", -1, &m_database_write, NULL);
127+
#endif
125128
if(d != SQLITE_OK) {
126129
errorstream<<"SQLite3 write statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
127130
throw FileNotGoodException("Cannot prepare write statement");
128131
}
129132

133+
#ifdef __ANDROID__
134+
d = sqlite3_prepare(m_database, "DELETE FROM `blocks` WHERE `pos`=?;", -1, &m_database_delete, NULL);
135+
if(d != SQLITE_OK) {
136+
infostream<<"WARNING: SQLite3 database delete statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
137+
throw FileNotGoodException("Cannot prepare delete statement");
138+
}
139+
#endif
140+
130141
d = sqlite3_prepare(m_database, "SELECT `pos` FROM `blocks`", -1, &m_database_list, NULL);
131142
if(d != SQLITE_OK) {
132143
infostream<<"SQLite3 list statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
@@ -140,6 +151,32 @@ bool Database_SQLite3::saveBlock(v3s16 blockpos, std::string &data)
140151
{
141152
verifyDatabase();
142153

154+
#ifdef __ANDROID__
155+
/**
156+
* Note: For some unknown reason sqlite3 fails to REPLACE blocks on android,
157+
* deleting them and inserting first works.
158+
*/
159+
if (sqlite3_bind_int64(m_database_read, 1, getBlockAsInteger(blockpos)) != SQLITE_OK) {
160+
infostream << "WARNING: Could not bind block position for load: "
161+
<< sqlite3_errmsg(m_database)<<std::endl;
162+
}
163+
164+
if (sqlite3_step(m_database_read) == SQLITE_ROW) {
165+
if (sqlite3_bind_int64(m_database_delete, 1, getBlockAsInteger(blockpos)) != SQLITE_OK) {
166+
infostream << "WARNING: Could not bind block position for delete: "
167+
<< sqlite3_errmsg(m_database)<<std::endl;
168+
}
169+
170+
if (sqlite3_step(m_database_delete) != SQLITE_DONE) {
171+
errorstream << "WARNING: saveBlock: Block failed to delete "
172+
<< PP(blockpos) << ": " << sqlite3_errmsg(m_database) << std::endl;
173+
return false;
174+
}
175+
sqlite3_reset(m_database_delete);
176+
}
177+
sqlite3_reset(m_database_read);
178+
#endif
179+
143180
if (sqlite3_bind_int64(m_database_write, 1, getBlockAsInteger(blockpos)) != SQLITE_OK) {
144181
errorstream << "WARNING: saveBlock: Block position failed to bind: "
145182
<< PP(blockpos) << ": " << sqlite3_errmsg(m_database) << std::endl;
@@ -162,6 +199,7 @@ bool Database_SQLite3::saveBlock(v3s16 blockpos, std::string &data)
162199
}
163200

164201
sqlite3_reset(m_database_write);
202+
165203
return true;
166204
}
167205

@@ -203,7 +241,7 @@ void Database_SQLite3::createDatabase()
203241
"`data` BLOB"
204242
");"
205243
, NULL, NULL, NULL);
206-
if(e == SQLITE_ABORT)
244+
if(e != SQLITE_OK)
207245
throw FileNotGoodException("Could not create sqlite3 database structure");
208246
else
209247
infostream<<"ServerMap: SQLite3 database structure was created";

‎src/database-sqlite3.h

+3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ class Database_SQLite3 : public Database
4747
sqlite3 *m_database;
4848
sqlite3_stmt *m_database_read;
4949
sqlite3_stmt *m_database_write;
50+
#ifdef __ANDROID__
51+
sqlite3_stmt *m_database_delete;
52+
#endif
5053
sqlite3_stmt *m_database_list;
5154

5255
// Create the database structure

‎src/subgame.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,7 @@ bool initializeWorld(const std::string &path, const std::string &gameid)
242242
infostream<<"Creating world.mt ("<<worldmt_path<<")"<<std::endl;
243243
fs::CreateAllDirs(path);
244244
std::ostringstream ss(std::ios_base::binary);
245-
ss<<"gameid = "<<gameid<<
246-
#ifdef __ANDROID__
247-
"\nbackend = leveldb\n";
248-
#else
249-
"\nbackend = sqlite3\n";
250-
#endif
245+
ss<<"gameid = "<<gameid<< "\nbackend = sqlite3\n";
251246
fs::safeWriteToFile(worldmt_path, ss.str());
252247
}
253248
return true;

0 commit comments

Comments
 (0)
Please sign in to comment.