|
|
|
|
@@ -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<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);
|
|
|
|
|
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));
|
|
|
|
|
|