• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4720

08 Sep 2025 08:43AM UTC coverage: 58.139% (-0.6%) from 58.762%
#4720

push

travis-ci

web-flow
Merge pull request #32881 from taosdata/enh/add-new-windows-ci

fix(ci): update workflow reference to use new Windows CI YAML

133181 of 292179 branches covered (45.58%)

Branch coverage included in aggregate %.

201691 of 283811 relevant lines covered (71.07%)

5442780.71 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

65.86
/source/util/src/tconfig.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include "cJSON.h"
18
#include "taoserror.h"
19
#include "tconfig.h"
20
#include "tconv.h"
21
#include "tenv.h"
22
#include "tglobal.h"
23
#include "tgrant.h"
24
#include "tjson.h"
25
#include "tlog.h"
26
#include "tunit.h"
27
#include "tutil.h"
28

29
#define CFG_NAME_PRINT_LEN 32
30
#define CFG_SRC_PRINT_LEN  12
31

32
struct SConfig {
33
  ECfgSrcType   stype;
34
  SArray       *localArray;
35
  SArray       *globalArray;
36
  TdThreadMutex lock;
37
};
38

39
int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath);
40
int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile);
41
int32_t cfgLoadFromEnvVar(SConfig *pConfig);
42
int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd);
43
int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url);
44
int32_t cfgSetItemVal(SConfigItem *pItem, const char *name, const char *value, ECfgSrcType stype);
45

46
extern char **environ;
47

48
int32_t cfgInit(SConfig **ppCfg) {
13,703✔
49
  int32_t  code = 0;
13,703✔
50
  int32_t  lino = 0;
13,703✔
51
  SConfig *pCfg = NULL;
13,703✔
52

53
  pCfg = taosMemoryCalloc(1, sizeof(SConfig));
13,703!
54
  if (pCfg == NULL) return terrno;
13,703!
55

56
  pCfg->localArray = NULL, pCfg->globalArray = NULL;
13,703✔
57
  pCfg->localArray = taosArrayInit(64, sizeof(SConfigItem));
13,703✔
58
  TSDB_CHECK_NULL(pCfg->localArray, code, lino, _exit, terrno);
13,703!
59

60
  pCfg->globalArray = taosArrayInit(64, sizeof(SConfigItem));
13,703✔
61
  TSDB_CHECK_NULL(pCfg->globalArray, code, lino, _exit, terrno);
13,703!
62

63
  TAOS_CHECK_RETURN(taosThreadMutexInit(&pCfg->lock, NULL));
13,703!
64
  *ppCfg = pCfg;
13,703✔
65

66
_exit:
13,703✔
67
  if (code != 0) {
13,703!
68
    uError("failed to init config, since %s ,at line %d", tstrerror(code), lino);
×
69
    cfgCleanup(pCfg);
×
70
  }
71

72
  TAOS_RETURN(TSDB_CODE_SUCCESS);
13,703✔
73
}
74

75
int32_t cfgLoad(SConfig *pCfg, ECfgSrcType cfgType, const void *sourceStr) {
68,212✔
76
  switch (cfgType) {
68,212!
77
    case CFG_STYPE_CFG_FILE:
13,640✔
78
      return cfgLoadFromCfgFile(pCfg, sourceStr);
13,640✔
79
    case CFG_STYPE_ENV_FILE:
13,643✔
80
      return cfgLoadFromEnvFile(pCfg, sourceStr);
13,643✔
81
    case CFG_STYPE_ENV_VAR:
13,643✔
82
      return cfgLoadFromEnvVar(pCfg);
13,643✔
83
    case CFG_STYPE_APOLLO_URL:
13,643✔
84
      return cfgLoadFromApollUrl(pCfg, sourceStr);
13,643✔
85
    case CFG_STYPE_ENV_CMD:
13,643✔
86
      return cfgLoadFromEnvCmd(pCfg, (const char **)sourceStr);
13,643✔
87
    default:
×
88
      return TSDB_CODE_INVALID_PARA;
×
89
  }
90
}
91

92
int32_t cfgLoadFromArray(SConfig *pCfg, SArray *pArgs) {
13,643✔
93
  int32_t size = taosArrayGetSize(pArgs);
13,643✔
94
  for (int32_t i = 0; i < size; ++i) {
13,661✔
95
    SConfigPair *pPair = taosArrayGet(pArgs, i);
18✔
96
    if (cfgSetItem(pCfg, pPair->name, pPair->value, CFG_STYPE_ARG_LIST, true) != 0) {
18!
97
      return TSDB_CODE_INVALID_PARA;
×
98
    }
99
  }
100

101
  return TSDB_CODE_SUCCESS;
13,643✔
102
}
103

104
int32_t cfgUpdateFromArray(SConfig *pCfg, SArray *pArgs) {
1,915✔
105
  int32_t code = TSDB_CODE_SUCCESS;
1,915✔
106
  int32_t size = taosArrayGetSize(pArgs);
1,915✔
107
  for (int32_t i = 0; i < size; ++i) {
179,669✔
108
    SConfigItem *pItemNew = taosArrayGet(pArgs, i);
177,754✔
109

110
    (void)taosThreadMutexLock(&pCfg->lock);
177,754✔
111

112
    SConfigItem *pItemOld = cfgGetItem(pCfg, pItemNew->name);
177,754✔
113
    if (pItemOld == NULL) {
177,754!
114
      uInfo("cfg:%s, type:%s src:%s, not found, skip to update", pItemNew->name, cfgDtypeStr(pItemNew->dtype),
×
115
            cfgStypeStr(pItemNew->stype));
116
      (void)taosThreadMutexUnlock(&pCfg->lock);
×
117
      continue;
×
118
    }
119
    switch (pItemNew->dtype) {
177,754!
120
      case CFG_DTYPE_BOOL:
34,038✔
121
        pItemOld->bval = pItemNew->bval;
34,038✔
122
        break;
34,038✔
123
      case CFG_DTYPE_INT32:
104,005✔
124
        pItemOld->i32 = pItemNew->i32;
104,005✔
125
        break;
104,005✔
126
      case CFG_DTYPE_INT64:
11,346✔
127
        pItemOld->i64 = pItemNew->i64;
11,346✔
128
        break;
11,346✔
129
      case CFG_DTYPE_FLOAT:
3,782✔
130
      case CFG_DTYPE_DOUBLE:
131
        pItemOld->fval = pItemNew->fval;
3,782✔
132
        break;
3,782✔
133
      case CFG_DTYPE_STRING:
18,910✔
134
      case CFG_DTYPE_DIR:
135
        taosMemoryFree(pItemOld->str);
18,910!
136
        pItemOld->str = taosStrdup(pItemNew->str);
18,910!
137
        if (pItemOld->str == NULL) {
18,910!
138
          (void)taosThreadMutexUnlock(&pCfg->lock);
×
139
          TAOS_RETURN(terrno);
×
140
        }
141
        break;
18,910✔
142
      case CFG_DTYPE_LOCALE:
3,782✔
143
      case CFG_DTYPE_CHARSET:
144
        code = cfgSetItemVal(pItemOld, pItemNew->name, pItemNew->str, pItemNew->stype);
3,782✔
145
        if (code != TSDB_CODE_SUCCESS) {
3,782!
146
          (void)taosThreadMutexUnlock(&pCfg->lock);
×
147
          TAOS_RETURN(code);
×
148
        }
149
        break;
3,782✔
150
      case CFG_DTYPE_TIMEZONE:
1,891✔
151
        truncateTimezoneString(pItemNew->str);
1,891✔
152
        code = cfgSetItemVal(pItemOld, pItemNew->name, pItemNew->str, pItemNew->stype);
1,891✔
153
        if (code != TSDB_CODE_SUCCESS) {
1,891!
154
          (void)taosThreadMutexUnlock(&pCfg->lock);
×
155
          TAOS_RETURN(code);
×
156
        }
157
        break;
1,891✔
158
      default:
×
159
        break;
×
160
    }
161

162
    (void)taosThreadMutexUnlock(&pCfg->lock);
177,754✔
163
  }
164

165
  return TSDB_CODE_SUCCESS;
1,915✔
166
}
167

168
void cfgItemFreeVal(SConfigItem *pItem) {
1,524,984✔
169
  if (pItem->dtype == CFG_DTYPE_STRING || pItem->dtype == CFG_DTYPE_DIR || pItem->dtype == CFG_DTYPE_LOCALE ||
1,524,984✔
170
      pItem->dtype == CFG_DTYPE_CHARSET || pItem->dtype == CFG_DTYPE_TIMEZONE) {
1,280,635✔
171
    taosMemoryFreeClear(pItem->str);
280,462!
172
  }
173

174
  if (pItem->array) {
1,524,984✔
175
    taosArrayDestroy(pItem->array);
5,148✔
176
    pItem->array = NULL;
5,148✔
177
  }
178
}
1,524,984✔
179

180
void cfgCleanup(SConfig *pCfg) {
13,683✔
181
  if (pCfg == NULL) {
13,683!
182
    return;
×
183
  }
184

185
  int32_t size = taosArrayGetSize(pCfg->localArray);
13,683✔
186
  for (int32_t i = 0; i < size; ++i) {
1,020,241✔
187
    SConfigItem *pItem = taosArrayGet(pCfg->localArray, i);
1,006,558✔
188
    cfgItemFreeVal(pItem);
1,006,558✔
189
    taosMemoryFreeClear(pItem->name);
1,006,558!
190
  }
191

192
  size = taosArrayGetSize(pCfg->globalArray);
13,683✔
193
  for (int32_t i = 0; i < size; ++i) {
495,905✔
194
    SConfigItem *pItem = taosArrayGet(pCfg->globalArray, i);
482,222✔
195
    cfgItemFreeVal(pItem);
482,222✔
196
    taosMemoryFreeClear(pItem->name);
482,222!
197
  }
198

199
  taosArrayDestroy(pCfg->localArray);
13,683✔
200
  taosArrayDestroy(pCfg->globalArray);
13,683✔
201
  (void)taosThreadMutexDestroy(&pCfg->lock);
13,683✔
202
  taosMemoryFree(pCfg);
13,683!
203
}
204

