// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "sqlite3.h" #include "QueryResult.hpp" #include #include #include class DatabaseInitialisationError : public std::runtime_error { public: using std::runtime_error::runtime_error; }; class Database { public: explicit Database(const char *name, bool readOnly = false); virtual ~Database(); std::unique_ptr query(const char *format, ...); bool execute(const char *format, ...); // Must be invoked prior creating any database object in order to initialize database OS layer static bool initialize(); // Must be invoked before closing system in order to properly close OS layer static bool deinitialize(); bool storeIntoFile(const std::filesystem::path &syncPath); uint32_t getLastInsertRowId(); void pragmaQuery(const std::string &pragmaStatement); auto pragmaQueryForValue(const std::string &pragmaStatement, const std::int32_t value) -> bool; [[nodiscard]] bool isInitialized() const noexcept { return isInitialized_; } [[nodiscard]] std::string getName() const { return dbName; } private: static constexpr std::uint32_t maxQueryLen = (8 * 1024); void initQueryStatementBuffer(); void clearQueryStatementBuffer(); void populateDbAppId(); /* * Arguments: * * usrPtr - Pointer to user data * count - The number of columns in the result set * data - The row's data * columns - The column names */ static int queryCallback(void *usrPtr, int count, char **data, char **columns); protected: sqlite3 *dbConnection; std::string dbName; char *queryStatementBuffer; bool isInitialized_; };