#ifndef __DATABASE_H__ #define __DATABASE_H__ #include "sqlite3.h" #include #include #include #include #include #include class Database { typedef std::vector> QueryData; public: Database(); ~Database(); bool open(); bool exec(const char* sqlQuery); bool exec(const std::string& sqlQuery); std::optional insert(const char* sql); std::set getStrSet(const std::string& sql); template std::optional get(const std::string sql, const QueryData& data){ sqlite3_stmt* stmt = bind(sql, data); T ret; if ((stmt == nullptr) || (sqlite3_step(stmt) != SQLITE_ROW)) return {}; if constexpr (std::is_same_v) { ret = sqlite3_column_int64(stmt, 0); } else if constexpr (std::is_same_v){ ret = reinterpret_cast(sqlite3_column_text(stmt, 0)); } sqlite3_finalize(stmt); return ret; } sqlite3_stmt* bind(const std::string sql, const QueryData& data); std::map getStrMap(const std::string sql, const QueryData& data); private: sqlite3_stmt* prepareStmt(const std::string& sql); sqlite3* m_db; }; #endif // __DATABASE_H__