205
int32_t cfgGetSize(SConfig *pCfg) { return taosArrayGetSize(pCfg->localArray) + taosArrayGetSize(pCfg->globalArray); }
311✔
206
int32_t cfgGetLocalSize(SConfig *pCfg) { return taosArrayGetSize(pCfg->localArray); }
39,693✔
207
int32_t cfgGetGlobalSize(SConfig *pCfg) { return taosArrayGetSize(pCfg->globalArray); }
145,248✔
208

209
static int32_t cfgCheckAndSetConf(SConfigItem *pItem, const char *conf) {
36,204✔
210
  cfgItemFreeVal(pItem);
36,204✔
211
  if (!(pItem->str == NULL)) return TSDB_CODE_INVALID_PARA;
36,204!
212

213
  pItem->str = taosStrdup(conf);
36,204!
214

215
  if (pItem->str == NULL) return terrno;
36,204!
216

217
  TAOS_RETURN(TSDB_CODE_SUCCESS);
36,204✔
218
}
219

220
static int32_t cfgCheckAndSetDir(SConfigItem *pItem, const char *inputDir) {
67,788✔
221
  char fullDir[PATH_MAX] = {0};
67,788✔
222
  if (taosExpandDir(inputDir, fullDir, PATH_MAX) != 0) {
67,788!
223
    int32_t code = terrno;
×
224
    uError("failed to expand dir:%s since %s", inputDir, tstrerror(code));
×
225
    TAOS_RETURN(code);
×
226
  }
227

228
  taosMemoryFreeClear(pItem->str);
67,788!
229
  pItem->str = taosStrdup(fullDir);
67,788!
230

231
  if (pItem->str == NULL) return terrno;
67,788!
232

233
  TAOS_RETURN(TSDB_CODE_SUCCESS);
67,788✔
234
}
235

236
static int32_t cfgSetBool(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
24,904✔
237
  int32_t code = 0;
24,904✔
238
  bool    tmp = false;
24,904✔
239
  if (strcasecmp(value, "true") == 0) tmp = true;
24,904!
240

241
  int32_t val = 0;
24,904✔
242
  if ((code = taosStr2int32(value, &val)) == 0 && val > 0) {
24,904!
243
    tmp = true;
5,161✔
244
  }
245

246
  pItem->bval = tmp;
24,904✔
247
  pItem->stype = stype;
24,904✔
248
  return 0;
24,904✔
249
}
250

251
static int32_t cfgSetInt32(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
171,915✔
252
  int32_t ival;
253
  TAOS_CHECK_RETURN(taosStrHumanToInt32(value, &ival));
171,915!
254
  if (ival < pItem->imin || ival > pItem->imax) {
171,915!
255
    uError("cfg:%s, type:%s src:%s value:%d out of range[%" PRId64 ", %" PRId64 "]", pItem->name,
3!
256
           cfgDtypeStr(pItem->dtype), cfgStypeStr(stype), ival, pItem->imin, pItem->imax);
257
    TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
3✔
258
  }
259

260
  pItem->i32 = ival;
171,912✔
261
  pItem->stype = stype;
171,912✔
262
  TAOS_RETURN(TSDB_CODE_SUCCESS);
171,912✔
263
}
264

265
static int32_t cfgSetInt64(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
28✔
266
  int64_t ival;
267
  TAOS_CHECK_RETURN(taosStrHumanToInt64(value, &ival));
28!
268
  if (ival < pItem->imin || ival > pItem->imax) {
28!
269
    uError("cfg:%s, type:%s src:%s value:%" PRId64 " out of range[%" PRId64 ", %" PRId64 "]", pItem->name,
3!
270
           cfgDtypeStr(pItem->dtype), cfgStypeStr(stype), ival, pItem->imin, pItem->imax);
271
    TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
3✔
272
  }
273

274
  pItem->i64 = ival;
25✔
275
  pItem->stype = stype;
25✔
276
  TAOS_RETURN(TSDB_CODE_SUCCESS);
25✔
277
}
278

279
static int32_t cfgSetFloat(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
26✔
280
  float dval = 0;
26✔
281
  TAOS_CHECK_RETURN(parseCfgReal(value, &dval));
26!
282
  if (dval < pItem->fmin || dval > pItem->fmax) {
26!
283
    uError("cfg:%s, type:%s src:%s value:%g out of range[%g, %g]", pItem->name, cfgDtypeStr(pItem->dtype),
×
284
           cfgStypeStr(stype), dval, pItem->fmin, pItem->fmax);
285
    TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
×
286
  }
287

288
  pItem->fval = dval;
26✔
289
  pItem->stype = stype;
26✔
290
  TAOS_RETURN(TSDB_CODE_SUCCESS);
26✔
291
}
292

293
static int32_t cfgSetString(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
27,500✔
294
  char *tmp = taosStrdup(value);
27,500!
295
  if (tmp == NULL) {
27,500!
296
    uError("cfg:%s, type:%s src:%s value:%s failed to dup since %s", pItem->name, cfgDtypeStr(pItem->dtype),
×
297
           cfgStypeStr(stype), value, tstrerror(TSDB_CODE_OUT_OF_MEMORY));
298
    TAOS_RETURN(terrno);
×
299
  }
300

301
  taosMemoryFreeClear(pItem->str);
27,500!
302
  pItem->str = tmp;
27,500✔
303
  pItem->stype = stype;
27,500✔
304
  TAOS_RETURN(TSDB_CODE_SUCCESS);
27,500✔
305
}
306

307
static int32_t cfgSetDir(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
15,258✔
308
  int32_t code = cfgCheckAndSetDir(pItem, value);
15,258✔
309
  if (TSDB_CODE_SUCCESS != code) {
15,258!
310
    uError("cfg:%s, type:%s src:%s value:%s failed to dup since %s", pItem->name, cfgDtypeStr(pItem->dtype),
×
311
           cfgStypeStr(stype), value, tstrerror(code));
312
    TAOS_RETURN(code);
×
313
  }
314

315
  pItem->stype = stype;
15,258✔
316
  TAOS_RETURN(TSDB_CODE_SUCCESS);
15,258✔
317
}
318

319
static int32_t doSetConf(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
15,744✔
320
  int32_t code = cfgCheckAndSetConf(pItem, value);
15,744✔
321
  if (TSDB_CODE_SUCCESS != code) {
15,744!
322
    uError("cfg:%s, type:%s src:%s value:%s failed to dup since %s", pItem->name, cfgDtypeStr(pItem->dtype),
×
323
           cfgStypeStr(stype), value, tstrerror(TSDB_CODE_OUT_OF_MEMORY));
324
    TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
×
325
  }
326

327
  pItem->stype = stype;
15,744✔
328
  TAOS_RETURN(TSDB_CODE_SUCCESS);
15,744✔
329
}
330

331
static int32_t cfgSetTimezone(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
1,930✔
332
  if (value == NULL) {
1,930!
333
    uError("cfg:%s, type:%s src:%s, value is null, skip to set timezone", pItem->name, cfgDtypeStr(pItem->dtype),
×
334
           cfgStypeStr(stype));
335
    TAOS_RETURN(TSDB_CODE_INVALID_CFG);
×
336
  }
337
  TAOS_CHECK_RETURN(osSetTimezone(value));
1,930!
338

339
  TAOS_CHECK_RETURN(doSetConf(pItem, tsTimezoneStr, stype));
1,930!
340

341
  TAOS_RETURN(TSDB_CODE_SUCCESS);
1,930✔
342
}
343

344
static int32_t cfgSetCharset(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
6,907✔
345
  if (stype == CFG_STYPE_ALTER_SERVER_CMD || stype == CFG_STYPE_ALTER_CLIENT_CMD) {
6,907!
346
    uError("failed to config charset, not support");
×
347
    TAOS_RETURN(TSDB_CODE_INVALID_CFG);
×
348
  }
349

350
  if (value == NULL || strlen(value) == 0) {
6,907!
351
    uError("cfg:%s, type:%s src:%s, value:%s, skip to set charset", pItem->name, cfgDtypeStr(pItem->dtype),
×
352
           cfgStypeStr(stype), value);
353
    TAOS_RETURN(TSDB_CODE_INVALID_CFG);
×
354
  }
355
#ifndef DISALLOW_NCHAR_WITHOUT_ICONV
356
  if (!taosValidateEncodec(value)) {
6,907!
357
    uError("invalid charset:%s", value);
×
358
    TAOS_RETURN(terrno);
×
359
  }
360

361
  if ((tsCharsetCxt = taosConvInit(value)) == NULL) {
6,907!
362
    TAOS_RETURN(terrno);
×
363
  }
364
  (void)memcpy(tsCharset, value, strlen(value) + 1);
6,907✔
365
  TAOS_CHECK_RETURN(doSetConf(pItem, value, stype));
6,907!
366
#endif
367
  TAOS_RETURN(TSDB_CODE_SUCCESS);
6,907✔
368
}
369

370
static int32_t cfgSetLocale(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
6,907✔
371
  if (stype == CFG_STYPE_ALTER_SERVER_CMD || (pItem->dynScope & CFG_DYN_CLIENT) == 0) {
6,907!
372
    uError("failed to config locale, not support");
×
373
    TAOS_RETURN(TSDB_CODE_INVALID_CFG);
×
374
  }
375

376
  if (value == NULL || strlen(value) == 0 || taosSetSystemLocale(value) != 0) {
6,907!
377
    uError("cfg:%s, type:%s src:%s, value:%s, skip to set locale", pItem->name, cfgDtypeStr(pItem->dtype),
×
378
           cfgStypeStr(stype), value);
379
    TAOS_RETURN(TSDB_CODE_INVALID_CFG);
×
380
  }
381

382
  TAOS_CHECK_RETURN(doSetConf(pItem, value, stype));
6,907!
383

384
  TAOS_RETURN(TSDB_CODE_SUCCESS);
6,907✔
385
}
386

