/* * 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_BASE_H #define LMDBAL_BASE_H #include #include #include #include #include #include #include #include #include #include "exceptions.h" namespace LMDBAL { class iStorage; template class Serializer; template class Storage; template class Cache; typedef MDB_txn* TransactionID; class Base { friend class iStorage; public: Base(const QString& name, uint16_t mapSize = 10); ~Base(); void open(); void close(); bool ready() const; bool removeDirectory(); QString createDirectory(); QString getName() const; void drop(); TransactionID beginReadOnlyTransaction() const; TransactionID beginTransaction() const; void commitTransaction(TransactionID id) const; void abortTransaction(TransactionID id) const; template LMDBAL::Storage* addStorage(const std::string& name); template LMDBAL::Cache* addCache(const std::string& name); template LMDBAL::Storage* getStorage(const std::string& name); template LMDBAL::Cache* getCache(const std::string& name); private: typedef std::map Storages; typedef std::set Transactions; TransactionID beginReadOnlyTransaction(const std::string& storageName) const; TransactionID beginTransaction(const std::string& storageName) const; void commitTransaction(TransactionID id, const std::string& storageName) const; void abortTransaction(TransactionID id, const std::string& storageName) const; TransactionID beginPrivateReadOnlyTransaction(const std::string& storageName) const; TransactionID beginPrivateTransaction(const std::string& storageName) const; void commitPrivateTransaction(TransactionID id, const std::string& storageName) const; void abortPrivateTransaction(TransactionID id, const std::string& storageName) const; private: std::string name; bool opened; uint16_t size; MDB_env* environment; Storages storages; Transactions* transactions; inline static const std::string emptyName = ""; }; } #include "operators.hpp" /** * Adds LMDBAL::Storage with the given name to the LMDBAL::Base, also returns it. The LMDBAL::Base must be closed */ template LMDBAL::Storage* LMDBAL::Base::addStorage(const std::string& p_name) { if (opened) { throw Opened(name, "add storage " + p_name); } Storage* storage = new Storage(p_name, this); storages.insert(std::make_pair(p_name, (iStorage*)storage)); return storage; } /** * Adds LMDBAL::Cache with given the name to the LMDBAL::Base, also returns it. The LMDBAL::Base must be closed */ template LMDBAL::Cache * LMDBAL::Base::addCache(const std::string& p_name) { if (opened) { throw Opened(name, "add cache " + p_name); } Cache* cache = new Cache(p_name, this); storages.insert(std::make_pair(p_name, (iStorage*)cache)); return cache; } /** * Returns LMDBAL::Storage with the given name */ template LMDBAL::Storage* LMDBAL::Base::getStorage(const std::string& p_name) { return static_cast*>(storages.at(p_name)); } /** * Returns LMDBAL::Cache with the given name */ template LMDBAL::Cache* LMDBAL::Base::getCache(const std::string& p_name) { return static_cast*>(storages.at(p_name)); } #endif //LMDBAL_BASE_H