105 lines
4.5 KiB
C++
105 lines
4.5 KiB
C++
/*
|
|
* LMDB Abstraction Layer.
|
|
* Copyright (C) 2023 Yury Gubich <blue@macaw.me>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <type_traits>
|
|
#include <cstring>
|
|
|
|
#include "base.h"
|
|
#include "serializer.h"
|
|
#include "cursor.h"
|
|
#include "transaction.h"
|
|
#include "storagecommon.h"
|
|
|
|
class BaseTest;
|
|
class DuplicatesTest;
|
|
class CacheCursorTest;
|
|
class StorageCursorTest;
|
|
|
|
namespace LMDBAL {
|
|
|
|
template <class K, class V>
|
|
class Storage : public StorageCommon {
|
|
friend class ::BaseTest;
|
|
friend class ::DuplicatesTest;
|
|
friend class ::CacheCursorTest;
|
|
friend class ::StorageCursorTest;
|
|
friend class Base;
|
|
friend class Cursor<K, V>;
|
|
protected:
|
|
Storage(Base* parent, const std::string& name, bool duplicates = false);
|
|
~Storage() override;
|
|
|
|
virtual void discoveredRecord(const K& key, const V& value) const;
|
|
virtual void discoveredRecord(const K& key, const V& value, TransactionID txn) const;
|
|
uint32_t flags() const;
|
|
|
|
virtual void addRecord(const K& key, const V& value, TransactionID txn);
|
|
virtual bool forceRecord(const K& key, const V& value, TransactionID txn);
|
|
virtual void changeRecord(const K& key, const V& value, TransactionID txn);
|
|
virtual void removeRecord(const K& key, TransactionID txn);
|
|
virtual bool checkRecord(const K& key, TransactionID txn) const;
|
|
virtual void getRecord(const K& key, V& value, TransactionID txn) const;
|
|
virtual V getRecord(const K& key, TransactionID txn) const;
|
|
virtual std::map<K, V> readAll(TransactionID txn) const;
|
|
virtual void readAll(std::map<K, V>& result, TransactionID txn) const;
|
|
virtual void replaceAll(const std::map<K, V>& data, TransactionID txn);
|
|
virtual uint32_t addRecords(const std::map<K, V>& data, TransactionID txn, bool overwrite = false);
|
|
|
|
public:
|
|
using StorageCommon::drop;
|
|
virtual void addRecord(const K& key, const V& value);
|
|
virtual void addRecord(const K& key, const V& value, const WriteTransaction& txn);
|
|
virtual bool forceRecord(const K& key, const V& value); //returns true if there was addition, false if change
|
|
virtual bool forceRecord(const K& key, const V& value, const WriteTransaction& txn);
|
|
virtual void changeRecord(const K& key, const V& value);
|
|
virtual void changeRecord(const K& key, const V& value, const WriteTransaction& txn);
|
|
virtual void removeRecord(const K& key);
|
|
virtual void removeRecord(const K& key, const WriteTransaction& txn);
|
|
virtual bool checkRecord(const K& key) const; //checks if there is a record with given key
|
|
virtual bool checkRecord(const K& key, const Transaction& txn) const;
|
|
virtual void getRecord(const K& key, V& value) const;
|
|
virtual void getRecord(const K& key, V& value, const Transaction& txn) const;
|
|
virtual V getRecord(const K& key) const;
|
|
virtual V getRecord(const K& key, const Transaction& txn) const;
|
|
virtual std::map<K, V> readAll() const;
|
|
virtual std::map<K, V> readAll(const Transaction& txn) const;
|
|
virtual void readAll(std::map<K, V>& result) const;
|
|
virtual void readAll(std::map<K, V>& result, const Transaction& txn) const;
|
|
virtual void replaceAll(const std::map<K, V>& data);
|
|
virtual void replaceAll(const std::map<K, V>& data, const WriteTransaction& txn);
|
|
virtual uint32_t addRecords(const std::map<K, V>& data, bool overwrite = false);
|
|
virtual uint32_t addRecords(const std::map<K, V>& data, const WriteTransaction& txn, bool overwrite = false);
|
|
|
|
Cursor<K, V> createCursor();
|
|
void destroyCursor(Cursor<K, V>& cursor);
|
|
|
|
protected:
|
|
mutable Serializer<K> keySerializer; /**<\brief internal object that would serialize and deserialize keys*/
|
|
mutable Serializer<V> valueSerializer; /**<\brief internal object that would serialize and deserialize values*/
|
|
std::map<uint32_t, Cursor<K, V>*> cursors; /**<\brief a set of cursors that has been created under this storage*/
|
|
|
|
int open(MDB_txn* transaction) override;
|
|
void close() override;
|
|
};
|
|
|
|
}
|
|
|
|
#include "storage.hpp"
|