387
static int32_t cfgSetTfsItem(SConfig *pCfg, const char *name, const char *value, const char *level, const char *primary,
10,439✔
388
                             const char *disable, ECfgSrcType stype) {
389
  int32_t code = 0;
10,439✔
390
  (void)taosThreadMutexLock(&pCfg->lock);
10,439✔
391

392
  SConfigItem *pItem = cfgGetItem(pCfg, name);
10,439✔
393
  if (pItem == NULL) {
10,439✔
394
    (void)taosThreadMutexUnlock(&pCfg->lock);
5,223✔
395

396
    TAOS_RETURN(TSDB_CODE_CFG_NOT_FOUND);
5,223✔
397
  }
398

399
  if (pItem->array == NULL) {
5,216✔
400
    pItem->array = taosArrayInit(16, sizeof(SDiskCfg));
4,782✔
401
    if (pItem->array == NULL) {
4,782!
402
      (void)taosThreadMutexUnlock(&pCfg->lock);
×
403

404
      TAOS_RETURN(terrno);
×
405
    }
406
  }
407

408
  SDiskCfg cfg = {0};
5,216✔
409
  tstrncpy(cfg.dir, pItem->str, sizeof(cfg.dir));
5,216✔
410

411
  if (level == NULL || strlen(level) == 0) {
5,216!
412
    cfg.level = 0;
4,718✔
413
  } else {
414
    code = taosStr2int32(level, &cfg.level);
498✔
415
    TAOS_CHECK_GOTO(code, NULL, _err);
498!
416
  }
417

418
  if (primary == NULL || strlen(primary) == 0) {
5,216!
419
    cfg.primary = 1;
4,718✔
420
  } else {
421
    code = taosStr2int32(primary, &cfg.primary);
498✔
422
    TAOS_CHECK_GOTO(code, NULL, _err);
498!
423
  }
424

425
  if (disable == NULL || strlen(disable) == 0) {
5,216✔
426
    cfg.disable = 0;
5,038✔
427
  } else {
428
    code = taosStr2int8(disable, &cfg.disable);
178✔
429
    TAOS_CHECK_GOTO(code, NULL, _err);
178!
430
  }
431
  void *ret = taosArrayPush(pItem->array, &cfg);
5,216✔
432
  if (ret == NULL) {
5,216!
433
    code = terrno;
×
434
    TAOS_CHECK_GOTO(code, NULL, _err);
×
435
  }
436

437
  pItem->stype = stype;
5,216✔
438
  (void)taosThreadMutexUnlock(&pCfg->lock);
5,216✔
439

440
  TAOS_RETURN(TSDB_CODE_SUCCESS);
5,216✔
441
_err:
×
442
  (void)taosThreadMutexUnlock(&pCfg->lock);
×
443
  TAOS_RETURN(code);
×
444
}
445

446
static int32_t cfgUpdateDebugFlagItem(SConfig *pCfg, const char *name, bool resetArray) {
138,428✔
447
  SConfigItem *pDebugFlagItem = cfgGetItem(pCfg, "debugFlag");
138,428✔
448
  if (resetArray) {
138,428✔
449
    // reset
450
    if (pDebugFlagItem == NULL) TAOS_RETURN(TSDB_CODE_CFG_NOT_FOUND);
366!
451

452
    // logflag names that should 'not' be set by 'debugFlag'
453
    if (pDebugFlagItem->array == NULL) {
366!
454
      pDebugFlagItem->array = taosArrayInit(16, sizeof(SLogVar));
366✔
455
      if (pDebugFlagItem->array == NULL) return terrno;
366!
456
    }
457
    taosArrayClear(pDebugFlagItem->array);
366✔
458
    TAOS_RETURN(TSDB_CODE_SUCCESS);
366✔
459
  }
460

461
  // update
462
  if (pDebugFlagItem == NULL) return -1;
138,062!
463
  if (pDebugFlagItem->array != NULL) {
138,062✔
464
    SLogVar logVar = {0};
4,632✔
465
    tstrncpy(logVar.name, name, TSDB_LOG_VAR_LEN);
4,632✔
466
    if (NULL == taosArrayPush(pDebugFlagItem->array, &logVar)) return terrno;
9,264!
467
  }
468
  TAOS_RETURN(TSDB_CODE_SUCCESS);
138,062✔
469
}
470

471
int32_t cfgSetItem(SConfig *pCfg, const char *name, const char *value, ECfgSrcType stype, bool lock) {
316,894✔
472
  // GRANT_CFG_SET;
473
  int32_t code = TSDB_CODE_SUCCESS;
316,894✔
474

475
  if (lock) {
316,894!
476
    (void)taosThreadMutexLock(&pCfg->lock);
316,894✔
477
  }
478

479
  SConfigItem *pItem = cfgGetItem(pCfg, name);
316,894✔
480
  if (pItem == NULL) {
316,894✔
481
    (void)taosThreadMutexUnlock(&pCfg->lock);
67,367✔
482
    TAOS_RETURN(TSDB_CODE_CFG_NOT_FOUND);
67,367✔
483
  }
484

485
  code = cfgSetItemVal(pItem, name, value, stype);
249,527✔
486
  if (code != TSDB_CODE_SUCCESS) {
249,527✔
487
    if (lock) {
6!
488
      (void)taosThreadMutexUnlock(&pCfg->lock);
6✔
489
    }
490
    TAOS_RETURN(code);
6✔
491
  }
492

493
  if (lock) {
249,521!
494
    (void)taosThreadMutexUnlock(&pCfg->lock);
249,521✔
495
  }
496

497
  TAOS_RETURN(code);
249,521✔
498
}
499

500
int32_t cfgGetAndSetItem(SConfig *pCfg, SConfigItem **pItem, const char *name, const char *value, ECfgSrcType stype,
180✔
501
                         bool lock) {
502
  // GRANT_CFG_SET;
503
  int32_t code = TSDB_CODE_SUCCESS;
180✔
504

505
  if (lock) {
180!
506
    (void)taosThreadMutexLock(&pCfg->lock);
180✔
507
  }
508

509
  *pItem = cfgGetItem(pCfg, name);
180✔
510
  if (*pItem == NULL) {
180✔
511
    code = TSDB_CODE_CFG_NOT_FOUND;
5✔
512
    goto _exit;
5✔
513
  }
514

515
  TAOS_CHECK_GOTO(cfgSetItemVal(*pItem, name, value, stype), NULL, _exit);
175!
516

517
_exit:
175✔
518
  if (lock) {
180!
519
    (void)taosThreadMutexUnlock(&pCfg->lock);
180✔
520
  }
521

522
  TAOS_RETURN(code);
180✔
523
}
524

525
int32_t cfgSetItemVal(SConfigItem *pItem, const char *name, const char *value, ECfgSrcType stype) {
255,375✔
526
  int32_t code = TSDB_CODE_SUCCESS;
255,375✔
527

528
  if (pItem == NULL) return TSDB_CODE_CFG_NOT_FOUND;
255,375!
529

530
  switch (pItem->dtype) {
255,375!
531
    case CFG_DTYPE_BOOL: {
24,904✔
532
      code = cfgSetBool(pItem, value, stype);
24,904✔
533
      break;
24,904✔
534
    }
535
    case CFG_DTYPE_INT32: {
171,915✔
536
      code = cfgSetInt32(pItem, value, stype);
171,915✔
537
      break;
171,915✔
538
    }
539
    case CFG_DTYPE_INT64: {
28✔
540
      code = cfgSetInt64(pItem, value, stype);
28✔
541
      break;
28✔
542
    }
543
    case CFG_DTYPE_FLOAT:
26✔
544
    case CFG_DTYPE_DOUBLE: {
545
      code = cfgSetFloat(pItem, value, stype);
26✔
546
      break;
26✔
547
    }
548
    case CFG_DTYPE_STRING: {
27,500✔
549
      code = cfgSetString(pItem, value, stype);
27,500✔
550
      break;
27,500✔
551
    }
552
    case CFG_DTYPE_DIR: {
15,258✔
553
      code = cfgSetDir(pItem, value, stype);
15,258✔
554
      break;
15,258✔
555
    }
556
    case CFG_DTYPE_TIMEZONE: {
1,930✔
557
      code = cfgSetTimezone(pItem, value, stype);
1,930✔
558
      break;
1,930✔
559
    }
560
    case CFG_DTYPE_CHARSET: {
6,907✔
561
      code = cfgSetCharset(pItem, value, stype);
6,907✔
562
      break;
6,907✔
563
    }
564
    case CFG_DTYPE_LOCALE: {
6,907✔
565
      code = cfgSetLocale(pItem, value, stype);
6,907✔
566
      break;
6,907✔
567
    }
568
    case CFG_DTYPE_NONE:
×
569
    default:
570
      code = TSDB_CODE_INVALID_CFG;
×
571
      break;
×
572
  }
573

574
  TAOS_RETURN(code);
255,375✔
575
}
576

577
SConfigItem *cfgGetItem(SConfig *pCfg, const char *pName) {
2,393,051✔
578
  if (pCfg == NULL) return NULL;
2,393,051✔
579
  int32_t size = taosArrayGetSize(pCfg->localArray);
2,390,710✔
580
  for (int32_t i = 0; i < size; ++i) {
188,225,040✔
581
    SConfigItem *pItem = taosArrayGet(pCfg->localArray, i);
187,255,481✔
582
    if (taosStrcasecmp(pItem->name, pName) == 0) {
187,255,472✔
583
      return pItem;
1,421,142✔
584
    }
585
  }
586
  size = taosArrayGetSize(pCfg->globalArray);
969,559✔
587
  for (int32_t i = 0; i < size; ++i) {
38,902,593✔
588
    SConfigItem *pItem = taosArrayGet(pCfg->globalArray, i);
38,829,892✔
589
    if (taosStrcasecmp(pItem->name, pName) == 0) {
38,829,892✔
590
      return pItem;
896,867✔
591
    }
592
  }
593

594
  return NULL;
72,701✔
595
}
596

597
void cfgLock(SConfig *pCfg) {
779✔
598
  if (pCfg == NULL) return;
779!
599
  (void)taosThreadMutexLock(&pCfg->lock);
779✔
600
}
601

602
void cfgUnLock(SConfig *pCfg) { (void)taosThreadMutexUnlock(&pCfg->lock); }
779✔
603

604
int32_t checkItemDyn(SConfigItem *pItem, bool isServer) {
272✔
605
  if (pItem->dynScope == CFG_DYN_NONE) {
272✔
606
    return TSDB_CODE_INVALID_CFG;
10✔
607
  }
608
  if (isServer) {
262✔
609
    if (pItem->dynScope == CFG_DYN_CLIENT || pItem->dynScope == CFG_DYN_CLIENT_LAZY) {
238!
610
      return TSDB_CODE_INVALID_CFG;
3✔
611
    }
612
  } else {
613
    if (pItem->dynScope == CFG_DYN_SERVER || pItem->dynScope == CFG_DYN_SERVER_LAZY) {
24!
614
      return TSDB_CODE_INVALID_CFG;
3✔
615
    }
616
  }
617

618
  return TSDB_CODE_SUCCESS;
256✔
619
}
620

