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

#include "catalog.h"
17
#include "clientInt.h"
18
#include "clientLog.h"
L
Liu Jicong 已提交
19
#include "clientStmt.h"
L
Liu Jicong 已提交
20
#include "os.h"
H
Haojun Liao 已提交
21
#include "query.h"
L
Liu Jicong 已提交
22
#include "scheduler.h"
23
#include "tglobal.h"
L
Liu Jicong 已提交
24 25 26
#include "tmsg.h"
#include "tref.h"
#include "trpc.h"
S
version  
Shengliang Guan 已提交
27
#include "version.h"
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

#define TSC_VAR_NOT_RELEASE 1
#define TSC_VAR_RELEASED    0

static int32_t sentinel = TSC_VAR_NOT_RELEASE;

int taos_options(TSDB_OPTION option, const void *arg, ...) {
  static int32_t lock = 0;

  for (int i = 1; atomic_val_compare_exchange_32(&lock, 0, 1) != 0; ++i) {
    if (i % 1000 == 0) {
      tscInfo("haven't acquire lock after spin %d times.", i);
      sched_yield();
    }
  }

L
Liu Jicong 已提交
44
  int ret = taos_options_imp(option, (const char *)arg);
45 46 47 48 49 50
  atomic_store_32(&lock, 0);
  return ret;
}

// this function may be called by user or system, or by both simultaneously.
void taos_cleanup(void) {
H
Haojun Liao 已提交
51
  tscInfo("start to cleanup client environment");
52 53 54 55 56

  if (atomic_val_compare_exchange_32(&sentinel, TSC_VAR_NOT_RELEASE, TSC_VAR_RELEASED) != TSC_VAR_NOT_RELEASE) {
    return;
  }

H
Haojun Liao 已提交
57 58
  int32_t id = clientReqRefPool;
  clientReqRefPool = -1;
59 60
  taosCloseRef(id);

H
Haojun Liao 已提交
61
  cleanupTaskQueue();
62

63 64
  id = clientConnRefPool;
  clientConnRefPool = -1;
65 66
  taosCloseRef(id);

67 68
  hbMgrCleanUp();

69
  rpcCleanup();
D
dapan1121 已提交
70
  catalogDestroy();
D
dapan1121 已提交
71
  schedulerDestroy();
H
Haojun Liao 已提交
72 73

  tscInfo("all local resources released");
74
  taosCleanupCfg();
75
  taosCloseLog();
76 77
}

L
Liu Jicong 已提交
78
setConfRet taos_set_config(const char *config) {
79 80 81 82 83
  // TODO
  setConfRet ret = {SET_CONF_RET_SUCC, {0}};
  return ret;
}

84
TAOS *taos_connect(const char *ip, const char *user, const char *pass, const char *db, uint16_t port) {
S
Shengliang Guan 已提交
85
  tscDebug("try to connect to %s:%u, user:%s db:%s", ip, port, user, db);
H
Haojun Liao 已提交
86 87 88
  if (user == NULL) {
    user = TSDB_DEFAULT_USER;
  }
89

H
Haojun Liao 已提交
90 91 92
  if (pass == NULL) {
    pass = TSDB_DEFAULT_PASS;
  }
93

L
Liu Jicong 已提交
94
  return taos_connect_internal(ip, user, pass, NULL, db, port, CONN_TYPE__QUERY);
95 96
}

L
Liu Jicong 已提交
97
void taos_close(TAOS *taos) {
98 99 100 101
  if (taos == NULL) {
    return;
  }

H
Haojun Liao 已提交
102
  STscObj *pTscObj = (STscObj *)taos;
L
Liu Jicong 已提交
103
  tscDebug("0x%" PRIx64 " try to close connection, numOfReq:%d", pTscObj->id, pTscObj->numOfReqs);
104

D
dapan1121 已提交
105
  taosRemoveRef(clientConnRefPool, pTscObj->id);
106 107
}

108 109 110 111 112
int taos_errno(TAOS_RES *tres) {
  if (tres == NULL) {
    return terrno;
  }

113 114 115 116
  if (TD_RES_TMQ(tres)) {
    return 0;
  }

L
Liu Jicong 已提交
117
  return ((SRequestObj *)tres)->code;
118 119
}

