feat: add reporter

- add general reporter.
- fix various compile error.
This commit is contained in:
2024-08-04 17:43:18 +08:00
parent f179907a3a
commit d4a5e83a87
12 changed files with 158 additions and 162 deletions

View File

@@ -31,8 +31,8 @@ PRIVATE
# Setup C++ standard # Setup C++ standard
set_target_properties(VSWDecorator set_target_properties(VSWDecorator
PROPERTIES PROPERTIES
CXX_STANDARD 20 CXX_STANDARD 17
CXX_STANDARD_REQUIRED 20 CXX_STANDARD_REQUIRED 17
CXX_EXTENSION OFF CXX_EXTENSION OFF
) )
# MSVC specific correction # MSVC specific correction

View File

@@ -6,10 +6,15 @@ namespace VSW::Materializer::Database {
#pragma region Help Macros #pragma region Help Macros
#define BEGIN_SAFE_SQL_EXEC { int errcode; #define BEGIN_CTOR int errcode;
#define SAFE_SQL_EXEC(sql) errcode = sqlite3_exec(this->GetDb(), sql, nullptr, nullptr, nullptr); \ #define CTOR_SQL_EXEC(sql) errcode = sqlite3_exec(this->GetDb(), sql, nullptr, nullptr, nullptr); \
if (errcode != SQLITE_OK) return false; if (errcode != SQLITE_OK) goto failed;
#define END_SAFE_SQL_EXEC } #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 /// @brief
/// Check database connection first. /// Check database connection first.
@@ -28,7 +33,7 @@ sqlite3_reset(stmt);
/// @brief /// @brief
/// Sumbit binded prepared statement. /// Sumbit binded prepared statement.
/// Binding error process. /// 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."); failed: throw std::runtime_error("fail to bind value for prepared statement.");
#define REVEAL_ENUM(enum_val) static_cast<std::underlying_type_t<decltype(enum_val)>>(enum_val) #define REVEAL_ENUM(enum_val) static_cast<std::underlying_type_t<decltype(enum_val)>>(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); errcode = sqlite3_exec(m_Db, "PRAGMA synchronous = OFF;", nullptr, nullptr, nullptr);
if (errcode != SQLITE_OK) goto failed_after_open; if (errcode != SQLITE_OK) goto failed_after_open;
// run extra stuff
if (!PostOpen()) goto failed_after_open;
// start transaction // start transaction
errcode = sqlite3_exec(m_Db, "begin;", nullptr, nullptr, nullptr); errcode = sqlite3_exec(m_Db, "begin;", nullptr, nullptr, nullptr);
if (errcode != SQLITE_OK) goto failed_after_open; 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); errcode = sqlite3_exec(m_Db, "commit;", nullptr, nullptr, nullptr);
if (errcode != SQLITE_OK) goto failed; if (errcode != SQLITE_OK) goto failed;
// run extra stuff
if (!PreClose()) goto failed;
failed: failed:
// directly release resources // directly release resources
sqlite3_close(m_Db); sqlite3_close(m_Db);
@@ -119,65 +118,49 @@ failed: throw std::runtime_error("fail to bind value for prepared statement.");
#pragma region Script Database #pragma region Script Database
ScriptDatabase::ScriptDatabase(const YYCC::yycc_u8string_view& file) : ScriptDatabase::ScriptDatabase(const YYCC::yycc_u8string_view& file) :
AbstractDatabase(file) {} AbstractDatabase(file) {
ScriptDatabase::~ScriptDatabase() {}
bool ScriptDatabase::PostOpen() {
// initialize table // initialize table
BEGIN_SAFE_SQL_EXEC; BEGIN_CTOR;
SAFE_SQL_EXEC("begin;"); 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);");
SAFE_SQL_EXEC("CREATE TABLE [script] ([thisobj] INTEGER, [name] TEXT, [index] INTEGER, [behavior] INTEGER);"); CTOR_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 [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 [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 [pTarget] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER, [direct_source] INTEGER, [shard_source] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [pOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] 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);"); CTOR_SQL_EXEC("CREATE TABLE [bIn] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);");
SAFE_SQL_EXEC("CREATE TABLE [pOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [parent] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [bOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);");
SAFE_SQL_EXEC("CREATE TABLE [bIn] ([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);");
SAFE_SQL_EXEC("CREATE TABLE [bOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [parent] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [pLocal] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [is_setting] INTEGER, [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);"); 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);");
SAFE_SQL_EXEC("CREATE TABLE [pLocal] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT, [is_setting] INTEGER, [parent] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [pOper] ([thisobj] INTEGER, [op] TEXT, [op_guid] TEXT, [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);"); CTOR_SQL_EXEC("CREATE TABLE [eLink] ([export_obj] INTEGER, [internal_obj] INTEGER, [is_in] INTEGER, [index] INTEGER, [parent] INTEGER);");
SAFE_SQL_EXEC("CREATE TABLE [pOper] ([thisobj] INTEGER, [op] TEXT, [op_guid] TEXT, [parent] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [pAttr] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT);");
SAFE_SQL_EXEC("CREATE TABLE [eLink] ([export_obj] INTEGER, [internal_obj] INTEGER, [is_in] INTEGER, [index] INTEGER, [parent] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [data] ([field] TEXT, [data] TEXT, [parent] INTEGER);");
SAFE_SQL_EXEC("CREATE TABLE [pAttr] ([thisobj] INTEGER, [name] TEXT, [type] TEXT, [type_guid] TEXT);"); END_CTOR;
//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;
} }
bool ScriptDatabase::PreClose() { ScriptDatabase::~ScriptDatabase() {
// create index for quick select in following process // create index for quick select in following process
BEGIN_SAFE_SQL_EXEC; BEGIN_DTOR;
SAFE_SQL_EXEC("begin;"); DTOR_SQL_EXEC("begin;");
SAFE_SQL_EXEC("CREATE INDEX [quick_where1] ON [behavior] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where1] ON [behavior] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where2] ON [pOper] ([parent], [thisobj])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where2] ON [pOper] ([parent], [thisobj])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where3] ON [pTarget] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where3] ON [pTarget] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where4] ON [bIn] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where4] ON [bIn] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where5] ON [bOut] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where5] ON [bOut] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where6] ON [pIn] ([parent], [thisobj])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where6] ON [pIn] ([parent], [thisobj])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where7] ON [pOut] ([parent], [thisobj])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where7] ON [pOut] ([parent], [thisobj])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where8] ON [pLocal] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where8] ON [pLocal] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where9] ON [pLink] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where9] ON [pLink] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where10] ON [bLink] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where10] ON [bLink] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where11] ON [elink] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where11] ON [elink] ([parent])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where12] ON [pAttr] ([thisobj])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where12] ON [pAttr] ([thisobj])");
SAFE_SQL_EXEC("CREATE INDEX [quick_where13] ON [data] ([parent])"); DTOR_SQL_EXEC("CREATE INDEX [quick_where13] ON [data] ([parent])");
SAFE_SQL_EXEC("commit;"); DTOR_SQL_EXEC("commit;");
END_SAFE_SQL_EXEC; END_DTOR;
return true;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_script& data) { 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_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_text(WRITER_STMT, WRITER_INDEX, data.host_name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); 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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_behavior& data) { 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_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.name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.type)); 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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_bIn& data) { 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.thisobj));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); 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_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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_bOut& data) { 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.thisobj));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); 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_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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pIn& data) { 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.thisobj));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); 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_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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pOut& data) { 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.thisobj));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); 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_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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_bLink& data) { 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.input));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.delay)); 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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pLocal& data) { 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_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.name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type.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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pAttr& data) { 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_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.name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type.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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pLink& data) { 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.input));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input_obj)); 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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pOper& data) { 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_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.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.op_guid.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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_eLink& data) { 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.export_obj));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.internal_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)); 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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_pTarget& data) { 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_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.name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type.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; END_WRITER;
} }
void ScriptDatabase::Write(const DataTypes::Script::Table_data& data) { 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.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_text(WRITER_STMT, WRITER_INDEX, data.data.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); 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 #pragma region Document Database
DocumentDatabase::DocumentDatabase(const YYCC::yycc_u8string_view& file) : DocumentDatabase::DocumentDatabase(const YYCC::yycc_u8string_view& file) :
AbstractDatabase(file) {} AbstractDatabase(file) {
DocumentDatabase::~DocumentDatabase() {}
bool DocumentDatabase::PostOpen() {
// initialize table // initialize table
BEGIN_SAFE_SQL_EXEC; BEGIN_CTOR;
SAFE_SQL_EXEC("begin;"); CTOR_SQL_EXEC("CREATE TABLE [msg] ([index] INTEGER, [name] TEXT);");
CTOR_SQL_EXEC("CREATE TABLE [obj] ([id] INTEGER, [name] TEXT, [classid] INTEGER, [classtype] TEXT);");
SAFE_SQL_EXEC("CREATE TABLE [msg] ([index] INTEGER, [name] TEXT);"); END_CTOR;
SAFE_SQL_EXEC("CREATE TABLE [obj] ([id] INTEGER, [name] TEXT, [classid] INTEGER, [classtype] TEXT);");
SAFE_SQL_EXEC("commit;");
END_SAFE_SQL_EXEC;
return true;
} }
bool DocumentDatabase::PreClose() { DocumentDatabase::~DocumentDatabase() {
// do nothing // do nothing
return true;
} }
void DocumentDatabase::Write(const DataTypes::Document::Table_msg& data) { 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_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_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT));
END_WRITER; END_WRITER;
} }
void DocumentDatabase::Write(const DataTypes::Document::Table_obj& data) { 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_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_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.classid)); 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 #pragma region Environment Database
EnvironmentDatabase::EnvironmentDatabase(const YYCC::yycc_u8string_view& file) : EnvironmentDatabase::EnvironmentDatabase(const YYCC::yycc_u8string_view& file) :
AbstractDatabase(file) {} AbstractDatabase(file) {
EnvironmentDatabase::~EnvironmentDatabase() {}
bool EnvironmentDatabase::PostOpen() {
// initialize table // initialize table
BEGIN_SAFE_SQL_EXEC; BEGIN_CTOR;
SAFE_SQL_EXEC("begin;"); 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);");
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);"); 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);");
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);"); 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);");
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);"); CTOR_SQL_EXEC("CREATE TABLE [variable] ([name] TEXT, [description] TEXT, [flags] INTEGER, [type] INTEGER, [representation] TEXT, [data] 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);"); END_CTOR;
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;
} }
bool EnvironmentDatabase::PreClose() { EnvironmentDatabase::~EnvironmentDatabase() {
// do nothing // do nothing
return true;
} }
void EnvironmentDatabase::Write(const DataTypes::Environment::Table_op& data) { 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_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.in1_guid));
WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.in2_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; END_WRITER;
} }
void EnvironmentDatabase::Write(const DataTypes::Environment::Table_param& data) { 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_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.guid));
WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.derived_from)); 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; END_WRITER;
} }
void EnvironmentDatabase::Write(const DataTypes::Environment::Table_attr& data) { 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_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_text(WRITER_STMT, WRITER_INDEX, data.name.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.category_index)); 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; END_WRITER;
} }
void EnvironmentDatabase::Write(const DataTypes::Environment::Table_plugin& data) { 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_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_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)); 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; END_WRITER;
} }
void EnvironmentDatabase::Write(const DataTypes::Environment::Table_variable& data) { 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.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_text(WRITER_STMT, WRITER_INDEX, data.desciption.c_str(), -1, SQLITE_TRANSIENT));
WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.flags)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.flags));

