clientMain.c 20.0 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 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
  if (taos == NULL || sql == NULL) {
    fp(param, NULL, TSDB_CODE_INVALID_PARA);
    return;
  }

  SRequestObj* pRequest = NULL;
  int32_t      retryNum = 0;
  int32_t      code = 0;

  while (retryNum++ < REQUEST_MAX_TRY_TIMES) {
//    pRequest = launchQuery(pTscObj, sql, sqlLen);
    if (pRequest == NULL || TSDB_CODE_SUCCESS == pRequest->code || !NEED_CLIENT_HANDLE_ERROR(pRequest->code)) {
      break;
    }

    code = refreshMeta(taos, pRequest);
    if (code) {
      pRequest->code = code;
      break;
    }

    destroyRequest(pRequest);
  }

  fp(param, pRequest, code);
591 592 593 594
}

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

L
Liu Jicong 已提交
597 598 599 600
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;
601 602 603
}

TAOS_RES *taos_consume(TAOS_SUB *tsub) {
L
Liu Jicong 已提交
604 605
  // TODO
  return NULL;
606 607 608
}

void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress) {
L
Liu Jicong 已提交
609
  // TODO
610 611
}

612 613 614 615 616
int taos_load_table_info(TAOS *taos, const char *tableNameList) {
  // TODO
  return -1;
}

L
Liu Jicong 已提交
617
TAOS_STMT *taos_stmt_init(TAOS *taos) {
D
stmt  
dapan1121 已提交
618
  if (taos == NULL) {
D
stmt  
dapan1121 已提交
619
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
620 621 622 623 624
    terrno = TSDB_CODE_INVALID_PARA;
    return NULL;
  }

  return stmtInit(taos);
625 626
}

D
stmt  
dapan1121 已提交
627 628
int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length) {
  if (stmt == NULL || sql == NULL) {
D
stmt  
dapan1121 已提交
629
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
630 631 632 633
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
634
  return stmtPrepare(stmt, sql, length);
635 636
}

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

D
stmt  
dapan1121 已提交
644 645 646 647 648 649 650 651 652 653
  int32_t code = stmtSetTbName(stmt, name);
  if (code) {
    return code;
  }

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

  return TSDB_CODE_SUCCESS;
654 655
}

D
stmt  
dapan1121 已提交
656 657
int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name) {
  if (stmt == NULL || name == NULL) {
D
stmt  
dapan1121 已提交
658
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
659
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
660
    return terrno;
D
stmt  
dapan1121 已提交
661 662
  }

D
stmt  
dapan1121 已提交
663
  return stmtSetTbName(stmt, name);
664 665
}

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

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

D
stmt  
dapan1121 已提交
675 676 677 678 679
  if (bind->num > 1) {
    tscError("invalid bind number %d for %s", bind->num, __FUNCTION__);
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
680

D
stmt  
dapan1121 已提交
681
  return stmtBindBatch(stmt, bind, -1);
682 683
}

D
dapan1121 已提交
684
int taos_stmt_bind_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind) {
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 692
  if (bind->num <= 0 || bind->num > INT16_MAX) {
    tscError("invalid bind num %d", bind->num);
D
stmt  
dapan1121 已提交
693 694 695 696
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
dapan1121 已提交
697 698 699 700 701 702 703 704
  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 已提交
705
  return stmtBindBatch(stmt, bind, -1);
706 707
}

D
dapan1121 已提交
708
int taos_stmt_bind_single_param_batch(TAOS_STMT *stmt, TAOS_MULTI_BIND *bind, int colIdx) {
D
stmt  
dapan1121 已提交
709
  if (stmt == NULL || bind == 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
  if (colIdx < 0) {
D
stmt  
dapan1121 已提交
716 717 718 719
    tscError("invalid bind column idx %d", colIdx);
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }
D
dapan1121 已提交
720 721 722 723 724 725 726 727

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

D
stmt  
dapan1121 已提交
729
  return stmtBindBatch(stmt, bind, colIdx);
730 731
}

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

D
stmt  
dapan1121 已提交
739
  return stmtAddBatch(stmt);
740 741
}

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

D
stmt  
dapan1121 已提交
749
  return stmtExec(stmt);
750 751
}

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

  return stmtIsInsert(stmt, insert);
760 761
}

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

  return stmtGetParamNum(stmt, nums);
770 771
}

D
stmt  
dapan1121 已提交
772
TAOS_RES *taos_stmt_use_result(TAOS_STMT *stmt) {
D
stmt  
dapan1121 已提交
773
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
774
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
775
    terrno = TSDB_CODE_INVALID_PARA;
D
stmt  
dapan1121 已提交
776
    return NULL;
D
stmt  
dapan1121 已提交
777 778
  }

D
stmt  
dapan1121 已提交
779
  return stmtUseResult(stmt);
780 781
}

782
char *taos_stmt_errstr(TAOS_STMT *stmt) { return (char *)stmtErrstr(stmt); }
783

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

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

D
dapan1121 已提交
794 795 796 797 798 799 800 801 802 803
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 已提交
804 805
int taos_stmt_close(TAOS_STMT *stmt) {
  if (stmt == NULL) {
D
stmt  
dapan1121 已提交
806
    tscError("NULL parameter for %s", __FUNCTION__);
D
stmt  
dapan1121 已提交
807 808 809 810
    terrno = TSDB_CODE_INVALID_PARA;
    return terrno;
  }

D
stmt  
dapan1121 已提交
811
  return stmtClose(stmt);
D
stmt  
dapan1121 已提交
812 813
}