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 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
  return pTscObj->ver;
}

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

  taos_query_l(taos, sql, (int32_t) strlen(sql));
571 572 573 574
}

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

L
Liu Jicong 已提交
577 578 579 580
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;
581 582 583
}

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

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

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

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

  return stmtInit(taos);
605 606
}

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

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

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

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

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

  return TSDB_CODE_SUCCESS;
634 635
}

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

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

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

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

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

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

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

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

D
dapan1121 已提交
677 678 679 680 681 682 683 684
  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 已提交
685
  return stmtBindBatch(stmt, bind, -1);
686 687
}

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

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

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

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

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

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

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

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

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

  return stmtIsInsert(stmt, insert);
740 741
}

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

  return stmtGetParamNum(stmt, nums);
750 751
}

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

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

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

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

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

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

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