From ba616b932cb9e9adb7eb9f1826caa62ce422a22d Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Mon, 11 Apr 2022 17:11:37 -0400 Subject: wallet: Add GetPrefixCursor to DatabaseBatch In order to get records beginning with a prefix, we will need a cursor specifically for that prefix. So add a GetPrefixCursor function and DatabaseCursor classes for dealing with those prefixes. Tested on each supported db engine. 1) Write two different key->value elements to db. 2) Create a new prefix cursor and walk-through every returned element, verifying that it gets parsed properly. 3) Try to move the cursor outside the filtered range: expect failure and flag complete=true. Co-Authored-By: Ryan Ofsky Co-Authored-By: furszy --- src/wallet/sqlite.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/wallet/sqlite.h') diff --git a/src/wallet/sqlite.h b/src/wallet/sqlite.h index d9de40569b..0378bbb8d6 100644 --- a/src/wallet/sqlite.h +++ b/src/wallet/sqlite.h @@ -15,12 +15,21 @@ struct bilingual_str; namespace wallet { class SQLiteDatabase; +/** RAII class that provides a database cursor */ class SQLiteCursor : public DatabaseCursor { public: sqlite3_stmt* m_cursor_stmt{nullptr}; + // Copies of the prefix things for the prefix cursor. + // Prevents SQLite from accessing temp variables for the prefix things. + std::vector m_prefix_range_start; + std::vector m_prefix_range_end; explicit SQLiteCursor() {} + explicit SQLiteCursor(std::vector start_range, std::vector end_range) + : m_prefix_range_start(std::move(start_range)), + m_prefix_range_end(std::move(end_range)) + {} ~SQLiteCursor() override; Status Next(DataStream& key, DataStream& value) override; @@ -57,6 +66,7 @@ public: void Close() override; std::unique_ptr GetNewCursor() override; + std::unique_ptr GetNewPrefixCursor(Span prefix) override; bool TxnBegin() override; bool TxnCommit() override; bool TxnAbort() override; -- cgit v1.2.3