621
int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *pVal, bool isServer,
299✔
622
                                  CfgAlterType alterType) {
623
  int32_t code = TSDB_CODE_SUCCESS;
299✔
624
  int32_t lino = 0;
299✔
625
  cfgLock(pCfg);
299✔
626

627
  SConfigItem *pItem = cfgGetItem(pCfg, name);
299✔
628
  TSDB_CHECK_NULL(pItem, code, lino, _exit, TSDB_CODE_CFG_NOT_FOUND);
299✔
629

630
  TAOS_CHECK_EXIT(checkItemDyn(pItem, isServer));
272✔
631

632
  if ((pItem->category == CFG_CATEGORY_GLOBAL) && alterType == CFG_ALTER_DNODE) {
256✔
633
    uError("failed to config:%s, not support update global config on only one dnode", name);
14!
634
    code = TSDB_CODE_INVALID_CFG;
14✔
635
    goto _exit;
14✔
636
  }
637
  switch (pItem->dtype) {
242!
638
    case CFG_DTYPE_STRING: {
×
639
      if (strcasecmp(name, "slowLogScope") == 0) {
×
640
        char *tmp = taosStrdup(pVal);
×
641
        if (!tmp) {
×
642
          code = terrno;
×
643
          goto _exit;
×
644
        }
645
        int32_t scope = 0;
×
646
        code = taosSetSlowLogScope(tmp, &scope);
×
647
        if (TSDB_CODE_SUCCESS != code) {
×
648
          taosMemoryFree(tmp);
×
649
          goto _exit;
×
650
        }
651
        taosMemoryFree(tmp);
×
652
      }
653
    } break;
×
654
    case CFG_DTYPE_BOOL: {
26✔
655
      int32_t ival = 0;
26✔
656
      code = taosStr2int32(pVal, &ival);
26✔
657
      if (code != 0 || (ival != 0 && ival != 1)) {
26!
658
        uError("cfg:%s, type:%s value:%d out of range[0, 1]", pItem->name, cfgDtypeStr(pItem->dtype), ival);
7!
659
        code = TSDB_CODE_OUT_OF_RANGE;
7✔
660
        goto _exit;
7✔
661
      }
662
    } break;
19✔
663
    case CFG_DTYPE_INT32: {
174✔
664
      int32_t ival;
665
      code = (int32_t)taosStrHumanToInt32(pVal, &ival);
174✔
666
      if (code != TSDB_CODE_SUCCESS) {
174✔
667
        cfgUnLock(pCfg);
15✔
668
        return code;
15✔
669
      }
670
      if (ival < pItem->imin || ival > pItem->imax) {
159✔
671
        uError("cfg:%s, type:%s value:%d out of range[%" PRId64 ", %" PRId64 "]", pItem->name,
17!
672
               cfgDtypeStr(pItem->dtype), ival, pItem->imin, pItem->imax);
673
        code = TSDB_CODE_OUT_OF_RANGE;
17✔
674
        goto _exit;
17✔
675
      }
676
    } break;
142✔
677
    case CFG_DTYPE_INT64: {
29✔
678
      int64_t ival;
679
      code = taosStrHumanToInt64(pVal, &ival);
29✔
680
      if (code != TSDB_CODE_SUCCESS) {
29✔
681
        cfgUnLock(pCfg);
6✔
682
        TAOS_RETURN(code);
6✔
683
      }
684
      if (ival < pItem->imin || ival > pItem->imax) {
23✔
685
        uError("cfg:%s, type:%s value:%" PRId64 " out of range[%" PRId64 ", %" PRId64 "]", pItem->name,
10!
686
               cfgDtypeStr(pItem->dtype), ival, pItem->imin, pItem->imax);
687
        code = TSDB_CODE_OUT_OF_RANGE;
10✔
688
        goto _exit;
10✔
689
      }
690
    } break;
13✔
691
    case CFG_DTYPE_FLOAT:
3✔
692
    case CFG_DTYPE_DOUBLE: {
693
      float dval = 0;
3✔
694
      TAOS_CHECK_EXIT(parseCfgReal(pVal, &dval));
6!
695

696
      if (dval < pItem->fmin || dval > pItem->fmax) {
3!
697
        uError("cfg:%s, type:%s value:%g out of range[%g, %g]", pItem->name, cfgDtypeStr(pItem->dtype), dval,
3!
698
               pItem->fmin, pItem->fmax);
699
        code = TSDB_CODE_OUT_OF_RANGE;
3✔
700
        goto _exit;
3✔
701
      }
702
    } break;
×
703
    default:
10✔
704
      break;
10✔
705
  }
706

707
_exit:
278✔
708
  if (code != TSDB_CODE_SUCCESS) {
278✔
709
    uError("failed to check range for cfg:%s, value:%s, since %s at line:%d", name, pVal, tstrerror(code), __LINE__);
94!
710
  }
711
  cfgUnLock(pCfg);
278✔
712
  TAOS_RETURN(code);
278✔
713
}
714

715
static int32_t cfgAddItem(SConfig *pCfg, SConfigItem *pItem, const char *name) {
1,489,040✔
716
  SArray *array = pCfg->globalArray;
1,489,040✔
717
  if (pItem->category == CFG_CATEGORY_LOCAL) array = pCfg->localArray;
1,489,040✔
718

719
  pItem->stype = CFG_STYPE_DEFAULT;
1,489,040✔
720
  pItem->name = taosStrdup(name);
1,489,040!
721
  if (pItem->name == NULL) return terrno;
1,489,040!
722

723
  int32_t size = taosArrayGetSize(array);
1,489,040✔
724
  for (int32_t i = 0; i < size; ++i) {
75,662,865✔
725
    SConfigItem *existItem = taosArrayGet(array, i);
74,173,825✔
726
    if (existItem != NULL && strcmp(existItem->name, pItem->name) == 0) {
74,173,825!
727
      taosMemoryFree(pItem->name);
×
728
      TAOS_RETURN(TSDB_CODE_INVALID_CFG);
×
729
    }
730
  }
731

732
  int32_t len = strlen(name);
1,489,040✔
733
  char    lowcaseName[CFG_NAME_MAX_LEN + 1] = {0};
1,489,040✔
734
  (void)strntolower(lowcaseName, name, TMIN(CFG_NAME_MAX_LEN, len));
1,489,040✔
735

736
  if (taosArrayPush(array, pItem) == NULL) {
1,489,040!
737
    if (pItem->dtype == CFG_DTYPE_STRING) {
×
738
      taosMemoryFree(pItem->str);
×
739
    }
740

741
    taosMemoryFree(pItem->name);
×
742
    TAOS_RETURN(terrno);
×
743
  }
744

745
  TAOS_RETURN(TSDB_CODE_SUCCESS);
1,489,040✔
746
}
747

748
int32_t cfgAddBool(SConfig *pCfg, const char *name, bool defaultVal, int8_t scope, int8_t dynScope, int8_t category) {
248,478✔
749
  SConfigItem item = {
248,478✔
750
      .dtype = CFG_DTYPE_BOOL, .bval = defaultVal, .scope = scope, .dynScope = dynScope, .category = category};
751
  return cfgAddItem(pCfg, &item, name);
248,478✔
752
}
753

754
int32_t cfgAddInt32Ex(SConfig *pCfg, const char *name, int32_t defaultVal, int64_t minval, int64_t maxval, int8_t scope,
4,783✔
755
                      int8_t dynScope, int8_t category) {
756
  SConfigItem item = {.dtype = CFG_DTYPE_INT32,
4,783✔
757
                      .i32 = defaultVal,
758
                      .imin = minval,
759
                      .imax = maxval,
760
                      .scope = scope,
761
                      .dynScope = dynScope,
762
                      .category = category};
763
  return cfgAddItem(pCfg, &item, name);
4,783✔
764
}
765

766
int32_t cfgAddInt32(SConfig *pCfg, const char *name, int32_t defaultVal, int64_t minval, int64_t maxval, int8_t scope,
875,395✔
767
                    int8_t dynScope, int8_t category) {
768
  if (defaultVal < minval || defaultVal > maxval) {
875,395!
769
    TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
9✔
770
  }
771

772
  SConfigItem item = {.dtype = CFG_DTYPE_INT32,
875,386✔
773
                      .i32 = defaultVal,
774
                      .imin = minval,
775
                      .imax = maxval,
776
                      .scope = scope,
777
                      .dynScope = dynScope,
778
                      .category = category};
779
  return cfgAddItem(pCfg, &item, name);
875,386✔
780
}
781

782
int32_t cfgAddInt64(SConfig *pCfg, const char *name, int64_t defaultVal, int64_t minval, int64_t maxval, int8_t scope,
74,431✔
783
                    int8_t dynScope, int8_t category) {
784
  if (defaultVal < minval || defaultVal > maxval) {
74,431!
785
    TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
9✔
786
  }
787

788
  SConfigItem item = {.dtype = CFG_DTYPE_INT64,
74,422✔
789
                      .i64 = defaultVal,
790
                      .imin = minval,
791
                      .imax = maxval,
792
                      .scope = scope,
793
                      .dynScope = dynScope,
794
                      .category = category};
795
  return cfgAddItem(pCfg, &item, name);
74,422✔
796
}
797

798
int32_t cfgAddFloat(SConfig *pCfg, const char *name, float defaultVal, float minval, float maxval, int8_t scope,
41,655✔
799
                    int8_t dynScope, int8_t category) {
800
  if (defaultVal < minval || defaultVal > maxval) {
41,655!
801
    TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
9✔
802
  }
803

804
  SConfigItem item = {.dtype = CFG_DTYPE_FLOAT,
41,646✔
805
                      .fval = defaultVal,
806
                      .fmin = minval,
807
                      .fmax = maxval,
808
                      .scope = scope,
809
                      .dynScope = dynScope,
810
                      .category = category};
811
  return cfgAddItem(pCfg, &item, name);
41,646✔
812
}
813

