@@ -253,22 +253,118 @@ void SQLiteBatch::Close()
253
253
254
254
bool SQLiteBatch::ReadKey (CDataStream&& key, CDataStream& value)
255
255
{
256
- return false ;
256
+ if (!m_database.m_db ) return false ;
257
+ assert (m_read_stmt);
258
+
259
+ // Bind: leftmost parameter in statement is index 1
260
+ int res = sqlite3_bind_blob (m_read_stmt, 1 , key.data (), key.size (), SQLITE_STATIC);
261
+ if (res != SQLITE_OK) {
262
+ LogPrintf (" %s: Unable to bind statement: %s\n " , __func__, sqlite3_errstr (res));
263
+ sqlite3_clear_bindings (m_read_stmt);
264
+ sqlite3_reset (m_read_stmt);
265
+ return false ;
266
+ }
267
+ res = sqlite3_step (m_read_stmt);
268
+ if (res != SQLITE_ROW) {
269
+ if (res != SQLITE_DONE) {
270
+ // SQLITE_DONE means "not found", don't log an error in that case.
271
+ LogPrintf (" %s: Unable to execute statement: %s\n " , __func__, sqlite3_errstr (res));
272
+ }
273
+ sqlite3_clear_bindings (m_read_stmt);
274
+ sqlite3_reset (m_read_stmt);
275
+ return false ;
276
+ }
277
+ // Leftmost column in result is index 0
278
+ const char * data = reinterpret_cast <const char *>(sqlite3_column_blob (m_read_stmt, 0 ));
279
+ int data_size = sqlite3_column_bytes (m_read_stmt, 0 );
280
+ value.write (data, data_size);
281
+
282
+ sqlite3_clear_bindings (m_read_stmt);
283
+ sqlite3_reset (m_read_stmt);
284
+ return true ;
257
285
}
258
286
259
287
bool SQLiteBatch::WriteKey (CDataStream&& key, CDataStream&& value, bool overwrite)
260
288
{
261
- return false ;
289
+ if (!m_database.m_db ) return false ;
290
+ assert (m_insert_stmt && m_overwrite_stmt);
291
+
292
+ sqlite3_stmt* stmt;
293
+ if (overwrite) {
294
+ stmt = m_overwrite_stmt;
295
+ } else {
296
+ stmt = m_insert_stmt;
297
+ }
298
+
299
+ // Bind: leftmost parameter in statement is index 1
300
+ // Insert index 1 is key, 2 is value
301
+ int res = sqlite3_bind_blob (stmt, 1 , key.data (), key.size (), SQLITE_STATIC);
302
+ if (res != SQLITE_OK) {
303
+ LogPrintf (" %s: Unable to bind key to statement: %s\n " , __func__, sqlite3_errstr (res));
304
+ sqlite3_clear_bindings (stmt);
305
+ sqlite3_reset (stmt);
306
+ return false ;
307
+ }
308
+ res = sqlite3_bind_blob (stmt, 2 , value.data (), value.size (), SQLITE_STATIC);
309
+ if (res != SQLITE_OK) {
310
+ LogPrintf (" %s: Unable to bind value to statement: %s\n " , __func__, sqlite3_errstr (res));
311
+ sqlite3_clear_bindings (stmt);
312
+ sqlite3_reset (stmt);
313
+ return false ;
314
+ }
315
+
316
+ // Execute
317
+ res = sqlite3_step (stmt);
318
+ sqlite3_clear_bindings (stmt);
319
+ sqlite3_reset (stmt);
320
+ if (res != SQLITE_DONE) {
321
+ LogPrintf (" %s: Unable to execute statement: %s\n " , __func__, sqlite3_errstr (res));
322
+ }
323
+ return res == SQLITE_DONE;
262
324
}
263
325
264
326
bool SQLiteBatch::EraseKey (CDataStream&& key)
265
327
{
266
- return false ;
328
+ if (!m_database.m_db ) return false ;
329
+ assert (m_delete_stmt);
330
+
331
+ // Bind: leftmost parameter in statement is index 1
332
+ int res = sqlite3_bind_blob (m_delete_stmt, 1 , key.data (), key.size (), SQLITE_STATIC);
333
+ if (res != SQLITE_OK) {
334
+ LogPrintf (" %s: Unable to bind statement: %s\n " , __func__, sqlite3_errstr (res));
335
+ sqlite3_clear_bindings (m_delete_stmt);
336
+ sqlite3_reset (m_delete_stmt);
337
+ return false ;
338
+ }
339
+
340
+ // Execute
341
+ res = sqlite3_step (m_delete_stmt);
342
+ sqlite3_clear_bindings (m_delete_stmt);
343
+ sqlite3_reset (m_delete_stmt);
344
+ if (res != SQLITE_DONE) {
345
+ LogPrintf (" %s: Unable to execute statement: %s\n " , __func__, sqlite3_errstr (res));
346
+ }
347
+ return res == SQLITE_DONE;
267
348
}
268
349
269
350
bool SQLiteBatch::HasKey (CDataStream&& key)
270
351
{
271
- return false ;
352
+ if (!m_database.m_db ) return false ;
353
+ assert (m_read_stmt);
354
+
355
+ // Bind: leftmost parameter in statement is index 1
356
+ bool ret = false ;
357
+ int res = sqlite3_bind_blob (m_read_stmt, 1 , key.data (), key.size (), SQLITE_STATIC);
358
+ if (res == SQLITE_OK) {
359
+ res = sqlite3_step (m_read_stmt);
360
+ if (res == SQLITE_ROW) {
361
+ ret = true ;
362
+ }
363
+ }
364
+
365
+ sqlite3_clear_bindings (m_read_stmt);
366
+ sqlite3_reset (m_read_stmt);
367
+ return ret;
272
368
}
273
369
274
370
bool SQLiteBatch::StartCursor ()
0 commit comments