View File

@@ -19,18 +19,6 @@ namespace VSW::Materializer::Database {
/// @brief Check whether this database is ready for use. /// @brief Check whether this database is ready for use.
bool IsValid() const; 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: protected:
/// @brief Subclass used for creating stmt with cache feature. /// @brief Subclass used for creating stmt with cache feature.
sqlite3_stmt* GetStmt(const char* stmt_str); sqlite3_stmt* GetStmt(const char* stmt_str);
@@ -51,10 +39,6 @@ namespace VSW::Materializer::Database {
ScriptDatabase(ScriptDatabase&&) = delete; ScriptDatabase(ScriptDatabase&&) = delete;
ScriptDatabase& operator=(ScriptDatabase&&) = delete; ScriptDatabase& operator=(ScriptDatabase&&) = delete;
protected:
virtual bool PostOpen() override;
virtual bool PreClose() override;
public: public:
void Write(const DataTypes::Script::Table_script& data); void Write(const DataTypes::Script::Table_script& data);
void Write(const DataTypes::Script::Table_behavior& data); void Write(const DataTypes::Script::Table_behavior& data);
@@ -81,10 +65,6 @@ namespace VSW::Materializer::Database {
DocumentDatabase(DocumentDatabase&&) = delete; DocumentDatabase(DocumentDatabase&&) = delete;
DocumentDatabase& operator=(DocumentDatabase&&) = delete; DocumentDatabase& operator=(DocumentDatabase&&) = delete;
protected:
virtual bool PostOpen() override;
virtual bool PreClose() override;
public: public:
void Write(const DataTypes::Document::Table_msg& data); void Write(const DataTypes::Document::Table_msg& data);
void Write(const DataTypes::Document::Table_obj& data); void Write(const DataTypes::Document::Table_obj& data);
@@ -99,10 +79,6 @@ namespace VSW::Materializer::Database {
EnvironmentDatabase(EnvironmentDatabase&&) = delete; EnvironmentDatabase(EnvironmentDatabase&&) = delete;
EnvironmentDatabase& operator=(EnvironmentDatabase&&) = delete; EnvironmentDatabase& operator=(EnvironmentDatabase&&) = delete;
protected:
virtual bool PostOpen() override;
virtual bool PreClose() override;
public: public:
void Write(const DataTypes::Environment::Table_op& data); void Write(const DataTypes::Environment::Table_op& data);
void Write(const DataTypes::Environment::Table_param& data); void Write(const DataTypes::Environment::Table_param& data);

View File

@@ -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) {
} }

View File

@@ -7,10 +7,11 @@
namespace VSW::Materializer::ExportEnvironment { namespace VSW::Materializer::ExportEnvironment {
struct ExportContext { struct ExportContext {
ExportContext(YYCC::yycc_u8string_view& db_path) : ExportContext(CKContext* ctx, const YYCC::yycc_u8string_view& db_path) :
db(db_path), cache() {} db(db_path), cache(), reporter(ctx) {}
Database::EnvironmentDatabase db; Database::EnvironmentDatabase db;
DataTypes::Environment::DataCache cache; DataTypes::Environment::DataCache cache;
Utilities::EnhancedReporter reporter;
}; };
static void IterateParameterOperation(ExportContext& expctx, CKParameterManager* param_mgr) { static void IterateParameterOperation(ExportContext& expctx, CKParameterManager* param_mgr) {
@@ -155,9 +156,9 @@ namespace VSW::Materializer::ExportEnvironment {
} }
#endif #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 // create database and data cache in context
ExportContext expctx(db_path); ExportContext expctx(ctx, db_path);
// export environment one by one // export environment one by one
IterateParameterOperation(expctx, ctx->GetParameterManager()); IterateParameterOperation(expctx, ctx->GetParameterManager());

View File

@@ -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) {
} }

View File

@@ -1,4 +1,4 @@
LIBRARY "SuperScriptMaterializer" LIBRARY "VSWMaterializer"
EXPORTS EXPORTS
GetVirtoolsPluginInfoCount GetVirtoolsPluginInfoCount

View File

@@ -29,14 +29,14 @@ namespace VSW::Materializer::Utilities {
// Then get its file name part // Then get its file name part
auto module_path = YYCC::FsPathPatch::FromUTF8Path(u8_module_path.c_str()); auto module_path = YYCC::FsPathPatch::FromUTF8Path(u8_module_path.c_str());
auto u8_module_name = YYCC::FsPathPatch::ToUTF8Path(module_path.filename()); auto u8_module_name = YYCC::FsPathPatch::ToUTF8Path(module_path.filename());
// Get the base address of current module // Get the base address of current module
// HMODULE is the base address of loaded module // HMODULE is the base address of loaded module
// Reference: https://stackoverflow.com/questions/4298331/exe-or-dll-image-base-address // Reference: https://stackoverflow.com/questions/4298331/exe-or-dll-image-base-address
uintptr_t relative_addr = reinterpret_cast<uintptr_t>(absolute_addr) - reinterpret_cast<uintptr_t>(hModule); uintptr_t relative_addr = reinterpret_cast<uintptr_t>(absolute_addr) - reinterpret_cast<uintptr_t>(hModule);
// get final result // 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); ret = YYCC::EncodingHelper::ToOrdinaryView(u8_ret);
return ret; return ret;
} }
@@ -53,4 +53,18 @@ namespace VSW::Materializer::Utilities {
else storage = str; 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<CKSTRING>(YYCC::EncodingHelper::UTF8ToChar(strl, CP_ACP).c_str()), FALSE);
}
#pragma endregion
} }

