From 7d9b7f14e8dc57118dab422fa8814d4bafd20abe Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Fri, 9 Aug 2024 16:19:26 +0800 Subject: [PATCH] fix: finish basic export test on Virtools 5 environment --- materializer/DataTypes.hpp | 2 +- materializer/Database.cpp | 118 ++++++++++++++--------------- materializer/ExportDocument.cpp | 5 ++ materializer/ExportEnvironment.cpp | 20 +++-- materializer/ExportScript.cpp | 9 +++ materializer/Utilities.cpp | 26 ++++--- materializer/Utilities.hpp | 5 ++ script/sqlite_helper.py | 5 ++ shared/GenericHelper.cpp | 14 ++-- 9 files changed, 123 insertions(+), 81 deletions(-) diff --git a/materializer/DataTypes.hpp b/materializer/DataTypes.hpp index cf7e5bb..6fdde6f 100644 --- a/materializer/DataTypes.hpp +++ b/materializer/DataTypes.hpp @@ -268,7 +268,7 @@ namespace VSW::Materializer::DataTypes { int64_t reader_setting_param_guid; YYCC::yycc_u8string reader_file_ext; // Manager and Render Engine specific - CKBOOL manager_active; + bool manager_active; // Behavior specific YYCC::yycc_u8string behavior_guids; }; diff --git a/materializer/Database.cpp b/materializer/Database.cpp index fecae54..d0fda10 100644 --- a/materializer/Database.cpp +++ b/materializer/Database.cpp @@ -39,6 +39,7 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); #define REVEAL_ENUM(enum_val) static_cast>(enum_val) #define REVEAL_U8STR(u8_str) YYCC::EncodingHelper::ToOrdinary(u8_str.c_str()), -1, SQLITE_TRANSIENT #define REVEAL_BLOB(blob_val) (blob_val).ptr, (blob_val).length, SQLITE_TRANSIENT +#define REVEAL_BOOL(bool_val) ((bool_val) ? 1 : 0) #pragma endregion @@ -123,19 +124,19 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); AbstractDatabase(file) { // initialize table 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 [script] ([beobj] INTEGER, [beobj_name] TEXT, [behavior_index] INTEGER, [behavior] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [behavior] ([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [proto_name] TEXT, [proto_guid] INTEGER, [flags] INTEGER, [priority] INTEGER, [version] INTEGER, [pin_count_ptarget] INTEGER, [pin_count_pin] INTEGER, [pin_count_pout] INTEGER, [pin_count_bin] INTEGER, [pin_count_bout] INTEGER, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pTarget] ([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [parent] INTEGER, [direct_source] INTEGER, [shared_source] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pIn] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] INTEGER, [parent] INTEGER, [direct_source] INTEGER, [shared_source] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pOut] ([thisobj] INTEGER, [index] INTEGER, [name] TEXT, [type] INTEGER, [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 [bLink] ([input] INTEGER, [output] INTEGER, [delay] INTEGER, [parent] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_index] INTEGER, [output_obj] INTEGER, [output_type] INTEGER, [output_index] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pLocal] ([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [is_setting] INTEGER, [parent] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pLink] ([parent] INTEGER, [input] INTEGER, [input_obj] INTEGER, [input_type] INTEGER, [input_is_bb] INTEGER, [input_index] INTEGER, [output] INTEGER, [output_obj] INTEGER, [output_type] INTEGER, [output_is_bb] INTEGER, [output_index] INTEGER);"); + CTOR_SQL_EXEC("CREATE TABLE [pOper] ([thisobj] INTEGER, [op] INTEGER, [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 [pAttr] ([thisobj] INTEGER, [name] TEXT, [type] INTEGER, [owner] INTEGER);"); CTOR_SQL_EXEC("CREATE TABLE [data] ([field] TEXT, [data] BLOB, [parent] INTEGER);"); END_CTOR; } @@ -163,134 +164,133 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); void ScriptDatabase::Write(const DataTypes::Script::Table_script& data) { 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)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.beobj)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.beobj_name))); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.behavior_index)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.behavior)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_behavior& data) { - BEGIN_WRITER("INSERT INTO [script_behavior] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.type)); - WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.proto_name.c_str(), -1, SQLITE_TRANSIENT)); - WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.proto_guid.c_str(), -1, SQLITE_TRANSIENT)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.proto_name))); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.proto_guid)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.flags)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.priority)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.version)); - WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.pin_count.c_str(), -1, SQLITE_TRANSIENT)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.pin_count_ptarget)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.pin_count_pin)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.pin_count_pout)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.pin_count_bin)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.pin_count_bout)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_bIn& data) { - BEGIN_WRITER("INSERT INTO [script_bIn] VALUES (?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_bOut& data) { - BEGIN_WRITER("INSERT INTO [script_bOut] VALUES (?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pIn& data) { - BEGIN_WRITER("INSERT INTO [script_pIn] VALUES (?, ?, ?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); - 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_guid.c_str(), -1, SQLITE_TRANSIENT)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.type)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.direct_source)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.shared_source)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pOut& data) { - BEGIN_WRITER("INSERT INTO [script_pOut] VALUES (?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); - 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_guid.c_str(), -1, SQLITE_TRANSIENT)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.type)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_bLink& data) { - BEGIN_WRITER("INSERT INTO [script_bLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input_obj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_ENUM(data.input_type))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input_index)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output_obj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_ENUM(data.output_type))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output_index)); - WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pLocal& data) { - BEGIN_WRITER("INSERT INTO [script_pLocal] VALUES (?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); - WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type_guid.c_str(), -1, SQLITE_TRANSIENT)); - WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.is_setting)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.type)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_BOOL(data.is_setting))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pAttr& data) { - BEGIN_WRITER("INSERT INTO [script_pAttr] VALUES (?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); - WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type_guid.c_str(), -1, SQLITE_TRANSIENT)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.type)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.owner)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pLink& data) { - BEGIN_WRITER("INSERT INTO [script_pLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [pLink] VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); 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)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_ENUM(data.input_type))); - WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input_is_bb)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_BOOL(data.input_is_bb))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.input_index)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output_obj)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_ENUM(data.output_type))); - WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output_is_bb)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_BOOL(data.output_is_bb))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.output_index)); - WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pOper& data) { - BEGIN_WRITER("INSERT INTO [script_pOper] VALUES (?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.op)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_eLink& data) { - BEGIN_WRITER("INSERT INTO [script_eLink] VALUES (?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_BOOL(data.is_in))); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.index)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } void ScriptDatabase::Write(const DataTypes::Script::Table_pTarget& data) { - BEGIN_WRITER("INSERT INTO [script_pTarget] VALUES (?, ?, ?, ?, ?, ?, ?);"); + BEGIN_WRITER("INSERT INTO [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)); - WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, data.type_guid.c_str(), -1, SQLITE_TRANSIENT)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.name))); + WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.type)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.direct_source)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.shared_source)); @@ -298,9 +298,9 @@ failed: throw std::runtime_error("fail to bind value for prepared statement."); } void ScriptDatabase::Write(const DataTypes::Script::Table_data& data) { BEGIN_WRITER("INSERT INTO [data] VALUES (?, ?, ?);"); -WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.field))); -WRITER_BIND(sqlite3_bind_blob(WRITER_STMT, WRITER_INDEX, REVEAL_BLOB(data.data))); -WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); + WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.field))); + WRITER_BIND(sqlite3_bind_blob(WRITER_STMT, WRITER_INDEX, REVEAL_BLOB(data.data))); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); END_WRITER; } @@ -430,7 +430,7 @@ WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.parent)); WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.reader_flags)); WRITER_BIND(sqlite3_bind_int64(WRITER_STMT, WRITER_INDEX, data.reader_setting_param_guid)); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.reader_file_ext))); - WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.manager_active)); + WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_BOOL(data.manager_active))); WRITER_BIND(sqlite3_bind_text(WRITER_STMT, WRITER_INDEX, REVEAL_U8STR(data.behavior_guids))); END_WRITER; } diff --git a/materializer/ExportDocument.cpp b/materializer/ExportDocument.cpp index afb6c04..6ea25e1 100644 --- a/materializer/ExportDocument.cpp +++ b/materializer/ExportDocument.cpp @@ -69,6 +69,11 @@ namespace VSW::Materializer::ExportDocument { // export document IterateMessage(expctx, ctx->GetMessageManager()); IterateObject(expctx, ctx); + + // report success + expctx.reporter.EnableBeep(); + expctx.reporter.Info(YYCC_U8("Exporting document database done.")); + expctx.reporter.DisableBeep(); } } diff --git a/materializer/ExportEnvironment.cpp b/materializer/ExportEnvironment.cpp index e2ea9a0..45e3759 100644 --- a/materializer/ExportEnvironment.cpp +++ b/materializer/ExportEnvironment.cpp @@ -8,11 +8,16 @@ namespace VSW::Materializer::ExportEnvironment { struct ExportContext { ExportContext(CKContext* ctx, const YYCC::yycc_u8string_view& db_path, UINT code_page) : - db(db_path), cache(), reporter(ctx), cp(code_page) {} + db(db_path), cache(), reporter(ctx), cp(code_page), ctx(ctx), plugin_mgr(CKGetPluginManager()) {} Database::EnvironmentDatabase db; DataTypes::Environment::DataCache cache; Utilities::EnhancedReporter reporter; UINT cp; + + /// @brief Virtools context. + CKContext* ctx; + /// @brief Virtools Plugin Manager + CKPluginManager* plugin_mgr; }; static void IterateParameterOperation(ExportContext& expctx, CKParameterManager* param_mgr) { @@ -47,7 +52,7 @@ namespace VSW::Materializer::ExportEnvironment { } } - static void IterateParameter(ExportContext& expctx, CKParameterManager* param_mgr, CKPluginManager* plugin_mgr) { + static void IterateParameter(ExportContext& expctx, CKParameterManager* param_mgr) { // prepare variables CKParameterTypeDesc* desc = nullptr; @@ -74,8 +79,8 @@ namespace VSW::Materializer::ExportEnvironment { // This is different with plugin. // Because some parameters are provided by Virtools self. CKPluginEntry* plugin_entry = desc->CreatorDll; - CKPluginDll* plugin_dll = plugin_mgr->GetPluginDllInfo(plugin_entry->m_PluginDllIndex); if (plugin_entry != nullptr) { + CKPluginDll* plugin_dll = expctx.plugin_mgr->GetPluginDllInfo(plugin_entry->m_PluginDllIndex); CP_CKSTR(expctx.cache.param.dll_name, plugin_dll->m_DllFileName.CStr()); expctx.cache.param.dll_index = plugin_entry->m_PluginDllIndex; expctx.cache.param.position_in_dll = plugin_entry->m_PositionInDll; @@ -156,7 +161,7 @@ namespace VSW::Materializer::ExportEnvironment { expctx.cache.plugin.reader_setting_param_guid = INT64_C(0); expctx.cache.plugin.reader_file_ext.clear(); expctx.cache.plugin.behavior_guids.clear(); - expctx.cache.plugin.manager_active = FALSE; + expctx.cache.plugin.manager_active = false; // then try to fetch these specific fields switch (plugin_type) { case CKPLUGIN_BITMAP_READER: @@ -263,12 +268,17 @@ namespace VSW::Materializer::ExportEnvironment { // export environment one by one IterateParameterOperation(expctx, ctx->GetParameterManager()); - IterateParameter(expctx, ctx->GetParameterManager(), CKGetPluginManager()); + IterateParameter(expctx, ctx->GetParameterManager()); IterateAttribute(expctx, ctx->GetAttributeManager()); IteratePlugin(expctx, CKGetPluginManager()); #if !defined(VIRTOOLS_21) IterateVariable(expctx, ctx->GetVariableManager()); #endif + + // report success + expctx.reporter.EnableBeep(); + expctx.reporter.Info(YYCC_U8("Exporting environment database done.")); + expctx.reporter.DisableBeep(); } } diff --git a/materializer/ExportScript.cpp b/materializer/ExportScript.cpp index 7059e2d..882e5c7 100644 --- a/materializer/ExportScript.cpp +++ b/materializer/ExportScript.cpp @@ -23,7 +23,9 @@ namespace VSW::Materializer::ExportScript { /// @brief Variable for removing duplicated exported attributes. std::set attr_set; + /// @brief Virtools context. CKContext* ctx; + /// @brief Virtools Parameter Manager CKParameterManager* param_mgr; }; @@ -34,6 +36,8 @@ namespace VSW::Materializer::ExportScript { using db_size_t = decltype(expctx.cache.data.data.length); if (data_length > static_cast(std::numeric_limits::max())) throw std::runtime_error("Too long data length when exporting to data dictionary."); + // if length is zero, reset ptr to nullptr + if (data_length == 0u) data = nullptr; // write data expctx.cache.data.field = field; expctx.cache.data.data.ptr = data; @@ -634,6 +638,11 @@ namespace VSW::Materializer::ExportScript { // export script IterateScript(expctx); + + // report success + expctx.reporter.EnableBeep(); + expctx.reporter.Info(YYCC_U8("Exporting script database done.")); + expctx.reporter.DisableBeep(); } } diff --git a/materializer/Utilities.cpp b/materializer/Utilities.cpp index 49c9bb6..222391a 100644 --- a/materializer/Utilities.cpp +++ b/materializer/Utilities.cpp @@ -5,13 +5,17 @@ namespace VSW::Materializer::Utilities { #pragma region Enhanced Reporter EnhancedReporter::EnhancedReporter(CKContext* ctx) : - m_Ctx(ctx) {} + m_Ctx(ctx), m_OrderBeep(false) {} EnhancedReporter::~EnhancedReporter() {} + void EnhancedReporter::EnableBeep() { m_OrderBeep = true; } + + void EnhancedReporter::DisableBeep() { m_OrderBeep = false; } + void EnhancedReporter::PrePrint(const YYCC::yycc_char8_t* strl) const { if (m_Ctx != nullptr) - m_Ctx->OutputToConsole(const_cast(YYCC::EncodingHelper::UTF8ToChar(strl, CP_ACP).c_str()), FALSE); + m_Ctx->OutputToConsole(const_cast(YYCC::EncodingHelper::UTF8ToChar(strl, CP_ACP).c_str()), m_OrderBeep); } #pragma endregion @@ -33,8 +37,8 @@ namespace VSW::Materializer::Utilities { // get curve control point count int cp_count = c->GetControlPointCount(); // reserve enough space - // count * (x + y + is_linear + is_tcb + tcb_tuple) - m_Cache.reserve(static_cast(cp_count) * (sizeof(float) * 2u + sizeof(float) * 3u + sizeof(uint32_t) + sizeof(uint32_t))); + // count * (x + y + is_linear + is_tcb + (io_tangent_tuple / tcb_tuple)) + m_Cache.reserve(static_cast(cp_count) * (sizeof(float) * 2u + sizeof(float) * 4u + sizeof(uint32_t) + sizeof(uint32_t))); // iterate control point for (int i = 0; i < cp_count; ++i) { @@ -71,16 +75,16 @@ namespace VSW::Materializer::Utilities { APPEND_DATA(float_cache); float_cache = cp->GetBias(); APPEND_DATA(float_cache); - } else { - // non-TCB control point - float_cache = cp->GetInTangent(); - APPEND_DATA(float_cache); - float_cache = cp->GetOutTangent(); - APPEND_DATA(float_cache); - // To keep balance with TCB control point, + // To keep balance with non-TCB control point, // We add a blank 0.0f in there float_cache = 0.0f; APPEND_DATA(float_cache); + } else { + // non-TCB control point + vector_cache = cp->GetInTangent(); + APPEND_DATA(vector_cache); + vector_cache = cp->GetOutTangent(); + APPEND_DATA(vector_cache); } #undef APPEND_DATA diff --git a/materializer/Utilities.hpp b/materializer/Utilities.hpp index 0bc0906..5d83745 100644 --- a/materializer/Utilities.hpp +++ b/materializer/Utilities.hpp @@ -14,11 +14,16 @@ namespace VSW::Materializer::Utilities { EnhancedReporter(CKContext* ctx); ~EnhancedReporter(); + public: + void EnableBeep(); + void DisableBeep(); + protected: virtual void PrePrint(const YYCC::yycc_char8_t* strl) const override; private: CKContext* m_Ctx; + bool m_OrderBeep; }; class Curve2DBuilder { diff --git a/script/sqlite_helper.py b/script/sqlite_helper.py index e7e2494..fbe7594 100644 --- a/script/sqlite_helper.py +++ b/script/sqlite_helper.py @@ -14,6 +14,9 @@ class FieldDecl(): self.m_DeclType = decl_type self.m_DeclName = decl_name + def is_bool(self): + return self.m_DeclType == 'bool' + def is_string(self): return self.m_DeclType == 'YYCC::yycc_u8string' @@ -102,6 +105,8 @@ def output_result(decls: tuple[StructDecl, ...]) -> None: return f'WRITER_BIND(sqlite3_bind_blob(WRITER_STMT, WRITER_INDEX, REVEAL_BLOB(data.{decl_pair.m_DeclName})));' elif decl_pair.is_enum(): return f'WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_ENUM(data.{decl_pair.m_DeclName})));' + elif decl_pair.is_bool(): + return f'WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, REVEAL_BOOL(data.{decl_pair.m_DeclName})));' else: return f'WRITER_BIND(sqlite3_bind_int(WRITER_STMT, WRITER_INDEX, data.{decl_pair.m_DeclName}));' diff --git a/shared/GenericHelper.cpp b/shared/GenericHelper.cpp index 64f9209..aeb803b 100644 --- a/shared/GenericHelper.cpp +++ b/shared/GenericHelper.cpp @@ -8,12 +8,16 @@ namespace VSW { void Reporter::PrePrint(const YYCC::yycc_char8_t* strl) const {} -#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; \ +#define GENERIC_REPORTER_WRITE(ty, data) YYCC::yycc_u8string cache(YYCC_U8("[" #ty "] ")); \ +cache += data; \ +this->PrePrint(cache.c_str()); \ +YYCC::ConsoleHelper::WriteLine(cache.c_str()); +#define GENERIC_REPORTER_FORMAT(ty, data) va_list argptr; \ va_start(argptr, data); \ -YYCC::ConsoleHelper::WriteLine(YYCC::StringHelper::VPrintf(data, argptr).c_str()); \ +YYCC::yycc_u8string cache(YYCC::StringHelper::VPrintf(data, argptr)); \ +cache.insert(0u, YYCC_U8("[" #ty "] ")); \ +this->PrePrint(cache.c_str()); \ +YYCC::ConsoleHelper::WriteLine(cache.c_str()); \ va_end(argptr); void Reporter::Err(const YYCC::yycc_char8_t* strl) const {