diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index f65e845e497f090a6f97992267c7cd6dc625f0ea..4e3db7b4f1062f1c248ad9f6fec6e726f3b56963 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -439,30 +439,49 @@ int taos_options(TSDB_OPTION option, const void *arg, ...) { } #include "cJSON.h" -static int taos_set_config_imp(const char *config){ +static setConfRet taos_set_config_imp(const char *config){ + setConfRet ret = {0}; static bool setConfFlag = false; if (setConfFlag) { - return 0; + ret.retCode = -5; + strcpy(ret.retMsg, "configuration can only set once"); + return ret; } taosInitGlobalCfg(); cJSON *root = cJSON_Parse(config); - if (root == NULL || !cJSON_IsObject(root) || cJSON_GetArraySize(root) == 0) { - return -1; + if (root == NULL){ + ret.retCode = -4; + strcpy(ret.retMsg, "parse json error"); + return ret; + } + if(!cJSON_IsObject(root) || cJSON_GetArraySize(root) == 0) { + ret.retCode = -3; + strcpy(ret.retMsg, "json content is invalid, must be not empty object"); + return ret; } - int ret = 0; int size = cJSON_GetArraySize(root); for(int i = 0; i < size; i++){ cJSON *item = cJSON_GetArrayItem(root, i); - if(item && !taosReadConfigOption(item->string, item->valuestring, NULL, NULL, TAOS_CFG_CSTATUS_OPTION, TSDB_CFG_CTYPE_B_CLIENT)){ - ret = -2; + if(!item) { + ret.retCode = -2; + strcpy(ret.retMsg, "inner error"); + return ret; + } + if(!taosReadConfigOption(item->string, item->valuestring, NULL, NULL, TAOS_CFG_CSTATUS_OPTION, TSDB_CFG_CTYPE_B_CLIENT)){ + ret.retCode = -1; + if (strlen(ret.retMsg) == 0){ + sprintf(ret.retMsg, "part error|%s", item->string); + }else{ + sprintf(ret.retMsg, "%s|%s", ret.retMsg, item->string); + } } } setConfFlag = true; return ret; } -int taos_set_config(const char *config){ +setConfRet taos_set_config(const char *config){ static int32_t lock = 0; for (int i = 1; atomic_val_compare_exchange_32(&lock, 0, 1) != 0; ++i) { @@ -471,7 +490,7 @@ int taos_set_config(const char *config){ sched_yield(); } } - int ret = taos_set_config_imp(config); + setConfRet ret = taos_set_config_imp(config); atomic_store_32(&lock, 0); return ret; } diff --git a/src/client/tests/setConfigTest.cpp b/src/client/tests/setConfigTest.cpp index e7c34ed8f161467bf394531aff7fa426210aa21c..9b982741b78e05a01c7f634c80f2001ccdef0418 100644 --- a/src/client/tests/setConfigTest.cpp +++ b/src/client/tests/setConfigTest.cpp @@ -8,10 +8,14 @@ /* test set config function */ TEST(testCase, set_config_test1) { const char *config = "{\"debugFlag\":\"131\"}"; - taos_set_config(config); + setConfRet ret = taos_set_config(config); + ASSERT_EQ(ret.retCode, 0); + printf("msg:%d->%s", ret.retCode, ret.retMsg); const char *config2 = "{\"debugFlag\":\"199\"}"; - taos_set_config(config2); // not take effect + ret = taos_set_config(config2); // not take effect + ASSERT_EQ(ret.retCode, -5) + printf("msg:%d->%s", ret.retCode, ret.retMsg); bool readResult = taosReadGlobalCfg(); // load file config, debugFlag not take effect ASSERT_TRUE(readResult); @@ -37,3 +41,24 @@ TEST(testCase, set_config_test2) { int32_t result = *(int32_t*)cfg->ptr; ASSERT_NE(result, 10); // numOfCommitThreads not type of TSDB_CFG_CTYPE_B_CLIENT } + +TEST(testCase, set_config_test3) { + const char *config = "{\"numOfCoitThreads\":\"10\", \"esdfa\":\"10\"}"; + setConfRet ret = taos_set_config(config); + ASSERT_EQ(ret.retCode, -1); + printf("msg:%d->%s", ret.retCode, ret.retMsg); +} + +TEST(testCase, set_config_test4) { + const char *config = "{null}"; + setConfRet ret = taos_set_config(config); + ASSERT_EQ(ret.retCode, -4); + printf("msg:%d->%s", ret.retCode, ret.retMsg); +} + +TEST(testCase, set_config_test5) { + const char *config = "ddd"; + setConfRet ret = taos_set_config(config); + ASSERT_EQ(ret.retCode, -3); + printf("msg:%d->%s", ret.retCode, ret.retMsg); +} diff --git a/src/inc/taos.h b/src/inc/taos.h index 107dbc2826bb022bacd48c57351bc8a699afa4c5..d77fa8f5fcb4c957c274d076a1d6f2ef5631c85a 100644 --- a/src/inc/taos.h +++ b/src/inc/taos.h @@ -62,6 +62,11 @@ typedef struct taosField { int16_t bytes; } TAOS_FIELD; +typedef struct setConfRet { + char retMsg[1024]; + int8_t retCode; +} setConfRet; + #ifdef _TD_GO_DLL_ #define DLL_EXPORT __declspec(dllexport) #else @@ -71,7 +76,7 @@ typedef struct taosField { DLL_EXPORT int taos_init(); DLL_EXPORT void taos_cleanup(void); DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...); -DLL_EXPORT int taos_set_config(const char *config); +DLL_EXPORT setConfRet taos_set_config(const char *config); DLL_EXPORT TAOS *taos_connect(const char *ip, const char *user, const char *pass, const char *db, uint16_t port); DLL_EXPORT TAOS *taos_connect_auth(const char *ip, const char *user, const char *auth, const char *db, uint16_t port); DLL_EXPORT void taos_close(TAOS *taos);