aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/migrate.cpp
diff options
context:
space:
mode:
authorAva Chow <github@achow101.com>2024-01-02 16:35:22 -0500
committerAva Chow <github@achow101.com>2024-05-13 23:01:37 -0400
commit0c8e72847603540bb29b8b8aeb80fa3f2e3a2c9a (patch)
tree3ad7d3dafb7257f8031fc8c5f9f2171d22e8eb2d /src/wallet/migrate.cpp
parent756ff9b478484b17c4a6e65c171c2e4fecb21ad4 (diff)
downloadbitcoin-0c8e72847603540bb29b8b8aeb80fa3f2e3a2c9a.tar.xz
wallet: implement BerkeleyROBatch
Implement ReadKey and HasKey of BerkeleyROBatch, and Next of BerkeleyROCursor. Also adds the containers for records to BerkeleyRODatabase so that BerkeleyROBatch will be able to access the records.
Diffstat (limited to 'src/wallet/migrate.cpp')
-rw-r--r--src/wallet/migrate.cpp31
1 files changed, 28 insertions, 3 deletions
diff --git a/src/wallet/migrate.cpp b/src/wallet/migrate.cpp
index e567cb0f51..f922d99a17 100644
--- a/src/wallet/migrate.cpp
+++ b/src/wallet/migrate.cpp
@@ -21,17 +21,42 @@ bool BerkeleyRODatabase::Backup(const std::string& dest) const
bool BerkeleyROBatch::ReadKey(DataStream&& key, DataStream& value)
{
- return false;
+ SerializeData key_data{key.begin(), key.end()};
+ const auto it{m_database.m_records.find(key_data)};
+ if (it == m_database.m_records.end()) {
+ return false;
+ }
+ auto val = it->second;
+ value.clear();
+ value.write(Span(val));
+ return true;
}
bool BerkeleyROBatch::HasKey(DataStream&& key)
{
- return false;
+ SerializeData key_data{key.begin(), key.end()};
+ return m_database.m_records.count(key_data) > 0;
+}
+
+BerkeleyROCursor::BerkeleyROCursor(const BerkeleyRODatabase& database, Span<const std::byte> prefix)
+ : m_database(database)
+{
+ std::tie(m_cursor, m_cursor_end) = m_database.m_records.equal_range(BytePrefix{prefix});
}
DatabaseCursor::Status BerkeleyROCursor::Next(DataStream& ssKey, DataStream& ssValue)
{
- return DatabaseCursor::Status::FAIL;
+ if (m_cursor == m_cursor_end) {
+ return DatabaseCursor::Status::DONE;
+ }
+ ssKey.write(Span(m_cursor->first));
+ ssValue.write(Span(m_cursor->second));
+ m_cursor++;
+ return DatabaseCursor::Status::MORE;
}
+std::unique_ptr<DatabaseCursor> BerkeleyROBatch::GetNewPrefixCursor(Span<const std::byte> prefix)
+{
+ return std::make_unique<BerkeleyROCursor>(m_database, prefix);
+}
} // namespace wallet