From d4a5e83a875c6c488ff8ba717a163d74108c87aa Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Sun, 4 Aug 2024 17:43:18 +0800 Subject: [PATCH] feat: add reporter - add general reporter. - fix various compile error. --- decorator/CMakeLists.txt | 4 +- materializer/Database.cpp | 201 ++++++++++++----------------- materializer/Database.hpp | 24 ---- materializer/ExportDocument.cpp | 2 +- materializer/ExportEnvironment.cpp | 9 +- materializer/ExportScript.cpp | 2 +- materializer/Materializer.def | 2 +- materializer/Utilities.cpp | 20 ++- materializer/Utilities.hpp | 14 +- shared/CMakeLists.txt | 4 +- shared/GenericHelper.cpp | 34 +++++ shared/GenericHelper.hpp | 4 +- 12 files changed, 158 insertions(+), 162 deletions(-) diff --git a/decorator/CMakeLists.txt b/decorator/CMakeLists.txt index 58da4d5..d01a692 100644 --- a/decorator/CMakeLists.txt +++ b/decorator/CMakeLists.txt @@ -31,8 +31,8 @@ PRIVATE # Setup C++ standard set_target_properties(VSWDecorator PROPERTIES - CXX_STANDARD 20 - CXX_STANDARD_REQUIRED 20 + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED 17 CXX_EXTENSION OFF ) # MSVC specific correction diff --git a/materializer/Database.cpp b/materializer/Database.cpp index d06d6e6..e7cccd5 100644 --- a/materializer/Database.cpp +++ b/materializer/Database.cpp @@ -6,10 +6,15 @@ namespace VSW::Materializer::Database { #pragma region Help Macros -#define BEGIN_SAFE_SQL_EXEC { int errcode; -#define SAFE_SQL_EXEC(sql) errcode = sqlite3_exec(this->GetDb(), sql, nullptr, nullptr, nullptr); \ -if (errcode != SQLITE_OK) return false; -#define END_SAFE_SQL_EXEC } +#define BEGIN_CTOR int errcode; +#define CTOR_SQL_EXEC(sql) errcode = sqlite3_exec(this->GetDb(), sql, nullptr, nullptr, nullptr); \ +if (errcode != SQLITE_OK) goto failed; +#define END_CTOR return; \ +failed: throw std::runtime_error("fail to initialize database."); +#define BEGIN_DTOR int errcode; +#define DTOR_SQL_EXEC(sql) errcode = sqlite3_exec(this->GetDb(), sql, nullptr, nullptr, nullptr); \ +if (errcode != SQLITE_OK) return; +#define END_DTOR ; /// @brief /// Check database connection first. @@ -28,7 +33,7 @@ sqlite3_reset(stmt); /// @brief /// Sumbit binded prepared statement. /// Binding error process. -#define END_WRITER if (sqlite3_step(stmt) == SQLITE_OK) return; \ +#define END_WRITER if (sqlite3_step(stmt) == SQLITE_DONE) return; \ failed: throw std::runtime_error("fail to bind value for prepared statement."); #define REVEAL_ENUM(enum_val) static_cast>(enum_val) @@ -49,9 +54,6 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); errcode = sqlite3_exec(m_Db, "PRAGMA synchronous = OFF;", nullptr, nullptr, nullptr); if (errcode != SQLITE_OK) goto failed_after_open; - // run extra stuff - if (!PostOpen()) goto failed_after_open; - // start transaction errcode = sqlite3_exec(m_Db, "begin;", nullptr, nullptr, nullptr); if (errcode != SQLITE_OK) goto failed_after_open; @@ -80,9 +82,6 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); errcode = sqlite3_exec(m_Db, "commit;", nullptr, nullptr, nullptr); if (errcode != SQLITE_OK) goto failed; - // run extra stuff - if (!PreClose()) goto failed; - failed: // directly release resources sqlite3_close(m_Db); @@ -119,65 +118,49 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); #pragma region Script Database ScriptDatabase::ScriptDatabase(const YYCC::yycc_u8string_view& file) : - AbstractDatabase(file) {} - - ScriptDatabase::~ScriptDatabase() {} - - bool ScriptDatabase::PostOpen() { + AbstractDatabase(file) { // initialize table - BEGIN_SAFE_SQL_EXEC; - SAFE_SQL_EXEC("begin;"); - - SAFE_SQL_EXEC("CREATE TABLE [script] ([thisobj] INTEGER, [name] TEXT, [index] INTEGER, [behavior] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [behavior] ([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [proto_name] TEXT, [proto_guid] TEXT, [flags] INTEGER, [priority] INTEGER, [version] INTEGER, [pin_count] TEXT, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pTarget] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER, [direct_source] INTEGER, [shard_source] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pIn] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER, [direct_source] INTEGER, [shared_source] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [bIn] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [bOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [bLink] ([input] INTEGER, [output] INTEGER, [delay] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_index] INETEGR, [output_obj] INTEGER, [output_type] INTEGER, [output_index] INETEGR, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pLocal] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [is_setting] INTEGER, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pLink] ([input] INTEGER, [output] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_is_bb] INTEGER, [input_index] INETEGR, [output_obj] INTEGER, [output_type] INTEGER, [output_is_bb] INTEGER, [output_index] INETEGR, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pOper] ([thisobj] INTEGER, [op] TEXT, [op_guid] TEXT, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [eLink] ([export_obj] INTEGER, [internal_obj] INTEGER, [is_in] INTEGER, [index] INTEGER, [parent] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [pAttr] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT);"); - - //SAFE_SQL_EXEC("CREATE TABLE [msg] ([index] INTEGER, [name] TEXT);"); - //SAFE_SQL_EXEC("CREATE TABLE [obj] ([id] INTEGER, [name] TEXT, [classid] INTEGER, [classtype] TEXT);"); - - SAFE_SQL_EXEC("CREATE TABLE [data] ([field] TEXT, [data] TEXT, [parent] INTEGER);"); - - SAFE_SQL_EXEC("commit;"); - END_SAFE_SQL_EXEC; - - return true; + BEGIN_CTOR; + CTOR_SQL_EXEC("CREATE TABLE [script] ([thisobj] INTEGER, [name] TEXT, [index] INTEGER, [behavior] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [behavior] ([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [proto_name] TEXT, [proto_guid] TEXT, [flags] INTEGER, [priority] INTEGER, [version] INTEGER, [pin_count] TEXT, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pTarget] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER, [direct_source] INTEGER, [shard_source] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pIn] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER, [direct_source] INTEGER, [shared_source] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [bIn] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [bOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [bLink] ([input] INTEGER, [output] INTEGER, [delay] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_index] INETEGR, [output_obj] INTEGER, [output_type] INTEGER, [output_index] INETEGR, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pLocal] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [is_setting] INTEGER, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pLink] ([input] INTEGER, [output] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_is_bb] INTEGER, [input_index] INETEGR, [output_obj] INTEGER, [output_type] INTEGER, [output_is_bb] INTEGER, [output_index] INETEGR, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pOper] ([thisobj] INTEGER, [op] TEXT, [op_guid] TEXT, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [eLink] ([export_obj] INTEGER, [internal_obj] INTEGER, [is_in] INTEGER, [index] INTEGER, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pAttr] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT);"); + CTOR_SQL_EXEC("CREATE TABLE [data] ([field] TEXT, [data] TEXT, [parent] INTEGER);"); + END_CTOR; } - bool ScriptDatabase::PreClose() { + ScriptDatabase::~ScriptDatabase() { // create index for quick select in following process - BEGIN_SAFE_SQL_EXEC; - SAFE_SQL_EXEC("begin;"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where1] ON [behavior] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where2] ON [pOper] ([parent], [thisobj])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where3] ON [pTarget] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where4] ON [bIn] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where5] ON [bOut] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where6] ON [pIn] ([parent], [thisobj])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where7] ON [pOut] ([parent], [thisobj])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where8] ON [pLocal] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where9] ON [pLink] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where10] ON [bLink] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where11] ON [elink] ([parent])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where12] ON [pAttr] ([thisobj])"); - SAFE_SQL_EXEC("CREATE INDEX [quick_where13] ON [data] ([parent])"); - SAFE_SQL_EXEC("commit;"); - END_SAFE_SQL_EXEC; - - return true; + BEGIN_DTOR; + DTOR_SQL_EXEC("begin;"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where1] ON [behavior] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where2] ON [pOper] ([parent], [thisobj])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where3] ON [pTarget] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where4] ON [bIn] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where5] ON [bOut] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where6] ON [pIn] ([parent], [thisobj])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where7] ON [pOut] ([parent], [thisobj])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where8] ON [pLocal] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where9] ON [pLink] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where10] ON [bLink] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where11] ON [elink] ([parent])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where12] ON [pAttr] ([thisobj])"); + DTOR_SQL_EXEC("CREATE INDEX [quick_where13] ON [data] ([parent])"); + DTOR_SQL_EXEC("commit;"); + END_DTOR; } void ScriptDatabase::Write(const DataTypes::Script::Table_script& data) { - BEGIN_WRITER("INSERT INTO [script] VALUES (?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script] VALUES (?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.host_name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); @@ -185,7 +168,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_behavior& data) { - BEGIN_WRITER("INSERT INTO [script_behavior] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_behavior] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.type)); @@ -199,7 +182,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_bIn& data) { - BEGIN_WRITER("INSERT INTO [script_bIn] VALUES (?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_bIn] VALUES (?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); @@ -207,7 +190,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_bOut& data) { - BEGIN_WRITER("INSERT INTO [script_bOut] VALUES (?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_bOut] VALUES (?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); @@ -215,7 +198,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pIn& data) { - BEGIN_WRITER("INSERT INTO [script_pIn] VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pIn] VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); @@ -227,7 +210,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pOut& data) { - BEGIN_WRITER("INSERT INTO [script_pOut] VALUES (?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pOut] VALUES (?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); @@ -237,7 +220,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_bLink& data) { - BEGIN_WRITER("INSERT INTO [script_bLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_bLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.delay)); @@ -251,7 +234,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pLocal& data) { - BEGIN_WRITER("INSERT INTO [script_pLocal] VALUES (?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pLocal] VALUES (?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type.c_str(), -1, SQLITE_TRANSIENT)); @@ -261,7 +244,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pAttr& data) { - BEGIN_WRITER("INSERT INTO [script_pAttr] VALUES (?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pAttr] VALUES (?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type.c_str(), -1, SQLITE_TRANSIENT)); @@ -269,7 +252,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pLink& data) { - BEGIN_WRITER("INSERT INTO [script_pLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input_obj)); @@ -284,7 +267,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pOper& data) { - BEGIN_WRITER("INSERT INTO [script_pOper] VALUES (?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pOper] VALUES (?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.op.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.op_guid.c_str(), -1, SQLITE_TRANSIENT)); @@ -292,7 +275,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_eLink& data) { - BEGIN_WRITER("INSERT INTO [script_eLink] VALUES (?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_eLink] VALUES (?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.export_obj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.internal_obj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.is_in)); @@ -301,7 +284,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pTarget& data) { - BEGIN_WRITER("INSERT INTO [script_pTarget] VALUES (?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [script_pTarget] VALUES (?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.thisobj)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type.c_str(), -1, SQLITE_TRANSIENT)); @@ -312,7 +295,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_data& data) { - BEGIN_WRITER("INSERT INTO [data] VALUES (?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [data] VALUES (?, ?, ?);"); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.field.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.data.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); @@ -324,37 +307,26 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); #pragma region Document Database DocumentDatabase::DocumentDatabase(const YYCC::yycc_u8string_view& file) : - AbstractDatabase(file) {} - - DocumentDatabase::~DocumentDatabase() {} - - bool DocumentDatabase::PostOpen() { + AbstractDatabase(file) { // initialize table - BEGIN_SAFE_SQL_EXEC; - SAFE_SQL_EXEC("begin;"); - - SAFE_SQL_EXEC("CREATE TABLE [msg] ([index] INTEGER, [name] TEXT);"); - SAFE_SQL_EXEC("CREATE TABLE [obj] ([id] INTEGER, [name] TEXT, [classid] INTEGER, [classtype] TEXT);"); - - SAFE_SQL_EXEC("commit;"); - END_SAFE_SQL_EXEC; - - return true; + BEGIN_CTOR; + CTOR_SQL_EXEC("CREATE TABLE [msg] ([index] INTEGER, [name] TEXT);"); + CTOR_SQL_EXEC("CREATE TABLE [obj] ([id] INTEGER, [name] TEXT, [classid] INTEGER, [classtype] TEXT);"); + END_CTOR; } - bool DocumentDatabase::PreClose() { + DocumentDatabase::~DocumentDatabase() { // do nothing - return true; } void DocumentDatabase::Write(const DataTypes::Document::Table_msg& data) { - BEGIN_WRITER("INSERT INTO [msg] VALUES (?, ?)"); + BEGIN_WRITER("INSERT INTO [msg] VALUES (?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); END_WRITER; } void DocumentDatabase::Write(const DataTypes::Document::Table_obj& data) { - BEGIN_WRITER("INSERT INTO [obj] VALUES (?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [obj] VALUES (?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.id)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.classid)); @@ -367,34 +339,23 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); #pragma region Environment Database EnvironmentDatabase::EnvironmentDatabase(const YYCC::yycc_u8string_view& file) : - AbstractDatabase(file) {} - - EnvironmentDatabase::~EnvironmentDatabase() {} - - bool EnvironmentDatabase::PostOpen() { + AbstractDatabase(file) { // initialize table - BEGIN_SAFE_SQL_EXEC; - SAFE_SQL_EXEC("begin;"); - - SAFE_SQL_EXEC("CREATE TABLE [op] ([funcptr] INTEGER, [in1_guid] TEXT, [in2_guid] TEXT, [out_guid] TEXT, [op_guid] TEXT, [op_name] TEXT, [op_code] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [param] ([index] INTEGER, [guid] TEXT, [derived_from] TEXT, [type_name] TEXT, [default_size] INTEGER, [func_CreateDefault] INTEGER, [func_Delete] INTEGER, [func_SaveLoad] INTEGER, [func_Check] INTEGER, [func_Copy] INTEGER, [func_String] INTEGER, [func_UICreator] INTEGER, [creator_dll_index] INTEGER, [creator_plugin_index] INTEGER, [dw_param] INTEGER, [dw_flags] INTEGER, [cid] INTEGER, [saver_manager] TEXT);"); - SAFE_SQL_EXEC("CREATE TABLE [attr] ([index] INTEGER, [name] TEXT, [category_index] INTEGER, [category_name] TEXT, [flags] INTEGER, [param_index] INTEGER, [compatible_classid] INTEGER, [default_value] TEXT);"); - SAFE_SQL_EXEC("CREATE TABLE [plugin] ([dll_index] INTEGER, [dll_name] TEXT, [plugin_index] INTEGER, [category] TEXT, [active] INTEGER, [guid] TEXT, [desc] TEXT, [author] TEXT, [summary] TEXT, [version] INTEGER, [func_init] INTEGER, [func_exit] INTEGER);"); - SAFE_SQL_EXEC("CREATE TABLE [variable] ([name] TEXT, [description] TEXT, [flags] INTEGER, [type] INTEGER, [representation] TEXT, [data] TEXT);"); - - SAFE_SQL_EXEC("commit;"); - END_SAFE_SQL_EXEC; - - return true; + BEGIN_CTOR; + CTOR_SQL_EXEC("CREATE TABLE [op] ([func_ptr] TEXT, [in1_guid] INTEGER, [in2_guid] INTEGER, [out_guid] INTEGER, [op_guid] INTEGER, [op_name] TEXT, [op_code] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [param] ([index] INTEGER, [guid] INTEGER, [derived_from] INTEGER, [type_name] TEXT, [default_size] INTEGER, [func_CreateDefault] TEXT, [func_Delete] TEXT, [func_SaveLoad] TEXT, [func_Check] TEXT, [func_Copy] TEXT, [func_String] TEXT, [func_UICreator] TEXT, [creator_dll_index] INTEGER, [creator_plugin_index] INTEGER, [dw_param] INTEGER, [dw_flags] INTEGER, [cid] INTEGER, [saver_manager] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [attr] ([index] INTEGER, [name] TEXT, [category_index] INTEGER, [category_name] TEXT, [flags] INTEGER, [param_index] INTEGER, [compatible_classid] INTEGER, [default_value] TEXT);"); + CTOR_SQL_EXEC("CREATE TABLE [plugin] ([dll_index] INTEGER, [dll_name] TEXT, [plugin_index] INTEGER, [category] TEXT, [active] INTEGER, [guid] INTEGER, [desc] TEXT, [author] TEXT, [summary] TEXT, [version] INTEGER, [func_init] TEXT, [func_exit] TEXT);"); + CTOR_SQL_EXEC("CREATE TABLE [variable] ([name] TEXT, [description] TEXT, [flags] INTEGER, [type] INTEGER, [representation] TEXT, [data] TEXT);"); + END_CTOR; } - bool EnvironmentDatabase::PreClose() { + EnvironmentDatabase::~EnvironmentDatabase() { // do nothing - return true; } void EnvironmentDatabase::Write(const DataTypes::Environment::Table_op& data) { - BEGIN_WRITER("INSERT INTO [op] VALUES (?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [op] VALUES (?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.func_ptr.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.in1_guid)); WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.in2_guid)); @@ -405,7 +366,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void EnvironmentDatabase::Write(const DataTypes::Environment::Table_param& data) { - BEGIN_WRITER("INSERT INTO [param] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [param] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.guid)); WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.derived_from)); @@ -427,7 +388,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void EnvironmentDatabase::Write(const DataTypes::Environment::Table_attr& data) { - BEGIN_WRITER("INSERT INTO [attr] VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [attr] VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.category_index)); @@ -439,7 +400,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void EnvironmentDatabase::Write(const DataTypes::Environment::Table_plugin& data) { - BEGIN_WRITER("INSERT INTO [plugin] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [plugin] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.dll_index)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.dll_name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.plugin_index)); @@ -455,7 +416,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); END_WRITER; } void EnvironmentDatabase::Write(const DataTypes::Environment::Table_variable& data) { - BEGIN_WRITER("INSERT INTO [variable] VALUES (?, ?, ?, ?, ?, ?)"); + BEGIN_WRITER("INSERT INTO [variable] VALUES (?, ?, ?, ?, ?, ?);"); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.desciption.c_str(), -1, SQLITE_TRANSIENT)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.flags)); diff --git a/materializer/Database.hpp b/materializer/Database.hpp index 1335ceb..81694e0 100644 --- a/materializer/Database.hpp +++ b/materializer/Database.hpp @@ -19,18 +19,6 @@ namespace VSW::Materializer::Database { /// @brief Check whether this database is ready for use. bool IsValid() const; - protected: - /** - * @brief User implemented function called after connect to the database before transition. - * @return True if success, otherwise false. - */ - virtual bool PostOpen() = 0; - /** - * @brief User implemented function called after transition before disconnect from database. - * @return True if success, otherwise false. - */ - virtual bool PreClose() = 0; - protected: /// @brief Subclass used for creating stmt with cache feature. sqlite3_stmt* GetStmt(const char* stmt_str); @@ -51,10 +39,6 @@ namespace VSW::Materializer::Database { ScriptDatabase(ScriptDatabase&&) = delete; ScriptDatabase& operator=(ScriptDatabase&&) = delete; - protected: - virtual bool PostOpen() override; - virtual bool PreClose() override; - public: void Write(const DataTypes::Script::Table_script& data); void Write(const DataTypes::Script::Table_behavior& data); @@ -81,10 +65,6 @@ namespace VSW::Materializer::Database { DocumentDatabase(DocumentDatabase&&) = delete; DocumentDatabase& operator=(DocumentDatabase&&) = delete; - protected: - virtual bool PostOpen() override; - virtual bool PreClose() override; - public: void Write(const DataTypes::Document::Table_msg& data); void Write(const DataTypes::Document::Table_obj& data); @@ -99,10 +79,6 @@ namespace VSW::Materializer::Database { EnvironmentDatabase(EnvironmentDatabase&&) = delete; EnvironmentDatabase& operator=(EnvironmentDatabase&&) = delete; - protected: - virtual bool PostOpen() override; - virtual bool PreClose() override; - public: void Write(const DataTypes::Environment::Table_op& data); void Write(const DataTypes::Environment::Table_param& data); diff --git a/materializer/ExportDocument.cpp b/materializer/ExportDocument.cpp index 25718f4..de722bf 100644 --- a/materializer/ExportDocument.cpp +++ b/materializer/ExportDocument.cpp @@ -5,7 +5,7 @@ namespace VSW::Materializer::ExportDocument { - void Export(CKContext* ctx, YYCC::yycc_u8string_view& db_path) { + void Export(CKContext* ctx, const YYCC::yycc_u8string_view& db_path, UINT code_page) { } diff --git a/materializer/ExportEnvironment.cpp b/materializer/ExportEnvironment.cpp index 325a03f..091692b 100644 --- a/materializer/ExportEnvironment.cpp +++ b/materializer/ExportEnvironment.cpp @@ -7,10 +7,11 @@ namespace VSW::Materializer::ExportEnvironment { struct ExportContext { - ExportContext(YYCC::yycc_u8string_view& db_path) : - db(db_path), cache() {} + ExportContext(CKContext* ctx, const YYCC::yycc_u8string_view& db_path) : + db(db_path), cache(), reporter(ctx) {} Database::EnvironmentDatabase db; DataTypes::Environment::DataCache cache; + Utilities::EnhancedReporter reporter; }; static void IterateParameterOperation(ExportContext& expctx, CKParameterManager* param_mgr) { @@ -155,9 +156,9 @@ namespace VSW::Materializer::ExportEnvironment { } #endif - void Export(CKContext* ctx, YYCC::yycc_u8string_view& db_path) { + void Export(CKContext* ctx, const YYCC::yycc_u8string_view& db_path, UINT code_page) { // create database and data cache in context - ExportContext expctx(db_path); + ExportContext expctx(ctx, db_path); // export environment one by one IterateParameterOperation(expctx, ctx->GetParameterManager()); diff --git a/materializer/ExportScript.cpp b/materializer/ExportScript.cpp index 1379d23..792ecfd 100644 --- a/materializer/ExportScript.cpp +++ b/materializer/ExportScript.cpp @@ -5,7 +5,7 @@ namespace VSW::Materializer::ExportScript { - void Export(CKContext* ctx, YYCC::yycc_u8string_view& db_path) { + void Export(CKContext* ctx, const YYCC::yycc_u8string_view& db_path, UINT code_page) { } diff --git a/materializer/Materializer.def b/materializer/Materializer.def index 9804125..f46673b 100644 --- a/materializer/Materializer.def +++ b/materializer/Materializer.def @@ -1,4 +1,4 @@ -LIBRARY "SuperScriptMaterializer" +LIBRARY "VSWMaterializer" EXPORTS GetVirtoolsPluginInfoCount diff --git a/materializer/Utilities.cpp b/materializer/Utilities.cpp index 5d6b98f..4276665 100644 --- a/materializer/Utilities.cpp +++ b/materializer/Utilities.cpp @@ -29,14 +29,14 @@ namespace VSW::Materializer::Utilities { // Then get its file name part auto module_path = YYCC::FsPathPatch::FromUTF8Path(u8_module_path.c_str()); auto u8_module_name = YYCC::FsPathPatch::ToUTF8Path(module_path.filename()); - + // Get the base address of current module // HMODULE is the base address of loaded module // Reference: https://stackoverflow.com/questions/4298331/exe-or-dll-image-base-address uintptr_t relative_addr = reinterpret_cast(absolute_addr) - reinterpret_cast(hModule); - + // get final result - auto u8_ret = YYCC::StringHelper::Printf(YYCC_U8("%s+%" PRI_XPTR_LEFT_PADDING PRIXPTR), u8_module_name.c_str(), relative_addr); + auto u8_ret = YYCC::StringHelper::Printf(YYCC_U8("%s+0x%" PRI_XPTR_LEFT_PADDING PRIXPTR), u8_module_name.c_str(), relative_addr); ret = YYCC::EncodingHelper::ToOrdinaryView(u8_ret); return ret; } @@ -53,4 +53,18 @@ namespace VSW::Materializer::Utilities { else storage = str; } +#pragma region Enhanced Reporter + + EnhancedReporter::EnhancedReporter(CKContext* ctx) : + m_Ctx(ctx) {} + + EnhancedReporter::~EnhancedReporter() {} + + void EnhancedReporter::PrePrint(const YYCC::yycc_char8_t* strl) { + if (m_Ctx != nullptr) + m_Ctx->OutputToConsole(const_cast(YYCC::EncodingHelper::UTF8ToChar(strl, CP_ACP).c_str()), FALSE); + } + +#pragma endregion + } diff --git a/materializer/Utilities.hpp b/materializer/Utilities.hpp index eed7b89..c4f53bb 100644 --- a/materializer/Utilities.hpp +++ b/materializer/Utilities.hpp @@ -1,11 +1,24 @@ #pragma once #include "stdafx.hpp" +#include namespace VSW::Materializer::Utilities { /// @brief The value representing a invalid CK_ID. constexpr CK_ID INVALID_CK_ID = static_cast(-1); + class EnhancedReporter : public VSW::Reporter { + public: + EnhancedReporter(CKContext* ctx); + ~EnhancedReporter(); + + protected: + virtual void PrePrint(const YYCC::yycc_char8_t* strl) override; + + private: + CKContext* m_Ctx; + }; + /** * @brief Get relative address from given absolute address * @details This function is used when exporting function pointer into database. @@ -13,7 +26,6 @@ namespace VSW::Materializer::Utilities { * @return Module based relative address like \c xxx.dll+0x00000000. */ std::string RelativeAddress(const void* absolute_addr); - void CopyGuid(int64_t& dst, const CKGUID& src); void CopyCKString(std::string& storage, const char* str); diff --git a/shared/CMakeLists.txt b/shared/CMakeLists.txt index 2b676da..7d60922 100644 --- a/shared/CMakeLists.txt +++ b/shared/CMakeLists.txt @@ -28,8 +28,8 @@ PUBLIC # Setup C++ standard set_target_properties(VSWShared PROPERTIES - CXX_STANDARD 20 - CXX_STANDARD_REQUIRED 20 + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED 17 CXX_EXTENSION OFF ) # MSVC specific correction diff --git a/shared/GenericHelper.cpp b/shared/GenericHelper.cpp index ef0594d..d010a61 100644 --- a/shared/GenericHelper.cpp +++ b/shared/GenericHelper.cpp @@ -1,7 +1,41 @@ #include "GenericHelper.hpp" +#include namespace VSW { + Reporter::Reporter() {} + Reporter::~Reporter() {} + void Reporter::PrePrint(const YYCC::yycc_char8_t* strl) {} + +#define GENERIC_REPORTER_WRITE(ty, data) YYCC::ConsoleHelper::Write(YYCC_U8("[" #ty "] ")); \ +YYCC::ConsoleHelper::WriteLine(data); +#define GENERIC_REPORTER_FORMAT(ty, data) YYCC::ConsoleHelper::Write(YYCC_U8("[" #ty "] ")); \ +va_list argptr; \ +va_start(argptr, data); \ +YYCC::ConsoleHelper::WriteLine(YYCC::StringHelper::VPrintf(data, argptr).c_str()); \ +va_end(argptr); + + void Reporter::Err(const YYCC::yycc_char8_t* strl) { + GENERIC_REPORTER_WRITE(Error, strl); + } + void Reporter::ErrF(const YYCC::yycc_char8_t* fmt, ...) { + GENERIC_REPORTER_FORMAT(Error ,fmt); + } + void Reporter::Warn(const YYCC::yycc_char8_t* strl) { + GENERIC_REPORTER_WRITE(Warning, strl); + } + void Reporter::WarnF(const YYCC::yycc_char8_t* fmt, ...) { + GENERIC_REPORTER_FORMAT(Warning ,fmt); + } + void Reporter::Info(const YYCC::yycc_char8_t* strl) { + GENERIC_REPORTER_WRITE(Info, strl); + } + void Reporter::InfoF(const YYCC::yycc_char8_t* fmt, ...) { + GENERIC_REPORTER_FORMAT(Info ,fmt); + } + +#undef GENERIC_REPORTER_WRITE +#undef GENERIC_REPORTER_FORMAT } diff --git a/shared/GenericHelper.hpp b/shared/GenericHelper.hpp index c0cd345..c044a83 100644 --- a/shared/GenericHelper.hpp +++ b/shared/GenericHelper.hpp @@ -10,7 +10,7 @@ namespace VSW { ~Reporter(); protected: - void PrePrint(const YYCC::yycc_char8_t* strl); + virtual void PrePrint(const YYCC::yycc_char8_t* strl); public: void Err(const YYCC::yycc_char8_t* strl); @@ -19,8 +19,6 @@ namespace VSW { void WarnF(const YYCC::yycc_char8_t* fmt, ...); void Info(const YYCC::yycc_char8_t* strl); void InfoF(const YYCC::yycc_char8_t* fmt, ...); - void Debug(const YYCC::yycc_char8_t* strl); - void DebugF(const YYCC::yycc_char8_t* fmt, ...); }; namespace DataTypes {