814
int32_t cfgAddString(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope, int8_t dynScope,
171,335✔
815
                     int8_t category) {
816
  SConfigItem item = {.dtype = CFG_DTYPE_STRING, .scope = scope, .dynScope = dynScope, .category = category};
171,335✔
817
  item.str = taosStrdup(defaultVal);
171,335!
818
  if (item.str == NULL) return terrno;
171,335!
819

820
  return cfgAddItem(pCfg, &item, name);
171,335✔
821
}
822

823
int32_t cfgAddDir(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope, int8_t dynScope,
52,530✔
824
                  int8_t category) {
825
  SConfigItem item = {.dtype = CFG_DTYPE_DIR, .scope = scope, .dynScope = dynScope, .category = category};
52,530✔
826
  TAOS_CHECK_RETURN(cfgCheckAndSetDir(&item, defaultVal));
52,530!
827
  return cfgAddItem(pCfg, &item, name);
52,530✔
828
}
829

830
int32_t cfgAddLocale(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope, int8_t dynScope,
6,820✔
831
                     int8_t category) {
832
  SConfigItem item = {.dtype = CFG_DTYPE_LOCALE, .scope = scope, .dynScope = dynScope, .category = category};
6,820✔
833
  TAOS_CHECK_RETURN(cfgCheckAndSetConf(&item, defaultVal));
6,820!
834
  return cfgAddItem(pCfg, &item, name);
6,820✔
835
}
836

837
int32_t cfgAddCharset(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope, int8_t dynScope,
6,820✔
838
                      int8_t category) {
839
  SConfigItem item = {.dtype = CFG_DTYPE_CHARSET, .scope = scope, .dynScope = dynScope, .category = category};
6,820✔
840
  TAOS_CHECK_RETURN(cfgCheckAndSetConf(&item, defaultVal));
6,820!
841
  return cfgAddItem(pCfg, &item, name);
6,820✔
842
}
843

844
int32_t cfgAddTimezone(SConfig *pCfg, const char *name, const char *defaultVal, int8_t scope, int8_t dynScope,
6,820✔
845
                       int8_t category) {
846
  SConfigItem item = {.dtype = CFG_DTYPE_TIMEZONE, .scope = scope, .dynScope = dynScope, .category = category};
6,820✔
847
  TAOS_CHECK_RETURN(cfgCheckAndSetConf(&item, defaultVal));
6,820!
848
  return cfgAddItem(pCfg, &item, name);
6,820✔
849
}
850

851
const char *cfgStypeStr(ECfgSrcType type) {
1,271,951✔
852
  switch (type) {
1,271,951✔
853
    case CFG_STYPE_DEFAULT:
1,124,685✔
854
      return "default";
1,124,685✔
855
    case CFG_STYPE_CFG_FILE:
147,101✔
856
      return "cfg_file";
147,101✔
857
    case CFG_STYPE_ENV_FILE:
3✔
858
      return "env_file";
3✔
859
    case CFG_STYPE_ENV_VAR:
3✔
860
      return "env_var";
3✔
861
    case CFG_STYPE_APOLLO_URL:
3✔
862
      return "apollo_url";
3✔
863
    case CFG_STYPE_ARG_LIST:
3✔
864
      return "arg_list";
3✔
865
    case CFG_STYPE_TAOS_OPTIONS:
3✔
866
      return "taos_options";
3✔
867
    case CFG_STYPE_ENV_CMD:
3✔
868
      return "env_cmd";
3✔
869
    case CFG_STYPE_ALTER_CLIENT_CMD:
3✔
870
      return "alter_client_cmd";
3✔
871
    case CFG_STYPE_ALTER_SERVER_CMD:
141✔
872
      return "alter_server_cmd";
141✔
873
    default:
3✔
874
      return "invalid";
3✔
875
  }
876
}
877

878
const char *cfgDtypeStr(ECfgDataType type) {
88✔
879
  switch (type) {
88✔
880
    case CFG_DTYPE_NONE:
3✔
881
      return "none";
3✔
882
    case CFG_DTYPE_BOOL:
10✔
883
      return "bool";
10✔
884
    case CFG_DTYPE_INT32:
23✔
885
      return "int32";
23✔
886
    case CFG_DTYPE_INT64:
16✔
887
      return "int64";
16✔
888
    case CFG_DTYPE_FLOAT:
6✔
889
      return "float";
6✔
890
    case CFG_DTYPE_DOUBLE:
3✔
891
      return "double";
3✔
892
    case CFG_DTYPE_STRING:
3✔
893
      return "string";
3✔
894
    case CFG_DTYPE_DIR:
12✔
895
      return "dir";
12✔
896
    case CFG_DTYPE_LOCALE:
3✔
897
      return "locale";
3✔
898
    case CFG_DTYPE_CHARSET:
3✔
899
      return "charset";
3✔
900
    case CFG_DTYPE_TIMEZONE:
3✔
901
      return "timezone";
3✔
902
    default:
3✔
903
      return "invalid";
3✔
904
  }
905
}
906

907
int32_t cfgDumpItemValue(SConfigItem *pItem, char *buf, int32_t bufSize, int32_t *pLen) {
65,802✔
908
  int32_t len = 0;
65,802✔
909
  switch (pItem->dtype) {
65,802!
910
    case CFG_DTYPE_BOOL:
12,036✔
911
      len = tsnprintf(buf, bufSize, "%u", pItem->bval);
12,036✔
912
      break;
12,036✔
913
    case CFG_DTYPE_INT32:
37,622✔
914
      len = tsnprintf(buf, bufSize, "%d", pItem->i32);
37,622✔
915
      break;
37,622✔
916
    case CFG_DTYPE_INT64:
3,722✔
917
      len = tsnprintf(buf, bufSize, "%" PRId64, pItem->i64);
3,722✔
918
      break;
3,722✔
919
    case CFG_DTYPE_FLOAT:
1,722✔
920
    case CFG_DTYPE_DOUBLE:
921
      len = tsnprintf(buf, bufSize, "%f", pItem->fval);
1,722✔
922
      break;
1,722✔
923
    case CFG_DTYPE_TIMEZONE: {
10,700✔
924
      //      char str1[TD_TIMEZONE_LEN] = {0};
925
      //      time_t    tx1 = taosGetTimestampSec();
926
      //      if (taosFormatTimezoneStr(tx1, buf, NULL, str1) != 0) {
927
      //        tstrncpy(str1, "tz error", sizeof(str1));
928
      //      }
929
      //      len = tsnprintf(buf, bufSize, "%s", str1);
930
      //      break;
931
    }
932
    case CFG_DTYPE_STRING:
933
    case CFG_DTYPE_DIR:
934
    case CFG_DTYPE_LOCALE:
935
    case CFG_DTYPE_CHARSET:
936
    case CFG_DTYPE_NONE:
937
      len = tsnprintf(buf, bufSize, "%s", pItem->str);
10,700✔
938
      break;
10,700✔
939
  }
940

941
  if (len < 0) return terrno;
65,802!
942

943
  if (len > bufSize) len = bufSize;
65,802!
944

945
  *pLen = len;
65,802✔
946
  TAOS_RETURN(TSDB_CODE_SUCCESS);
65,802✔
947
}
948

949
int32_t cfgDumpItemScope(SConfigItem *pItem, char *buf, int32_t bufSize, int32_t *pLen) {
65,802✔
950
  int32_t len = 0;
65,802✔
951
  switch (pItem->scope) {
65,802!
952
    case CFG_SCOPE_SERVER:
40,938✔
953
      len = tsnprintf(buf, bufSize, "server");
40,938✔
954
      break;
40,938✔
955
    case CFG_SCOPE_CLIENT:
8,584✔
956
      len = tsnprintf(buf, bufSize, "client");
8,584✔
957
      break;
8,584✔
958
    case CFG_SCOPE_BOTH:
16,280✔
959
      len = tsnprintf(buf, bufSize, "both");
16,280✔
960
      break;
16,280✔
961
  }
962

963
  if (len < 0) {
65,802!
964
    TAOS_RETURN(TAOS_SYSTEM_ERROR(ERRNO));
×
965
  }
966

967
  if (len > bufSize) {
65,802!
968
    len = bufSize;
×
969
  }
970

971
  *pLen = len;
65,802✔
972
  TAOS_RETURN(TSDB_CODE_SUCCESS);
65,802✔
973
}
974

975
int32_t cfgDumpItemCategory(SConfigItem *pItem, char *buf, int32_t bufSize, int32_t *pLen) {
65,805✔
976
  int32_t len = 0;
65,805✔
977
  switch (pItem->category) {
65,805✔
978
    case CFG_CATEGORY_LOCAL:
39,382✔
979
      len = tsnprintf(buf, bufSize, "local");
39,382✔
980
      break;
39,382✔
981
    case CFG_CATEGORY_GLOBAL:
26,420✔
982
      len = tsnprintf(buf, bufSize, "global");
26,420✔
983
      break;
26,420✔
984
    default:
3✔
985
      uError("invalid category:%d", pItem->category);
3!
986
      TAOS_RETURN(TSDB_CODE_INVALID_CFG);
3✔
987
  }
988

989
  if (len < 0) {
65,802!
990
    TAOS_RETURN(TAOS_SYSTEM_ERROR(ERRNO));
×
991
  }
992

993
  if (len > bufSize) {
65,802!
994
    len = bufSize;
×
995
  }
996

997
  *pLen = len;
65,802✔
998
  TAOS_RETURN(TSDB_CODE_SUCCESS);
65,802✔
999
}
1000

