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

taosdata / TDengine / #4847

11 Nov 2025 05:50AM UTC coverage: 62.651% (+0.3%) from 62.306%
#4847

push

travis-ci

web-flow
Merge e78cd6509 into 47a2ea7a0

542 of 650 new or added lines in 16 files covered. (83.38%)

1515 existing lines in 91 files now uncovered.

113826 of 181682 relevant lines covered (62.65%)

113230552.12 hits per line

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

70.9
/source/util/src/tarray.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 "tarray.h"
18
#include "tcoding.h"
19

20
// todo refactor API
21
#define BOUNDARY_SIZE         1024 * 1024 * 1024  // 1G
22
#define BOUNDARY_SMALL_FACTOR 1.2
23
#define BOUNDARY_BIG_FACTOR   2
24

25
SArray* taosArrayInit(size_t size, size_t elemSize) {
2,147,483,647✔
26
  if (elemSize == 0) {
2,147,483,647✔
27
    terrno = TSDB_CODE_INVALID_PARA;
×
28
    return NULL;
×
29
  }
30

31
  if (size < TARRAY_MIN_SIZE) {
2,147,483,647✔
32
    size = TARRAY_MIN_SIZE;
2,147,483,647✔
33
  }
34

35
  SArray* pArray = taosMemoryMalloc(sizeof(SArray));
2,147,483,647✔
36
  if (pArray == NULL) {
2,147,483,647✔
37
    return NULL;
×
38
  }
39

40
  pArray->size = 0;
2,147,483,647✔
41
  pArray->pData = taosMemoryCalloc(size, elemSize);
2,147,483,647✔
42
  if (pArray->pData == NULL) {
2,147,483,647✔
43
    taosMemoryFree(pArray);
×
44
    return NULL;
×
45
  }
46

47
  pArray->capacity = size;
2,147,483,647✔
48
  pArray->elemSize = elemSize;
2,147,483,647✔
49
  return pArray;
2,147,483,647✔
50
}
51

52
SArray* taosArrayInit_s(size_t elemSize, size_t initialSize) {
105,801,892✔
53
  SArray* pArray = taosMemoryMalloc(sizeof(SArray));
105,801,892✔
54
  if (pArray == NULL) {
105,445,472✔
55
    return NULL;
×
56
  }
57

58
  pArray->size = initialSize;
105,445,472✔
59
  pArray->pData = taosMemoryCalloc(initialSize, elemSize);
105,586,939✔
60
  if (pArray->pData == NULL) {
105,799,162✔
61
    taosMemoryFree(pArray);
×
62
    return NULL;
×
63
  }
64

65
  pArray->capacity = initialSize;
105,772,971✔
66
  pArray->elemSize = elemSize;
105,809,727✔
67
  return pArray;
105,907,272✔
68
}
69

70
static int32_t taosArrayResize(SArray* pArray) {
×
71
  size_t size = pArray->capacity;
×
72
  size = (size << 1u);
×
73

74
  void* tmp = taosMemoryRealloc(pArray->pData, size * pArray->elemSize);
×
75
  if (tmp == NULL) {  // reallocate failed, the original buffer remains
×
76
    return terrno;
×
77
  }
78

79
  pArray->pData = tmp;
×
80
  pArray->capacity = size;
×
81

82
  return 0;
×
83
}
84

85
int32_t taosArrayEnsureCap(SArray* pArray, size_t newCap) {
2,147,483,647✔
86
  if (newCap > pArray->capacity) {
2,147,483,647✔
87
    float factor = BOUNDARY_BIG_FACTOR;
925,185,531✔
88
    if (newCap * pArray->elemSize > BOUNDARY_SIZE) {
925,185,531✔
89
      factor = BOUNDARY_SMALL_FACTOR;
×
90
    }
91

92
    size_t tsize = (pArray->capacity * factor);
925,441,014✔
93
    while (newCap > tsize) {
934,814,999✔
94
      size_t newSize = (tsize * factor);
9,737,043✔
95
      tsize = (newSize == tsize) ? (tsize + 2) : newSize;
9,737,043✔
96
    }
97

98
    char* p = taosMemoryRealloc(pArray->pData, tsize * pArray->elemSize);
925,077,956✔
99
    if (p == NULL) {
924,966,421✔
100
      return terrno;
×
101
    }
102

103
    pArray->pData = p;
924,966,421✔
104
    pArray->capacity = tsize;
925,117,101✔
105
  }
106
  return 0;
2,147,483,647✔
107
}
108

109
void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles) {
2,147,483,647✔
110
  if (pData == NULL) {
2,147,483,647✔
111
    terrno = TSDB_CODE_INVALID_PARA;
×
112
    return NULL;
×
113
  }
114

115
  int32_t code = taosArrayEnsureCap(pArray, pArray->size + nEles);
2,147,483,647✔
116
  if (code) {
2,147,483,647✔
117
    terrno = code;
13,130✔
118
    return NULL;
×
119
  }
120

121
  void* dst = TARRAY_GET_ELEM(pArray, pArray->size);
2,147,483,647✔
122
  memcpy(dst, pData, pArray->elemSize * nEles);
2,147,483,647✔
123

124
  pArray->size += nEles;
2,147,483,647✔
125
  return dst;
2,147,483,647✔
126
}
127

128
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
5,666,813✔
129
  size_t size = pArray->size;
5,666,813✔
130
  if (size <= 1) {
5,667,429✔
131
    return;
3,648,186✔
132
  }
133

134
  int32_t pos = 0;
2,019,243✔
135
  for (int32_t i = 1; i < size; ++i) {
34,023,089✔
136
    char* p1 = taosArrayGet(pArray, pos);
32,007,298✔
137
    char* p2 = taosArrayGet(pArray, i);
31,995,276✔
138

139
    if (comparFn(p1, p2) == 0) {
31,996,784✔
140
      // do nothing
141
    } else {
142
      if (pos + 1 != i) {
31,832,711✔
143
        void* p = taosArrayGet(pArray, pos + 1);
187,769✔
144
        if (fp != NULL) {
187,769✔
145
          fp(p);
×
146
        }
147

148
        taosArraySet(pArray, pos + 1, p2);
187,769✔
149
        memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
187,769✔
150
        pos += 1;
187,769✔
151
      } else {
152
        pos += 1;
31,644,942✔
153
      }
154
    }
155
  }
156

157
  if (fp != NULL) {
2,015,791✔
158
    for (int32_t i = pos + 1; i < pArray->size; ++i) {
543✔
159
      void* p = taosArrayGet(pArray, i);
53✔
160
      fp(p);
53✔
161
    }
162
  }
163

164
  pArray->size = pos + 1;
2,015,791✔
165
}
166

167
void* taosArrayAddAll(SArray* pArray, const SArray* pInput) {
44,087,514✔
168
  if (pInput) {
44,087,514✔
169
    return taosArrayAddBatch(pArray, pInput->pData, (int32_t)taosArrayGetSize(pInput));
43,554,572✔
170
  } else {
171
    terrno = TSDB_CODE_INVALID_PARA;
532,942✔
172
    return NULL;
536,403✔
173
  }
174
}
175

176
void* taosArrayReserve(SArray* pArray, int32_t num) {
2,147,483,647✔
177
  int32_t code = taosArrayEnsureCap(pArray, pArray->size + num);
2,147,483,647✔
178
  if (code) {
2,147,483,647✔
179
    terrno = code;
3,247,415✔
180
    return NULL;
×
181
  }
182

183
  void* dst = TARRAY_GET_ELEM(pArray, pArray->size);
2,147,483,647✔
184
  pArray->size += num;
2,147,483,647✔
185

186
  memset(dst, 0, num * pArray->elemSize);
2,147,483,647✔
187

188
  return dst;
2,147,483,647✔
189
}
190

191
void* taosArrayPop(SArray* pArray) {
2,147,483,647✔
192
  if (pArray->size == 0) {
2,147,483,647✔
193
    return NULL;
15,401,759✔
194
  }
195

196
  pArray->size -= 1;
2,147,483,647✔
197
  return TARRAY_GET_ELEM(pArray, pArray->size);
2,147,483,647✔
198
}
199

200
void* taosArrayGet(const SArray* pArray, size_t index) {
2,147,483,647✔
201
  if (NULL == pArray) {
2,147,483,647✔
202
    terrno = TSDB_CODE_INVALID_PARA;
×
203
    uError("failed to return value from array of null ptr");
×
204
    return NULL;
×
205
  }
206

207
  if (index >= pArray->size) {
2,147,483,647✔
208
    uError("index is out of range, current:%" PRIzu " max:%" PRIzu, index, pArray->size);
172,307✔
209
    terrno = TSDB_CODE_OUT_OF_RANGE;
172,307✔
210
    return NULL;
172,307✔
211
  }
212

213
  return TARRAY_GET_ELEM(pArray, index);
2,147,483,647✔
214
}
215

216
void* taosArrayGetP(const SArray* pArray, size_t index) {
2,147,483,647✔
217
  void** p = taosArrayGet(pArray, index);
2,147,483,647✔
218
  if (p == NULL) {
2,147,483,647✔
219
    return NULL;
×
220
  }
221
  return *p;
2,147,483,647✔
222
}
223

224
void* taosArrayGetLast(const SArray* pArray) {
2,147,483,647✔
225
  if (pArray->size == 0) {
2,147,483,647✔
226
    terrno = TSDB_CODE_INVALID_PARA;
4,308,201✔
227
    return NULL;
4,308,201✔
228
  }
229

230
  return TARRAY_GET_ELEM(pArray, pArray->size - 1);
2,147,483,647✔
231
}
232

233
size_t taosArrayGetSize(const SArray* pArray) {
2,147,483,647✔
234
  if (pArray == NULL) {
2,147,483,647✔
235
    return 0;
2,147,483,647✔
236
  }
237
  return TARRAY_SIZE(pArray);
2,147,483,647✔
238
}
239

240
void* taosArrayInsert(SArray* pArray, size_t index, const void* pData) {
746,235,135✔
241
  if (pArray == NULL || pData == NULL) {
746,235,135✔
242
    terrno = TSDB_CODE_INVALID_PARA;
×
243
    return NULL;
×
244
  }
245

246
  if (index >= pArray->size) {
746,236,765✔
247
    return taosArrayPush(pArray, pData);
743,477,508✔
248
  }
249

250
  if (pArray->size >= pArray->capacity) {
2,763,586✔
251
    int32_t ret = taosArrayResize(pArray);
×
252
    if (ret < 0) {
×
253
      terrno = ret;
×
254
      return NULL;
×
255
    }
256
  }
257

258
  void* dst = TARRAY_GET_ELEM(pArray, index);
2,763,070✔
259

260
  int32_t remain = (int32_t)(pArray->size - index);
2,763,070✔
261
  memmove((char*)dst + pArray->elemSize, (char*)dst, pArray->elemSize * remain);
2,763,070✔
262
  memcpy(dst, pData, pArray->elemSize);
2,763,070✔
263

264
  pArray->size += 1;
2,763,070✔
265

266
  return dst;
2,762,867✔
267
}
268

269
void taosArraySet(SArray* pArray, size_t index, void* pData) {
2,147,483,647✔
270
  if (index < pArray->size) {
2,147,483,647✔
271
    memcpy(TARRAY_GET_ELEM(pArray, index), pData, pArray->elemSize);
2,147,483,647✔
272
  }
273
}
2,147,483,647✔
274

275
void taosArrayPopFrontBatch(SArray* pArray, size_t cnt) {
5,071,238✔
276
  if (cnt > pArray->size) {
5,071,238✔
277
    cnt = pArray->size;
×
278
  }
279

280
  pArray->size = pArray->size - cnt;
5,071,631✔
281
  if (pArray->size == 0 || cnt == 0) {
5,072,006✔
282
    return;
4,831,818✔
283
  }
284
  memmove(pArray->pData, (char*)pArray->pData + cnt * pArray->elemSize, pArray->size * pArray->elemSize);
240,188✔
285
}
286

287
void taosArrayPopTailBatch(SArray* pArray, size_t cnt) {
11,926,363✔
288
  if (cnt >= pArray->size) {
11,926,363✔
289
    cnt = pArray->size;
10,364,398✔
290
  }
291

292
  pArray->size = pArray->size - cnt;
11,925,723✔
293
}
11,921,280✔
294

295
void taosArrayRemove(SArray* pArray, size_t index) {
330,833,648✔
296
  if (!(index < pArray->size)) {
330,833,648✔
297
    return;
×
298
  }
299

300
  if (index == pArray->size - 1) {
330,833,648✔
301
    void* t = taosArrayPop(pArray);
111,322,379✔
302
    return;
111,322,379✔
303
  }
304

305
  size_t remain = pArray->size - index - 1;
219,511,269✔
306
  memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + 1) * pArray->elemSize,