View File

@@ -1,11 +1,24 @@
#pragma once #pragma once
#include "stdafx.hpp" #include "stdafx.hpp"
#include <GenericHelper.hpp>
namespace VSW::Materializer::Utilities { namespace VSW::Materializer::Utilities {
/// @brief The value representing a invalid CK_ID. /// @brief The value representing a invalid CK_ID.
constexpr CK_ID INVALID_CK_ID = static_cast<CK_ID>(-1); constexpr CK_ID INVALID_CK_ID = static_cast<CK_ID>(-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 * @brief Get relative address from given absolute address
* @details This function is used when exporting function pointer into database. * @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. * @return Module based relative address like \c xxx.dll+0x00000000.
*/ */
std::string RelativeAddress(const void* absolute_addr); std::string RelativeAddress(const void* absolute_addr);
void CopyGuid(int64_t& dst, const CKGUID& src); void CopyGuid(int64_t& dst, const CKGUID& src);
void CopyCKString(std::string& storage, const char* str); void CopyCKString(std::string& storage, const char* str);

View File

@@ -28,8 +28,8 @@ PUBLIC
# Setup C++ standard # Setup C++ standard
set_target_properties(VSWShared set_target_properties(VSWShared
PROPERTIES PROPERTIES
CXX_STANDARD 20 CXX_STANDARD 17
CXX_STANDARD_REQUIRED 20 CXX_STANDARD_REQUIRED 17
CXX_EXTENSION OFF CXX_EXTENSION OFF
) )
# MSVC specific correction # MSVC specific correction

View File

@@ -1,7 +1,41 @@
#include "GenericHelper.hpp" #include "GenericHelper.hpp"
#include <cstdarg>
namespace VSW { 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
} }

View File

@@ -10,7 +10,7 @@ namespace VSW {
~Reporter(); ~Reporter();
protected: protected:
void PrePrint(const YYCC::yycc_char8_t* strl); virtual void PrePrint(const YYCC::yycc_char8_t* strl);
public: public:
void Err(const YYCC::yycc_char8_t* strl); void Err(const YYCC::yycc_char8_t* strl);
@@ -19,8 +19,6 @@ namespace VSW {
void WarnF(const YYCC::yycc_char8_t* fmt, ...); void WarnF(const YYCC::yycc_char8_t* fmt, ...);
void Info(const YYCC::yycc_char8_t* strl); void Info(const YYCC::yycc_char8_t* strl);
void InfoF(const YYCC::yycc_char8_t* fmt, ...); 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 { namespace DataTypes {