aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsapier <Sapier at GMX dot net>2014-07-07 22:57:11 +0200
committersapier <Sapier at GMX dot net>2014-08-16 12:28:07 +0200
commitfa427d641b687dd8585adced708510b94588cf51 (patch)
tree8fcb8c926f9054daa593c9a0d10782661731d8e4
parent6c5f79fee90ca0f0b971ec2a0e33d0e8f57616cb (diff)
downloadminetest-fa427d641b687dd8585adced708510b94588cf51.tar.gz
minetest-fa427d641b687dd8585adced708510b94588cf51.tar.bz2
minetest-fa427d641b687dd8585adced708510b94588cf51.zip
Add sqlite3 backend hack for android
-rw-r--r--src/database-sqlite3.cpp44
-rw-r--r--src/database-sqlite3.h3
-rw-r--r--src/subgame.cpp7
3 files changed, 45 insertions, 9 deletions
diff --git a/src/database-sqlite3.cpp b/src/database-sqlite3.cpp
index 7e1767a8f..4d48796fc 100644
--- a/src/database-sqlite3.cpp
+++ b/src/database-sqlite3.cpp
@@ -120,13 +120,24 @@ void Database_SQLite3::verifyDatabase() {
errorstream<<"SQLite3 read statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
throw FileNotGoodException("Cannot prepare read statement");
}
-
- d = sqlite3_prepare(m_database, "REPLACE INTO `blocks` VALUES(?, ?)", -1, &m_database_write, NULL);
+#ifdef __ANDROID__
+ d = sqlite3_prepare(m_database, "INSERT INTO `blocks` VALUES(?, ?);", -1, &m_database_write, NULL);
+#else
+ d = sqlite3_prepare(m_database, "REPLACE INTO `blocks` VALUES(?, ?);", -1, &m_database_write, NULL);
+#endif
if(d != SQLITE_OK) {
errorstream<<"SQLite3 write statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
throw FileNotGoodException("Cannot prepare write statement");
}
+#ifdef __ANDROID__
+ d = sqlite3_prepare(m_database, "DELETE FROM `blocks` WHERE `pos`=?;", -1, &m_database_delete, NULL);
+ if(d != SQLITE_OK) {
+ infostream<<"WARNING: SQLite3 database delete statment failed to prepare: "<<sqlite3_errmsg(m_database)<<std::endl;
+ throw FileNotGoodException("Cannot prepare delete statement");
+ }
+#endif
+
d = sqlite3_prepare(m_database, "SELECT `pos` FROM `blocks`", -1, &m_database_list, NULL);
if(d != SQLITE_OK) {
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)
{
verifyDatabase();
+#ifdef __ANDROID__
+ /**
+ * Note: For some unknown reason sqlite3 fails to REPLACE blocks on android,
+ * deleting them and inserting first works.
+ */
+ if (sqlite3_bind_int64(m_database_read, 1, getBlockAsInteger(blockpos)) != SQLITE_OK) {
+ infostream << "WARNING: Could not bind block position for load: "
+ << sqlite3_errmsg(m_database)<<std::endl;
+ }
+
+ if (sqlite3_step(m_database_read) == SQLITE_ROW) {
+ if (sqlite3_bind_int64(m_database_delete, 1, getBlockAsInteger(blockpos)) != SQLITE_OK) {
+ infostream << "WARNING: Could not bind block position for delete: "
+ << sqlite3_errmsg(m_database)<<std::endl;
+ }
+
+ if (sqlite3_step(m_database_delete) != SQLITE_DONE) {
+ errorstream << "WARNING: saveBlock: Block failed to delete "
+ << PP(blockpos) << ": " << sqlite3_errmsg(m_database) << std::endl;
+ return false;
+ }
+ sqlite3_reset(m_database_delete);
+ }
+ sqlite3_reset(m_database_read);
+#endif
+
if (sqlite3_bind_int64(m_database_write, 1, getBlockAsInteger(blockpos)) != SQLITE_OK) {
errorstream << "WARNING: saveBlock: Block position failed to bind: "
<< PP(blockpos) << ": " << sqlite3_errmsg(m_database) << std::endl;
@@ -162,6 +199,7 @@ bool Database_SQLite3::saveBlock(v3s16 blockpos, std::string &data)
}
sqlite3_reset(m_database_write);
+
return true;
}
@@ -203,7 +241,7 @@ void Database_SQLite3::createDatabase()
"`data` BLOB"
");"
, NULL, NULL, NULL);
- if(e == SQLITE_ABORT)
+ if(e != SQLITE_OK)
throw FileNotGoodException("Could not create sqlite3 database structure");
else
infostream<<"ServerMap: SQLite3 database structure was created";
diff --git a/src/database-sqlite3.h b/src/database-sqlite3.h
index 81f7d459d..45619b885 100644
--- a/src/database-sqlite3.h
+++ b/src/database-sqlite3.h
@@ -47,6 +47,9 @@ private:
sqlite3 *m_database;
sqlite3_stmt *m_database_read;
sqlite3_stmt *m_database_write;
+#ifdef __ANDROID__
+ sqlite3_stmt *m_database_delete;
+#endif
sqlite3_stmt *m_database_list;
// Create the database structure
diff --git a/src/subgame.cpp b/src/subgame.cpp
index 1030d535a..f2465c93e 100644
--- a/src/subgame.cpp
+++ b/src/subgame.cpp
@@ -242,12 +242,7 @@ bool initializeWorld(const std::string &path, const std::string &gameid)
infostream<<"Creating world.mt ("<<worldmt_path<<")"<<std::endl;
fs::CreateAllDirs(path);
std::ostringstream ss(std::ios_base::binary);
- ss<<"gameid = "<<gameid<<
-#ifdef __ANDROID__
- "\nbackend = leveldb\n";
-#else
- "\nbackend = sqlite3\n";
-#endif
+ ss<<"gameid = "<<gameid<< "\nbackend = sqlite3\n";
fs::safeWriteToFile(worldmt_path, ss.str());
}
return true;