16 dbKey.mv_size =
key.size();
17 dbKey.mv_data = (
void*)
key.
data();
20 dbVal.mv_size =
data.size();
21 dbVal.mv_data = (
void*)
data.data();
25 unsigned int flags = duplicatesPermitted ? MDB_NODUPDATA : 0U;
27 if (code == MDB_KEYEXIST && duplicatesPermitted) {
31 if (code != MDB_SUCCESS) {
40 bool duplicatesPermitted)
43 dbKey.mv_size =
key.size();
44 dbKey.mv_data = (
void*)
key.
data();
50 dbVal.mv_size = serialised.size();
51 dbVal.mv_data = (
void*)serialised.data();
55 unsigned int flags = duplicatesPermitted ? MDB_NODUPDATA : 0U;
62 dbKey.mv_size =
key.size();
63 dbKey.mv_data = (
void*)
key.
data();
65 MDB_val* dbVal =
nullptr;
67 if (code != MDB_SUCCESS && code != MDB_NOTFOUND) {
75 dbKey.mv_size =
key.size();
76 dbKey.mv_data = (
void*)
key.
data();
79 dbVal.mv_size =
value.size();
83 if (code != MDB_SUCCESS && code != MDB_NOTFOUND) {
91 dbKey.mv_size =
key.size();
92 dbKey.mv_data = (
void*)
key.
data();
105 dbKey.mv_size =
key.size();
106 dbKey.mv_data = (
void*)
key.
data();
120 dbKey.mv_size =
key.size();
121 dbKey.mv_data = (
void*)
key.
data();
124 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_SET);
125 return code == MDB_SUCCESS;
131 dbKey.mv_size =
key.size();
132 dbKey.mv_data = (
void*)
key.
data();
135 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_SET_RANGE);
136 return code == MDB_SUCCESS;
143 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_FIRST);
144 return code == MDB_SUCCESS;
151 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_LAST);
152 return code == MDB_SUCCESS;
157 uint64_t numKeysRead = 0;
160 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_GET_CURRENT);
161 while (numKeysRead < numKeysToRead && code == MDB_SUCCESS) {
172 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, op);
175 return code != MDB_SUCCESS;
184 dbTargetKey.mv_size = targetKey.size();
185 dbTargetKey.mv_data = (
void*)targetKey.data();
186 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_GET_CURRENT);
187 while (code == MDB_SUCCESS) {
189 if ((result >= 0 && op == MDB_NEXT) || (result <= 0 && op == MDB_PREV)) {
193 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, op);
200 uint64_t numKeysRead = 0;
206 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_FIRST_DUP);
207 while (numKeysRead < numKeysToRead && code == MDB_SUCCESS) {
208 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_GET_CURRENT);
214 values.push_back(
value);
217 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_NEXT_DUP);
218 if (code == MDB_NOTFOUND) {
224 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, op);
225 if (code == MDB_SUCCESS) {
226 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_FIRST_DUP);
245 dbTargetKey.mv_size = targetKey.size();
246 dbTargetKey.mv_data = (
void*)targetKey.data();
249 int code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_FIRST_DUP);
250 while (code == MDB_SUCCESS) {
251 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_GET_CURRENT);
254 if ((result >= 0 && op == MDB_NEXT_NODUP) || (result <= 0 && op == MDB_PREV_NODUP)) {
261 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_NEXT_DUP);
262 if (code == MDB_NOTFOUND) {
264 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, op);
265 if (code == MDB_SUCCESS) {
267 code = mdb_cursor_get(cursor.
underlying(), &dbKey, &dbVal, MDB_FIRST_DUP);
279 return read_next(cursor, keyValues, numKeysToRead, MDB_NEXT);
283 return read_next(cursor, keyValues, numKeysToRead, MDB_PREV);
288 return read_next_dup(cursor, keyValues, numKeysToRead, MDB_NEXT_NODUP);
292 return read_next_dup(cursor, keyValues, numKeysToRead, MDB_PREV_NODUP);
const MDB_dbi & underlying_db() const
MDB_txn * underlying_tx() const
MDB_cursor * underlying() const
const MDB_dbi & underlying() const
MDB_txn * underlying() const
const std::vector< FF > data
void delete_value(Key &key, const LMDBDatabase &db, bb::lmdblib::LMDBWriteTransaction &tx)
bool read_prev_dup(const LMDBCursor &cursor, KeyDupValuesVector &keyValues, uint64_t numKeysToRead)
bool read_next(const LMDBCursor &cursor, KeyDupValuesVector &keyValues, uint64_t numKeysToRead, MDB_cursor_op op)
bool set_at_start(const LMDBCursor &cursor)
bool get_value(Key &key, Value &data, const LMDBDatabase &db, const bb::lmdblib::LMDBTransaction &tx)
bool count_until_next_dup(const LMDBCursor &cursor, const Key &targetKey, uint64_t &count, MDB_cursor_op op)
bool read_next_dup(const LMDBCursor &cursor, KeyDupValuesVector &keyValues, uint64_t numKeysToRead, MDB_cursor_op op)
bool set_at_key_gte(const LMDBCursor &cursor, Key &key)
bool count_until_prev(const LMDBCursor &cursor, const Key &key, uint64_t &count)
void put_value(Key &key, Value &data, const LMDBDatabase &db, bb::lmdblib::LMDBWriteTransaction &tx, bool duplicatesPermitted)
bool set_at_key(const LMDBCursor &cursor, Key &key)
bool read_prev(const LMDBCursor &cursor, KeyDupValuesVector &keyValues, uint64_t numKeysToRead)
bool set_at_end(const LMDBCursor &cursor)
bool count_until_next(const LMDBCursor &cursor, const Key &targetKey, uint64_t &count, MDB_cursor_op op)
bool count_until_prev_dup(const LMDBCursor &cursor, const Key &key, uint64_t &count)
std::vector< uint8_t > Key
void deserialise_key(void *data, uint8_t &key)
std::vector< uint8_t > serialise_key(uint8_t key)
std::vector< uint8_t > Value
void throw_error(const std::string &errorString, int error)
std::vector< KeyValuesPair > KeyDupValuesVector
void copy_to_vector(const MDB_val &dbVal, std::vector< uint8_t > &target)
std::vector< Value > ValuesVector
bool call_lmdb_func(int(*f)(TArgs...), TArgs... args)
int call_lmdb_func_with_return(int(*f)(TArgs...), TArgs... args)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept