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

taosdata / TDengine / #4817

20 Oct 2025 02:09AM UTC coverage: 61.125% (-0.05%) from 61.177%
#4817

push

travis-ci

web-flow
Merge e6f7b1ad7 into 21184b20f

155539 of 324487 branches covered (47.93%)

Branch coverage included in aggregate %.

72 of 84 new or added lines in 6 files covered. (85.71%)

476 existing lines in 111 files now uncovered.

207605 of 269610 relevant lines covered (77.0%)

126509550.12 hits per line

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

63.12
/source/util/src/tjson.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

18
#include "tjson.h"
19
#include "cJSON.h"
20
#include "taoserror.h"
21

22
SJson* tjsonCreateObject() {
2,147,483,647✔
23
  SJson* pJson = cJSON_CreateObject();
2,147,483,647✔
24
  if (pJson == NULL) {
2,147,483,647!
25
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
26
  }
27
  return pJson;
2,147,483,647✔
28
}
29

30
SJson* tjsonCreateArray() {
31,766,217✔
31
  SJson* pJson = cJSON_CreateArray();
31,766,217✔
32
  if (pJson == NULL) {
31,772,322!
33
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
34
  }
35
  return pJson;
31,775,748✔
36
}
37

38
void tjsonDelete(SJson* pJson) {
674,371,670✔
39
  if (pJson != NULL) {
674,371,670✔
40
    cJSON_Delete((cJSON*)pJson);
674,378,977✔
41
  }
42
}
674,367,559✔
43

44
int32_t tjsonAddIntegerToObject(SJson* pJson, const char* pName, const uint64_t number) {
2,147,483,647✔
45
  char tmp[40] = {0};
2,147,483,647✔
46
  snprintf(tmp, sizeof(tmp), "%" PRId64, number);
2,147,483,647!
47
  return tjsonAddStringToObject(pJson, pName, tmp);
2,147,483,647✔
48
}
49

50
int32_t tjsonAddDoubleToObject(SJson* pJson, const char* pName, const double number) {
355,300,912✔
51
  if (NULL == cJSON_AddNumberToObject((cJSON*)pJson, pName, number)) {
355,300,912✔
52
    return terrno = TSDB_CODE_OUT_OF_MEMORY;
3,061✔
53
  }
54

55
  return TSDB_CODE_SUCCESS;
355,309,374✔
56
}
57

58
int32_t tjsonAddBoolToObject(SJson* pJson, const char* pName, const bool boolean) {
2,147,483,647✔
59
  if (NULL == cJSON_AddBoolToObject((cJSON*)pJson, pName, boolean)) {
2,147,483,647!
60
    return terrno = TSDB_CODE_OUT_OF_MEMORY;
×
61
  }
62

63
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
64
}
65

66
int32_t tjsonAddStringToObject(SJson* pJson, const char* pName, const char* pVal) {
2,147,483,647✔
67
  if (NULL == cJSON_AddStringToObject((cJSON*)pJson, pName, pVal)) {
2,147,483,647✔
68
    return terrno = TSDB_CODE_OUT_OF_MEMORY;
687,355✔
69
  }
70

71
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
72
}
73

74
SJson* tjsonAddArrayToObject(SJson* pJson, const char* pName) {
2,147,483,647✔
75
  SJson* ret = (SJson*)cJSON_AddArrayToObject((cJSON*)pJson, pName);
2,147,483,647✔
76
  if (ret == NULL) {
2,147,483,647!
77
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
78
  }
79
  return ret;
2,147,483,647✔
80
}
81

82
int32_t tjsonAddItemToObject(SJson* pJson, const char* pName, SJson* pItem) {
2,147,483,647✔
83
  if (cJSON_AddItemToObject((cJSON*)pJson, pName, pItem)) {
2,147,483,647!
84
    return TSDB_CODE_SUCCESS;
2,147,483,647✔
85
  }
86

UNCOV
87
  return terrno = TSDB_CODE_OUT_OF_MEMORY;
×
88
}
89