219,511,269✔
307
          remain * pArray->elemSize);
219,511,269✔
308
  pArray->size -= 1;
219,511,269✔
309
}
310

311
void taosArrayRemoveP(SArray* pArray, size_t index, void (*fp)(void*)){
11,754,549✔
312
  if (!(index < pArray->size)) {
11,754,549✔
NEW
313
    return;
×
314
  }
315

11,754,549✔
316
  if (index == pArray->size - 1) {
11,754,724✔
317
    void** t = taosArrayPop(pArray);
88,647,572✔
318
    if (fp && t!= NULL) {
76,895,266✔
319
      fp(*t);
320
    }
321
    return;
322
  }
11,751,819✔
323

11,752,011✔
324
  void* p = taosArrayGetP(pArray, index);
11,753,983✔
325
  if (fp) {
326
    fp(p);
327
  }
NEW
328

×
NEW
329
  size_t remain = pArray->size - index - 1;
×
NEW
330
  memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + 1) * pArray->elemSize,
×
NEW
331
          remain * pArray->elemSize);
×
332
  pArray->size -= 1;
333
}
NEW
334

×
UNCOV
335
void taosArrayRemoveBatch(SArray* pArray, size_t index, size_t num, FDelete fp) {
×
UNCOV
336
  if(num == 0) {
×
337
    return;
×
338
  }
339
  if (index + num <= pArray->size) {
UNCOV
340
    if (fp) {
×
341
      for (int32_t i = 0; i < num; i++) {
342
        fp(taosArrayGet(pArray, index + i));
343
      }
468,443,967✔
344
    }
468,443,967✔
345

1,547,693✔
346
    memmove((char*)pArray->pData + index * pArray->elemSize, (char*)pArray->pData + (index + num) * pArray->elemSize,
1,547,693✔
347
            (pArray->size - index - num) * pArray->elemSize);
348
    pArray->size -= num;
349
  }
466,896,274✔
350
}
93,948,137✔
351

352
SArray* taosArrayFromList(const void* src, size_t size, size_t elemSize) {
353
  if (elemSize <= 0) {
372,940,540✔
354
    terrno = TSDB_CODE_INVALID_PARA;
355
    return NULL;
372,926,132✔
356
  }
372,929,385✔
357

372,881,575✔
358
  SArray* pDst = taosArrayInit(size, elemSize);
359
  if (pDst) {
99,072✔
360
    memcpy(pDst->pData, src, elemSize * size);
48,260✔
361
    pDst->size = size;
51,262✔
362
  }
363

364
  return pDst;
365
}
372,956,502✔
366

367
SArray* taosArrayDup(const SArray* pSrc, __array_item_dup_fn_t fn) {
368
  if (NULL == pSrc) {
372,958,715✔
369
    terrno = TSDB_CODE_INVALID_PARA;
370
    return NULL;
371
  }
2,147,483,647✔
372

2,147,483,647✔
373
  if (pSrc->size == 0) {  // empty array list
2,147,483,647✔
374
    return taosArrayInit(8, pSrc->elemSize);
375
  }
376

113,106,924✔
377
  SArray* dst = taosArrayInit(pSrc->size, pSrc->elemSize);
113,106,924✔
378

98,548,865✔
UNCOV
379
  if (dst) {
×
UNCOV
380
    if (fn == NULL) {
×
381
      memcpy(dst->pData, pSrc->pData, pSrc->elemSize * pSrc->size);
382
    } else {
383
      for (int32_t i = 0; i < pSrc->size; ++i) {
228,552,772✔
384
        void* p = fn(taosArrayGetP(pSrc, i));
130,004,577✔
385
        memcpy(((char*)dst->pData) + i * dst->elemSize, &p, dst->elemSize);
386
      }
387
    }
98,546,925✔
388

389
    dst->size = pSrc->size;
4,697,927✔
390
  }
391

392
  return dst;
393
}
394

395
void taosArrayClear(SArray* pArray) {
396
  if (pArray == NULL) return;
397
  pArray->size = 0;
398
}
399