1001
void cfgDumpCfgImpl(SArray *array, bool tsc, bool dump) {
13,650✔
1002
  char src[CFG_SRC_PRINT_LEN + 1] = {0};
13,650✔
1003
  char name[CFG_NAME_PRINT_LEN + 1] = {0};
13,650✔
1004

1005
  int32_t size = taosArrayGetSize(array);
13,650✔
1006
  for (int32_t i = 0; i < size; ++i) {
1,298,505✔
1007
    SConfigItem *pItem = taosArrayGet(array, i);
1,284,855✔
1008
    if (tsc && pItem->scope == CFG_SCOPE_SERVER) continue;
1,284,855✔
1009
    if (dump && strcmp(pItem->name, "scriptDir") == 0) continue;
1,276,699✔
1010
    if (strcmp(pItem->name, "ssAccessString") == 0) continue; // contains sensitive information
1,276,697✔
1011

1012
    tstrncpy(src, cfgStypeStr(pItem->stype), CFG_SRC_PRINT_LEN);
1,271,912✔
1013
    for (int32_t j = 0; j < CFG_SRC_PRINT_LEN; ++j) {
16,534,856✔
1014
      if (src[j] == 0) src[j] = ' ';
15,262,944✔
1015
    }
1016

1017
    tstrncpy(name, pItem->name, CFG_NAME_PRINT_LEN);
1,271,912✔
1018
    for (int32_t j = 0; j < CFG_NAME_PRINT_LEN; ++j) {
41,973,096✔
1019
      if (name[j] == 0) name[j] = ' ';
40,701,184✔
1020
    }
1021

1022
    switch (pItem->dtype) {
1,271,912!
1023
      case CFG_DTYPE_BOOL:
241,770✔
1024
        if (dump) {
241,770✔
1025
          (void)printf("%s %s %u\n", src, name, pItem->bval);
40✔
1026
        } else {
1027
          uInfo("%s %s %u", src, name, pItem->bval);
241,730!
1028
        }
1029

1030
        break;
241,770✔
1031
      case CFG_DTYPE_INT32:
703,728✔
1032
        if (dump) {
703,728✔
1033
          (void)printf("%s %s %d\n", src, name, pItem->i32);
66✔
1034
        } else {
1035
          uInfo("%s %s %d", src, name, pItem->i32);
703,662!
1036
        }
1037
        break;
703,728✔
1038
      case CFG_DTYPE_INT64:
74,445✔
1039
        if (dump) {
74,445✔
1040
          (void)printf("%s %s %" PRId64 "\n", src, name, pItem->i64);
12✔
1041
        } else {
1042
          uInfo("%s %s %" PRId64, src, name, pItem->i64);
74,433!
1043
        }
1044
        break;
74,445✔
1045
      case CFG_DTYPE_DOUBLE:
34,830✔
1046
      case CFG_DTYPE_FLOAT:
1047
        if (dump) {
34,830✔
1048
          (void)printf("%s %s %.2f\n", src, name, pItem->fval);
6✔
1049
        } else {
1050
          uInfo("%s %s %.2f", src, name, pItem->fval);
34,824!
1051
        }
1052
        break;
34,830✔
1053
      case CFG_DTYPE_STRING:
217,139✔
1054
      case CFG_DTYPE_DIR:
1055
      case CFG_DTYPE_LOCALE:
1056
      case CFG_DTYPE_CHARSET:
1057
      case CFG_DTYPE_TIMEZONE:
1058
      case CFG_DTYPE_NONE:
1059
        if (strcasecmp(pItem->name, "dataDir") == 0) {
217,139✔
1060
          size_t sz = taosArrayGetSize(pItem->array);
4,785✔
1061
          if (sz > 1) {
4,785✔
1062
            for (size_t j = 0; j < sz; ++j) {
598✔
1063
              SDiskCfg *pCfg = taosArrayGet(pItem->array, j);
516✔
1064
              if (dump) {
516!
1065
                (void)printf("%s %s %s l:%d p:%d d:%" PRIi8 "\n", src, name, pCfg->dir, pCfg->level, pCfg->primary,
×
1066
                             pCfg->disable);
×
1067
              } else {
1068
                uInfo("%s %s %s l:%d p:%d d:%" PRIi8, src, name, pCfg->dir, pCfg->level, pCfg->primary, pCfg->disable);
516!
1069
              }
1070
            }
1071
            break;
82✔
1072
          }
1073
        }
1074
        if (dump) {
217,057✔
1075
          (void)printf("%s %s %s\n", src, name, pItem->str);
42✔
1076
        } else {
1077
          uInfo("%s %s %s", src, name, pItem->str);
217,015!
1078
        }
1079

1080
        break;
217,057✔
1081
    }
1082
  }
1083
}
13,650✔
1084

1085
void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) {
6,825✔
1086
  if (dump) {
6,825✔
1087
    (void)printf("                     global config");
2✔
1088
    (void)printf("\n");
2✔
1089
    (void)printf("=================================================================");
2✔
1090
    (void)printf("\n");
2✔
1091
  } else {
1092
    uInfo("                     global config");
6,823!
1093
    uInfo("=================================================================");
6,823!
1094
  }
1095
  cfgDumpCfgImpl(pCfg->localArray, tsc, dump);
6,825✔
1096
  cfgDumpCfgImpl(pCfg->globalArray, tsc, dump);
6,825✔
1097
  if (dump) {
6,825✔
1098
    (void)printf("=================================================================\n");
2✔
1099
  } else {
1100
    uInfo("=================================================================");
6,823!
1101
  }
1102
}
6,825✔
1103

1104
int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
13,643✔
1105
  char    line[1024], *name, *value, *value2, *value3, *value4;
1106
  int32_t olen, vlen, vlen2, vlen3, vlen4;
1107
  int32_t code = 0;
13,643✔
1108
  char  **pEnv = environ;
13,643✔
1109
  line[1023] = 0;
13,643✔
1110

1111
  if (pEnv == NULL) TAOS_RETURN(TSDB_CODE_SUCCESS);
13,643!
1112
  while (*pEnv != NULL) {
398,420✔
1113
    name = value = value2 = value3 = value4 = NULL;
384,777✔
1114
    olen = vlen = vlen2 = vlen3 = vlen4 = 0;
384,777✔
1115

1116
    tstrncpy(line, *pEnv, sizeof(line));
384,777✔
1117
    pEnv++;
384,777✔
1118
    if (taosEnvToCfg(line, line, 1024) < 0) {
384,777!
1119
      uTrace("failed to convert env to cfg:%s", line);
384,777✔
1120
    }
1121

1122
    (void)paGetToken(line, &name, &olen);
384,777✔
1123
    if (olen == 0) continue;
384,777!
1124
    name[olen] = 0;
×
1125

1126
    (void)paGetToken(name + olen + 1, &value, &vlen);
×
1127
    if (vlen == 0) continue;
×
1128
    value[vlen] = 0;
×
1129

1130
    (void)paGetToken(value + vlen + 1, &value2, &vlen2);
×
1131
    if (vlen2 != 0) {
×
1132
      value2[vlen2] = 0;
×
1133
      (void)paGetToken(value2 + vlen2 + 1, &value3, &vlen3);
×
1134
      if (vlen3 != 0) {
×
1135
        value3[vlen3] = 0;
×
1136
        (void)paGetToken(value3 + vlen3 + 1, &value4, &vlen4);
×
1137
        if (vlen4 != 0) value4[vlen4] = 0;
×
1138
      }
1139
    }
1140

1141
    code = cfgSetItem(pConfig, name, value, CFG_STYPE_ENV_VAR, true);
×
1142
    if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1143

1144
    if (strcasecmp(name, "dataDir") == 0) {
×
1145
      code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_ENV_VAR);
×
1146
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1147
    }
1148
  }
1149

1150
  uInfo("load from env variables cfg success");
13,643!
1151
  TAOS_RETURN(TSDB_CODE_SUCCESS);
13,643✔
1152
}
1153

1154
int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd) {
13,643✔
1155
  char    buf[1024], *name, *value, *value2, *value3, *value4;
1156
  int32_t olen, vlen, vlen2, vlen3, vlen4;
1157
  int32_t code = 0;
13,643✔
1158
  int32_t index = 0;
13,643✔
1159
  if (envCmd == NULL) TAOS_RETURN(TSDB_CODE_SUCCESS);
13,643✔
1160
  while (envCmd[index] != NULL) {
4,775✔
1161
    tstrncpy(buf, envCmd[index], sizeof(buf));
15✔
1162
    buf[sizeof(buf) - 1] = 0;
15✔
1163
    if (taosEnvToCfg(buf, buf, 1024) < 0) {
15!
1164
      uTrace("failed to convert env to cfg:%s", buf);
15!
1165
    }
1166
    index++;
15✔
1167

1168
    name = value = value2 = value3 = value4 = NULL;
15✔
1169
    olen = vlen = vlen2 = vlen3 = vlen4 = 0;
15✔
1170

1171
    (void)paGetToken(buf, &name, &olen);
15✔
1172
    if (olen == 0) continue;
15!
1173
    name[olen] = 0;
×
1174

1175
    (void)paGetToken(name + olen + 1, &value, &vlen);
×
1176
    if (vlen == 0) continue;
×
1177
    value[vlen] = 0;
×
1178

1179
    (void)paGetToken(value + vlen + 1, &value2, &vlen2);
×
1180
    if (vlen2 != 0) {
×
1181
      value2[vlen2] = 0;
×
1182
      (void)paGetToken(value2 + vlen2 + 1, &value3, &vlen3);
×
1183
      if (vlen3 != 0) {
×
1184
        value3[vlen3] = 0;
×
1185
        (void)paGetToken(value3 + vlen3 + 1, &value4, &vlen4);
×
1186
        if (vlen4 != 0) value4[vlen4] = 0;
×
1187
      }
1188
    }
1189

1190
    code = cfgSetItem(pConfig, name, value, CFG_STYPE_ENV_CMD, true);
×
1191
    if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1192

1193
    if (strcasecmp(name, "dataDir") == 0) {
×
1194
      code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_ENV_CMD);
×
1195
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1196
    }
1197
  }
1198

1199
  uInfo("load from env cmd cfg success");
4,760!
1200
  TAOS_RETURN(TSDB_CODE_SUCCESS);
4,760✔
1201
}
1202

1203
int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) {
13,643✔
1204
  char    line[1024], *name, *value, *value2, *value3, *value4;
1205
  int32_t olen, vlen, vlen2, vlen3, vlen4;
1206
  int32_t code = 0;
13,643✔
1207
  ssize_t _bytes = 0;
13,643✔
1208

1209
  const char *filepath = ".env";
13,643✔
1210
  if (envFile != NULL && strlen(envFile) > 0) {
13,643✔
1211
    if (!taosCheckExistFile(envFile)) {
3!
1212
      (void)printf("failed to load env file:%s\n", envFile);
×
1213
      TAOS_RETURN(TSDB_CODE_NOT_FOUND);
×
1214
    }
1215
    filepath = envFile;
3✔
1216
  } else {
1217
    if (!taosCheckExistFile(filepath)) {
13,640!
1218
      uInfo("env file:%s not load", filepath);
13,640!
1219
      TAOS_RETURN(TSDB_CODE_SUCCESS);
13,640✔
1220
    }
1221
  }
1222

1223
  TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ | TD_FILE_STREAM);
