Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
lmdb_store.cpp
Go to the documentation of this file.
7#include "lmdb.h"
8#include <cstdint>
9#include <memory>
10#include <mutex>
11#include <optional>
12#include <stdexcept>
13
14namespace bb::lmdblib {
15LMDBStore::LMDBStore(std::string directory, uint64_t mapSizeKb, uint64_t maxNumReaders, uint64_t maxDbs)
16 : LMDBStoreBase(std::move(directory), mapSizeKb, maxNumReaders, maxDbs)
17{}
18
19void LMDBStore::open_database(const std::string& name, bool duplicateKeysPermitted)
20{
22 {
24 try {
25 db = std::make_shared<LMDBDatabase>(_environment, *tx, name, false, false, duplicateKeysPermitted);
26 tx->commit();
27 } catch (std::exception& e) {
28 tx->try_abort();
29 throw std::runtime_error(format("Unable to create database: ", name, " Error: ", e.what()));
30 }
31 }
32 // if we are here then we successfully created the database
34 databases[name] = db;
35}
36
37void LMDBStore::close_database(const std::string& name)
38{
40 {
42 const auto it = databases.find(name);
43 if (it == databases.end()) {
44 throw std::runtime_error(format("Database ", name, " not found"));
45 }
46 db = it->second;
47 databases.erase(it);
48 }
49}
50
52{
54 const auto it = databases.find(name);
55 if (it == databases.end()) {
56 throw std::runtime_error(format("Database ", name, " not found"));
57 }
58 return it->second;
59}
60
62{
65 dbs.reserve(databases.size());
66 for (const auto& db : databases) {
67 dbs.push_back(db.second);
68 }
69 return dbs;
70}
71
73{
76 dbs.reserve(puts.size());
77 for (const auto& p : puts) {
78 const auto it = databases.find(p.name);
79 if (it == databases.end()) {
80 throw std::runtime_error(format("Database ", p.name, " not found"));
81 }
82 dbs.push_back(it->second);
83 }
84 return dbs;
85}
86
88{
91 for (const auto& db : dbs) {
92 stats.push_back(db->get_stats(*tx));
93 }
94 return { _environment->get_map_size(), _environment->get_data_file_size() };
95}
96
98{
101 try {
102 for (size_t i = 0; i < data.size(); i++) {
103 put(data[i].toWrite, data[i].toDelete, *dbs[i], *tx);
104 }
105 tx->commit();
106 } catch (std::exception& e) {
107 tx->try_abort();
108 throw std::runtime_error(format("Failed to commit data", " Error: ", e.what()));
109 }
110}
111
112void LMDBStore::get(KeysVector& keys, OptionalValuesVector& values, const std::string& name)
113{
114 get(keys, values, get_database(name));
115}
116
118 KeyOptionalValuesVector& toDelete,
119 const LMDBDatabase& db,
121{
122 for (auto& kd : toWrite) {
123 for (auto& p : kd.second) {
124 tx.put_value(kd.first, p, db);
125 }
126 }
127 for (auto& kd : toDelete) {
128 if (!kd.second.has_value()) {
129 tx.delete_value(kd.first, db);
130 continue;
131 }
132 for (auto& p : kd.second.value()) {
133 tx.delete_value(kd.first, p, db);
134 }
135 }
136}
138{
139 values.reserve(keys.size());
141 if (!db->duplicate_keys_permitted()) {
142 const LMDBDatabase& dbRef = *db;
143 for (auto& k : keys) {
145 Value value;
146 bool result = tx->get_value(k, value, dbRef);
148 values.emplace_back(optional);
149 }
150 return;
151 }
152 {
153 Cursor::Ptr cursor = std::make_unique<Cursor>(tx, db, _environment->getNextId());
154 for (auto& k : keys) {
155 if (!cursor->set_at_key(k)) {
156 values.emplace_back(std::nullopt);
157 continue;
158 }
160 cursor->read_next(1, keyValuePairs);
161 if (keyValuePairs.empty()) {
162 // this shouldn't happen but return the null optional anyway
163 values.emplace_back(std::nullopt);
164 continue;
165 }
167 values.reserve(keyValuePairs.size());
168 for (auto& kv : keyValuePairs) {
169 for (auto& vals : kv.second) {
170 retrievedValues.push_back(std::move(vals));
171 }
172 }
174 values.emplace_back(optionalValues);
175 }
176 }
177}
178
180{
182 return std::make_unique<Cursor>(tx, db, _environment->getNextId());
183}
184} // namespace bb::lmdblib
std::unique_ptr< LMDBCursor > Ptr
std::unique_ptr< LMDBDatabaseCreationTransaction > Ptr
std::shared_ptr< LMDBDatabase > SharedPtr
std::shared_ptr< LMDBReadTransaction > SharedPtr
LMDBEnvironment::SharedPtr _environment
LMDBDatabaseCreationTransaction::Ptr create_db_transaction() const
WriteTransaction::Ptr create_write_transaction() const
ReadTransaction::Ptr create_read_transaction() const
std::vector< Database::SharedPtr > get_databases() const
Database::SharedPtr get_database(const std::string &name)
void open_database(const std::string &name, bool duplicateKeysPermitted=false)
std::pair< uint64_t, uint64_t > get_stats(std::vector< DBStats > &stats) const
void close_database(const std::string &name)
LMDBStore(std::string directory, uint64_t mapSizeKb, uint64_t maxNumReaders, uint64_t maxDbs)
void put(std::vector< PutData > &data)
std::unordered_map< std::string, LMDBDatabase::SharedPtr > databases
Cursor::Ptr create_cursor(ReadTransaction::SharedPtr tx, const std::string &dbName)
void get(KeysVector &keys, OptionalValuesVector &values, const std::string &name)
std::unique_ptr< LMDBWriteTransaction > Ptr
void put_value(T &key, Value &data, const LMDBDatabase &db)
void delete_value(T &key, const LMDBDatabase &db)
std::string format(Args... args)
Definition log.hpp:20
const std::vector< FF > data
std::vector< Key > KeysVector
Definition types.hpp:13
std::vector< uint8_t > Value
Definition types.hpp:12
std::vector< KeyValuesPair > KeyDupValuesVector
Definition types.hpp:18
std::vector< OptionalValues > OptionalValuesVector
Definition types.hpp:17
std::vector< Value > ValuesVector
Definition types.hpp:14
std::vector< KeyOptionalValuesPair > KeyOptionalValuesVector
Definition types.hpp:20
std::optional< ValuesVector > OptionalValues
Definition types.hpp:16
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13