90
int32_t tjsonAddItemToArray(SJson* pJson, SJson* pItem) {
2,147,483,647✔
91
  if (cJSON_AddItemToArray((cJSON*)pJson, pItem)) {
2,147,483,647!
92
    return TSDB_CODE_SUCCESS;
2,147,483,647✔
93
  }
94

95
  return terrno = TSDB_CODE_OUT_OF_MEMORY;
×
96
}
97

98
int32_t tjsonAddObject(SJson* pJson, const char* pName, FToJson func, const void* pObj) {
2,147,483,647✔
99
  if (NULL == pObj) {
2,147,483,647✔
100
    return TSDB_CODE_SUCCESS;
2,147,483,647✔
101
  }
102

103
  SJson* pJobj = tjsonCreateObject();
2,147,483,647✔
104
  if (NULL == pJobj) {
2,147,483,647!
105
    return terrno;
×
106
  }
107
  int32_t rc = func(pObj, pJobj);
2,147,483,647✔
108
  if (rc != TSDB_CODE_SUCCESS) {
2,147,483,647!
109
    tjsonDelete(pJobj);
×
110
    return rc;
×
111
  }
112
  return tjsonAddItemToObject(pJson, pName, pJobj);
2,147,483,647✔
113
}
114

115
int32_t tjsonAddItem(SJson* pJson, FToJson func, const void* pObj) {
2,147,483,647✔
116
  SJson* pJobj = tjsonCreateObject();
2,147,483,647✔
117
  if (pJobj == NULL) {
2,147,483,647!
118
    return terrno;
×
119
  }
120

121
  int32_t rc = func(pObj, pJobj);
2,147,483,647✔
122
  if (rc != TSDB_CODE_SUCCESS) {
2,147,483,647!
123
    tjsonDelete(pJobj);
×
124
    return rc;
×
125
  }
126
  return tjsonAddItemToArray(pJson, pJobj);
2,147,483,647✔
127
}
128

129
int32_t tjsonAddArray(SJson* pJson, const char* pName, FToJson func, const void* pArray, int32_t itemSize,
791,329,992✔
130
                      int32_t num) {
131
  if (num > 0) {
791,329,992✔
132
    SJson* pJsonArray = tjsonAddArrayToObject(pJson, pName);
747,770,434✔
133
    if (NULL == pJsonArray) {
747,772,654!
134
      return terrno;
×
135
    }
136
    for (size_t i = 0; i < num; ++i) {
1,516,119,068✔
137
      int32_t code = tjsonAddItem(pJsonArray, func, (const char*)pArray + itemSize * i);
768,343,414✔
138
      if (TSDB_CODE_SUCCESS != code) {
768,345,964!
139
        return code;
×
140
      }
141
    }
142
  }
143
  return TSDB_CODE_SUCCESS;
791,335,212✔
144
}
145

146
int32_t tjsonAddTArray(SJson* pJson, const char* pName, FToJson func, const SArray* pArray) {
1,071,534✔
147
  int32_t num = taosArrayGetSize(pArray);
1,071,534✔
148
  if (num > 0) {
1,071,534!
149
    SJson* pJsonArray = tjsonAddArrayToObject(pJson, pName);
×
150
    if (NULL == pJsonArray) {
×
151
      return terrno;
×
152
    }
153
    for (int32_t i = 0; i < num; ++i) {
×
154
      int32_t code = tjsonAddItem(pJsonArray, func, taosArrayGet(pArray, i));
×
155
      if (TSDB_CODE_SUCCESS != code) {
×
156
        return code;
×
157
      }
158
    }
159
  }
160
  return TSDB_CODE_SUCCESS;
1,071,534✔
161
}
162

163
char* tjsonToString(const SJson* pJson) {
37,864,962✔
164
  char* p = cJSON_Print((cJSON*)pJson);
37,864,962✔
165
  if (!p) {
37,868,097!
166
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
167
  }
168
  return p;
37,868,350✔
169
}
170

171
char* tjsonToUnformattedString(const SJson* pJson) {
620,613,245✔
172
  char* p = cJSON_PrintUnformatted((cJSON*)pJson);
620,613,245✔
173
  if (!p) {
620,617,006!
174
    terrno = TSDB_CODE_OUT_OF_MEMORY;
×
175
  }
176
  return p;
620,617,006✔
177
}
178

179
SJson* tjsonGetObjectItem(const SJson* pJson, const char* pName) { return cJSON_GetObjectItem(pJson, pName); }
2,147,483,647✔
180

181
int32_t tjsonGetObjectName(const SJson* pJson, char** pName) {
457✔
182
  *pName = ((cJSON*)pJson)->string;
457✔
183
  if (NULL == *pName) {
457!
184
    return TSDB_CODE_FAILED;
×
185
  }
186
  return TSDB_CODE_SUCCESS;
457✔
187
}
188

189
int32_t tjsonGetObjectValueString(const SJson* pJson, char** pValueString) {
457✔
190
  *pValueString = ((cJSON*)pJson)->valuestring;
457✔
191
  if (NULL == *pValueString) {
457!
192
    return TSDB_CODE_FAILED;
×
193
  }
194
  return TSDB_CODE_SUCCESS;
457✔
195
}
196

197
void tjsonGetObjectValueBigInt(const SJson* pJson, int64_t* pVal) { *pVal = (int64_t)((cJSON*)pJson)->valuedouble; }
×
198

199
void tjsonGetObjectValueDouble(const SJson* pJson, double* pVal) { *pVal = ((cJSON*)pJson)->valuedouble; }
×
200

201
int32_t tjsonGetStringValue(const SJson* pJson, const char* pName, char* pVal) {
807,535,618✔
202
  char* p = cJSON_GetStringValue(tjsonGetObjectItem((cJSON*)pJson, pName));
807,535,618✔
203
  if (NULL == p) {
807,748,729!
204
    return TSDB_CODE_SUCCESS;
×
205
  }
206
  strcpy(pVal, p);
807,748,729!
207
  return TSDB_CODE_SUCCESS;
807,748,729✔
208
}
209

210
int32_t tjsonGetStringValue2(const SJson* pJson, const char* pName, char* pVal, int32_t maxLen) {
664✔
211
  char* p = cJSON_GetStringValue(tjsonGetObjectItem((cJSON*)pJson, pName));
664✔
212
  if (NULL == p) {
664!
213
    return TSDB_CODE_SUCCESS;
×
214
  }
215
  int32_t len = strlen(p);
664!
216
  if (len >= maxLen - 1) {
664!
217
    return TSDB_CODE_OUT_OF_MEMORY;
×
218
  }
219
  strcpy(pVal, p);
664!
220
  return TSDB_CODE_SUCCESS;
664✔
221
}
222

223
int32_t tjsonDupStringValue(const SJson* pJson, const char* pName, char** pVal) {
20,095,242✔
224
  char* p = cJSON_GetStringValue(tjsonGetObjectItem((cJSON*)pJson, pName));
20,095,242✔
225
  if (NULL == p) {
20,098,218!
226
    return TSDB_CODE_SUCCESS;
×
227
  }
228
  *pVal = taosStrdup(p);
20,098,218!
229
  return TSDB_CODE_SUCCESS;
20,094,731✔
230
}
231

232
int32_t tjsonGetBigIntValue(const SJson* pJson, const char* pName, int64_t* pVal) {
2,147,483,647✔
233
  char* p = cJSON_GetStringValue(tjsonGetObjectItem((cJSON*)pJson, pName));
2,147,483,647✔
234
  if (NULL == p) {
2,147,483,647✔
235
    return TSDB_CODE_SUCCESS;
33,467,762✔
236
  }
237
#ifdef WINDOWS
238
  sscanf(p, "%" PRId64, pVal);
239
#else
240
  *pVal = taosStr2Int64(p, NULL, 10);
2,147,483,647✔
241
#endif
242
  return TSDB_CODE_SUCCESS;
2,147,483,647✔
243
}
244

245
int32_t tjsonGetIntValue(const SJson* pJson, const char* pName, int32_t* pVal) {
1,037,247,582✔
246
  int64_t val = 0;
1,037,247,582✔
247
  int32_t code = tjsonGetBigIntValue(pJson, pName, &val);
1,037,262,390✔
248
  *pVal = val;
1,037,503,152✔
249
  return code;
1,037,527,161✔
250
}
251