3✔
1224
  if (pFile == NULL) return terrno;
3!
1225

1226
  while (!taosEOFFile(pFile)) {
18!
1227
    name = value = value2 = value3 = value4 = NULL;
18✔
1228
    olen = vlen = vlen2 = vlen3 = vlen4 = 0;
18✔
1229

1230
    _bytes = taosGetsFile(pFile, sizeof(line), line);
18✔
1231
    if (_bytes <= 0) {
18✔
1232
      break;
3✔
1233
    }
1234
    if (line[_bytes - 1] == '\n') line[_bytes - 1] = 0;
15!
1235
    if (taosEnvToCfg(line, line, 1024) < 0) {
15!
1236
      uTrace("failed to convert env to cfg:%s", line);
15!
1237
    }
1238

1239
    (void)paGetToken(line, &name, &olen);
15✔
1240
    if (olen == 0) continue;
15!
1241
    name[olen] = 0;
×
1242

1243
    (void)paGetToken(name + olen + 1, &value, &vlen);
×
1244
    if (vlen == 0) continue;
×
1245
    value[vlen] = 0;
×
1246

1247
    (void)paGetToken(value + vlen + 1, &value2, &vlen2);
×
1248
    if (vlen2 != 0) {
×
1249
      value2[vlen2] = 0;
×
1250
      (void)paGetToken(value2 + vlen2 + 1, &value3, &vlen3);
×
1251
      if (vlen3 != 0) {
×
1252
        value3[vlen3] = 0;
×
1253
        (void)paGetToken(value3 + vlen3 + 1, &value4, &vlen4);
×
1254
        if (vlen4 != 0) value4[vlen4] = 0;
×
1255
      }
1256
    }
1257

1258
    code = cfgSetItem(pConfig, name, value, CFG_STYPE_ENV_FILE, true);
×
1259
    if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1260

1261
    if (strcasecmp(name, "dataDir") == 0) {
×
1262
      code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_ENV_FILE);
×
1263
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1264
    }
1265
  }
1266

1267
  (void)taosCloseFile(&pFile);
3✔
1268

1269
  uInfo("load from env cfg file %s success", filepath);
3!
1270
  TAOS_RETURN(TSDB_CODE_SUCCESS);
3✔
1271
}
1272

1273
int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) {
13,640✔
1274
  char    line[1024], *name, *value, *value2, *value3, *value4;
1275
  int32_t olen, vlen, vlen2, vlen3, vlen4;
1276
  ssize_t _bytes = 0;
13,640✔
1277
  int32_t code = 0;
13,640✔
1278

1279
  TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ | TD_FILE_STREAM);
13,640✔
1280
  if (pFile == NULL) {
13,640✔
1281
    // success when the file does not exist
1282
    code = terrno;
10✔
1283
    if (ERRNO == ENOENT) {
10!
1284
      uInfo("failed to load from cfg file %s since %s, use default parameters", filepath, tstrerror(code));
10!
1285
      TAOS_RETURN(TSDB_CODE_SUCCESS);
10✔
1286
    } else {
1287
      (void)printf("failed to load from cfg file %s since %s\n", filepath, tstrerror(code));
×
1288
      TAOS_RETURN(code);
×
1289
    }
1290
  }
1291

1292
  while (!taosEOFFile(pFile)) {
1,186,141!
1293
    name = value = value2 = value3 = value4 = NULL;
1,186,141✔
1294
    olen = vlen = vlen2 = vlen3 = vlen4 = 0;
1,186,141✔
1295

1296
    _bytes = taosGetsFile(pFile, sizeof(line), line);
1,186,141✔
1297
    if (_bytes <= 0) {
1,186,141✔
1298
      break;
13,630✔
1299
    }
1300

1301
    if (line[_bytes - 1] == '\n') line[_bytes - 1] = 0;
1,172,511!
1302

1303
    (void)paGetToken(line, &name, &olen);
1,172,511✔
1304
    if (olen == 0) continue;
1,172,511✔
1305
    name[olen] = 0;
299,412✔
1306

1307
    (void)paGetToken(name + olen + 1, &value, &vlen);
299,412✔
1308
    if (vlen == 0) continue;
299,412✔
1309
    value[vlen] = 0;
299,402✔
1310

1311
    if (strcasecmp(name, "encryptScope") == 0) {
299,402!
1312
      char   *tmp = NULL;
×
1313
      int32_t len = 0;
×
1314
      char    newValue[1024] = {0};
×
1315

1316
      tstrncpy(newValue, value, sizeof(newValue));
×
1317

1318
      int32_t count = 1;
×
1319
      while (vlen < 1024) {
×
1320
        (void)paGetToken(value + vlen + 1 * count, &tmp, &len);
×
1321
        if (len == 0) break;
×
1322
        tmp[len] = 0;
×
1323
        tstrncpy(newValue + vlen, tmp, sizeof(newValue) - vlen);
×
1324
        vlen += len;
×
1325
        count++;
×
1326
      }
1327

1328
      code = cfgSetItem(pConfig, name, newValue, CFG_STYPE_CFG_FILE, true);
×
1329
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) {
×
1330
        (void)printf("cfg:%s, value:%s failed since %s\n", name, newValue, tstrerror(code));
×
1331
        break;
×
1332
      }
1333
    } else {
1334
      (void)paGetToken(value + vlen + 1, &value2, &vlen2);
299,402✔
1335
      if (vlen2 != 0) {
299,402✔
1336
        value2[vlen2] = 0;
996✔
1337
        (void)paGetToken(value2 + vlen2 + 1, &value3, &vlen3);
996✔
1338
        if (vlen3 != 0) {
996!
1339
          value3[vlen3] = 0;
996✔
1340
          (void)paGetToken(value3 + vlen3 + 1, &value4, &vlen4);
996✔
1341
          if (vlen4 != 0) value4[vlen4] = 0;
996✔
1342
        }
1343
      }
1344

1345
      code = cfgSetItem(pConfig, name, value, CFG_STYPE_CFG_FILE, true);
299,402✔
1346
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) {
299,402!
1347
        (void)printf("cfg:%s, value:%s failed since %s\n", name, value, tstrerror(code));
×
1348
        break;
×
1349
      }
1350
    }
1351

1352
    if (strcasecmp(name, "dataDir") == 0) {
299,402✔
1353
      code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_CFG_FILE);
10,439✔
1354
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
10,439!
1355
    }
1356

1357
    size_t       len = strlen(name);
299,402✔
1358
    const char  *debugFlagStr = "debugFlag";
299,402✔
1359
    const size_t debugFlagLen = strlen(debugFlagStr);
299,402✔
1360
    if (len >= debugFlagLen && taosStrcasecmp(name + len - debugFlagLen, debugFlagStr) == 0) {
299,402✔
1361
      code = cfgUpdateDebugFlagItem(pConfig, name, len == debugFlagLen);
138,428✔
1362
      if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
138,428!
1363
    }
1364
  }
1365

1366
  (void)taosCloseFile(&pFile);
13,630✔
1367

1368
  if (TSDB_CODE_SUCCESS == code || TSDB_CODE_CFG_NOT_FOUND == code) {
13,630!
1369
    uInfo("load from cfg file %s success", filepath);
13,630!
1370
    TAOS_RETURN(TSDB_CODE_SUCCESS);
13,630✔
1371
  } else {
1372
    (void)printf("failed to load from cfg file %s since %s\n", filepath, tstrerror(code));
×
1373
    TAOS_RETURN(code);
×
1374
  }
1375
}
1376

1377
int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
13,643✔
1378
  char     *cfgLineBuf = NULL, *buf = NULL, *name, *value, *value2, *value3, *value4;
13,643✔
1379
  SJson    *pJson = NULL;
13,643✔
1380
  TdFilePtr pFile = NULL;
13,643✔
1381

1382
  int32_t olen, vlen, vlen2, vlen3, vlen4;
1383
  int32_t code = 0, lino = 0;
13,643✔
1384
  if (url == NULL || strlen(url) == 0) {
13,643✔
1385
    uTrace("apoll url not load");
13,640✔
1386
    TAOS_RETURN(TSDB_CODE_SUCCESS);
13,640✔
1387
  }
1388

1389
  char *p = strchr(url, ':');
3✔
1390
  if (p == NULL) {
3!
1391
    (void)printf("fail to load apoll url: %s, unknown format\n", url);
×
1392
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
1393
  }
1394
  p++;
3✔
1395

