Skip to content

Commit bf90e03

Browse files
committed
Implement SQLiteBatch::ReadKey, WriteKey, EraseKey, and HasKey
1 parent 7aa4562 commit bf90e03

File tree

1 file changed

+100
-4
lines changed

1 file changed

+100
-4
lines changed

src/wallet/sqlite.cpp

Lines changed: 100 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,22 +253,118 @@ void SQLiteBatch::Close()
253253

254254
bool SQLiteBatch::ReadKey(CDataStream&& key, CDataStream& value)
255255
{
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;
257285
}
258286

259287
bool SQLiteBatch::WriteKey(CDataStream&& key, CDataStream&& value, bool overwrite)
260288
{
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;
262324
}
263325

264326
bool SQLiteBatch::EraseKey(CDataStream&& key)
265327
{
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;
267348
}
268349

269350
bool SQLiteBatch::HasKey(CDataStream&& key)
270351
{
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;
272368
}
273369

274370
bool SQLiteBatch::StartCursor()

0 commit comments

Comments
 (0)