diff --git a/SuperScriptMaterializer/database.cpp b/SuperScriptMaterializer/database.cpp index 18328ce..dabe66b 100644 --- a/SuperScriptMaterializer/database.cpp +++ b/SuperScriptMaterializer/database.cpp @@ -36,8 +36,27 @@ namespace SSMaterializer { #pragma region universal sqlite database init and free - SSMaterializerDatabase::SSMaterializerDatabase(const char* file) : + SSMaterializerDatabase::SSMaterializerDatabase() : mStmtCache(), mDb(NULL) { + ; + } + + SSMaterializerDatabase::~SSMaterializerDatabase() { + ; + } + + sqlite3_stmt* SSMaterializerDatabase::CreateStmt(const char* str_stmt) { + int result; + sqlite3_stmt* stmt = NULL; + result = sqlite3_prepare_v2(mDb, str_stmt, -1, &stmt, NULL); + if (result != SQLITE_OK) return NULL; + + // append new one + mStmtCache.push_back(stmt); + return stmt; + } + + void SSMaterializerDatabase::FakeConstructor(const char* file) { // open mDb int result; result = sqlite3_open(file, &mDb); @@ -47,6 +66,13 @@ namespace SSMaterializer { result = sqlite3_exec(mDb, "PRAGMA synchronous = OFF;", NULL, NULL, NULL); if (result != SQLITE_OK) goto fail; + // run init + if (!Init()) goto fail; + + //start job + result = sqlite3_exec(mDb, "begin;", NULL, NULL, NULL); + if (result != SQLITE_OK) goto fail; + return; fail: sqlite3_close(mDb); @@ -54,10 +80,17 @@ namespace SSMaterializer { mDb = NULL; } - SSMaterializerDatabase::~SSMaterializerDatabase() { + void SSMaterializerDatabase::FakeDeconstructor() { if (mDb == NULL) return; int result; + //commit job + result = sqlite3_exec(mDb, "commit;", NULL, NULL, NULL); + if (result != SQLITE_OK) goto fail; + + // run extra stuff + if (!Finalize()) goto fail; + //free all cached stmts and commit job for (auto it = mStmtCache.begin(); it != mStmtCache.end(); it++) { if (*it != NULL) { @@ -72,15 +105,12 @@ namespace SSMaterializer { mDb = NULL; } - sqlite3_stmt* SSMaterializerDatabase::CreateStmt(const char* str_stmt) { - int result; - sqlite3_stmt* stmt = NULL; - result = sqlite3_prepare_v2(mDb, str_stmt, -1, &stmt, NULL); - if (result != SQLITE_OK) return NULL; + BOOL SSMaterializerDatabase::Init() { + return TRUE; + } - // append new one - mStmtCache.push_back(stmt); - return stmt; + BOOL SSMaterializerDatabase::Finalize() { + return TRUE; } #pragma endregion @@ -88,53 +118,21 @@ namespace SSMaterializer { #pragma region sub-database constructor, deconstructor and help functions DocumentDatabase::DocumentDatabase(const char* file, CKParameterManager* paramManager) : - SSMaterializerDatabase(file), mUniqueAttr(), mUniqueObj(), mDbHelper(paramManager) { - if (!Init()) goto fail; - - //start job - int result = sqlite3_exec(mDb, "begin;", NULL, NULL, NULL); - if (result != SQLITE_OK) goto fail; - - fail: - sqlite3_close(mDb); - mDb = NULL; + SSMaterializerDatabase(), mUniqueAttr(), mUniqueObj(), mDbHelper(paramManager) { + FakeConstructor(file); } DocumentDatabase::~DocumentDatabase() { - if (!Finalize()) goto fail; - - //commit job - int result = sqlite3_exec(mDb, "commit;", NULL, NULL, NULL); - if (result != SQLITE_OK) goto fail; - - fail: - sqlite3_close(mDb); - mDb = NULL; + FakeDeconstructor(); } EnvironmentDatabase::EnvironmentDatabase(const char* file) : - SSMaterializerDatabase(file), mDbHelper() { - if (!Init()) goto fail; - - //start job - int result = sqlite3_exec(mDb, "begin;", NULL, NULL, NULL); - if (result != SQLITE_OK) goto fail; - - fail: - sqlite3_close(mDb); - mDb = NULL; + SSMaterializerDatabase(), mDbHelper() { + FakeConstructor(file); } EnvironmentDatabase::~EnvironmentDatabase() { - if (!Finalize()) goto fail; - - //commit job - int result = sqlite3_exec(mDb, "commit;", NULL, NULL, NULL); - if (result != SQLITE_OK) goto fail; - - fail: - sqlite3_close(mDb); - mDb = NULL; + FakeDeconstructor(); } BOOL DocumentDatabase::is_attr_duplicated(DataStruct::EXPAND_CK_ID parents) { @@ -169,6 +167,9 @@ namespace SSMaterializer { if (result != SQLITE_OK) { return FALSE; } BOOL DocumentDatabase::Init() { + // execute parent first + if (!SSMaterializerDatabase::Init()) return FALSE; + int result; //Init table @@ -202,6 +203,9 @@ if (result != SQLITE_OK) { return FALSE; } } BOOL DocumentDatabase::Finalize() { + // execute parent first + if (!SSMaterializerDatabase::Finalize()) return FALSE; + //create index for quick select in SuperScriptDecorator int result; @@ -225,6 +229,9 @@ if (result != SQLITE_OK) { return FALSE; } } BOOL EnvironmentDatabase::Init() { + // execute parent first + if (!SSMaterializerDatabase::Init()) return FALSE; + int result; //init table @@ -242,6 +249,9 @@ if (result != SQLITE_OK) { return FALSE; } } BOOL EnvironmentDatabase::Finalize() { + // execute parent first + if (!SSMaterializerDatabase::Finalize()) return FALSE; + return TRUE; } diff --git a/SuperScriptMaterializer/database.hpp b/SuperScriptMaterializer/database.hpp index 131d92f..d8755cb 100644 --- a/SuperScriptMaterializer/database.hpp +++ b/SuperScriptMaterializer/database.hpp @@ -306,11 +306,15 @@ namespace SSMaterializer { class SSMaterializerDatabase { public: - SSMaterializerDatabase(const char* file); + SSMaterializerDatabase(); virtual ~SSMaterializerDatabase(); protected: sqlite3_stmt* CreateStmt(const char* stmt); + void FakeConstructor(const char* file); + void FakeDeconstructor(); + virtual BOOL Init(); + virtual BOOL Finalize(); sqlite3* mDb; std::vector mStmtCache; @@ -348,8 +352,8 @@ namespace SSMaterializer { BOOL is_obj_duplicated(DataStruct::EXPAND_CK_ID parents); protected: - BOOL Init(); - BOOL Finalize(); + virtual BOOL Init() override; + virtual BOOL Finalize() override; std::set mUniqueAttr; std::set mUniqueObj; @@ -368,8 +372,8 @@ namespace SSMaterializer { void write_variable(DataStruct::dbenv_variable& data); protected: - BOOL Init(); - BOOL Finalize(); + virtual BOOL Init() override; + virtual BOOL Finalize() override; }; } diff --git a/SuperScriptMaterializer/doc_export.cpp b/SuperScriptMaterializer/doc_export.cpp index 17167bd..e6a2373 100644 --- a/SuperScriptMaterializer/doc_export.cpp +++ b/SuperScriptMaterializer/doc_export.cpp @@ -561,6 +561,7 @@ namespace SSMaterializer { CKParameter* p = NULL; CK_CLASSID objcls; int param_size = 0; + BOOL need_evaluate = FALSE; for (int row = 0; row < rows; ++row) { mDb->mDbHelper.array_cell.column = col; @@ -578,11 +579,13 @@ namespace SSMaterializer { // use class id objcls = obj->GetClassID(); if (objcls == CKCID_PARAMETER || objcls == CKCID_PARAMETERLOCAL || objcls == CKCID_PARAMETEROUT) { + need_evaluate = objcls == CKCID_PARAMETEROUT; + // CKParameter p = (CKParameter*)obj; - param_size = p->GetStringValue(NULL, FALSE); + param_size = p->GetStringValue(NULL, need_evaluate); mDb->mDbHelper.array_cell.showcase.resize(param_size); - p->GetStringValue((char*)mDb->mDbHelper.array_cell.showcase.data(), FALSE); + p->GetStringValue((char*)mDb->mDbHelper.array_cell.showcase.data(), need_evaluate); mDb->mDbHelper.array_cell.inner_param = p->GetID(); @@ -715,7 +718,8 @@ namespace SSMaterializer { } if (t == CKPGUID_2DCURVE) { //CK2dCurve* c; - CK2dCurve* c = (CK2dCurve*)p->GetReadDataPtr(false); + CK2dCurve* c = NULL; + memcpy(&c, p->GetReadDataPtr(false), sizeof(c)); // we need construct a fake json body as our data static std::string str_2dcurve; @@ -757,6 +761,7 @@ namespace SSMaterializer { str_2dcurve += '}'; } + str_2dcurve = "]"; DataDictWritter("2dcurve", str_2dcurve.c_str(), mDb, parents); return; }