@@ -120,13 +120,24 @@ void Database_SQLite3::verifyDatabase() {
120
120
errorstream<<" SQLite3 read statment failed to prepare: " <<sqlite3_errmsg (m_database)<<std::endl;
121
121
throw FileNotGoodException (" Cannot prepare read statement" );
122
122
}
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
125
128
if (d != SQLITE_OK) {
126
129
errorstream<<" SQLite3 write statment failed to prepare: " <<sqlite3_errmsg (m_database)<<std::endl;
127
130
throw FileNotGoodException (" Cannot prepare write statement" );
128
131
}
129
132
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
+
130
141
d = sqlite3_prepare (m_database, " SELECT `pos` FROM `blocks`" , -1 , &m_database_list, NULL );
131
142
if (d != SQLITE_OK) {
132
143
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)
140
151
{
141
152
verifyDatabase ();
142
153
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
+
143
180
if (sqlite3_bind_int64 (m_database_write, 1 , getBlockAsInteger (blockpos)) != SQLITE_OK) {
144
181
errorstream << " WARNING: saveBlock: Block position failed to bind: "
145
182
<< PP (blockpos) << " : " << sqlite3_errmsg (m_database) << std::endl;
@@ -162,6 +199,7 @@ bool Database_SQLite3::saveBlock(v3s16 blockpos, std::string &data)
162
199
}
163
200
164
201
sqlite3_reset (m_database_write);
202
+
165
203
return true ;
166
204
}
167
205
@@ -203,7 +241,7 @@ void Database_SQLite3::createDatabase()
203
241
" `data` BLOB"
204
242
" );"
205
243
, NULL , NULL , NULL );
206
- if (e == SQLITE_ABORT )
244
+ if (e != SQLITE_OK )
207
245
throw FileNotGoodException (" Could not create sqlite3 database structure" );
208
246
else
209
247
infostream<<" ServerMap: SQLite3 database structure was created" ;
0 commit comments