/* * 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 . */ #ifndef LMDBAL_CACHE_H #define LMDBAL_CACHE_H #include #include #include #include "storage.h" namespace LMDBAL { template class Cache : public Storage { friend class Base; enum class Mode { /** Entry; typedef std::list Queue; typedef std::map TransactionCache; protected: Cache(const std::string& name, Base* parent); ~Cache() override; virtual void transactionStarted(TransactionID txn, bool readOnly) const override; virtual void transactionCommited(TransactionID txn) override; virtual void transactionAborted(TransactionID txn) const override; private: void handleMode() const; void handleTransactionEntry(const Entry& entry); void destroyTransactionEntry(const Entry& entry) const; void handleAddRecord(const K& key, const V& value); void handleRemoveRecord(const K& key); void handleChangeRecord(const K& key, const V& value); void handleForceRecord(const K& key, const V& value, bool added); void handleReplaceAll(std::map* data); void handleAddRecords(const std::map& data, bool overwrite, SizeType newSize); void handleDrop(); public: using Storage::drop; virtual int drop(TransactionID transaction) override; virtual void addRecord(const K& key, const V& value) override; virtual void addRecord(const K& key, const V& value, TransactionID txn) override; virtual bool forceRecord(const K& key, const V& value) override; virtual bool forceRecord(const K& key, const V& value, TransactionID txn) override; virtual void changeRecord(const K& key, const V& value) override; virtual void changeRecord(const K& key, const V& value, TransactionID txn) override; virtual void removeRecord(const K& key) override; virtual void removeRecord(const K& key, TransactionID txn) override; virtual bool checkRecord(const K& key) const override; virtual bool checkRecord(const K& key, TransactionID txn) const override; virtual void getRecord(const K& key, V& out) const override; virtual void getRecord(const K& key, V& out, TransactionID txn) const override; virtual V getRecord(const K& key) const override; virtual V getRecord(const K& key, TransactionID txn) const override; virtual SizeType count() const override; virtual SizeType count(TransactionID txn) const override; virtual std::map readAll() const override; virtual std::map readAll(TransactionID txn) const override; virtual void readAll(std::map& out) const override; virtual void readAll(std::map& out, TransactionID txn) const override; virtual void replaceAll(const std::map& data) override; virtual void replaceAll(const std::map& data, TransactionID txn) override; virtual SizeType addRecords(const std::map& data, bool overwrite = false) override; virtual SizeType addRecords(const std::map& data, TransactionID txn, bool overwrite = false) override; protected: /** * \brief Cache mode * * Sometimes we have a complete information about the content of the database, * and we don't even need to refer to lmdb to fetch or check for data. * This member actually shows what is the current state, more about them you can read in Enum descriptions * * It's done with pointer to comply some of the const method limitations which would modify this state eventually */ Mode* mode; std::map* cache; /**<\brief Cached data*/ std::set* abscent; /**<\brief Set of keys that are definitely not in the cache*/ SizeType* sizeDifference; /**<\brief Difference of size between cached data and amount of records in the lmdb storage*/ TransactionCache* transactionCache; /**<\brief All changes made under under uncommited transactions*/ }; } #include "cache.hpp" #endif // LMDBAL_CACHE_H