4,697,927✔
400
void taosArrayClearEx(SArray* pArray, void (*fp)(void*)) {
4,697,927✔
401
  if (pArray == NULL) return;
519,851✔
402
  if (fp == NULL) {
311✔
403
    pArray->size = 0;
404
    return;
405
  }
14,841,339✔
406

10,662,952✔
407
  for (int32_t i = 0; i < pArray->size; ++i) {
408
    fp(TARRAY_GET_ELEM(pArray, i));
409
  }
410

4,697,927✔
411
  pArray->size = 0;
4,698,627✔
412
}
413
void taosArrayClearP(SArray* pArray, void (*fp)(void*)) {
2,147,483,647✔
414
  // if (pArray == NULL) return;
2,147,483,647✔
415
  // if (fp == NULL) {
2,147,483,647✔
416
  //   pArray->size = 0;
2,147,483,647✔
417
  //   return;
418
  // }
2,147,483,647✔
419

420
  // for (int32_t i = 0; i < pArray->size; ++i) {
758,212,810✔
421
  //   fp(TARRAY_GET_ELEM(pArray, i));
758,212,810✔
422
  // }
208,020,250✔
423
  if (pArray) {
431,212,847✔
424
    if (NULL == fp) {
247,563,927✔
425
      for (int32_t i = 0; i < pArray->size; i++) {
426
        taosMemoryFree(*(void**)TARRAY_GET_ELEM(pArray, i));
427
      }
205,277,698✔
428
    } else {
181,557,778✔
429
      for (int32_t i = 0; i < pArray->size; i++) {
430
        fp(*(void**)TARRAY_GET_ELEM(pArray, i));
431
      }
207,980,099✔
432
    }
433
  }
758,185,426✔
434
  taosArrayClear(pArray);
435
}
2,147,483,647✔
436

2,147,483,647✔
437
void taosArrayDestroy(SArray* pArray) {
2,147,483,647✔
438
  if (pArray) {
439
    taosMemoryFree(pArray->pData);
440
    taosMemoryFree(pArray);
2,147,483,647✔
441
  }
83,584,405✔
442
}
83,584,656✔
443

444
void taosArrayDestroyP(SArray* pArray, FDelete fp) {
445
  if (pArray) {
2,147,483,647✔
446
    if (NULL == fp) {
2,147,483,647✔
447
      for (int32_t i = 0; i < pArray->size; i++) {
448
        taosMemoryFree(*(void**)TARRAY_GET_ELEM(pArray, i));
449
      }
2,147,483,647✔
450
    } else {
451
      for (int32_t i = 0; i < pArray->size; i++) {
452
        fp(*(void**)TARRAY_GET_ELEM(pArray, i));
566,787,408✔
453
      }
566,787,408✔
454
    }
566,797,436✔
455
    taosArrayDestroy(pArray);
456
  }
970,466✔
457
}
970,466✔
458

459
void taosArrayDestroyEx(SArray* pArray, FDelete fp) {
460
  if (pArray == NULL) {
1,013,711,538✔
461
    return;
1,013,711,538✔
462
  }
463

464
  if (fp == NULL) {
201,923,239✔
465
    taosArrayDestroy(pArray);
201,923,239✔
466
    return;
201,919,939✔
467
  }
468

469
  for (int32_t i = 0; i < pArray->size; ++i) {
470
    fp(TARRAY_GET_ELEM(pArray, i));
471
  }
472

473
  taosArrayDestroy(pArray);
474
}
475

476
void taosArraySort(SArray* pArray, __compar_fn_t compar) {
477
  taosSort(pArray->pData, pArray->size, pArray->elemSize, compar);
478
}
479

480
int32_t taosArrayMSort(SArray* pArray, __compar_fn_t compar) {
481
  return taosMergeSort(pArray->pData, pArray->size, pArray->elemSize, compar);
482
}
483

