LMDBAL 0.6.0
LMDB (Lightning Memory-Mapped Database Manager) Abstraction Layer
Loading...
Searching...
No Matches
storage.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 <type_traits>
22#include <cstring>
23
24#include "base.h"
25#include "serializer.h"
26#include "cursor.h"
27#include "transaction.h"
28#include "storagecommon.h"
29
30class BaseTest;
31class DuplicatesTest;
32class CacheCursorTest;
33class StorageCursorTest;
34
35namespace LMDBAL {
36
37template <class K, class V>
38class Storage : public StorageCommon {
39 friend class ::BaseTest;
40 friend class ::DuplicatesTest;
41 friend class ::CacheCursorTest;
42 friend class ::StorageCursorTest;
43 friend class Base;
44 friend class Cursor<K, V>;
45protected:
46 Storage(Base* parent, const std::string& name, bool duplicates = false);
47 ~Storage() override;
48
49 virtual void discoveredRecord(const K& key, const V& value) const;
50 virtual void discoveredRecord(const K& key, const V& value, TransactionID txn) const;
51 uint32_t flags() const;
52
53 virtual void addRecord(const K& key, const V& value, TransactionID txn);
54 virtual bool forceRecord(const K& key, const V& value, TransactionID txn);
55 virtual void changeRecord(const K& key, const V& value, TransactionID txn);
56 virtual void removeRecord(const K& key, TransactionID txn);
57 virtual bool checkRecord(const K& key, TransactionID txn) const;
58 virtual void getRecord(const K& key, V& value, TransactionID txn) const;
59 virtual V getRecord(const K& key, TransactionID txn) const;
60 virtual std::map<K, V> readAll(TransactionID txn) const;
61 virtual void readAll(std::map<K, V>& result, TransactionID txn) const;
62 virtual void replaceAll(const std::map<K, V>& data, TransactionID txn);
63 virtual uint32_t addRecords(const std::map<K, V>& data, TransactionID txn, bool overwrite = false);
64
65public:
67 virtual void addRecord(const K& key, const V& value);
68 virtual void addRecord(const K& key, const V& value, const WriteTransaction& txn);
69 virtual bool forceRecord(const K& key, const V& value); //returns true if there was addition, false if change
70 virtual bool forceRecord(const K& key, const V& value, const WriteTransaction& txn);
71 virtual void changeRecord(const K& key, const V& value);
72 virtual void changeRecord(const K& key, const V& value, const WriteTransaction& txn);
73 virtual void removeRecord(const K& key);
74 virtual void removeRecord(const K& key, const WriteTransaction& txn);
75 virtual bool checkRecord(const K& key) const; //checks if there is a record with given key
76 virtual bool checkRecord(const K& key, const Transaction& txn) const;
77 virtual void getRecord(const K& key, V& value) const;
78 virtual void getRecord(const K& key, V& value, const Transaction& txn) const;
79 virtual V getRecord(const K& key) const;
80 virtual V getRecord(const K& key, const Transaction& txn) const;
81 virtual std::map<K, V> readAll() const;
82 virtual std::map<K, V> readAll(const Transaction& txn) const;
83 virtual void readAll(std::map<K, V>& result) const;
84 virtual void readAll(std::map<K, V>& result, const Transaction& txn) const;
85 virtual void replaceAll(const std::map<K, V>& data);
86 virtual void replaceAll(const std::map<K, V>& data, const WriteTransaction& txn);
87 virtual uint32_t addRecords(const std::map<K, V>& data, bool overwrite = false);
88 virtual uint32_t addRecords(const std::map<K, V>& data, const WriteTransaction& txn, bool overwrite = false);
89
91 void destroyCursor(Cursor<K, V>& cursor);
92
93protected:
96 std::map<uint32_t, Cursor<K, V>*> cursors;
97
98 int open(MDB_txn* transaction) override;
99 void close() override;
100};
101
102}
103
104#include "storage.hpp"
An object to iterate storages.
Definition cursor.h:32
A class handling serialization/deserialization.
Definition serializer.h:33
StorageCommon(Base *parent, const std::string &name, bool duplicates=false)
Constructs a storage interface.
Definition storagecommon.cpp:42
virtual int drop(TransactionID transaction)
Drops content of a storage interface (transaction variant)
Definition storagecommon.cpp:109
const std::string name
this storage name
Definition storagecommon.h:111
const bool duplicates
true if storage supports duplicates
Definition storagecommon.h:112
virtual bool checkRecord(const K &key, TransactionID txn) const
Chechs if storage has value (private transaction variant)
Definition storage.hpp:592
Serializer< V > valueSerializer
internal object that would serialize and deserialize values
Definition storage.h:95
virtual void addRecord(const K &key, const V &value, TransactionID txn)
Adds a key-value record to the storage (private transaction variant)
Definition storage.hpp:107
virtual std::map< K, V > readAll() const
Reads whole storage into a map.
Definition storage.hpp:638
~Storage() override
Destroys a storage.
Definition storage.hpp:59
Serializer< K > keySerializer
internal object that would serialize and deserialize keys
Definition storage.h:94
std::map< uint32_t, Cursor< K, V > * > cursors
a set of cursors that has been created under this storage
Definition storage.h:96
virtual void discoveredRecord(const K &key, const V &value) const
A private virtual method that cursor calls when he reads a record, does nothing here but populates th...
Definition storage.hpp:1088
virtual void replaceAll(const std::map< K, V > &data, TransactionID txn)
Replaces the content of the whole storage with the given (private transaction variant)
Definition storage.hpp:809
void destroyCursor(Cursor< K, V > &cursor)
Frees cursor.
Definition storage.hpp:1047
uint32_t flags() const
Reads current storage flags it was opened with.
Definition storage.hpp:1068
virtual void removeRecord(const K &key, TransactionID txn)
Removes one of the records (private transaction variant)
Definition storage.hpp:971
void close() override
A private virtual method I need to close each storage in the database.
Definition storage.hpp:1014
Cursor< K, V > createCursor()
Creates cursor.
Definition storage.hpp:1030
virtual bool forceRecord(const K &key, const V &value, TransactionID txn)
Adds a key-value record to the storage, overwrites if it already exists (private transaction variant)
Definition storage.hpp:198
virtual void changeRecord(const K &key, const V &value, TransactionID txn)
Changes key-value record to the storage (private transaction variant)
Definition storage.hpp:314
virtual void getRecord(const K &key, V &value, TransactionID txn) const
Gets the record from the database (private transaction, reference variant)
Definition storage.hpp:515
Storage(Base *parent, const std::string &name, bool duplicates=false)
Creates a storage.
Definition storage.hpp:48
virtual uint32_t addRecords(const std::map< K, V > &data, TransactionID txn, bool overwrite=false)
Adds records in bulk (private transaction variant)
Definition storage.hpp:887
int open(MDB_txn *transaction) override
A private virtual method I need to open each storage in the database.
Definition storage.hpp:1006
Public read only transaction.
Definition transaction.h:27
Public writable transaction.
Definition transaction.h:54