/* * LMDB Abstraction Layer. * Copyright (C) 2023 Yury Gubich * * 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 . */ #pragma once #include #include #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 Storage : public StorageCommon { friend class ::BaseTest; friend class ::DuplicatesTest; friend class ::CacheCursorTest; friend class ::StorageCursorTest; friend class Base; friend class Cursor; 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 readAll(TransactionID txn) const; virtual void readAll(std::map& result, TransactionID txn) const; virtual void replaceAll(const std::map& data, TransactionID txn); virtual uint32_t addRecords(const std::map& 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 readAll() const; virtual std::map readAll(const Transaction& txn) const; virtual void readAll(std::map& result) const; virtual void readAll(std::map& result, const Transaction& txn) const; virtual void replaceAll(const std::map& data); virtual void replaceAll(const std::map& data, const WriteTransaction& txn); virtual uint32_t addRecords(const std::map& data, bool overwrite = false); virtual uint32_t addRecords(const std::map& data, const WriteTransaction& txn, bool overwrite = false); Cursor createCursor(); void destroyCursor(Cursor& cursor); protected: mutable Serializer keySerializer; /**<\brief internal object that would serialize and deserialize keys*/ mutable Serializer valueSerializer; /**<\brief internal object that would serialize and deserialize values*/ std::map*> 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"