484
void* taosArraySearch(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {
485
  return taosbsearch(key, pArray->pData, pArray->size, pArray->elemSize, comparFn, flags);
486
}
487

488
int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {
489
  void* item = taosArraySearch(pArray, key, comparFn, flags);
490
  return item == NULL ? -1 : (int32_t)((char*)item - (char*)pArray->pData) / pArray->elemSize;
491
}
492

493
#ifdef BUILD_NO_CALL
494
static int32_t taosArrayPartition(SArray* pArray, int32_t i, int32_t j, __ext_compar_fn_t fn, const void* userData) {
495
  void* key = taosArrayGetP(pArray, i);
496
  while (i < j) {
497
    while (i < j && fn(taosArrayGetP(pArray, j), key, userData) >= 0) {
498
      j--;
499
    }
500
    if (i < j) {
501
      void* a = taosArrayGetP(pArray, j);
502
      taosArraySet(pArray, i, &a);
503
    }
504
    while (i < j && fn(taosArrayGetP(pArray, i), key, userData) <= 0) {
505
      i++;
506
    }
507
    if (i < j) {
508
      void* a = taosArrayGetP(pArray, i);
509
      taosArraySet(pArray, j, &a);
510
    }
511
  }
512
  taosArraySet(pArray, i, &key);
513
  return i;
514
}
515

516
static void taosArrayQuicksortImpl(SArray* pArray, int32_t low, int32_t high, __ext_compar_fn_t fn, const void* param) {
517
  if (low < high) {
518
    int32_t idx = taosArrayPartition(pArray, low, high, fn, param);
519
    taosArrayQuicksortImpl(pArray, low, idx - 1, fn, param);
520
    taosArrayQuicksortImpl(pArray, idx + 1, high, fn, param);
521
  }
522
}
523

524
static void taosArrayQuickSort(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
525
  if (pArray->size <= 1) {
526
    return;
UNCOV
527
  }
×
UNCOV
528
  taosArrayQuicksortImpl(pArray, 0, (int32_t)(taosArrayGetSize(pArray) - 1), fn, param);
×
UNCOV
529
}
×
UNCOV
530

×
UNCOV
531
static void taosArrayInsertSort(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
×
UNCOV
532
  if (pArray->size <= 1) {
×
UNCOV
533
    return;
×
534
  }
UNCOV
535

×
536
  for (int32_t i = 1; i <= pArray->size - 1; ++i) {
537
    for (int32_t j = i; j > 0; --j) {
UNCOV
538
      if (fn(taosArrayGetP(pArray, j), taosArrayGetP(pArray, j - 1), param) == -1) {
×
UNCOV
539
        void* a = taosArrayGetP(pArray, j);
×
UNCOV
540
        void* b = taosArrayGetP(pArray, j - 1);
×
UNCOV
541
        taosArraySet(pArray, j - 1, &a);
×
UNCOV
542
        taosArraySet(pArray, j, &b);
×
UNCOV
543
      } else {
×
544
        break;
UNCOV
545
      }
×
UNCOV
546
    }
×
UNCOV
547
  }
×
UNCOV
548
}
×
549
#endif
550

551
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode) {
×
552
  int32_t tlen = 0;
553
  int32_t sz = pArray->size;
×
554
  tlen += taosEncodeFixedI32(buf, sz);
×
555
  for (int32_t i = 0; i < sz; i++) {
×
556
    void* data = taosArrayGetP(pArray, i);
557
    tlen += encode(buf, data);
UNCOV
558
  }
×
559
  return tlen;
560
}
561

562
void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz, int8_t sver) {
563
  int32_t sz;
×
564
  buf = taosDecodeFixedI32(buf, &sz);
×
565
  *pArray = taosArrayInit(sz, sizeof(void*));
566
  if (*pArray == NULL) {
567
    return NULL;
×
UNCOV
568
  }
×
569
  for (int32_t i = 0; i < sz; i++) {
×
570
    void* data = taosMemoryCalloc(1, dataSz);
×
571
    if (data == NULL) {
×
572
      return NULL;
UNCOV
573
    }
×
UNCOV
574

×
575
    buf = decode(buf, data, sver);
×
576

577
    if (taosArrayPush(*pArray, &data) == NULL) {
×
578
      taosMemoryFree(data);
×
579
      return NULL;
×
580
    }
UNCOV
581
  }
×
582
  return (void*)buf;
×
UNCOV
583
}
×
584

585
// todo remove it
586
// order array<type *>
587
int32_t taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
588
  return taosqsort(pArray->pData, pArray->size, pArray->elemSize, param, fn);
589
}
590

591
void taosArraySwap(SArray* a, SArray* b) {
592
  if (a == NULL || b == NULL) return;
593
  size_t t = a->size;
594
  a->size = b->size;
595
  b->size = t;
596

597
  uint32_t cap = a->capacity;
598
  a->capacity = b->capacity;
599
  b->capacity = cap;
600

601
  uint32_t elem = a->elemSize;
602
  a->elemSize = b->elemSize;
603
  b->elemSize = elem;
604

605
  void* data = a->pData;
606
  a->pData = b->pData;
607
  b->pData = data;
608
}
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