1396
  if (strncmp(url, "jsonFile", 8) == 0) {
3!
1397
    char *filepath = p;
3✔
1398
    if (!taosCheckExistFile(filepath)) {
3!
1399
      (void)printf("failed to load json file:%s\n", filepath);
×
1400
      TAOS_RETURN(TSDB_CODE_NOT_FOUND);
×
1401
    }
1402

1403
    TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
3✔
1404
    TSDB_CHECK_NULL(pFile, code, lino, _exit, terrno);
3!
1405

1406
    size_t fileSize = taosLSeekFile(pFile, 0, SEEK_END);
3✔
1407
    if (fileSize <= 0) {
3!
1408
      code = terrno;
×
1409
      goto _exit;
×
1410
    }
1411

1412
    buf = taosMemoryMalloc(fileSize + 1);
3!
1413
    TSDB_CHECK_NULL(buf, code, lino, _exit, terrno);
3!
1414

1415
    buf[fileSize] = 0;
3✔
1416
    if (taosLSeekFile(pFile, 0, SEEK_SET) < 0) {
3!
1417
      code = terrno;
×
1418
      goto _exit;
×
1419
    }
1420

1421
    if (taosReadFile(pFile, buf, fileSize) <= 0) {
3!
1422
      code = TSDB_CODE_INVALID_DATA_FMT;
×
1423
      goto _exit;
×
1424
    }
1425

1426
    pJson = tjsonParse(buf);
3✔
1427
    if (NULL == pJson) {
3!
1428
      const char *jsonParseError = tjsonGetError();
×
1429
      if (jsonParseError != NULL) {
×
1430
        (void)printf("load json file parse error: %s\n", jsonParseError);
×
1431
      }
1432
      taosMemoryFreeClear(buf);
×
1433
      TAOS_CHECK_EXIT(TSDB_CODE_INVALID_DATA_FMT);
×
1434
    }
1435

1436
    int32_t jsonArraySize = tjsonGetArraySize(pJson);
3✔
1437
    for (int32_t i = 0; i < jsonArraySize; i++) {
18✔
1438
      cJSON *item = tjsonGetArrayItem(pJson, i);
15✔
1439
      if (item == NULL) break;
15!
1440
      char *itemName = NULL, *itemValueString = NULL;
15✔
1441
      if (tjsonGetObjectName(item, &itemName) != 0) {
15!
1442
        TAOS_CHECK_EXIT(TSDB_CODE_INVALID_DATA_FMT);
×
1443
      }
1444
      if (tjsonGetObjectValueString(item, &itemValueString) != 0) {
15!
1445
        TAOS_CHECK_EXIT(TSDB_CODE_INVALID_DATA_FMT);
×
1446
      }
1447

1448
      if (itemValueString != NULL && itemName != NULL) {
15!
1449
        size_t itemNameLen = strlen(itemName);
15✔
1450
        size_t itemValueStringLen = strlen(itemValueString);
15✔
1451
        void  *px = taosMemoryRealloc(cfgLineBuf, itemNameLen + itemValueStringLen + 3);
15!
1452
        if (NULL == px) {
15!
1453
          TAOS_CHECK_EXIT(terrno);
×
1454
        }
1455

1456
        cfgLineBuf = px;
15✔
1457
        (void)memset(cfgLineBuf, 0, itemNameLen + itemValueStringLen + 3);
15✔
1458

1459
        (void)memcpy(cfgLineBuf, itemName, itemNameLen);
15✔
1460
        cfgLineBuf[itemNameLen] = ' ';
15✔
1461
        (void)memcpy(&cfgLineBuf[itemNameLen + 1], itemValueString, itemValueStringLen);
15✔
1462

1463
        (void)paGetToken(cfgLineBuf, &name, &olen);
15✔
1464
        if (olen == 0) continue;
15!
1465
        name[olen] = 0;
15✔
1466

1467
        (void)paGetToken(name + olen + 1, &value, &vlen);
15✔
1468
        if (vlen == 0) continue;
15!
1469
        value[vlen] = 0;
15✔
1470

1471
        (void)paGetToken(value + vlen + 1, &value2, &vlen2);
15✔
1472
        if (vlen2 != 0) {
15!
1473
          value2[vlen2] = 0;
×
1474
          (void)paGetToken(value2 + vlen2 + 1, &value3, &vlen3);
×
1475
          if (vlen3 != 0) {
×
1476
            value3[vlen3] = 0;
×
1477
            (void)paGetToken(value3 + vlen3 + 1, &value4, &vlen4);
×
1478
            if (vlen4 != 0) value4[vlen4] = 0;
×
1479
          }
1480
        }
1481

1482
        code = cfgSetItem(pConfig, name, value, CFG_STYPE_APOLLO_URL, true);
15✔
1483
        if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
15!
1484

1485
        if (strcasecmp(name, "dataDir") == 0) {
15!
1486
          code = cfgSetTfsItem(pConfig, name, value, value2, value3, value4, CFG_STYPE_APOLLO_URL);
×
1487
          if (TSDB_CODE_SUCCESS != code && TSDB_CODE_CFG_NOT_FOUND != code) break;
×
1488
        }
1489
      }
1490
    }
1491
    tjsonDelete(pJson);
3✔
1492
    pJson = NULL;
3✔
1493

1494
    // } else if (strncmp(url, "jsonUrl", 7) == 0) {
1495
    // } else if (strncmp(url, "etcdUrl", 7) == 0) {
1496
  } else {
1497
    (void)printf("Unsupported url: %s\n", url);
×
1498
    TAOS_RETURN(TSDB_CODE_INVALID_PARA);
×
1499
  }
1500

1501
  uInfo("load from apoll url not implemented yet");
3!
1502

1503
_exit:
×
1504
  taosMemoryFree(cfgLineBuf);
3!
1505
  taosMemoryFree(buf);
3!
1506
  (void)taosCloseFile(&pFile);
3✔
1507
  tjsonDelete(pJson);
3✔
1508
  if (code == TSDB_CODE_CFG_NOT_FOUND) {
3!
1509
    uTrace("load from apoll url success");
×
1510
    TAOS_RETURN(TSDB_CODE_SUCCESS);
×
1511
  } else {
1512
    (void)printf("failed to load from apoll url:%s at line %d since %s\n", url, lino, tstrerror(code));
3✔
1513
    TAOS_RETURN(code);
3✔
1514
  }
1515
}
1516

1517
int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char *apolloUrl) {
4,759✔
1518
  int32_t index = 0;
4,759✔
1519
  if (envCmd == NULL) TAOS_RETURN(TSDB_CODE_SUCCESS);
4,759✔
1520
  while (envCmd[index] != NULL) {
4,757!
1521
    if (strncmp(envCmd[index], "TAOS_APOLLO_URL", 14) == 0) {
×
1522
      char *p = strchr(envCmd[index], '=');
×
1523
      if (p != NULL) {
×
1524
        p++;
×
1525
        if (*p == '\'') {
×
1526
          p++;
×
1527
          p[strlen(p) - 1] = '\0';
×
1528
        }
1529
        (void)memcpy(apolloUrl, p, TMIN(strlen(p) + 1, PATH_MAX));
×
1530
        uInfo("get apollo url from env cmd success");
×
1531
        TAOS_RETURN(TSDB_CODE_SUCCESS);
×
1532
      }
1533
    }
1534
    index++;
×
1535
  }
1536

1537
  char   line[1024];
1538
  char **pEnv = environ;
4,757✔
1539
  line[1023] = 0;
4,757✔
1540
  while (*pEnv != NULL) {
132,145✔
1541
    tstrncpy(line, *pEnv, sizeof(line));
127,388✔
1542
    pEnv++;
127,388✔
1543
    if (strncmp(line, "TAOS_APOLLO_URL", 14) == 0) {
127,388!
1544
      char *p = strchr(line, '=');
×
1545
      if (p != NULL) {
×
1546
        p++;
×
1547
        if (*p == '\'') {
×
1548
          p++;
×
1549
          p[strlen(p) - 1] = '\0';
×
1550
        }
1551
        (void)memcpy(apolloUrl, p, TMIN(strlen(p) + 1, PATH_MAX));
×
1552
        uInfo("get apollo url from env variables success, apolloUrl=%s", apolloUrl);
×
1553
        TAOS_RETURN(TSDB_CODE_SUCCESS);
×
1554
      }
1555
    }
1556
  }
1557

1558
  const char *filepath = ".env";
4,757✔
1559
  if (envFile != NULL && strlen(envFile) > 0) {
4,757!
1560
    if (!taosCheckExistFile(envFile)) {
×
1561
      uError("failed to load env file:%s", envFile);
×
1562
      TAOS_RETURN(TSDB_CODE_NOT_FOUND);
×
1563
    }
1564
    filepath = envFile;
×
1565
  } else {
1566
    if (!taosCheckExistFile(filepath)) {
4,757!
1567
      uInfo("env file:%s not load", filepath);
4,757!
1568
      TAOS_RETURN(TSDB_CODE_SUCCESS);
4,757✔
1569
    }
1570
  }
1571
  int64_t   _bytes;
1572
  TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ | TD_FILE_STREAM);
×
1573
  if (pFile != NULL) {
×
1574
    while (!taosEOFFile(pFile)) {
×
1575
      _bytes = taosGetsFile(pFile, sizeof(line) - 1, line);
×
1576
      if (_bytes <= 0) {
×
1577
        break;
×
1578
      }
1579
      if (line[_bytes - 1] == '\n') line[_bytes - 1] = 0;
×
1580
      if (strncmp(line, "TAOS_APOLLO_URL", 14) == 0) {
×
1581
        char *p = strchr(line, '=');
×
1582
        if (p != NULL) {
×
1583
          p++;
×
1584
          if (*p == '\'') {
×
1585
            p++;
×
1586
            p[strlen(p) - 1] = '\0';
×
1587
          }
1588
          (void)memcpy(apolloUrl, p, TMIN(strlen(p) + 1, PATH_MAX));
×
1589
          (void)taosCloseFile(&pFile);
×
1590
          uInfo("get apollo url from env file success");
×
1591
          TAOS_RETURN(TSDB_CODE_SUCCESS);
×
1592
        }
1593
      }
1594
    }
1595
    (void)taosCloseFile(&pFile);
×
1596
  }
1597

1598
  uInfo("fail get apollo url from cmd env file");
×
1599
  TAOS_RETURN(TSDB_CODE_NOT_FOUND);
×
1600
}
1601

1602
struct SConfigIter {
1603
  int32_t  index;
1604
  SConfig *pConf;
1605
};
1606

1607
int32_t cfgCreateIter(SConfig *pConf, SConfigIter **ppIter) {
311✔
1608
  SConfigIter *pIter = taosMemoryCalloc(1, sizeof(SConfigIter));
311!
1609
  if (pIter == NULL) return terrno;
311!
1610

1611
  pIter->pConf = pConf;
311✔
1612

1613
  *ppIter = pIter;
311✔
1614
  TAOS_RETURN(TSDB_CODE_SUCCESS);
311✔
1615
}
1616

1617
SConfigItem *cfgNextIter(SConfigIter *pIter) {
66,173✔
1618
  if (pIter->index < cfgGetGlobalSize(pIter->pConf)) {
66,173✔
1619
    return taosArrayGet(pIter->pConf->globalArray, pIter->index++);
26,480✔
1620
  } else if (pIter->index < cfgGetGlobalSize(pIter->pConf) + cfgGetLocalSize(pIter->pConf)) {
39,693✔
1621
    return taosArrayGet(pIter->pConf->localArray, pIter->index++ - cfgGetGlobalSize(pIter->pConf));
39,382✔
1622
  }
1623
  return NULL;
311✔
1624
}
1625

1626
void cfgDestroyIter(SConfigIter *pIter) {
311✔
1627
  if (pIter == NULL) return;
311!
1628

1629
  taosMemoryFree(pIter);
311!
1630
}
1631

1632
SArray *taosGetLocalCfg(SConfig *pCfg) { return pCfg->localArray; }
14,472✔
1633
SArray *taosGetGlobalCfg(SConfig *pCfg) { return pCfg->globalArray; }
3,707,248✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc