Skip to content

Commit 0c8e728

Browse files
committed
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.
1 parent 756ff9b commit 0c8e728

File tree

5 files changed

+52
-10
lines changed

5 files changed

+52
-10
lines changed

src/wallet/db.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
#include <vector>
1717

1818
namespace wallet {
19+
bool operator<(BytePrefix a, Span<const std::byte> b) { return a.prefix < b.subspan(0, std::min(a.prefix.size(), b.size())); }
20+
bool operator<(Span<const std::byte> a, BytePrefix b) { return a.subspan(0, std::min(a.size(), b.prefix.size())) < b.prefix; }
21+
1922
std::vector<fs::path> ListDatabases(const fs::path& wallet_dir)
2023
{
2124
std::vector<fs::path> paths;

src/wallet/db.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ class ArgsManager;
2020
struct bilingual_str;
2121

2222
namespace wallet {
23+
// BytePrefix compares equality with other byte spans that begin with the same prefix.
24+
struct BytePrefix {
25+
Span<const std::byte> prefix;
26+
};
27+
bool operator<(BytePrefix a, Span<const std::byte> b);
28+
bool operator<(Span<const std::byte> a, BytePrefix b);
2329

2430
class DatabaseCursor
2531
{

src/wallet/migrate.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,42 @@ bool BerkeleyRODatabase::Backup(const std::string& dest) const
2121

2222
bool BerkeleyROBatch::ReadKey(DataStream&& key, DataStream& value)
2323
{
24-
return false;
24+
SerializeData key_data{key.begin(), key.end()};
25+
const auto it{m_database.m_records.find(key_data)};
26+
if (it == m_database.m_records.end()) {
27+
return false;
28+
}
29+
auto val = it->second;
30+
value.clear();
31+
value.write(Span(val));
32+
return true;
2533
}
2634

2735
bool BerkeleyROBatch::HasKey(DataStream&& key)
2836
{
29-
return false;
37+
SerializeData key_data{key.begin(), key.end()};
38+
return m_database.m_records.count(key_data) > 0;
39+
}
40+
41+
BerkeleyROCursor::BerkeleyROCursor(const BerkeleyRODatabase& database, Span<const std::byte> prefix)
42+
: m_database(database)
43+
{
44+
std::tie(m_cursor, m_cursor_end) = m_database.m_records.equal_range(BytePrefix{prefix});
3045
}
3146

3247
DatabaseCursor::Status BerkeleyROCursor::Next(DataStream& ssKey, DataStream& ssValue)
3348
{
34-
return DatabaseCursor::Status::FAIL;
49+
if (m_cursor == m_cursor_end) {
50+
return DatabaseCursor::Status::DONE;
51+
}
52+
ssKey.write(Span(m_cursor->first));
53+
ssValue.write(Span(m_cursor->second));
54+
m_cursor++;
55+
return DatabaseCursor::Status::MORE;
3556
}
3657

58+
std::unique_ptr<DatabaseCursor> BerkeleyROBatch::GetNewPrefixCursor(Span<const std::byte> prefix)
59+
{
60+
return std::make_unique<BerkeleyROCursor>(m_database, prefix);
61+
}
3762
} // namespace wallet

src/wallet/migrate.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
#include <optional>
1111

1212
namespace wallet {
13+
14+
using BerkeleyROData = std::map<SerializeData, SerializeData, std::less<>>;
15+
1316
/**
1417
* A class representing a BerkeleyDB file from which we can only read records.
1518
* This is used only for migration of legacy to descriptor wallets
@@ -27,6 +30,8 @@ class BerkeleyRODatabase : public WalletDatabase
2730
}
2831
~BerkeleyRODatabase(){};
2932

33+
BerkeleyROData m_records;
34+
3035
/** Open the database if it is not already opened. */
3136
void Open() override;
3237

@@ -69,7 +74,15 @@ class BerkeleyRODatabase : public WalletDatabase
6974

7075
class BerkeleyROCursor : public DatabaseCursor
7176
{
77+
private:
78+
const BerkeleyRODatabase& m_database;
79+
BerkeleyROData::const_iterator m_cursor;
80+
BerkeleyROData::const_iterator m_cursor_end;
81+
7282
public:
83+
explicit BerkeleyROCursor(const BerkeleyRODatabase& database, Span<const std::byte> prefix = {});
84+
~BerkeleyROCursor() {}
85+
7386
Status Next(DataStream& key, DataStream& value) override;
7487
};
7588

@@ -97,8 +110,8 @@ class BerkeleyROBatch : public DatabaseBatch
97110
void Flush() override {}
98111
void Close() override {}
99112

100-
std::unique_ptr<DatabaseCursor> GetNewCursor() override { return std::make_unique<BerkeleyROCursor>(); }
101-
std::unique_ptr<DatabaseCursor> GetNewPrefixCursor(Span<const std::byte> prefix) override { return std::make_unique<BerkeleyROCursor>(); }
113+
std::unique_ptr<DatabaseCursor> GetNewCursor() override { return std::make_unique<BerkeleyROCursor>(m_database); }
114+
std::unique_ptr<DatabaseCursor> GetNewPrefixCursor(Span<const std::byte> prefix) override;
102115
bool TxnBegin() override { return false; }
103116
bool TxnCommit() override { return false; }
104117
bool TxnAbort() override { return false; }

src/wallet/test/util.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,6 @@ CTxDestination getNewDestination(CWallet& w, OutputType output_type)
9393
return *Assert(w.GetNewDestination(output_type, ""));
9494
}
9595

96-
// BytePrefix compares equality with other byte spans that begin with the same prefix.
97-
struct BytePrefix { Span<const std::byte> prefix; };
98-
bool operator<(BytePrefix a, Span<const std::byte> b) { return a.prefix < b.subspan(0, std::min(a.prefix.size(), b.size())); }
99-
bool operator<(Span<const std::byte> a, BytePrefix b) { return a.subspan(0, std::min(a.size(), b.prefix.size())) < b.prefix; }
100-
10196
MockableCursor::MockableCursor(const MockableData& records, bool pass, Span<const std::byte> prefix)
10297
{
10398
m_pass = pass;

0 commit comments

Comments
 (0)