14class LMDBWriteTransaction;
17namespace lmdb_queries {
19template <
typename TKey,
typename TValue,
typename TxType>
23 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
24 MDB_cursor* cursor =
nullptr;
30 dbKey.mv_size = keySize;
31 dbKey.mv_data = (
void*)keyBuffer.data();
35 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
39 if (keyBuffer == temp) {
46 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_PREV);
50 if (dbKey.mv_size != keySize) {
57 }
else if (code == MDB_NOTFOUND) {
60 throw_error(
"get_value_or_previous::mdb_cursor_get", code);
63 }
else if (code == MDB_NOTFOUND) {
65 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_PREV);
68 if (dbKey.mv_size != keySize) {
75 }
else if (code == MDB_NOTFOUND) {
78 throw_error(
"get_value_or_previous::mdb_cursor_get", code);
81 throw_error(
"get_value_or_previous::mdb_cursor_get", code);
83 }
catch (std::exception& e) {
91template <
typename TKey,
typename TValue,
typename TxType>
95 const std::function<
bool(
const MDB_val&)>& is_valid,
99 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
100 MDB_cursor* cursor =
nullptr;
101 bool success =
false;
106 dbKey.mv_size = keySize;
107 dbKey.mv_data = (
void*)keyBuffer.data();
111 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
117 if (keyBuffer == temp || lower) {
119 if (is_valid(dbVal)) {
126 }
else if (dbKey.mv_size < keySize) {
135 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_PREV);
139 }
else if (code == MDB_NOTFOUND) {
143 throw_error(
"get_value_or_previous::mdb_cursor_get", code);
146 }
else if (code == MDB_NOTFOUND) {
149 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_PREV);
152 if (dbKey.mv_size != keySize) {
156 if (is_valid(dbVal)) {
164 }
else if (code == MDB_NOTFOUND) {
167 throw_error(
"get_value_or_previous::mdb_cursor_get", code);
171 throw_error(
"get_value_or_previous::mdb_cursor_get", code);
173 }
catch (std::exception& e) {
182template <
typename TKey,
typename TxType>
185 bool success =
false;
187 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
188 MDB_cursor* cursor =
nullptr;
193 dbKey.mv_size = keySize;
194 dbKey.mv_data = (
void*)keyBuffer.data();
198 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
203 if (keySize == dbKey.mv_size) {
208 }
else if (code == MDB_NOTFOUND) {
211 throw_error(
"get_value_or_greater::mdb_cursor_get", code);
213 }
catch (std::exception& e) {
221template <
typename TKey,
typename TxType>
225 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
226 MDB_cursor* cursor =
nullptr;
231 dbKey.mv_size = keySize;
232 dbKey.mv_data = (
void*)keyBuffer.data();
236 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
241 if (keySize != dbKey.mv_size) {
247 data.emplace_back(temp);
250 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_NEXT);
251 }
else if (code == MDB_NOTFOUND) {
255 throw_error(
"get_all_values_greater_or_equal_key::mdb_cursor_get", code);
258 }
catch (std::exception& e) {
265template <
typename TKey,
typename TxType>
269 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
270 MDB_cursor* cursor =
nullptr;
275 dbKey.mv_size = keySize;
276 dbKey.mv_data = (
void*)keyBuffer.data();
280 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
285 if (keySize != dbKey.mv_size) {
289 code = mdb_cursor_del(cursor, 0);
292 throw_error(
"delete_all_values_greater_or_equal_key::mdb_cursor_del", code);
296 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_NEXT);
297 }
else if (code == MDB_NOTFOUND) {
301 throw_error(
"delete_all_values_greater_or_equal_key::mdb_cursor_get", code);
304 }
catch (std::exception& e) {
311template <
typename TKey,
typename TxType>
315 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
316 MDB_cursor* cursor =
nullptr;
321 dbKey.mv_size = keySize;
322 dbKey.mv_data = (
void*)keyBuffer.data();
326 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
330 if (keyBuffer == temp) {
334 data.push_back(temp);
339 }
else if (code == MDB_NOTFOUND) {
342 throw_error(
"get_all_values_lesser_or_equal_key::mdb_cursor_get", code);
347 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_PREV);
351 if (dbKey.mv_size != keySize) {
357 data.push_back(temp);
359 }
else if (MDB_NOTFOUND) {
363 throw_error(
"get_all_values_lesser_or_equal_key::mdb_cursor_get", code);
366 }
catch (std::exception& e) {
373template <
typename TKey,
typename TxType>
377 uint32_t keySize =
static_cast<uint32_t
>(keyBuffer.size());
378 MDB_cursor* cursor =
nullptr;
383 dbKey.mv_size = keySize;
384 dbKey.mv_data = (
void*)keyBuffer.data();
388 int code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_SET_RANGE);
392 if (keyBuffer == temp) {
394 code = mdb_cursor_del(cursor, 0);
397 throw_error(
"delete_all_values_lesser_or_equal_key::mdb_cursor_del", code);
403 }
else if (code == MDB_NOTFOUND) {
406 throw_error(
"get_all_values_lesser_or_equal_key::mdb_cursor_get", code);
411 code = mdb_cursor_get(cursor, &dbKey, &dbVal, MDB_PREV);
415 if (dbKey.mv_size != keySize) {
419 code = mdb_cursor_del(cursor, 0);
422 throw_error(
"delete_all_values_lesser_or_equal_key::mdb_cursor_del", code);
425 }
else if (MDB_NOTFOUND) {
429 throw_error(
"get_all_values_lesser_or_equal_key::mdb_cursor_get", code);
432 }
catch (std::exception& e) {
const MDB_dbi & underlying() const
const std::vector< FF > data
void delete_value(Key &key, const LMDBDatabase &db, bb::lmdblib::LMDBWriteTransaction &tx)
void get_all_values_greater_or_equal_key(const TKey &key, ValuesVector &data, const LMDBDatabase &db, const TxType &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 get_value_or_greater(TKey &key, Value &data, const LMDBDatabase &db, const TxType &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)
void delete_all_values_lesser_or_equal_key(const TKey &key, const LMDBDatabase &db, const TxType &tx)
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)
void delete_all_values_greater_or_equal_key(const TKey &key, const LMDBDatabase &db, const TxType &tx)
bool set_at_end(const LMDBCursor &cursor)
bool get_value_or_previous(TKey &key, TValue &data, const LMDBDatabase &db, const TxType &tx)
void get_all_values_lesser_or_equal_key(const TKey &key, ValuesVector &data, const LMDBDatabase &db, const TxType &tx)
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
std::vector< uint8_t > mdb_val_to_vector(const MDB_val &dbVal)
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)