252
int32_t tjsonGetSmallIntValue(const SJson* pJson, const char* pName, int16_t* pVal) {
452,699,641✔
253
  int64_t val = 0;
452,699,641✔
254
  int32_t code = tjsonGetBigIntValue(pJson, pName, &val);
452,714,955✔
255
  *pVal = val;
452,818,223✔
256
  return code;
452,823,105✔
257
}
258

259
int32_t tjsonGetTinyIntValue(const SJson* pJson, const char* pName, int8_t* pVal) {
158,704,411✔
260
  int64_t val = 0;
158,704,411✔
261
  int32_t code = tjsonGetBigIntValue(pJson, pName, &val);
158,707,897✔
262
  *pVal = val;
158,749,990✔
263
  return code;
158,752,436✔
264
}
265

266
int32_t tjsonGetUBigIntValue(const SJson* pJson, const char* pName, uint64_t* pVal) {
780,878,350✔
267
  char* p = cJSON_GetStringValue(tjsonGetObjectItem((cJSON*)pJson, pName));
780,878,350✔
268
  if (NULL == p) {
780,707,816!
269
    return TSDB_CODE_SUCCESS;
×
270
  }
271
#ifdef WINDOWS
272
  sscanf(p, "%" PRIu64, pVal);
273
#else
274
  *pVal = taosStr2UInt64(p, NULL, 10);
780,707,816✔
275
#endif
276
  return TSDB_CODE_SUCCESS;
781,017,073✔
277
}
278

279
int32_t tjsonGetUIntValue(const SJson* pJson, const char* pName, uint32_t* pVal) {
26,568✔
280
  uint64_t val = 0;
26,568✔
281
  int32_t  code = tjsonGetUBigIntValue(pJson, pName, &val);
26,568✔
282
  *pVal = val;
26,568✔
283
  return code;
26,568✔
284
}
285

286
int32_t tjsonGetUTinyIntValue(const SJson* pJson, const char* pName, uint8_t* pVal) {
697,921,219✔
287
  uint64_t val = 0;
697,921,219✔
288
  int32_t  code = tjsonGetUBigIntValue(pJson, pName, &val);
697,945,881✔
289
  *pVal = val;
698,128,561✔
290
  return code;
698,138,375✔
291
}
292

293
int32_t tjsonGetBoolValue(const SJson* pJson, const char* pName, bool* pVal) {
779,143,237✔
294
  const SJson* pObject = tjsonGetObjectItem(pJson, pName);
779,143,237✔
295
  if (NULL == pObject) {
779,292,372!
296
    return TSDB_CODE_SUCCESS;
×
297
  }
298
  if (!cJSON_IsBool(pObject)) {
779,292,372!
299
    return TSDB_CODE_FAILED;
×
300
  }
301
  *pVal = cJSON_IsTrue(pObject) ? true : false;
779,283,481✔
302
  return TSDB_CODE_SUCCESS;
779,295,152✔
303
}
304

305
int32_t tjsonGetDoubleValue(const SJson* pJson, const char* pName, double* pVal) {
26,977,546✔
306
  const SJson* pObject = tjsonGetObjectItem(pJson, pName);
26,977,546✔
307
  if (NULL == pObject) {
26,987,025✔
308
    return TSDB_CODE_SUCCESS;
617,376✔
309
  }
310
  if (!cJSON_IsNumber(pObject)) {
26,369,649!
311
    return TSDB_CODE_FAILED;
×
312
  }
313
  *pVal = cJSON_GetNumberValue(pObject);
26,371,506✔
314
  return TSDB_CODE_SUCCESS;
26,371,828✔
315
}
316

317
int32_t tjsonGetArraySize(const SJson* pJson) { return cJSON_GetArraySize(pJson); }
88,614,206✔
318

319
SJson* tjsonGetArrayItem(const SJson* pJson, int32_t index) { return cJSON_GetArrayItem(pJson, index); }
176,520,224✔
320

321
int32_t tjsonToObject(const SJson* pJson, const char* pName, FToObject func, void* pObj) {
565,948,192✔
322
  SJson* pJsonObj = tjsonGetObjectItem(pJson, pName);
565,948,192✔
323
  if (NULL == pJsonObj) {
566,035,937✔
324
    return TSDB_CODE_SUCCESS;
9,880,563✔
325
  }
326
  return func(pJsonObj, pObj);
556,155,374✔
327
}
328