120
const char *taos_errstr(TAOS_RES *res) {
121
  if (res == NULL) {
L
Liu Jicong 已提交
122
    return (const char *)tstrerror(terrno);
123 124
  }

125 126 127 128 129
  if (TD_RES_TMQ(res)) {
    return "success";
  }

  SRequestObj *pRequest = (SRequestObj *)res;
130
  if (NULL != pRequest->msgBuf && (strlen(pRequest->msgBuf) > 0 || pRequest->code == TSDB_CODE_RPC_FQDN_ERROR)) {
131 132
    return pRequest->msgBuf;
  } else {
L
Liu Jicong 已提交
133
    return (const char *)tstrerror(pRequest->code);
134
  }
135 136 137
}

void taos_free_result(TAOS_RES *res) {
D
stmt  
dapan1121 已提交
138 139 140
  if (NULL == res) {
    return;
  }
141

L
Liu Jicong 已提交
142 143 144
  if (TD_RES_QUERY(res)) {
    SRequestObj *pRequest = (SRequestObj *)res;
    destroyRequest(pRequest);
L
Liu Jicong 已提交
145 146 147 148 149 150 151 152 153 154
  } else if (TD_RES_TMQ(res)) {
    SMqRspObj *pRsp = (SMqRspObj *)res;
    if (pRsp->rsp.blockData) taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
    if (pRsp->rsp.blockDataLen) taosArrayDestroy(pRsp->rsp.blockDataLen);
    if (pRsp->rsp.blockSchema) taosArrayDestroy(pRsp->rsp.blockSchema);
    if (pRsp->rsp.blockTbName) taosArrayDestroy(pRsp->rsp.blockTbName);
    if (pRsp->rsp.blockTags) taosArrayDestroy(pRsp->rsp.blockTags);
    if (pRsp->rsp.blockTagSchema) taosArrayDestroy(pRsp->rsp.blockTagSchema);
    pRsp->resInfo.pRspMsg = NULL;
    doFreeReqResultInfo(&pRsp->resInfo);
L
Liu Jicong 已提交
155
  }
156 157
}

L
Liu Jicong 已提交
158
int taos_field_count(TAOS_RES *res) {
H
Haojun Liao 已提交
159 160 161 162
  if (res == NULL) {
    return 0;
  }

L
Liu Jicong 已提交
163
  SReqResultInfo *pResInfo = tscGetCurResInfo(res);
H
Haojun Liao 已提交
164 165 166
  return pResInfo->numOfCols;
}

L
Liu Jicong 已提交
167
int taos_num_fields(TAOS_RES *res) { return taos_field_count(res); }
H
Haojun Liao 已提交
168 169 170 171 172 173

TAOS_FIELD *taos_fetch_fields(TAOS_RES *res) {
  if (taos_num_fields(res) == 0) {
    return NULL;
  }

L
Liu Jicong 已提交
174
  SReqResultInfo *pResInfo = tscGetCurResInfo(res);
175
  return pResInfo->userFields;
H
Haojun Liao 已提交
176 177
}

178 179 180 181 182
TAOS_RES *taos_query(TAOS *taos, const char *sql) {
  if (taos == NULL || sql == NULL) {
    return NULL;
  }

L
Liu Jicong 已提交
183
  return taos_query_l(taos, sql, (int32_t)strlen(sql));
184
}
185

186 187
TAOS_ROW taos_fetch_row(TAOS_RES *res) {
  if (res == NULL) {
188 189 190
    return NULL;
  }

L
Liu Jicong 已提交
191 192 193 194 195 196 197
  if (TD_RES_QUERY(res)) {
    SRequestObj *pRequest = (SRequestObj *)res;
    if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT ||
        pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) {
      return NULL;
    }

198
    return doFetchRows(pRequest, true, true);
L
Liu Jicong 已提交
199 200

  } else if (TD_RES_TMQ(res)) {
L
Liu Jicong 已提交
201 202 203 204 205 206 207
    SMqRspObj      *msg = ((SMqRspObj *)res);
    SReqResultInfo *pResultInfo;
    if (msg->resIter == -1) {
      pResultInfo = tmqGetNextResInfo(res, true);
    } else {
      pResultInfo = tmqGetCurResInfo(res);
    }
L
Liu Jicong 已提交
208
    if (pResultInfo->current < pResultInfo->numOfRows) {
L
Liu Jicong 已提交
209 210
      doSetOneRowPtr(pResultInfo);
      pResultInfo->current += 1;
L
Liu Jicong 已提交
211 212
      return pResultInfo->row;
    } else {
L
Liu Jicong 已提交
213 214 215 216 217
      pResultInfo = tmqGetNextResInfo(res, true);
      if (pResultInfo == NULL) return NULL;
      doSetOneRowPtr(pResultInfo);
      pResultInfo->current += 1;
      return pResultInfo->row;
L
Liu Jicong 已提交
218 219
    }
  } else {
220
    // assert to avoid un-initialization error
L
Liu Jicong 已提交
221 222 223
    ASSERT(0);
  }
  return NULL;
