#include "TessesFramework/Serialization/SQLite.hpp" #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) #include "sqlite/sqlite3-mod.h" #endif namespace Tesses::Framework::Serialization { int SQLiteDatabase::collector(void* user, int count,char** vals, char** keys) { auto list = static_cast>>>*>(user); std::vector>> d; for(int i = 0; i < count; i++) { std::string key = keys[i] == nullptr ? "" : keys[i]; std::optional value = vals[i] == nullptr ? std::nullopt : (std::optional)vals[i]; d.push_back(std::pair>(key,value)); } list->push_back(d); return 0; } SQLiteDatabase::SQLiteDatabase(Tesses::Framework::Filesystem::VFSPath path) { #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) auto name = path.ToString(); sqlite3* sqlite; int rc =sqlite3_open(name.c_str(),&sqlite); if(rc) { std::string error = sqlite3_errmsg(sqlite); throw std::runtime_error(error); } this->data = static_cast(sqlite); #endif } std::string SQLiteDatabase::Escape(std::string text) { std::string myStr = "\'"; for(auto c : text) { if(c == '\'') myStr += "\'\'"; else myStr += c; } myStr += '\''; return myStr; } bool SQLiteDatabase::IsEnabled() { #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) return true; #endif return false; } std::vector>>> SQLiteDatabase::Exec(std::string statement) { std::vector>>> items; Exec(statement,items); return items; } void SQLiteDatabase::Exec(std::string statement,std::vector>>>& items) { #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) char* err; int res = sqlite3_exec(static_cast(this->data),statement.c_str(),SQLiteDatabase::collector,&items,&err); if(res != SQLITE_OK) { std::string errstr = err == nullptr ? "" : err; sqlite3_free(err); throw std::runtime_error(errstr); } #endif } SQLiteDatabase::~SQLiteDatabase() { #if defined(TESSESFRAMEWORK_ENABLE_SQLITE) sqlite3_close(static_cast(this->data)); #endif } }