/* * 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_CURSOR_H #define LMDBAL_CURSOR_H #include #include "lmdb.h" #include "base.h" #include "storage.h" #include "transaction.h" namespace LMDBAL { template class Cursor { friend class Storage; private: enum State { /*** parent); Cursor(const Cursor& other) = delete; Cursor(Cursor&& other); ~Cursor(); Cursor& operator = (const Cursor& other) = delete; Cursor& operator = (Cursor&& other); void open(); void open(const Transaction& transaction); void renew(); void renew(const Transaction& transaction); void close(); bool opened() const; bool empty() const; void drop(); std::pair first(); std::pair last(); std::pair next(); std::pair prev(); std::pair current() const; bool set(const K& target); void first(K& key, V& value); void last(K& key, V& value); void next(K& key, V& value); void prev(K& key, V& value); void current(K& key, V& value) const; private: void dropped(); void freed(); void terminated(); void operateCursorRead(K& key, V& value, MDB_cursor_op operation, const std::string& methodName, const std::string& operationName) const; private: Storage* storage; MDB_cursor* cursor; State state; uint32_t id; inline static const std::string openCursorMethodName = "Cursor::open"; /**<\brief member function name, just for exceptions*/ inline static const std::string closeCursorMethodName = "Cursor::close"; /**<\brief member function name, just for exceptions*/ inline static const std::string renewCursorMethodName = "Cursor::renew"; /**<\brief member function name, just for exceptions*/ inline static const std::string firstMethodName = "first"; /**<\brief member function name, just for exceptions*/ inline static const std::string lastMethodName = "last"; /**<\brief member function name, just for exceptions*/ inline static const std::string nextMethodName = "next"; /**<\brief member function name, just for exceptions*/ inline static const std::string prevMethodName = "prev"; /**<\brief member function name, just for exceptions*/ inline static const std::string currentMethodName = "current"; /**<\brief member function name, just for exceptions*/ inline static const std::string setMethodName = "set"; /**<\brief member function name, just for exceptions*/ inline static const std::string firstOperationName = "Cursor::first"; /**<\brief member function name, just for exceptions*/ inline static const std::string lastOperationName = "Cursor::last"; /**<\brief member function name, just for exceptions*/ inline static const std::string nextOperationName = "Cursor::next"; /**<\brief member function name, just for exceptions*/ inline static const std::string prevOperationName = "Cursor::prev"; /**<\brief member function name, just for exceptions*/ inline static const std::string currentOperationName = "Cursor::current"; /**<\brief member function name, just for exceptions*/ }; }; #include "cursor.hpp" #endif //LMDBAL_CURSOR_H