224
}
H
Haojun Liao 已提交
225

L
Liu Jicong 已提交
226
int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) {
H
Haojun Liao 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
  int32_t len = 0;
  for (int i = 0; i < num_fields; ++i) {
    if (i > 0) {
      str[len++] = ' ';
    }

    if (row[i] == NULL) {
      len += sprintf(str + len, "%s", TSDB_DATA_NULL_STR);
      continue;
    }

    switch (fields[i].type) {
      case TSDB_DATA_TYPE_TINYINT:
        len += sprintf(str + len, "%d", *((int8_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_UTINYINT:
        len += sprintf(str + len, "%u", *((uint8_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_SMALLINT:
        len += sprintf(str + len, "%d", *((int16_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_USMALLINT:
        len += sprintf(str + len, "%u", *((uint16_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_INT:
        len += sprintf(str + len, "%d", *((int32_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_UINT:
        len += sprintf(str + len, "%u", *((uint32_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_BIGINT:
        len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_UBIGINT:
        len += sprintf(str + len, "%" PRIu64, *((uint64_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_FLOAT: {
        float fv = 0;
        fv = GET_FLOAT_VAL(row[i]);
        len += sprintf(str + len, "%f", fv);
      } break;

      case TSDB_DATA_TYPE_DOUBLE: {
        double dv = 0;
        dv = GET_DOUBLE_VAL(row[i]);
        len += sprintf(str + len, "%lf", dv);
      } break;

      case TSDB_DATA_TYPE_BINARY:
      case TSDB_DATA_TYPE_NCHAR: {
L
Liu Jicong 已提交
285
        int32_t charLen = varDataLen((char *)row[i] - VARSTR_HEADER_SIZE);
H
Haojun Liao 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
        if (fields[i].type == TSDB_DATA_TYPE_BINARY) {
          assert(charLen <= fields[i].bytes && charLen >= 0);
        } else {
          assert(charLen <= fields[i].bytes * TSDB_NCHAR_SIZE && charLen >= 0);
        }

        memcpy(str + len, row[i], charLen);
        len += charLen;
      } break;

      case TSDB_DATA_TYPE_TIMESTAMP:
        len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
        break;

      case TSDB_DATA_TYPE_BOOL:
        len += sprintf(str + len, "%d", *((int8_t *)row[i]));
      default:
        break;
    }
  }
L
Liu Jicong 已提交
306
  str[len] = 0;
H
Haojun Liao 已提交
307 308 309

  return len;
}
310

L
Liu Jicong 已提交
311
int *taos_fetch_lengths(TAOS_RES *res) {
312 313 314 315
  if (res == NULL) {
    return NULL;
  }

L
Liu Jicong 已提交
316 317
  SReqResultInfo *pResInfo = tscGetCurResInfo(res);
  return pResInfo->length;
318 319
}

320
TAOS_ROW *taos_result_block(TAOS_RES *res) {
L
Liu Jicong 已提交
321
  if (res == NULL) {
322 323 324 325 326 327 328 329
    terrno = TSDB_CODE_INVALID_PARA;
    return NULL;
  }

  if (taos_is_update_query(res)) {
    return NULL;
  }

L
Liu Jicong 已提交
330 331
  SReqResultInfo *pResInfo = tscGetCurResInfo(res);
  return &pResInfo->row;
332 333
}

334
// todo intergrate with tDataTypes
335 336
const char *taos_data_type(int type) {
  switch (type) {
L
Liu Jicong 已提交
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
    case TSDB_DATA_TYPE_NULL:
      return "TSDB_DATA_TYPE_NULL";
    case TSDB_DATA_TYPE_BOOL:
      return "TSDB_DATA_TYPE_BOOL";
    case TSDB_DATA_TYPE_TINYINT:
      return "TSDB_DATA_TYPE_TINYINT";
    case TSDB_DATA_TYPE_SMALLINT:
      return "TSDB_DATA_TYPE_SMALLINT";
    case TSDB_DATA_TYPE_INT:
      return "TSDB_DATA_TYPE_INT";
    case TSDB_DATA_TYPE_BIGINT:
      return "TSDB_DATA_TYPE_BIGINT";
    case TSDB_DATA_TYPE_FLOAT:
      return "TSDB_DATA_TYPE_FLOAT";
    case TSDB_DATA_TYPE_DOUBLE:
      return "TSDB_DATA_TYPE_DOUBLE";
    case TSDB_DATA_TYPE_VARCHAR:
      return "TSDB_DATA_TYPE_VARCHAR";
      //    case TSDB_DATA_TYPE_BINARY:          return "TSDB_DATA_TYPE_VARCHAR";
    case TSDB_DATA_TYPE_TIMESTAMP:
      return "TSDB_DATA_TYPE_TIMESTAMP";
    case TSDB_DATA_TYPE_NCHAR:
      return "TSDB_DATA_TYPE_NCHAR";
    case TSDB_DATA_TYPE_JSON:
      return "TSDB_DATA_TYPE_JSON";
    default:
      return "UNKNOWN";
364 365
  }
}
366 367 368

const char *taos_get_client_info() { return version; }

X
Xiaoyu Wang 已提交
369
int taos_affected_rows(TAOS_RES *res) {
L
Liu Jicong 已提交
370
  if (res == NULL || TD_RES_TMQ(res)) {
H
Haojun Liao 已提交
371 372 373
    return 0;
  }

L
Liu Jicong 已提交
374 375
  SRequestObj    *pRequest = (SRequestObj *)res;
  SReqResultInfo *pResInfo = &pRequest->body.resInfo;
H
Haojun Liao 已提交
376
  return pResInfo->numOfRows;
X
Xiaoyu Wang 已提交
377
}
378

379
int taos_result_precision(TAOS_RES *res) {
L
Liu Jicong 已提交
380
  if (res == NULL) {
H
Haojun Liao 已提交
381 382
    return TSDB_TIME_PRECISION_MILLI;
  }
383

L
Liu Jicong 已提交
384 385 386 387 388 389 390 391
  if (TD_RES_QUERY(res)) {
    SRequestObj *pRequest = (SRequestObj *)res;
    return pRequest->body.resInfo.precision;
  } else if (TD_RES_TMQ(res)) {
    SReqResultInfo *info = tmqGetCurResInfo(res);
    return info->precision;
  }
  return TSDB_TIME_PRECISION_MILLI;
392
}
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408

int taos_select_db(TAOS *taos, const char *db) {
  STscObj *pObj = (STscObj *)taos;
  if (pObj == NULL) {
    terrno = TSDB_CODE_TSC_DISCONNECTED;
    return TSDB_CODE_TSC_DISCONNECTED;
  }

  if (db == NULL || strlen(db) == 0) {
    terrno = TSDB_CODE_TSC_INVALID_INPUT;
    return terrno;
  }

  char sql[256] = {0};
  snprintf(sql, tListLen(sql), "use %s", db);

L
Liu Jicong 已提交
409 410
  TAOS_RES *pRequest = taos_query(taos, sql);
  int32_t   code = taos_errno(pRequest);
411 412 413 414 415 416 417 418 419 420

  taos_free_result(pRequest);
  return code;
}

void taos_stop_query(TAOS_RES *res) {
  if (res == NULL) {
    return;
  }

L
Liu Jicong 已提交
421 422
  SRequestObj *pRequest = (SRequestObj *)res;
  int32_t      numOfFields = taos_num_fields(pRequest);
423 424 425 426 427 428

  // It is not a query, no need to stop.
  if (numOfFields == 0) {
    return;
  }

D
dapan1121 已提交
429
  schedulerFreeJob(pRequest->body.queryJob);
430 431 432
}

bool taos_is_null(TAOS_RES *res, int32_t row, int32_t col) {
L
Liu Jicong 已提交
433
  SReqResultInfo *pResultInfo = tscGetCurResInfo(res);
434 435 436 437
  if (col >= pResultInfo->numOfCols || col < 0 || row >= pResultInfo->numOfRows || row < 0) {
    return true;
  }

L
Liu Jicong 已提交
438
  SResultColumn *pCol = &pResultInfo->pCol[col];
439 440 441 442 443
  if (IS_VAR_DATA_TYPE(pResultInfo->fields[col].type)) {
    return (pCol->offset[row] == -1);
  } else {
    return colDataIsNull_f(pCol->nullbitmap, row);
  }
444 445
}

L
Liu Jicong 已提交
446
bool taos_is_update_query(TAOS_RES *res) { return taos_num_fields(res) == 0; }
447

L
Liu Jicong 已提交
448
int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows) {
H
Haojun Liao 已提交
449
  int32_t numOfRows = 0;
L
Liu Jicong 已提交
450
  /*int32_t code = */ taos_fetch_block_s(res, &numOfRows, rows);
H
Haojun Liao 已提交
451 452 453
  return numOfRows;
}

L
Liu Jicong 已提交
454 455
int taos_fetch_block_s(TAOS_RES *res, int *numOfRows, TAOS_ROW *rows) {
  if (res == NULL) {
456 457
    return 0;
  }
L
Liu Jicong 已提交
458 459
  if (TD_RES_QUERY(res)) {
    SRequestObj *pRequest = (SRequestObj *)res;
460

L
Liu Jicong 已提交
461 462
    (*rows) = NULL;
    (*numOfRows) = 0;
H
Haojun Liao 已提交
463

L
Liu Jicong 已提交
464 465 466 467
    if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT ||
        pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) {
      return 0;
    }
468

469
    doFetchRows(pRequest, false, true);
470

L
Liu Jicong 已提交
471 472 473
    // TODO refactor
    SReqResultInfo *pResultInfo = &pRequest->body.resInfo;
    pResultInfo->current = pResultInfo->numOfRows;
474

L
Liu Jicong 已提交
475 476 477 478
    (*rows) = pResultInfo->row;
    (*numOfRows) = pResultInfo->numOfRows;
    return pRequest->code;
  } else if (TD_RES_TMQ(res)) {
L
Liu Jicong 已提交
479
    SReqResultInfo *pResultInfo = tmqGetNextResInfo(res, true);
L
Liu Jicong 已提交
480
    if (pResultInfo == NULL) return -1;
H
Haojun Liao 已提交
481

L
Liu Jicong 已提交
482 483 484
    pResultInfo->current = pResultInfo->numOfRows;
    (*rows) = pResultInfo->row;
    (*numOfRows) = pResultInfo->numOfRows;
H
Haojun Liao 已提交
485
    return 0;
L
Liu Jicong 已提交
486 487 488
  } else {
    ASSERT(0);
    return -1;
H
Haojun Liao 已提交
489
  }
L
Liu Jicong 已提交
490
}
H
Haojun Liao 已提交
491

L
Liu Jicong 已提交
492 493
int taos_fetch_raw_block(TAOS_RES *res, int *numOfRows, void **pData) {
  if (res == NULL) {
H
Haojun Liao 已提交
494 495
    return 0;
  }
496

497
  if (TD_RES_TMQ(res)) {
L
Liu Jicong 已提交
498
    SReqResultInfo *pResultInfo = tmqGetNextResInfo(res, false);
L
Liu Jicong 已提交
499 500 501 502
    if (pResultInfo == NULL) {
      (*numOfRows) = 0;
      return 0;
    }
H
Haojun Liao 已提交
503

L
Liu Jicong 已提交
504 505 506 507
    pResultInfo->current = pResultInfo->numOfRows;
    (*numOfRows) = pResultInfo->numOfRows;
    (*pData) = (void *)pResultInfo->pData;
    return 0;
508
  }
L
Liu Jicong 已提交
509

510 511 512 513 514
  SRequestObj *pRequest = (SRequestObj *)res;

  if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT ||
      pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) {
    return 0;
L
Liu Jicong 已提交
515
  }
516 517 518 519 520 521 522 523 524 525

  doFetchRows(pRequest, false, false);

  SReqResultInfo *pResultInfo = &pRequest->body.resInfo;

  pResultInfo->current = pResultInfo->numOfRows;
  (*numOfRows) = pResultInfo->numOfRows;
  (*pData) = (void *)pResultInfo->pData;

  return 0;
526 527
}

H
Haojun Liao 已提交
528
int *taos_get_column_data_offset(TAOS_RES *res, int columnIndex) {
L
Liu Jicong 已提交
529
  if (res == NULL) {
H
Haojun Liao 已提交
530 531 532
    return 0;
  }

L
Liu Jicong 已提交
533
  int32_t numOfFields = taos_num_fields(res);
H
Haojun Liao 已提交
534 535 536 537
  if (columnIndex < 0 || columnIndex >= numOfFields || numOfFields == 0) {
    return 0;
  }

L
Liu Jicong 已提交
538 539
  SReqResultInfo *pResInfo = tscGetCurResInfo(res);
  TAOS_FIELD     *pField = &pResInfo->userFields[columnIndex];
H
Haojun Liao 已提交
540 541 542 543
  if (!IS_VAR_DATA_TYPE(pField->type)) {
    return 0;
  }

L
Liu Jicong 已提交
544
  return pResInfo->pCol[columnIndex].offset;
H
Haojun Liao 已提交
545 546
}

L
Liu Jicong 已提交
547
int taos_validate_sql(TAOS *taos, const char *sql) { return true; }
548

549
void taos_reset_current_db(TAOS *taos) {
H
Haojun Liao 已提交
550 551 552 553 554
  if (taos == NULL) {
    return;
  }

  resetConnectDB(taos);
555 556
}

557 558 559 560 561
const char *taos_get_server_info(TAOS *taos) {
  if (taos == NULL) {
    return NULL;
  }

L
Liu Jicong 已提交
562
  STscObj *pTscObj = (STscObj *)taos;
563 564 565 566
  return pTscObj->ver;
}

void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) {
567 568 569 570
  if (taos == NULL || sql == NULL) {
    // todo directly call fp
  }

L
Liu Jicong 已提交
571
  taos_query_l(taos, sql, (int32_t)strlen(sql));
572 573 574 575
}

void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) {
  // TODO
L
Liu Jicong 已提交
576
}
577

L
Liu Jicong 已提交
578 579 580 581
TAOS_SUB *taos_subscribe(TAOS *taos, int restart, const char *topic, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp,
                         void *param, int interval) {
  // TODO
  return NULL;
582 583 584
}

TAOS_RES *taos_consume(TAOS_SUB *tsub) {
L
Liu Jicong 已提交
585 586
  // TODO
  return NULL;
587 588 589
}

void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress) {
L
Liu Jicong 已提交
590
  // TODO
591 592
}

593 594 595 596 597
int taos_load_table_info(TAOS *taos, const char *tableNameList) {
  // TODO
  return -1;
}

L
Liu Jicong 已提交
598
TAOS_STMT *taos_stmt_init(TAOS *taos) {
D
stmt  
dapan1121 已提交
599
  if (taos == NULL) {
D
stmt  
dapan1121 已提交
600
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
601 602 603 604 605
    terrno = TSDB_CODE_INVALID_PARA;
    return NULL;
  }

  return stmtInit(taos);
606 607
}

D
stmt  
dapan1121 已提交
608 609
int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length) {
  if (stmt == NULL || sql == NULL) {
D
stmt  
dapan1121 已提交
610
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
611 612 613 614
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
615
  return stmtPrepare(stmt, sql, length);
616 617
}

D
dapan1121 已提交
618
int taos_stmt_set_tbname_tags(TAOS_STMT *stmt, const char *name, TAOS_MULTI_BIND *tags) {
D
stmt  
dapan1121 已提交
619
  if (stmt == NULL || name == NULL) {
D
stmt  
dapan1121 已提交
620
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
621 622 623 624
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
625 626 627 628 629 630 631 632 633 634
  int32_t code = stmtSetTbName(stmt, name);
  if (code) {
    return code;
  }

  if (tags) {
    return stmtSetTbTags(stmt, tags);
  }

  return TSDB_CODE_SUCCESS;
635 636
}

D
stmt  
dapan1121 已提交
637 638
int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name) {
  if (stmt == NULL || name == NULL) {
D
stmt  
dapan1121 已提交
639
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
640
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
641
    return terrno;
D
stmt  
dapan1121 已提交
642 643
  }

D
stmt  
dapan1121 已提交
644
  return stmtSetTbName(stmt, name);
645 646
}

647
int taos_stmt_set_sub_tbname(TAOS_STMT *stmt, const char *name) { return taos_stmt_set_tbname(stmt, name); }
D
dapan1121 已提交
648

D
dapan1121 已提交
649
int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
D
stmt  
dapan1121 已提交
650
  if (stmt == NULL || bind == NULL) {
D
stmt  
dapan1121 已提交
651
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
652
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
653
    return terrno;
D
stmt  
dapan1121 已提交
654
  }
655

D
stmt  
dapan1121 已提交
656 657 658 659 660
  if (bind->num > 1) {
    tscError("invalid bind number %d for %s", bind->num, __FUNCTION__);
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
661

D
stmt  
dapan1121 已提交
662
  return stmtBindBatch(stmt, bind, -1);
663 664
}

D
dapan1121 已提交
665
int taos_stmt_bind_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
D
stmt  
dapan1121 已提交
666
  if (stmt == NULL || bind == NULL) {
D
stmt  
dapan1121 已提交
667
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
668 669 670 671
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
672 673
  if (bind->num <= 0 || bind->num > INT16_MAX) {
    tscError("invalid bind num %d", bind->num);
D
stmt  
dapan1121 已提交
674 675 676 677
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
dapan1121 已提交
678 679 680 681 682 683 684 685
  int32_t insert = 0;
  stmtIsInsert(stmt, &insert);
  if (0 == insert && bind->num > 1) {
    tscError("only one row data allowed for query");
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
686
  return stmtBindBatch(stmt, bind, -1);
687 688
}

D
dapan1121 已提交
689
int taos_stmt_bind_single_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int colIdx) {
D
stmt  
dapan1121 已提交
690
  if (stmt == NULL || bind == NULL) {
D
stmt  
dapan1121 已提交
691
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
692 693 694 695
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
696
  if (colIdx < 0) {
D
stmt  
dapan1121 已提交
697 698 699 700
    tscError("invalid bind column idx %d", colIdx);
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
D
dapan1121 已提交
701 702 703 704 705 706 707 708

  int32_t insert = 0;
  stmtIsInsert(stmt, &insert);
  if (0 == insert && bind->num > 1) {
    tscError("only one row data allowed for query");
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
709

D
stmt  
dapan1121 已提交
710
  return stmtBindBatch(stmt, bind, colIdx);
711 712
}

D
stmt  
dapan1121 已提交
713 714
int taos_stmt_add_batch(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
715
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
716 717 718 719
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
720
  return stmtAddBatch(stmt);
721 722
}

D
stmt  
dapan1121 已提交
723 724
int taos_stmt_execute(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
725
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
726 727 728 729
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
730
  return stmtExec(stmt);
731 732
}

733
int taos_stmt_is_insert(TAOS_STMT *stmt, int *insert) {
D
stmt  
dapan1121 已提交
734
  if (stmt == NULL || insert == NULL) {
D
stmt  
dapan1121 已提交
735
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
736 737 738 739 740
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

  return stmtIsInsert(stmt, insert);
741 742
}

743
int taos_stmt_num_params(TAOS_STMT *stmt, int *nums) {
D
stmt  
dapan1121 已提交
744
  if (stmt == NULL || nums == NULL) {
D
stmt  
dapan1121 已提交
745
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
746 747 748 749 750
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

  return stmtGetParamNum(stmt, nums);
751 752
}

D
stmt  
dapan1121 已提交
753
TAOS_RES *taos_stmt_use_result(TAOS_STMT *stmt) {
D
stmt  
dapan1121 已提交
754
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
755
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
756
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
757
    return NULL;
D
stmt  
dapan1121 已提交
758 759
  }

D
stmt  
dapan1121 已提交
760
  return stmtUseResult(stmt);
761 762
}

763
char *taos_stmt_errstr(TAOS_STMT *stmt) { return (char *)stmtErrstr(stmt); }
764

D
stmt  
dapan1121 已提交
765
int taos_stmt_affected_rows(TAOS_STMT *stmt) {
D
stmt  
dapan1121 已提交
766
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
767
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
768
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
769
    return 0;
D
stmt  
dapan1121 已提交
770 771
  }

D
stmt  
dapan1121 已提交
772
  return stmtAffectedRows(stmt);
773 774
}

D
dapan1121 已提交
775 776 777 778 779 780 781 782 783 784
int taos_stmt_affected_rows_once(TAOS_STMT *stmt) {
  if (stmt == NULL) {
    tscError("NULL parameter for %s", __FUNCTION__);
    terrno = TSDB_CODE_INVALID_PARA;
    return 0;
  }

  return stmtAffectedRowsOnce(stmt);
}

D
stmt  
dapan1121 已提交
785 786
int taos_stmt_close(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
787
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
788 789 790 791
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
792
  return stmtClose(stmt);
D
stmt  
dapan1121 已提交
793 794
}