329
int32_t tjsonMakeObject(const SJson* pJson, const char* pName, FToObject func, void** pObj, int32_t objSize) {
348,058✔
330
  if (objSize <= 0) {
348,058✔
331
    return TSDB_CODE_SUCCESS;
180,608✔
332
  }
333

334
  SJson* pJsonObj = tjsonGetObjectItem(pJson, pName);
167,450✔
335
  if (NULL == pJsonObj) {
167,450!
336
    return TSDB_CODE_SUCCESS;
×
337
  }
338
  *pObj = taosMemoryCalloc(1, objSize);
167,450!
339
  if (NULL == *pObj) {
167,450!
340
    return terrno;
×
341
  }
342
  return func(pJsonObj, *pObj);
167,450✔
343
}
344

345
int32_t tjsonToArray(const SJson* pJson, const char* pName, FToObject func, void* pArray, int32_t itemSize) {
10,967,318✔
346
  const cJSON* jArray = tjsonGetObjectItem(pJson, pName);
10,967,318✔
347
  int32_t      size = (NULL == jArray ? 0 : tjsonGetArraySize(jArray));
10,971,626✔
348
  for (int32_t i = 0; i < size; ++i) {
24,067,913✔
349
    int32_t code = func(tjsonGetArrayItem(jArray, i), (char*)pArray + itemSize * i);
13,091,374✔
350
    if (TSDB_CODE_SUCCESS != code) {
13,096,261!
351
      return code;
×
352
    }
353
  }
354
  return TSDB_CODE_SUCCESS;
10,976,539✔
355
}
356

357
int32_t tjsonToTArray(const SJson* pJson, const char* pName, FToObject func, SArray** pArray, int32_t itemSize) {
167,423✔
358
  const cJSON* jArray = tjsonGetObjectItem(pJson, pName);
167,423✔
359
  int32_t      size = tjsonGetArraySize(jArray);
167,423✔
360
  if (size > 0) {
167,423!
361
    *pArray = taosArrayInit_s(itemSize, size);
×
362
    if (NULL == *pArray) {
×
363
      return terrno;
×
364
    }
365
    for (int32_t i = 0; i < size; ++i) {
×
366
      int32_t code = func(tjsonGetArrayItem(jArray, i), taosArrayGet(*pArray, i));
×
367
      if (TSDB_CODE_SUCCESS != code) {
×
368
        return code;
×
369
      }
370
    }
371
  }
372
  return TSDB_CODE_SUCCESS;
167,423✔
373
}
374

375
SJson* tjsonParse(const char* pStr) { return cJSON_Parse(pStr); }
19,103,891✔
376

377
bool tjsonValidateJson(const char* jIn) {
×
378
  if (!jIn) {
×
379
    return false;
×
380
  }
381

382
  // set json real data
383
  cJSON* root = cJSON_Parse(jIn);
×
384
  if (root == NULL) {
×
385
    return false;
×
386
  }
387

388
  if (!cJSON_IsObject(root)) {
×
389
    return false;
×
390
  }
391
  int size = cJSON_GetArraySize(root);
×
392
  for (int i = 0; i < size; i++) {
×
393
    cJSON* item = cJSON_GetArrayItem(root, i);
×
394
    if (!item) {
×
395
      return false;
×
396
    }
397

398
    char* jsonKey = item->string;
×
399
    if (!jsonKey) return false;
×
400
    for (size_t j = 0; j < strlen(jsonKey); ++j) {
×
401
      if (isprint(jsonKey[j]) == 0) return false;
×
402
    }
403

404
    if (item->type == cJSON_Object || item->type == cJSON_Array) {
×
405
      return false;
×
406
    }
407
  }
408
  return true;
×
409
}
410

411
const char* tjsonGetError() { return cJSON_GetErrorPtr(); }
×
412

413
void tjsonDeleteItemFromObject(const SJson* pJson, const char* pName) {
×
414
  cJSON_DeleteItemFromObject((cJSON*)pJson, pName);
×
415
}
×
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

© 2026 Coveralls, Inc