Merge pull request #7599 from taosdata/feature/TD-6285
[TD-6285]<feature>: added directive for db name in restful interface
This commit is contained in:
commit
13c2db3ae3
|
@ -194,6 +194,9 @@ keepColumnName 1
|
||||||
# maximum number of rows returned by the restful interface
|
# maximum number of rows returned by the restful interface
|
||||||
# restfulRowLimit 10240
|
# restfulRowLimit 10240
|
||||||
|
|
||||||
|
# database name must be specified in restful interface if the following parameter is set, off by default
|
||||||
|
# httpDbNameMandatory 1
|
||||||
|
|
||||||
# The following parameter is used to limit the maximum number of lines in log files.
|
# The following parameter is used to limit the maximum number of lines in log files.
|
||||||
# max number of lines per log filters
|
# max number of lines per log filters
|
||||||
# numOfLogLines 10000000
|
# numOfLogLines 10000000
|
||||||
|
|
|
@ -365,6 +365,8 @@ STblCond* tsGetTableFilter(SArray* filters, uint64_t uid, int16_t idx);
|
||||||
|
|
||||||
void tscRemoveCachedTableMeta(STableMetaInfo* pTableMetaInfo, uint64_t id);
|
void tscRemoveCachedTableMeta(STableMetaInfo* pTableMetaInfo, uint64_t id);
|
||||||
|
|
||||||
|
char* cloneCurrentDBName(SSqlObj* pSql);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
#include "qScript.h"
|
#include "qScript.h"
|
||||||
#include "ttype.h"
|
#include "ttype.h"
|
||||||
#include "qFilter.h"
|
#include "qFilter.h"
|
||||||
#include "httpInt.h"
|
|
||||||
|
|
||||||
#define DEFAULT_PRIMARY_TIMESTAMP_COL_NAME "_c0"
|
#define DEFAULT_PRIMARY_TIMESTAMP_COL_NAME "_c0"
|
||||||
|
|
||||||
|
@ -72,7 +71,6 @@ static int convertTimestampStrToInt64(tVariant *pVar, int32_t precision);
|
||||||
static bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, uint8_t precision);
|
static bool serializeExprListToVariant(SArray* pList, tVariant **dst, int16_t colType, uint8_t precision);
|
||||||
|
|
||||||
static bool has(SArray* pFieldList, int32_t startIdx, const char* name);
|
static bool has(SArray* pFieldList, int32_t startIdx, const char* name);
|
||||||
static char* cloneCurrentDBName(SSqlObj* pSql);
|
|
||||||
static int32_t getDelimiterIndex(SStrToken* pTableName);
|
static int32_t getDelimiterIndex(SStrToken* pTableName);
|
||||||
static bool validateTableColumnInfo(SArray* pFieldList, SSqlCmd* pCmd);
|
static bool validateTableColumnInfo(SArray* pFieldList, SSqlCmd* pCmd);
|
||||||
static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pCmd);
|
static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pCmd);
|
||||||
|
@ -1675,34 +1673,6 @@ static bool has(SArray* pFieldList, int32_t startIdx, const char* name) {
|
||||||
|
|
||||||
static char* getAccountId(SSqlObj* pSql) { return pSql->pTscObj->acctId; }
|
static char* getAccountId(SSqlObj* pSql) { return pSql->pTscObj->acctId; }
|
||||||
|
|
||||||
static char* cloneCurrentDBName(SSqlObj* pSql) {
|
|
||||||
char *p = NULL;
|
|
||||||
HttpContext *pCtx = NULL;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&pSql->pTscObj->mutex);
|
|
||||||
STscObj *pTscObj = pSql->pTscObj;
|
|
||||||
switch (pTscObj->from) {
|
|
||||||
case TAOS_REQ_FROM_HTTP:
|
|
||||||
pCtx = pSql->param;
|
|
||||||
if (pCtx && pCtx->db[0] != '\0') {
|
|
||||||
char db[TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN] = {0};
|
|
||||||
int32_t len = sprintf(db, "%s%s%s", pTscObj->acctId, TS_PATH_DELIMITER, pCtx->db);
|
|
||||||
assert(len <= sizeof(db));
|
|
||||||
|
|
||||||
p = strdup(db);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (p == NULL) {
|
|
||||||
p = strdup(pSql->pTscObj->db);
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&pSql->pTscObj->mutex);
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* length limitation, strstr cannot be applied */
|
/* length limitation, strstr cannot be applied */
|
||||||
static int32_t getDelimiterIndex(SStrToken* pTableName) {
|
static int32_t getDelimiterIndex(SStrToken* pTableName) {
|
||||||
for (uint32_t i = 0; i < pTableName->n; ++i) {
|
for (uint32_t i = 0; i < pTableName->n; ++i) {
|
||||||
|
|
|
@ -1403,7 +1403,6 @@ int32_t tscBuildSyncDbReplicaMsg(SSqlObj* pSql, SSqlInfo *pInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tscBuildShowMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
int32_t tscBuildShowMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
STscObj *pObj = pSql->pTscObj;
|
|
||||||
SSqlCmd *pCmd = &pSql->cmd;
|
SSqlCmd *pCmd = &pSql->cmd;
|
||||||
pCmd->msgType = TSDB_MSG_TYPE_CM_SHOW;
|
pCmd->msgType = TSDB_MSG_TYPE_CM_SHOW;
|
||||||
pCmd->payloadLen = sizeof(SShowMsg) + 100;
|
pCmd->payloadLen = sizeof(SShowMsg) + 100;
|
||||||
|
@ -1426,9 +1425,9 @@ int32_t tscBuildShowMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tNameIsEmpty(&pTableMetaInfo->name)) {
|
if (tNameIsEmpty(&pTableMetaInfo->name)) {
|
||||||
pthread_mutex_lock(&pObj->mutex);
|
char *p = cloneCurrentDBName(pSql);
|
||||||
tstrncpy(pShowMsg->db, pObj->db, sizeof(pShowMsg->db));
|
tstrncpy(pShowMsg->db, p, sizeof(pShowMsg->db));
|
||||||
pthread_mutex_unlock(&pObj->mutex);
|
tfree(p);
|
||||||
} else {
|
} else {
|
||||||
tNameGetFullDbName(&pTableMetaInfo->name, pShowMsg->db);
|
tNameGetFullDbName(&pTableMetaInfo->name, pShowMsg->db);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "tsclient.h"
|
#include "tsclient.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
|
#include "httpInt.h"
|
||||||
|
|
||||||
static void freeQueryInfoImpl(SQueryInfo* pQueryInfo);
|
static void freeQueryInfoImpl(SQueryInfo* pQueryInfo);
|
||||||
|
|
||||||
|
@ -5112,3 +5113,31 @@ void tscRemoveCachedTableMeta(STableMetaInfo* pTableMetaInfo, uint64_t id) {
|
||||||
taosHashRemove(tscTableMetaMap, fname, len);
|
taosHashRemove(tscTableMetaMap, fname, len);
|
||||||
tscDebug("0x%"PRIx64" remove table meta %s, numOfRemain:%d", id, fname, (int32_t) taosHashGetSize(tscTableMetaMap));
|
tscDebug("0x%"PRIx64" remove table meta %s, numOfRemain:%d", id, fname, (int32_t) taosHashGetSize(tscTableMetaMap));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* cloneCurrentDBName(SSqlObj* pSql) {
|
||||||
|
char *p = NULL;
|
||||||
|
HttpContext *pCtx = NULL;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&pSql->pTscObj->mutex);
|
||||||
|
STscObj *pTscObj = pSql->pTscObj;
|
||||||
|
switch (pTscObj->from) {
|
||||||
|
case TAOS_REQ_FROM_HTTP:
|
||||||
|
pCtx = pSql->param;
|
||||||
|
if (pCtx && pCtx->db[0] != '\0') {
|
||||||
|
char db[TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN] = {0};
|
||||||
|
int32_t len = sprintf(db, "%s%s%s", pTscObj->acctId, TS_PATH_DELIMITER, pCtx->db);
|
||||||
|
assert(len <= sizeof(db));
|
||||||
|
|
||||||
|
p = strdup(db);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (p == NULL) {
|
||||||
|
p = strdup(pSql->pTscObj->db);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&pSql->pTscObj->mutex);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
|
@ -130,6 +130,7 @@ extern int32_t tsHttpMaxThreads;
|
||||||
extern int8_t tsHttpEnableCompress;
|
extern int8_t tsHttpEnableCompress;
|
||||||
extern int8_t tsHttpEnableRecordSql;
|
extern int8_t tsHttpEnableRecordSql;
|
||||||
extern int8_t tsTelegrafUseFieldNum;
|
extern int8_t tsTelegrafUseFieldNum;
|
||||||
|
extern int8_t tsHttpDbNameMandatory;
|
||||||
|
|
||||||
// mqtt
|
// mqtt
|
||||||
extern int8_t tsEnableMqttModule;
|
extern int8_t tsEnableMqttModule;
|
||||||
|
|
|
@ -175,6 +175,7 @@ int32_t tsHttpMaxThreads = 2;
|
||||||
int8_t tsHttpEnableCompress = 1;
|
int8_t tsHttpEnableCompress = 1;
|
||||||
int8_t tsHttpEnableRecordSql = 0;
|
int8_t tsHttpEnableRecordSql = 0;
|
||||||
int8_t tsTelegrafUseFieldNum = 0;
|
int8_t tsTelegrafUseFieldNum = 0;
|
||||||
|
int8_t tsHttpDbNameMandatory = 0;
|
||||||
|
|
||||||
// mqtt
|
// mqtt
|
||||||
int8_t tsEnableMqttModule = 0; // not finished yet, not started it by default
|
int8_t tsEnableMqttModule = 0; // not finished yet, not started it by default
|
||||||
|
@ -1287,6 +1288,16 @@ static void doInitGlobalConfig(void) {
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
|
cfg.option = "httpDbNameMandatory";
|
||||||
|
cfg.ptr = &tsHttpDbNameMandatory;
|
||||||
|
cfg.valType = TAOS_CFG_VTYPE_INT8;
|
||||||
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
|
||||||
|
cfg.minValue = 0;
|
||||||
|
cfg.maxValue = 1;
|
||||||
|
cfg.ptrLength = 0;
|
||||||
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
// debug flag
|
// debug flag
|
||||||
cfg.option = "numOfLogLines";
|
cfg.option = "numOfLogLines";
|
||||||
cfg.ptr = &tsNumOfLogLines;
|
cfg.ptr = &tsNumOfLogLines;
|
||||||
|
|
|
@ -6,6 +6,7 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/lz4/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/lz4/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "httpRestHandle.h"
|
#include "httpRestHandle.h"
|
||||||
#include "httpRestJson.h"
|
#include "httpRestJson.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
|
||||||
static HttpDecodeMethod restDecodeMethod = {"rest", restProcessRequest};
|
static HttpDecodeMethod restDecodeMethod = {"rest", restProcessRequest};
|
||||||
static HttpDecodeMethod restDecodeMethod2 = {"restful", restProcessRequest};
|
static HttpDecodeMethod restDecodeMethod2 = {"restful", restProcessRequest};
|
||||||
|
@ -111,6 +112,14 @@ bool restProcessSqlRequest(HttpContext* pContext, int32_t timestampFmt) {
|
||||||
pContext->db[0] = '\0';
|
pContext->db[0] = '\0';
|
||||||
|
|
||||||
HttpString *path = &pContext->parser->path[REST_USER_USEDB_URL_POS];
|
HttpString *path = &pContext->parser->path[REST_USER_USEDB_URL_POS];
|
||||||
|
if (tsHttpDbNameMandatory) {
|
||||||
|
if (path->pos == 0) {
|
||||||
|
httpError("context:%p, fd:%d, user:%s, database name is mandatory", pContext, pContext->fd, pContext->user);
|
||||||
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_INVALID_URL);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (path->pos > 0 && !(strlen(sql) > 4 && (sql[0] == 'u' || sql[0] == 'U') &&
|
if (path->pos > 0 && !(strlen(sql) > 4 && (sql[0] == 'u' || sql[0] == 'U') &&
|
||||||
(sql[1] == 's' || sql[1] == 'S') && (sql[2] == 'e' || sql[2] == 'E') && sql[3] == ' '))
|
(sql[1] == 's' || sql[1] == 'S') && (sql[2] == 'e' || sql[2] == 'E') && sql[3] == ' '))
|
||||||
{
|
{
|
||||||
|
|
|
@ -172,6 +172,10 @@ python3 test.py -f tools/taosdemoTestSampleData.py
|
||||||
python3 test.py -f tools/taosdemoTestInterlace.py
|
python3 test.py -f tools/taosdemoTestInterlace.py
|
||||||
python3 test.py -f tools/taosdemoTestQuery.py
|
python3 test.py -f tools/taosdemoTestQuery.py
|
||||||
|
|
||||||
|
# restful test for python
|
||||||
|
python3 test.py -f restful/restful_bind_db1.py
|
||||||
|
python3 test.py -f restful/restful_bind_db2.py
|
||||||
|
|
||||||
# nano support
|
# nano support
|
||||||
python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanoInsert.py
|
python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanoInsert.py
|
||||||
python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanoQuery.py
|
python3 test.py -f tools/taosdemoAllTest/NanoTestCase/taosdemoTestSupportNanoQuery.py
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
# #################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
|
||||||
|
# #################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# TODO: after TD-4518 and TD-4510 is resolved, add the exception test case for these situations
|
||||||
|
|
||||||
|
from distutils.log import error
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from requests.api import head
|
||||||
|
from requests.models import Response
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
import time, datetime
|
||||||
|
import requests, json
|
||||||
|
import threading
|
||||||
|
import string
|
||||||
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
def check_unbind_db(url, data, header):
|
||||||
|
resp = requests.post(url, data, headers = header )
|
||||||
|
resp.encoding='utf-8'
|
||||||
|
resp = eval(resp.text)
|
||||||
|
status = resp['status']
|
||||||
|
desc = resp['desc']
|
||||||
|
sqls = data
|
||||||
|
if status=="error" and desc == "invalid url format":
|
||||||
|
print(" %s : check pass" %sqls)
|
||||||
|
else:
|
||||||
|
printf(" error occured , ")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
def check_bind_db(url, data, header):
|
||||||
|
resp = requests.post(url, data, headers = header )
|
||||||
|
resp.encoding='utf-8'
|
||||||
|
resp_dict = eval(resp.text)
|
||||||
|
status = resp_dict['status']
|
||||||
|
if status =="succ":
|
||||||
|
print("%s run success!"%data)
|
||||||
|
# print(resp.text)
|
||||||
|
else :
|
||||||
|
print("%s run failed !"%data)
|
||||||
|
print(resp.text)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
class TDTestCase():
|
||||||
|
updatecfgDict={'httpDbNameMandatory':1}
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
tdSql.execute('reset query cache')
|
||||||
|
tdSql.execute('drop database if exists test')
|
||||||
|
tdSql.execute('drop database if exists db')
|
||||||
|
tdSql.execute('drop database if exists des')
|
||||||
|
tdSql.execute('create database test')
|
||||||
|
tdSql.execute('create database des')
|
||||||
|
|
||||||
|
header = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}
|
||||||
|
url = "http://127.0.0.1:6041/rest/sql/"
|
||||||
|
|
||||||
|
# test with no bind databases
|
||||||
|
|
||||||
|
sqls = ["show databases;",
|
||||||
|
"use test",
|
||||||
|
"show tables;",
|
||||||
|
"show dnodes;",
|
||||||
|
"show vgroups;",
|
||||||
|
"create database db;",
|
||||||
|
"drop database db;",
|
||||||
|
"select client_version();" ,
|
||||||
|
"use test",
|
||||||
|
"ALTER DATABASE test COMP 2;",
|
||||||
|
"create table tb (ts timestamp, id int , data double)",
|
||||||
|
"insert into tb values (now , 1, 1.0) ",
|
||||||
|
"select * from tb",
|
||||||
|
"show test.tables",
|
||||||
|
"show tables",
|
||||||
|
"insert into tb values (now , 2, 2.0) ",
|
||||||
|
"create table test.tb (ts timestamp, id int , data double)",
|
||||||
|
"insert into test.tb values (now , 2, 2.0) ",
|
||||||
|
"select * from tb",
|
||||||
|
"select * from test.tb"]
|
||||||
|
|
||||||
|
for sql in sqls:
|
||||||
|
print("===================")
|
||||||
|
check_unbind_db(url,sql,header)
|
||||||
|
|
||||||
|
print("==================="*5)
|
||||||
|
print(" check bind db about restful ")
|
||||||
|
print("==================="*5)
|
||||||
|
url = "http://127.0.0.1:6041/rest/sql/des"
|
||||||
|
for sql in sqls:
|
||||||
|
print("===================")
|
||||||
|
check_bind_db(url,sql,header)
|
||||||
|
# check data
|
||||||
|
tdSql.query("select * from test.tb")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.query("select * from des.tb")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
os.system('sudo timedatectl set-ntp on')
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,133 @@
|
||||||
|
# #################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
|
||||||
|
# #################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# TODO: after TD-4518 and TD-4510 is resolved, add the exception test case for these situations
|
||||||
|
|
||||||
|
from distutils.log import error
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from requests.api import head
|
||||||
|
from requests.models import Response
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
import time, datetime
|
||||||
|
import requests, json
|
||||||
|
import threading
|
||||||
|
import string
|
||||||
|
import random
|
||||||
|
|
||||||
|
def check_res(url, data, header):
|
||||||
|
resp = requests.post(url, data, headers = header )
|
||||||
|
resp.encoding='utf-8'
|
||||||
|
resp_dict = eval(resp.text)
|
||||||
|
status = resp_dict['status']
|
||||||
|
if status =="succ":
|
||||||
|
print("%s run success!"%data)
|
||||||
|
# print(resp.text)
|
||||||
|
else :
|
||||||
|
print("%s run failed !"%data)
|
||||||
|
print(resp.text)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
class TDTestCase():
|
||||||
|
# updatecfgDict={'httpDbNameMandatory':0}
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
tdSql.execute('reset query cache')
|
||||||
|
tdSql.execute('drop database if exists test')
|
||||||
|
tdSql.execute('drop database if exists db')
|
||||||
|
tdSql.execute('drop database if exists des')
|
||||||
|
tdSql.execute('create database test')
|
||||||
|
tdSql.execute('create database des')
|
||||||
|
header = {'Authorization': 'Basic cm9vdDp0YW9zZGF0YQ=='}
|
||||||
|
url = "http://127.0.0.1:6041/rest/sql/"
|
||||||
|
|
||||||
|
# test with no bind databases
|
||||||
|
|
||||||
|
sqls = ["show databases;",
|
||||||
|
"use test",
|
||||||
|
"show tables;",
|
||||||
|
"show dnodes;",
|
||||||
|
"show vgroups;",
|
||||||
|
"create database db;",
|
||||||
|
"drop database db;",
|
||||||
|
"select client_version();" ,
|
||||||
|
"use test",
|
||||||
|
"ALTER DATABASE test COMP 2;",
|
||||||
|
"create table tb (ts timestamp, id int , data double)",
|
||||||
|
"insert into tb values (now , 1, 1.0) ",
|
||||||
|
"select * from tb",
|
||||||
|
"show test.tables",
|
||||||
|
"show tables",
|
||||||
|
"insert into tb values (now , 2, 2.0) ",
|
||||||
|
"create table test.tb (ts timestamp, id int , data double)",
|
||||||
|
"insert into test.tb values (now , 3, 3.0) ",
|
||||||
|
"select * from tb",
|
||||||
|
"select * from test.tb",
|
||||||
|
"create table des.tb (ts timestamp, id int , data double)",
|
||||||
|
"insert into des.tb values (now , 3, 3.0)"]
|
||||||
|
for sql in sqls:
|
||||||
|
print("===================")
|
||||||
|
if sql == "create table test.tb (ts timestamp, id int , data double)":
|
||||||
|
resp = requests.post(url, sql, headers = header )
|
||||||
|
print(resp.text)
|
||||||
|
print ("%s run occur error as expect ,check pass!" %(sql))
|
||||||
|
else:
|
||||||
|
check_res(url,sql,header)
|
||||||
|
|
||||||
|
tdSql.query("select * from test.tb")
|
||||||
|
tdSql.checkRows(3)
|
||||||
|
tdSql.query("select * from des.tb")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
|
||||||
|
print("==================="*5)
|
||||||
|
print(" check bind db about restful ")
|
||||||
|
print("==================="*5)
|
||||||
|
|
||||||
|
tdSql.execute('reset query cache')
|
||||||
|
tdSql.execute('drop database if exists test')
|
||||||
|
tdSql.execute('drop database if exists db')
|
||||||
|
tdSql.execute('drop database if exists des')
|
||||||
|
tdSql.execute('create database test')
|
||||||
|
tdSql.execute('create database des')
|
||||||
|
|
||||||
|
url = "http://127.0.0.1:6041/rest/sql/des"
|
||||||
|
for sql in sqls:
|
||||||
|
print("===================")
|
||||||
|
if sql in ["create table des.tb (ts timestamp, id int , data double)"]:
|
||||||
|
resp = requests.post(url, sql, headers = header )
|
||||||
|
print(resp.text)
|
||||||
|
print ("%s run occur error as expect ,check pass!" %(sql))
|
||||||
|
else:
|
||||||
|
check_res(url,sql,header)
|
||||||
|
# check data
|
||||||
|
tdSql.query("select * from test.tb")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
tdSql.query("select * from des.tb")
|
||||||
|
tdSql.checkRows(3)
|
||||||
|
|
||||||
|
os.system('sudo timedatectl set-ntp on')
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,124 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
sleep 2000
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c http -v 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c httpDbNameMandatory -v 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
|
sleep 2000
|
||||||
|
sql connect
|
||||||
|
sql drop database if exists db
|
||||||
|
|
||||||
|
print ============================ dnode1 start
|
||||||
|
|
||||||
|
print =============== step1 - login
|
||||||
|
|
||||||
|
system_content curl 127.0.0.1:7111/rest/login/root/taosdata
|
||||||
|
print curl 127.0.0.1:7111/rest/login/root/taosdata -----> $system_content
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","code":0,"desc":"/KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print =============== step2 - execute sql without db_name
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'show databases' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'show databases' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create database if not exists db' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create database if not exists db' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create table table_rest (ts timestamp, i int)' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create table table_rest (ts timestamp, i int)' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'insert into table_rest (now, 1)' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'insert into table_rest values (now, 1)' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from table_rest' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from table_rest' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'drop database if exists db' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'drop database if exists db' 127.0.0.1:7111/rest/sql
|
||||||
|
|
||||||
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print =============== step3 - execute sql with db_name
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'show databases' 127.0.0.1:7111/rest/sql/databases
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'show databases' 127.0.0.1:7111/rest/sql/databases
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","cachelast","precision","update","status"],"column_meta":[["name",8,32],["created_time",9,8],["ntables",4,4],["vgroups",4,4],["replica",3,2],["quorum",3,2],["days",3,2],["keep",8,24],["cache(MB)",4,4],["blocks",4,4],["minrows",4,4],["maxrows",4,4],["wallevel",2,1],["fsync",4,4],["comp",2,1],["cachelast",2,1],["precision",8,3],["update",2,1],["status",8,10]],"data":[],"rows":0}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create database if not exists db' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create database if not exists db' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","head":["affected_rows"],"column_meta":[["affected_rows",4,4]],"data":[[0]],"rows":1}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create table table_rest (ts timestamp, i int)' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'create table table_rest (ts timestamp, i int)' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","head":["affected_rows"],"column_meta":[["affected_rows",4,4]],"data":[[0]],"rows":1}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'insert into table_rest (now, 1)' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'insert into table_rest values (1629904789233, 1)' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","head":["affected_rows"],"column_meta":[["affected_rows",4,4]],"data":[[1]],"rows":1}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from table_rest' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from table_rest' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","head":["ts","i"],"column_meta":[["ts",9,8],["i",4,4]],"data":[["2021-08-25 23:19:49.233",1]],"rows":1}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'drop database if exists db' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'drop database if exists db' 127.0.0.1:7111/rest/sql/db
|
||||||
|
|
||||||
|
if $system_content != @{"status":"succ","head":["affected_rows"],"column_meta":[["affected_rows",4,4]],"data":[[0]],"rows":1}@ then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Loading…
Reference in New Issue