From f6f9cd6a64842ef23777312f2465e826ca04b886 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Tue, 26 May 2020 20:53:46 -0400 Subject: Implement SQLiteBatch::StartCursor, ReadAtCursor, and CloseCursor --- src/wallet/sqlite.cpp | 30 ++++++++++++++++++++++++++++-- src/wallet/sqlite.h | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) (limited to 'src/wallet') diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp index aae32e404e..d684eef87e 100644 --- a/src/wallet/sqlite.cpp +++ b/src/wallet/sqlite.cpp @@ -369,16 +369,42 @@ bool SQLiteBatch::HasKey(CDataStream&& key) bool SQLiteBatch::StartCursor() { - return false; + assert(!m_cursor_init); + if (!m_database.m_db) return false; + m_cursor_init = true; + return true; } bool SQLiteBatch::ReadAtCursor(CDataStream& key, CDataStream& value, bool& complete) { - return false; + complete = false; + + if (!m_cursor_init) return false; + + int res = sqlite3_step(m_cursor_stmt); + if (res == SQLITE_DONE) { + complete = true; + return true; + } + if (res != SQLITE_ROW) { + LogPrintf("SQLiteBatch::ReadAtCursor: Unable to execute cursor step: %s\n", sqlite3_errstr(res)); + return false; + } + + // Leftmost column in result is index 0 + const char* key_data = reinterpret_cast(sqlite3_column_blob(m_cursor_stmt, 0)); + int key_data_size = sqlite3_column_bytes(m_cursor_stmt, 0); + key.write(key_data, key_data_size); + const char* value_data = reinterpret_cast(sqlite3_column_blob(m_cursor_stmt, 1)); + int value_data_size = sqlite3_column_bytes(m_cursor_stmt, 1); + value.write(value_data, value_data_size); + return true; } void SQLiteBatch::CloseCursor() { + sqlite3_reset(m_cursor_stmt); + m_cursor_init = false; } bool SQLiteBatch::TxnBegin() diff --git a/src/wallet/sqlite.h b/src/wallet/sqlite.h index 4d4dca1d20..dca6560abb 100644 --- a/src/wallet/sqlite.h +++ b/src/wallet/sqlite.h @@ -18,6 +18,8 @@ class SQLiteBatch : public DatabaseBatch private: SQLiteDatabase& m_database; + bool m_cursor_init = false; + sqlite3_stmt* m_read_stmt{nullptr}; sqlite3_stmt* m_insert_stmt{nullptr}; sqlite3_stmt* m_overwrite_stmt{nullptr}; -- cgit v1.2.3