clientMain.c 19.4 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 306 307 308
        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;
    }
  }

  return len;
}
309

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

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

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

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

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

333
// todo intergrate with tDataTypes
334 335
const char *taos_data_type(int type) {
  switch (type) {
L
Liu Jicong 已提交
336 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
    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";
363 364
  }
}
365 366 367

const char *taos_get_client_info() { return version; }

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

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

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

L
Liu Jicong 已提交
383 384 385 386 387 388 389 390
  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;
391
}
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407

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 已提交
408 409
  TAOS_RES *pRequest = taos_query(taos, sql);
  int32_t   code = taos_errno(pRequest);
410 411 412 413 414 415 416 417 418 419

  taos_free_result(pRequest);
  return code;
}

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

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

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

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

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

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

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

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

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

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

L
Liu Jicong 已提交
463 464 465 466
    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;
    }
467

468
    doFetchRows(pRequest, false, true);
469

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

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

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

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

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

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

509 510 511 512 513
  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 已提交
514
  }
515 516 517 518 519 520 521 522 523 524

  doFetchRows(pRequest, false, false);

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

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

  return 0;
525 526
}

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

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

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

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

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

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

  resetConnectDB(taos);
554 555
}

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

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

void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) {
  // TODO
}

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

L
Liu Jicong 已提交
573 574 575 576
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;
577 578 579
}

TAOS_RES *taos_consume(TAOS_SUB *tsub) {
L
Liu Jicong 已提交
580 581
  // TODO
  return NULL;
582 583 584
}

void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress) {
L
Liu Jicong 已提交
585
  // TODO
586 587
}

588 589 590 591 592
int taos_load_table_info(TAOS *taos, const char *tableNameList) {
  // TODO
  return -1;
}

L
Liu Jicong 已提交
593
TAOS_STMT *taos_stmt_init(TAOS *taos) {
D
stmt  
dapan1121 已提交
594
  if (taos == NULL) {
D
stmt  
dapan1121 已提交
595
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
596 597 598 599 600
    terrno = TSDB_CODE_INVALID_PARA;
    return NULL;
  }

  return stmtInit(taos);
601 602
}

D
stmt  
dapan1121 已提交
603 604
int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length) {
  if (stmt == NULL || sql == NULL) {
D
stmt  
dapan1121 已提交
605
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
606 607 608 609
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
610
  return stmtPrepare(stmt, sql, length);
611 612
}

D
dapan1121 已提交
613
int taos_stmt_set_tbname_tags(TAOS_STMT *stmt, const char *name, TAOS_MULTI_BIND *tags) {
D
stmt  
dapan1121 已提交
614
  if (stmt == NULL || name == NULL) {
D
stmt  
dapan1121 已提交
615
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
616 617 618 619
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
620 621 622 623 624 625 626 627 628 629
  int32_t code = stmtSetTbName(stmt, name);
  if (code) {
    return code;
  }

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

  return TSDB_CODE_SUCCESS;
630 631
}

D
stmt  
dapan1121 已提交
632 633
int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name) {
  if (stmt == NULL || name == NULL) {
D
stmt  
dapan1121 已提交
634
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
635
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
636
    return terrno;
D
stmt  
dapan1121 已提交
637 638
  }

D
stmt  
dapan1121 已提交
639
  return stmtSetTbName(stmt, name);
640 641
}

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

D
dapan1121 已提交
644
int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
D
stmt  
dapan1121 已提交
645
  if (stmt == NULL || bind == NULL) {
D
stmt  
dapan1121 已提交
646
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
647
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
648
    return terrno;
D
stmt  
dapan1121 已提交
649
  }
650

D
stmt  
dapan1121 已提交
651 652 653 654 655
  if (bind->num > 1) {
    tscError("invalid bind number %d for %s", bind->num, __FUNCTION__);
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
656

D
stmt  
dapan1121 已提交
657
  return stmtBindBatch(stmt, bind, -1);
658 659
}

D
dapan1121 已提交
660
int taos_stmt_bind_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
D
stmt  
dapan1121 已提交
661
  if (stmt == NULL || bind == NULL) {
D
stmt  
dapan1121 已提交
662
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
663 664 665 666
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
667 668
  if (bind->num <= 0 || bind->num > INT16_MAX) {
    tscError("invalid bind num %d", bind->num);
D
stmt  
dapan1121 已提交
669 670 671 672
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
dapan1121 已提交
673 674 675 676 677 678 679 680
  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 已提交
681
  return stmtBindBatch(stmt, bind, -1);
682 683
}

D
dapan1121 已提交
684
int taos_stmt_bind_single_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int colIdx) {
D
stmt  
dapan1121 已提交
685
  if (stmt == NULL || bind == NULL) {
D
stmt  
dapan1121 已提交
686
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
687 688 689 690
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
691
  if (colIdx < 0) {
D
stmt  
dapan1121 已提交
692 693 694 695
    tscError("invalid bind column idx %d", colIdx);
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
D
dapan1121 已提交
696 697 698 699 700 701 702 703

  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;
  }
704

D
stmt  
dapan1121 已提交
705
  return stmtBindBatch(stmt, bind, colIdx);
706 707
}

D
stmt  
dapan1121 已提交
708 709
int taos_stmt_add_batch(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
710
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
711 712 713 714
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
715
  return stmtAddBatch(stmt);
716 717
}

D
stmt  
dapan1121 已提交
718 719
int taos_stmt_execute(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
720
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
721 722 723 724
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
725
  return stmtExec(stmt);
726 727
}

728
int taos_stmt_is_insert(TAOS_STMT *stmt, int *insert) {
D
stmt  
dapan1121 已提交
729
  if (stmt == NULL || insert == NULL) {
D
stmt  
dapan1121 已提交
730
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
731 732 733 734 735
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

  return stmtIsInsert(stmt, insert);
736 737
}

738
int taos_stmt_num_params(TAOS_STMT *stmt, int *nums) {
D
stmt  
dapan1121 已提交
739
  if (stmt == NULL || nums == NULL) {
D
stmt  
dapan1121 已提交
740
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
741 742 743 744 745
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

  return stmtGetParamNum(stmt, nums);
746 747
}

D
stmt  
dapan1121 已提交
748
TAOS_RES *taos_stmt_use_result(TAOS_STMT *stmt) {
D
stmt  
dapan1121 已提交
749
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
750
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
751
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
752
    return NULL;
D
stmt  
dapan1121 已提交
753 754
  }

D
stmt  
dapan1121 已提交
755
  return stmtUseResult(stmt);
756 757
}

758
char *taos_stmt_errstr(TAOS_STMT *stmt) { return (char *)stmtErrstr(stmt); }
759

D
stmt  
dapan1121 已提交
760
int taos_stmt_affected_rows(TAOS_STMT *stmt) {
D
stmt  
dapan1121 已提交
761
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
762
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
763
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
764
    return 0;
D
stmt  
dapan1121 已提交
765 766
  }

D
stmt  
dapan1121 已提交
767
  return stmtAffectedRows(stmt);
768 769
}

D
dapan1121 已提交
770 771 772 773 774 775 776 777 778 779
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 已提交
780 781
int taos_stmt_close(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
782
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
783 784 785 786
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
787
  return stmtClose(stmt);
D
stmt  
dapan1121 已提交
788 789
}