/* * libfud * Copyright 2024 Dominick Allen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef FUD_SQLITE_HPP #define FUD_SQLITE_HPP #include #include #include #include namespace fud { class SqliteStatement; enum class SqliteOpenMode : int { ReadOnly = SQLITE_OPEN_READONLY, ReadWrite = SQLITE_OPEN_READWRITE, ReadWriteCreate = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE }; class SqliteDb { public: SqliteDb(const String& name, SqliteOpenMode mode, int extraFlags = 0); SqliteDb(const char* name, SqliteOpenMode mode, int extraFlags = 0); SqliteDb(const SqliteDb&) = delete; SqliteDb(SqliteDb&& rhs) noexcept; ~SqliteDb(); SqliteDb& operator=(const SqliteDb&) = delete; SqliteDb& operator=(SqliteDb&& rhs) noexcept; bool valid() const; bool revalidate(); FudStatus exec( const String& statement, int (*callback)(void*, int, char**, char**), void* context, String* errorMessage); constexpr int errorCode() { return m_errorCode; } constexpr sqlite3* handle() const { return m_dbHandle; } // private methods private: void initialize(); [[nodiscard]] int open(); Result prepare(const String& sql); // private data members private: String m_name{}; bool m_nameValid{false}; sqlite3* m_dbHandle{nullptr}; int m_errorCode{0}; SqliteOpenMode m_mode{}; int m_extraFlags{}; }; class SqliteStatement { public: SqliteStatement(const SqliteDb& sqliteDb, const String& input); SqliteStatement(const SqliteStatement&) = delete; SqliteStatement(SqliteStatement&& rhs) noexcept; ~SqliteStatement(); SqliteStatement& operator=(const SqliteStatement&) = delete; SqliteStatement& operator=(SqliteStatement&& rhs) noexcept = delete; bool valid() const; sqlite3_stmt* statement(); int step(); FudStatus reset(); constexpr int errorCode() { return m_errorCode; } constexpr FudStatus status() { return m_status; } private: String m_input{}; const char* m_tail{nullptr}; FudStatus m_status{FudStatus::ObjectInvalid}; int m_errorCode{0}; sqlite3_stmt* m_preparedStatement{nullptr}; }; } // namespace fud #endif