LMDBAL 0.6.2
LMDB (Lightning Memory-Mapped Database Manager) Abstraction Layer
Loading...
Searching...
No Matches
storagecommon.h
1/*
2 * LMDB Abstraction Layer.
3 * Copyright (C) 2023 Yury Gubich <blue@macaw.me>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#pragma once
20
21#include <string>
22#include <string_view>
23#include <cstdint>
24
25#include <lmdb.h>
26
27#include "base.h"
28#include "transaction.h"
29
30namespace LMDBAL {
31
32class CursorCommon;
33
35 friend class Base;
36 friend class CursorCommon;
37public:
38protected:
39 StorageCommon(Base* parent, const std::string& name, bool duplicates = false);
40 virtual ~ StorageCommon();
41
48 virtual int open(MDB_txn * transaction) = 0;
49 virtual void close();
50 virtual void handleDrop();
51
52 bool isDBOpened() const;
53 const std::string& dbName() const;
54
55 void ensureOpened(std::string_view methodName) const;
56 void throwDuplicateOrUnknown(int rc, std::string_view key) const;
57 void throwDuplicateOrUnknown(int rc, TransactionID txn, std::string_view key) const;
58 void throwNotFoundOrUnknown(int rc, std::string_view key) const;
59 void throwNotFoundOrUnknown(int rc, TransactionID txn, std::string_view key) const;
60 void throwUnknown(int rc, TransactionID txn) const;
61 void throwUnknown(int rc) const;
62 void throwUnknown(std::string_view message) const;
63 void throwDuplicate(std::string_view key) const;
64 void throwNotFound(std::string_view key) const;
65 void throwCursorNotReady(std::string_view method) const;
66
67 TransactionID extractTransactionId(const Transaction& txn, std::string_view action = {}) const;
71 void abortTransaction(TransactionID id) const;
72 virtual void transactionStarted(TransactionID txn, bool readOnly) const;
73 virtual void transactionCommited(TransactionID txn);
74 virtual void transactionAborted(TransactionID txn) const;
75 virtual int drop(TransactionID transaction);
76 virtual SizeType count(TransactionID txn) const;
77
78 Transaction* getTransactionForCursor(MDB_cursor* cursor) const;
79
80 void openCursorTransaction(MDB_cursor** cursor, bool renew = false) const;
81 void closeCursorTransaction(MDB_cursor* cursor, bool closeCursor = false) const;
82
83 int _mdbOpen(MDB_txn* txn, unsigned int flags = 0);
84
85 int _mdbPut(MDB_txn* txn, MDB_val& key, MDB_val& data, unsigned int flags = 0);
86 int _mdbGet(MDB_txn* txn, MDB_val& key, MDB_val& data) const;
87 int _mdbDel(MDB_txn* txn, MDB_val& key);
88 int _mdbDel(MDB_txn* txn, MDB_val& key, MDB_val& data);
89
90 int _mdbStat(MDB_txn* txn, MDB_stat& stat) const;
91 int _mdbFlags(MDB_txn* txn, uint32_t& flags) const;
92
93 int _mdbCursorOpen(MDB_txn* txn, MDB_cursor** cursor) const;
94 void _mdbCursorClose(MDB_cursor* cursor) const;
95 int _mdbCursorGet(MDB_cursor* cursor, MDB_val& key, MDB_val& data, MDB_cursor_op operation) const;
96 int _mdbCursorSet(MDB_cursor* cursor, MDB_val& key) const;
97 int _mdbCursorDel(MDB_cursor* cursor, unsigned int flags = 0);
98 int _mdbCursorPut(MDB_cursor* cursor, MDB_val& key, MDB_val& data, unsigned int flags = 0);
99
100 int _mdbCursorRenew(MDB_txn* txn, MDB_cursor* cursor) const;
101 MDB_txn* _mdbCursorTxn(MDB_cursor* cursor) const;
102
103public:
104 virtual void drop();
105 virtual int drop(const WriteTransaction& txn);
106 virtual SizeType count() const;
107 virtual SizeType count(const Transaction& txn) const;
108
109protected:
110 MDB_dbi dbi;
111 Base* db;
112 const std::string name;
113 const bool duplicates;
114
115 inline static constexpr std::string_view dropMethodName = "drop";
116 inline static constexpr std::string_view countMethodName = "count";
117 inline static constexpr std::string_view flagsMethodName = "flags";
118
119 inline static constexpr std::string_view addRecordMethodName = "addRecord";
120 inline static constexpr std::string_view forceRecordMethodName = "forceRecord";
121 inline static constexpr std::string_view changeRecordMethodName = "changeRecord";
122 inline static constexpr std::string_view removeRecordMethodName = "removeRecord";
123 inline static constexpr std::string_view checkRecordMethodName = "checkRecord";
124 inline static constexpr std::string_view getRecordMethodName = "getRecord";
125 inline static constexpr std::string_view readAllMethodName = "readAllRecord";
126 inline static constexpr std::string_view replaceAllMethodName = "replaceAll";
127 inline static constexpr std::string_view addRecordsMethodName = "addRecords";
128 inline static constexpr std::string_view openCursorTransactionMethodName = "openCursorTransaction";
129
130protected:
131 template <class K, class V>
132 int makeStorage(MDB_txn* transaction, bool duplicates = false);
133
134 template <class T>
135 static std::string toString(const T& value);
136};
137
138}
139
140#include "storagecommon.hpp"
An object to manage cursor internals and state.
Definition cursorcommon.h:32
StorageCommon(Base *parent, const std::string &name, bool duplicates=false)
Constructs a storage interface.
Definition storagecommon.cpp:42
void commitTransaction(TransactionID id)
Commits transaction.
Definition storagecommon.cpp:456
void throwNotFound(std::string_view key) const
Throws LMDBAL::NotFound.
Definition storagecommon.cpp:406
virtual void transactionCommited(TransactionID txn)
called on commitment of public transaction
Definition storagecommon.cpp:487
static constexpr std::string_view forceRecordMethodName
member function name, just for exceptions
Definition storagecommon.h:120
static constexpr std::string_view removeRecordMethodName
member function name, just for exceptions
Definition storagecommon.h:122
TransactionID beginReadOnlyTransaction() const
Begins read-only transaction.
Definition storagecommon.cpp:428
int makeStorage(MDB_txn *transaction, bool duplicates=false)
A functiion to actually open MDB_dbi storage.
Definition storagecommon.hpp:38
void abortTransaction(TransactionID id) const
Aborts transaction.
Definition storagecommon.cpp:446
static std::string toString(const T &value)
A method to cast a value (which can be a value or a key) to string.
Definition storagecommon.hpp:71
static constexpr std::string_view addRecordMethodName
member function name, just for exceptions
Definition storagecommon.h:119
void throwDuplicateOrUnknown(int rc, std::string_view key) const
Throws LMDBAL::Exist or LMDBAL::Unknown.
Definition storagecommon.cpp:301
Transaction * getTransactionForCursor(MDB_cursor *cursor) const
Retrieves a public transaction object for a cursor handle.
Definition storagecommon.cpp:173
virtual SizeType count() const
Storage size.
Definition storagecommon.cpp:148
virtual void close()
A private virtual function to close each storage in the database.
Definition storagecommon.cpp:57
static constexpr std::string_view getRecordMethodName
member function name, just for exceptions
Definition storagecommon.h:124
static constexpr std::string_view changeRecordMethodName
member function name, just for exceptions
Definition storagecommon.h:121
const std::string name
this storage name
Definition storagecommon.h:112
TransactionID extractTransactionId(const Transaction &txn, std::string_view action={}) const
Checks if the transaction is still active, returns inner TransactionID.
Definition storagecommon.cpp:72
static constexpr std::string_view readAllMethodName
member function name, just for exceptions
Definition storagecommon.h:125
virtual void handleDrop()
A method where database additionally handles drop.
Definition storagecommon.cpp:510
virtual int open(MDB_txn *transaction)=0
A private virtual function I need to open each storage in the database.
const std::string & dbName() const
Database name.
Definition storagecommon.cpp:348
static constexpr std::string_view openCursorTransactionMethodName
member function name, just for exceptions
Definition storagecommon.h:128
static constexpr std::string_view checkRecordMethodName
member function name, just for exceptions
Definition storagecommon.h:123
void throwCursorNotReady(std::string_view method) const
Throws LMDBAL::CursorNotReady.
Definition storagecommon.cpp:418
void closeCursorTransaction(MDB_cursor *cursor, bool closeCursor=false) const
Closes transaction that is private to LMDBAL::Cursor, but public to the LMDBAL::Storage.
Definition storagecommon.cpp:213
static constexpr std::string_view replaceAllMethodName
member function name, just for exceptions
Definition storagecommon.h:126
void ensureOpened(std::string_view methodName) const
Helper function; throws an exception if the database is not opened.
Definition storagecommon.cpp:135
void throwNotFoundOrUnknown(int rc, std::string_view key) const
Throws LMDBAL::NotFound or LMDBAL::Unknown (transaction variant).
Definition storagecommon.cpp:319
virtual void transactionAborted(TransactionID txn) const
called on abortion of public transaction
Definition storagecommon.cpp:501
void throwUnknown(int rc, TransactionID txn) const
Throws LMDBAL::Unknown (transaction vairiant).
Definition storagecommon.cpp:336
MDB_dbi dbi
lmdb storage handle
Definition storagecommon.h:110
TransactionID beginTransaction() const
Begins writable transaction.
Definition storagecommon.cpp:438
const bool duplicates
true if storage supports duplicates
Definition storagecommon.h:113
bool isDBOpened() const
Is database opened.
Definition storagecommon.cpp:358
static constexpr std::string_view addRecordsMethodName
member function name, just for exceptions
Definition storagecommon.h:127
void openCursorTransaction(MDB_cursor **cursor, bool renew=false) const
Opens a transaction that is ment to be private to LMDBAL::Cursor, but public to the LMDBAL::Storage.
Definition storagecommon.cpp:189
static constexpr std::string_view flagsMethodName
member function name, just for exceptions
Definition storagecommon.h:117
virtual void transactionStarted(TransactionID txn, bool readOnly) const
called on beginning of public transaction
Definition storagecommon.cpp:471
static constexpr std::string_view countMethodName
member function name, just for exceptions
Definition storagecommon.h:116
Base * db
parent database pointer (borrowed)
Definition storagecommon.h:111
virtual void drop()
Drops content of a storage interface.
Definition storagecommon.cpp:87
void throwDuplicate(std::string_view key) const
Throws LMDBAL::Exist.
Definition storagecommon.cpp:394
static constexpr std::string_view dropMethodName
member function name, just for exceptions
Definition storagecommon.h:115
Public read only transaction.
Definition transaction.h:27
Public writable transaction.
Definition transaction.h:54
Destroys a cache.
Definition base.h:36
MDB_txn * TransactionID
I'm going to use transaction pointers as transaction IDs.
Definition base.h:52
uint32_t SizeType
All LMDBAL sizes are uint32.
Definition base.h:53