diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/executor/base/grd_db_api.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/executor/base/grd_db_api.cpp index 73bc1e4d4c858c1d401ea01ab7dee8cb5c65b84c..fff6188d208afaffc01ac49fdfbc9177ae11acc1 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/executor/base/grd_db_api.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/executor/base/grd_db_api.cpp @@ -25,7 +25,7 @@ using namespace DocumentDB; int GRD_DBOpen(const char *dbPath, const char *configStr, unsigned int flags, GRD_DB **db) { - if (db == nullptr || (*db) != nullptr) { + if (db == nullptr) { return GRD_INVALID_ARGS; } std::string path = (dbPath == nullptr ? "" : dbPath); diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/oh_adapter/src/sqlite_utils.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/oh_adapter/src/sqlite_utils.cpp index 30c0d095134e5bf0687fc5ac7ea20c4b6cd7a27e..bb86791fb5bb5cd26f979678665af805c1b057d3 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/oh_adapter/src/sqlite_utils.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/src/oh_adapter/src/sqlite_utils.cpp @@ -14,12 +14,14 @@ */ #include "sqlite_utils.h" +#include #include "doc_errno.h" #include "log_print.h" namespace DocumentDB { -const int MAX_BLOB_READ_SIZE = 5 * 1024 * 1024; // 5M limit TODO:: check blob size +const int MAX_BLOB_READ_SIZE = 5 * 1024 * 1024; // 5M limit const int MAX_TEXT_READ_SIZE = 5 * 1024 * 1024; // 5M limit +const int BUSY_TIMEOUT_MS = 3000; // 3000ms for sqlite busy timeout. const std::string BEGIN_SQL = "BEGIN TRANSACTION"; const std::string BEGIN_IMMEDIATE_SQL = "BEGIN IMMEDIATE TRANSACTION"; const std::string COMMIT_SQL = "COMMIT TRANSACTION"; @@ -39,6 +41,9 @@ int MapSqliteError(int errCode) return -E_ERROR; } } + +std::mutex g_logConfigMutex; +bool g_configLog = false; } void SQLiteUtils::SqliteLogCallback(void *data, int err, const char *msg) @@ -48,6 +53,14 @@ void SQLiteUtils::SqliteLogCallback(void *data, int err, const char *msg) int SQLiteUtils::CreateDataBase(const std::string &path, int flag, sqlite3 *&db) { + { + std::lock_guard lock(g_logConfigMutex); + if (!g_configLog) { + sqlite3_config(SQLITE_CONFIG_LOG, &SqliteLogCallback, nullptr); + g_configLog = true; + } + } + int errCode = sqlite3_open_v2(path.c_str(), &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr); if (errCode != SQLITE_OK) { GLOGE("Open database [%s] failed. %d", path.c_str(), errCode); @@ -55,6 +68,12 @@ int SQLiteUtils::CreateDataBase(const std::string &path, int flag, sqlite3 *&db) (void)sqlite3_close_v2(db); db = nullptr; } + return MapSqliteError(errCode); + } + + errCode = sqlite3_busy_timeout(db, BUSY_TIMEOUT_MS); + if (errCode != SQLITE_OK) { + GLOGE("Set busy timeout failed:%d", errCode); } return MapSqliteError(errCode); } diff --git a/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/test/unittest/api/documentdb_api_test.cpp b/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/test/unittest/api/documentdb_api_test.cpp index b36dd2e11f19d590550a829baa07f2a156dc52b9..c442be61c3ec63b644da27d40c9d1bd535193cd8 100644 --- a/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/test/unittest/api/documentdb_api_test.cpp +++ b/services/distributeddataservice/service/data_share/gaussdb_rd_Simple/test/unittest/api/documentdb_api_test.cpp @@ -100,8 +100,11 @@ HWTEST_F(DocumentDBApiTest, OpenDBTest002, TestSize.Level0) EXPECT_EQ(status, GRD_OK); EXPECT_NE(db, nullptr); + status = GRD_DBClose(db, GRD_DB_CLOSE); + EXPECT_EQ(status, GRD_OK); + status = GRD_DBOpen(path.c_str(), nullptr, GRD_DB_OPEN_CREATE, &db); - EXPECT_EQ(status, GRD_INVALID_ARGS); + EXPECT_EQ(status, GRD_OK); status = GRD_DBClose(db, GRD_DB_CLOSE); EXPECT_EQ(status, GRD_OK);