[td-225] merge with develop branch, fix bugs in interp query
This commit is contained in:
commit
eae2cd3eef
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
TDengine provides many connectors for development, including C/C++, JAVA, Python, RESTful, Go, Node.JS, etc.
|
TDengine provides many connectors for development, including C/C++, JAVA, Python, RESTful, Go, Node.JS, etc.
|
||||||
|
|
||||||
|
NOTE: All APIs which require a SQL string as parameter, including but not limit to `taos_query`, `taos_query_a`, `taos_subscribe` in the C/C++ Connector and their counterparts in other connectors, can ONLY process one SQL statement at a time. If more than one SQL statements are provided, their behaviors are undefined.
|
||||||
|
|
||||||
## C/C++ API
|
## C/C++ API
|
||||||
|
|
||||||
C/C++ APIs are similar to the MySQL APIs. Applications should include TDengine head file _taos.h_ to use C/C++ APIs by adding the following line in code:
|
C/C++ APIs are similar to the MySQL APIs. Applications should include TDengine head file _taos.h_ to use C/C++ APIs by adding the following line in code:
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
TDengine提供了丰富的应用程序开发接口,其中包括C/C++、JAVA、Python、RESTful、Go等,便于用户快速开发应用。
|
TDengine提供了丰富的应用程序开发接口,其中包括C/C++、JAVA、Python、RESTful、Go等,便于用户快速开发应用。
|
||||||
|
|
||||||
|
注意:所以执行 SQL 语句的 API,例如 C/C++ Connector 中的 `tao_query`、`taos_query_a`、`taos_subscribe` 等,以及其它语言中与它们对应的API,每次都只能执行一条 SQL 语句,如果实际参数中包含了多条语句,它们的行为是未定义的。
|
||||||
|
|
||||||
## C/C++ Connector
|
## C/C++ Connector
|
||||||
|
|
||||||
C/C++的API类似于MySQL的C API。应用程序使用时,需要包含TDengine头文件 _taos.h_(安装后,位于 _/usr/local/taos/include_):
|
C/C++的API类似于MySQL的C API。应用程序使用时,需要包含TDengine头文件 _taos.h_(安装后,位于 _/usr/local/taos/include_):
|
||||||
|
|
|
@ -24,24 +24,11 @@ extern "C" {
|
||||||
|
|
||||||
extern int32_t cDebugFlag;
|
extern int32_t cDebugFlag;
|
||||||
|
|
||||||
#define tscError(...) \
|
#define tscError(...) { if (cDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR TSC ", cDebugFlag, __VA_ARGS__); }}
|
||||||
if (cDebugFlag & DEBUG_ERROR) { \
|
#define tscWarn(...) { if (cDebugFlag & DEBUG_WARN) { taosPrintLog("WARN TSC ", cDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR TSC ", 255, __VA_ARGS__); \
|
#define tscTrace(...) { if (cDebugFlag & DEBUG_TRACE) { taosPrintLog("TSC ", cDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define tscDump(...) { if (cDebugFlag & DEBUG_TRACE) { taosPrintLongString("TSC ", cDebugFlag, __VA_ARGS__); }}
|
||||||
#define tscWarn(...) \
|
#define tscPrint(...) { taosPrintLog("TSC ", tscEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }
|
||||||
if (cDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN TSC ", cDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define tscTrace(...) \
|
|
||||||
if (cDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("TSC ", cDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define tscPrint(...) \
|
|
||||||
{ taosPrintLog("TSC ", 255, __VA_ARGS__); }
|
|
||||||
#define tscDump(...) \
|
|
||||||
if (cDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLongString("TSC ", cDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,20 +22,10 @@
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
|
||||||
#define jniError(...) \
|
#define jniError(...) { if (jniDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR JNI ", jniDebugFlag, __VA_ARGS__); }}
|
||||||
if (jniDebugFlag & DEBUG_ERROR) { \
|
#define jniWarn(...) { if (jniDebugFlag & DEBUG_WARN) { taosPrintLog("WARN JNI ", jniDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR JNI ", jniDebugFlag, __VA_ARGS__); \
|
#define jniTrace(...) { if (jniDebugFlag & DEBUG_TRACE) { taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define jniPrint(...) { taosPrintLog("JNI ", tscEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }
|
||||||
#define jniWarn(...) \
|
|
||||||
if (jniDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN JNI ", jniDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define jniTrace(...) \
|
|
||||||
if (jniDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("JNI ", jniDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define jniPrint(...) \
|
|
||||||
{ taosPrintLog("JNI ", 255, __VA_ARGS__); }
|
|
||||||
|
|
||||||
int __init = 0;
|
int __init = 0;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _XOPEN_SOURCE
|
#define _BSD_SOURCE
|
||||||
|
#define _XOPEN_SOURCE 500
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
|
@ -217,10 +217,10 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet) {
|
||||||
STscObj *pObj = pSql->pTscObj;
|
STscObj *pObj = pSql->pTscObj;
|
||||||
// tscTrace("%p msg:%s is received from server", pSql, taosMsg[rpcMsg->msgType]);
|
// tscTrace("%p msg:%s is received from server", pSql, taosMsg[rpcMsg->msgType]);
|
||||||
|
|
||||||
if (pSql->freed || pObj->signature != pObj) {
|
if (pObj->signature != pObj) {
|
||||||
tscTrace("%p sql is already released or DB connection is closed, freed:%d pObj:%p signature:%p", pSql, pSql->freed,
|
tscTrace("%p sql is already released or DB connection is closed, freed:%d pObj:%p signature:%p", pSql, pSql->freed,
|
||||||
pObj, pObj->signature);
|
pObj, pObj->signature);
|
||||||
if (pObj->pSql != pSql) { // it is not a main SqlObj, should be freed
|
if (pSql != pObj->pSql) {
|
||||||
tscFreeSqlObj(pSql);
|
tscFreeSqlObj(pSql);
|
||||||
}
|
}
|
||||||
rpcFreeCont(rpcMsg->pCont);
|
rpcFreeCont(rpcMsg->pCont);
|
||||||
|
|
|
@ -530,6 +530,7 @@ void taos_free_result_imp(TAOS_RES *res, int keepCmd) {
|
||||||
|
|
||||||
SSqlObj *pSql = (SSqlObj *)res;
|
SSqlObj *pSql = (SSqlObj *)res;
|
||||||
SSqlRes *pRes = &pSql->res;
|
SSqlRes *pRes = &pSql->res;
|
||||||
|
SSqlCmd *pCmd = &pSql->cmd;
|
||||||
|
|
||||||
tscTrace("%p start to free result", pSql);
|
tscTrace("%p start to free result", pSql);
|
||||||
|
|
||||||
|
@ -561,6 +562,11 @@ void taos_free_result_imp(TAOS_RES *res, int keepCmd) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pQueryInfo->type = TSDB_QUERY_TYPE_FREE_RESOURCE;
|
||||||
|
STscObj* pTscObj = pSql->pTscObj;
|
||||||
|
|
||||||
|
STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* case 1. Partial data have been retrieved from vnodes, but not all data has been retrieved yet.
|
* case 1. Partial data have been retrieved from vnodes, but not all data has been retrieved yet.
|
||||||
* We need to recycle the connection by noticing the vnode return 0 results.
|
* We need to recycle the connection by noticing the vnode return 0 results.
|
||||||
|
@ -571,29 +577,25 @@ void taos_free_result_imp(TAOS_RES *res, int keepCmd) {
|
||||||
* for each subquery. Because the failure of execution tsProcessSql may trigger the callback function
|
* for each subquery. Because the failure of execution tsProcessSql may trigger the callback function
|
||||||
* be executed, and the retry efforts may result in double free the resources, e.g.,SRetrieveSupport
|
* be executed, and the retry efforts may result in double free the resources, e.g.,SRetrieveSupport
|
||||||
*/
|
*/
|
||||||
// if ((pCmd->command == TSDB_SQL_SELECT || pCmd->command == TSDB_SQL_SHOW || pCmd->command == TSDB_SQL_RETRIEVE ||
|
if ((pCmd->command == TSDB_SQL_SELECT ||
|
||||||
// pCmd->command == TSDB_SQL_FETCH) &&
|
pCmd->command == TSDB_SQL_SHOW ||
|
||||||
// (pRes->code != TSDB_CODE_QUERY_CANCELLED && ((pRes->numOfRows > 0 && pCmd->command < TSDB_SQL_LOCAL && pRes->completed == false) ||
|
pCmd->command == TSDB_SQL_RETRIEVE ||
|
||||||
// (pRes->code == TSDB_CODE_SUCCESS && pRes->numOfRows == 0 && pCmd->command == TSDB_SQL_SELECT &&
|
pCmd->command == TSDB_SQL_FETCH) &&
|
||||||
// pSql->pStream == NULL && pTableMetaInfo->pTableMeta != NULL)))) {
|
(pRes->code != TSDB_CODE_QUERY_CANCELLED && ((pCmd->command < TSDB_SQL_LOCAL && pRes->completed == false) ||
|
||||||
// pCmd->command = (pCmd->command > TSDB_SQL_MGMT) ? TSDB_SQL_RETRIEVE : TSDB_SQL_FETCH;
|
(pRes->code == TSDB_CODE_SUCCESS && pCmd->command == TSDB_SQL_SELECT && pSql->pStream == NULL && pTableMetaInfo->pTableMeta != NULL)))) {
|
||||||
//
|
pCmd->command = (pCmd->command > TSDB_SQL_MGMT) ? TSDB_SQL_RETRIEVE : TSDB_SQL_FETCH;
|
||||||
// tscTrace("%p code:%d, numOfRows:%d, command:%d", pSql, pRes->code, pRes->numOfRows, pCmd->command);
|
|
||||||
//
|
|
||||||
// pSql->freed = 1;
|
|
||||||
// tscProcessSql(pSql);
|
|
||||||
|
|
||||||
/*
|
tscTrace("%p send msg to free qhandle in vnode, code:%d, numOfRows:%d, command:%s", pSql, pRes->code, pRes->numOfRows,
|
||||||
* If release connection msg is sent to vnode, the corresponding SqlObj for async query can not be freed instantly,
|
sqlCmd[pCmd->command]);
|
||||||
* since its free operation is delegated to callback function, which is tscProcessMsgFromServer.
|
|
||||||
*/
|
|
||||||
// STscObj* pObj = pSql->pTscObj;
|
|
||||||
// if (pObj->pSql == pSql) {
|
|
||||||
// pObj->pSql = NULL;
|
|
||||||
// }
|
|
||||||
// } else { // if no free resource msg is sent to vnode, we free this object immediately.
|
|
||||||
STscObj* pTscObj = pSql->pTscObj;
|
|
||||||
|
|
||||||
|
pSql->freed = 1;
|
||||||
|
tscProcessSql(pSql);
|
||||||
|
|
||||||
|
// waits for response and then goes on
|
||||||
|
if (pTscObj->pSql == pSql) {
|
||||||
|
sem_wait(&pSql->rspSem);
|
||||||
|
}
|
||||||
|
} else { // if no free resource msg is sent to vnode, we free this object immediately.
|
||||||
if (pTscObj->pSql != pSql) {
|
if (pTscObj->pSql != pSql) {
|
||||||
tscFreeSqlObj(pSql);
|
tscFreeSqlObj(pSql);
|
||||||
tscTrace("%p sql result is freed by app", pSql);
|
tscTrace("%p sql result is freed by app", pSql);
|
||||||
|
@ -606,7 +608,7 @@ void taos_free_result_imp(TAOS_RES *res, int keepCmd) {
|
||||||
tscTrace("%p sql result is freed by app", pSql);
|
tscTrace("%p sql result is freed by app", pSql);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void taos_free_result(TAOS_RES *res) { taos_free_result_imp(res, 0); }
|
void taos_free_result(TAOS_RES *res) { taos_free_result_imp(res, 0); }
|
||||||
|
|
|
@ -217,6 +217,59 @@ void tdPopDataColsPoints(SDataCols *pCols, int pointsToPop); //!!!!
|
||||||
int tdMergeDataCols(SDataCols *target, SDataCols *src, int rowsToMerge);
|
int tdMergeDataCols(SDataCols *target, SDataCols *src, int rowsToMerge);
|
||||||
void tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, SDataCols *src2, int *iter2, int tRows);
|
void tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, SDataCols *src2, int *iter2, int tRows);
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------- Tag row structure
|
||||||
|
|
||||||
|
/* A tag row, the format is like below:
|
||||||
|
+----------+----------------------------------------------------------------+
|
||||||
|
| STagRow | STagCol | STagCol | STagCol | STagCol | ...| STagCol | STagCol |
|
||||||
|
+----------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
pData
|
||||||
|
+----------+----------------------------------------------------------------+
|
||||||
|
| value 1 | value 2 | value 3 | value 4 | ....|value n |
|
||||||
|
+----------+----------------------------------------------------------------+
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define TD_TAG_ROW_HEAD_SIZE sizeof(int16_t)
|
||||||
|
|
||||||
|
#define tagRowNum(r) (*(int16_t *)(r))
|
||||||
|
#define tagRowArray(r) POINTER_SHIFT(r, TD_TAG_ROW_HEAD_SIZE)
|
||||||
|
//#define dataRowKey(r) (*(TSKEY *)(dataRowTuple(r)))
|
||||||
|
//#define dataRowSetLen(r, l) (dataRowLen(r) = (l))
|
||||||
|
//#define dataRowCpy(dst, r) memcpy((dst), (r), dataRowLen(r))
|
||||||
|
//#define dataRowMaxBytesFromSchema(s) (schemaTLen(s) + TD_DATA_ROW_HEAD_SIZE)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int16_t colId; // column ID
|
||||||
|
int16_t colType;
|
||||||
|
uint16_t offset; //to store value for numeric col or offset for binary/Nchar
|
||||||
|
} STagCol;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t len;
|
||||||
|
void * pData; // Space to store the tag value
|
||||||
|
uint16_t dataLen;
|
||||||
|
int16_t ncols; // Total columns allocated
|
||||||
|
STagCol tagCols[];
|
||||||
|
} STagRow;
|
||||||
|
|
||||||
|
|
||||||
|
#define tagColSize(r) (sizeof(STagCol) + r.colLen)
|
||||||
|
|
||||||
|
int tdSetTagCol(SDataRow row, void *value, int16_t len, int8_t type, int16_t colId); //insert tag value and update all the information
|
||||||
|
int tdDeleteTagCol(SDataRow row, int16_t colId); // delete tag value and update all the information
|
||||||
|
void * tdQueryTagByID(SDataRow row, int16_t colId, int16_t *type); //if find tag, 0, else return -1;
|
||||||
|
int tdAppendTagColVal(SDataRow row, void *value, int8_t type, int32_t bytes, int16_t colId);
|
||||||
|
SDataRow tdTagRowDup(SDataRow row);
|
||||||
|
void tdFreeTagRow(SDataRow row);
|
||||||
|
SDataRow tdTagRowDecode(SDataRow row);
|
||||||
|
int tdTagRowCpy(SDataRow dst, SDataRow src);
|
||||||
|
void * tdNewTagRowFromSchema(STSchema *pSchema, int16_t numofTags);
|
||||||
|
STSchema *tdGetSchemaFromData(SDataRow *row);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25,31 +25,15 @@ extern "C" {
|
||||||
extern int32_t uDebugFlag;
|
extern int32_t uDebugFlag;
|
||||||
extern int32_t tscEmbedded;
|
extern int32_t tscEmbedded;
|
||||||
|
|
||||||
#define uError(...) \
|
#define uError(...) { if (uDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR UTL ", uDebugFlag, __VA_ARGS__); }}
|
||||||
if (uDebugFlag & DEBUG_ERROR) { \
|
#define uWarn(...) { if (uDebugFlag & DEBUG_WARN) { taosPrintLog("WARN UTL ", uDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR UTL ", uDebugFlag, __VA_ARGS__); \
|
#define uTrace(...) { if (uDebugFlag & DEBUG_TRACE) { taosPrintLog("UTL ", uDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define uDump(x, y) { if (uDebugFlag & DEBUG_DUMP) { taosDumpData(x, y); }}
|
||||||
#define uWarn(...) \
|
#define uPrint(...) { taosPrintLog("UTL ", tscEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }
|
||||||
if (uDebugFlag & DEBUG_WARN) { \
|
#define uForcePrint(...) { taosPrintLog("ERROR UTL ", 255, __VA_ARGS__); }
|
||||||
taosPrintLog("WARN UTL ", uDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define uTrace(...) \
|
|
||||||
if (uDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("UTL ", uDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define uDump(x, y) \
|
|
||||||
if (uDebugFlag & DEBUG_DUMP) { \
|
|
||||||
taosDumpData(x, y); \
|
|
||||||
}
|
|
||||||
#define uPrint(...) \
|
|
||||||
{ taosPrintLog("UTL ", tscEmbedded ? 255 : uDebugFlag, __VA_ARGS__); }
|
|
||||||
#define uForcePrint(...) \
|
|
||||||
{ taosPrintLog("ERROR UTL ", 255, __VA_ARGS__); }
|
|
||||||
|
|
||||||
#define pError(...) \
|
#define pError(...) { taosPrintLog("ERROR APP ", 255, __VA_ARGS__); }
|
||||||
{ taosPrintLog("ERROR APP ", 255, __VA_ARGS__); }
|
#define pPrint(...) { taosPrintLog("APP ", 255, __VA_ARGS__); }
|
||||||
#define pPrint(...) \
|
|
||||||
{ taosPrintLog("APP ", 255, __VA_ARGS__); }
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
#include "tdataformat.h"
|
#include "tdataformat.h"
|
||||||
#include "wchar.h"
|
#include "wchar.h"
|
||||||
|
#include "talgo.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a SSchema object with nCols columns
|
* Create a SSchema object with nCols columns
|
||||||
|
@ -151,6 +152,151 @@ SDataRow tdNewDataRowFromSchema(STSchema *pSchema) {
|
||||||
return row;
|
return row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tdSetTagCol(SDataRow row, void *value, int16_t len, int8_t type, int16_t colId){ //insert/update tag value and update all the information
|
||||||
|
ASSERT(((STagRow *)row)->pData != NULL);
|
||||||
|
//STagCol * stCol = tdQueryTagColByID()
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
int tdDeleteTagCol(SDataRow row, int16_t colId){ // delete tag value and update all the information
|
||||||
|
//todo
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int compTagId(const void *key1, const void *key2) {
|
||||||
|
if (((STagCol *)key1)->colId > ((STagCol *)key2)->colId) {
|
||||||
|
return 1;
|
||||||
|
} else if (((STagCol *)key1)->colId == ((STagCol *)key2)->colId) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find tag structure by colId, if find, return tag structure, else return NULL;
|
||||||
|
*/
|
||||||
|
STagCol * tdQueryTagColByID(SDataRow row, int16_t colId, int flags) { //if find tag, 0, else return -1;
|
||||||
|
ASSERT(((STagRow *)row)->pData != NULL);
|
||||||
|
STagCol *pBase = ((STagRow *)row)->tagCols;
|
||||||
|
int16_t nCols = ((STagRow *)row)->ncols;
|
||||||
|
STagCol key = {colId,0,0};
|
||||||
|
STagCol * stCol = taosbsearch(&key, pBase, nCols, sizeof(STagCol), compTagId, flags);
|
||||||
|
return stCol;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find tag value by colId, if find, return tag value, else return NULL;
|
||||||
|
*/
|
||||||
|
void * tdQueryTagByID(SDataRow row, int16_t colId, int16_t *type) {
|
||||||
|
ASSERT(((STagRow *)row)->pData != NULL);
|
||||||
|
STagCol *pBase = ((STagRow *)row)->tagCols;
|
||||||
|
int16_t nCols = ((STagRow *)row)->ncols;
|
||||||
|
STagCol key = {colId,0,0};
|
||||||
|
STagCol * stCol = taosbsearch(&key, pBase, nCols, sizeof(STagCol), compTagId, TD_EQ);
|
||||||
|
if (NULL == stCol) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void * pData = ((STagRow *)row)->pData;
|
||||||
|
*type = stCol->colType;
|
||||||
|
|
||||||
|
return pData + stCol->offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
int tdAppendTagColVal(SDataRow row, void *value, int8_t type, int32_t bytes, int16_t colId){
|
||||||
|
ASSERT(value != NULL);
|
||||||
|
//ASSERT(bytes-2 == varDataTLen(value));
|
||||||
|
ASSERT(row != NULL);
|
||||||
|
STagRow *pTagrow = row;
|
||||||
|
pTagrow->tagCols[pTagrow->ncols].colId = colId;
|
||||||
|
pTagrow->tagCols[pTagrow->ncols].colType = type;
|
||||||
|
pTagrow->tagCols[pTagrow->ncols].offset = pTagrow->dataLen;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
memcpy((char *)pTagrow->pData + pTagrow->dataLen, value, varDataTLen(value));
|
||||||
|
pTagrow->dataLen += varDataTLen(value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
memcpy((char *)pTagrow->pData + pTagrow->dataLen, value, TYPE_BYTES[type]);
|
||||||
|
pTagrow->dataLen += TYPE_BYTES[type];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pTagrow->ncols++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void * tdNewTagRowFromSchema(STSchema *pSchema, int16_t numofTags) {
|
||||||
|
int32_t size = sizeof(STagRow) + numofTags * sizeof(STagCol);
|
||||||
|
|
||||||
|
STagRow *row = malloc(size);
|
||||||
|
if (row == NULL) return NULL;
|
||||||
|
|
||||||
|
int32_t datasize = pSchema->tlen;
|
||||||
|
row->pData = malloc(datasize);
|
||||||
|
if (NULL == row->pData) {
|
||||||
|
free(row);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
row->len = size;
|
||||||
|
row->dataLen = 0;
|
||||||
|
row->ncols = 0;
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* free tag row
|
||||||
|
*/
|
||||||
|
|
||||||
|
void tdFreeTagRow(SDataRow row) {
|
||||||
|
if (row) {
|
||||||
|
free(((STagRow *)row)->pData);
|
||||||
|
free(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDataRow tdTagRowDup(SDataRow row) {
|
||||||
|
STagRow *trow = malloc(dataRowLen(row));
|
||||||
|
if (trow == NULL) return NULL;
|
||||||
|
|
||||||
|
dataRowCpy(trow, row);
|
||||||
|
trow->pData = malloc(trow->dataLen);
|
||||||
|
if (NULL == trow->pData) {
|
||||||
|
free(trow);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(trow->pData, ((STagRow *)row)->pData, trow->dataLen);
|
||||||
|
return trow;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDataRow tdTagRowDecode(SDataRow row) {
|
||||||
|
STagRow *trow = malloc(dataRowLen(row));
|
||||||
|
if (trow == NULL) return NULL;
|
||||||
|
|
||||||
|
dataRowCpy(trow, row);
|
||||||
|
trow->pData = malloc(trow->dataLen);
|
||||||
|
if (NULL == trow->pData) {
|
||||||
|
free(trow);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
char * pData = (char *)row + dataRowLen(row);
|
||||||
|
memcpy(trow->pData, pData, trow->dataLen);
|
||||||
|
return trow;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdTagRowCpy(SDataRow dst, SDataRow src) {
|
||||||
|
if (src == NULL) return -1;
|
||||||
|
|
||||||
|
dataRowCpy(dst, src);
|
||||||
|
void * pData = dst + dataRowLen(src);
|
||||||
|
memcpy(pData, ((STagRow *)src)->pData, ((STagRow *)src)->dataLen);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Free the SDataRow object
|
* Free the SDataRow object
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -142,7 +142,7 @@ int32_t rpcDebugFlag = 135;
|
||||||
int32_t uDebugFlag = 131;
|
int32_t uDebugFlag = 131;
|
||||||
int32_t debugFlag = 131;
|
int32_t debugFlag = 131;
|
||||||
int32_t sDebugFlag = 135;
|
int32_t sDebugFlag = 135;
|
||||||
int32_t tsdbDebugFlag = 131;
|
int32_t tsdbDebugFlag = 135;
|
||||||
|
|
||||||
// the maximum number of results for projection query on super table that are returned from
|
// the maximum number of results for projection query on super table that are returned from
|
||||||
// one virtual node, to order according to timestamp
|
// one virtual node, to order according to timestamp
|
||||||
|
@ -202,6 +202,8 @@ char tsTimezone[64] = {0};
|
||||||
char tsLocale[TSDB_LOCALE_LEN] = {0};
|
char tsLocale[TSDB_LOCALE_LEN] = {0};
|
||||||
char tsCharset[TSDB_LOCALE_LEN] = {0}; // default encode string
|
char tsCharset[TSDB_LOCALE_LEN] = {0}; // default encode string
|
||||||
|
|
||||||
|
int32_t tsMaxBinaryDisplayWidth = 30;
|
||||||
|
|
||||||
static pthread_once_t tsInitGlobalCfgOnce = PTHREAD_ONCE_INIT;
|
static pthread_once_t tsInitGlobalCfgOnce = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
void taosSetAllDebugFlag() {
|
void taosSetAllDebugFlag() {
|
||||||
|
@ -605,7 +607,7 @@ static void doInitGlobalConfig() {
|
||||||
cfg.minValue = TSDB_MIN_CACHE_BLOCK_SIZE;
|
cfg.minValue = TSDB_MIN_CACHE_BLOCK_SIZE;
|
||||||
cfg.maxValue = TSDB_MAX_CACHE_BLOCK_SIZE;
|
cfg.maxValue = TSDB_MAX_CACHE_BLOCK_SIZE;
|
||||||
cfg.ptrLength = 0;
|
cfg.ptrLength = 0;
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_BYTE;
|
cfg.unitType = TAOS_CFG_UTYPE_Mb;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
cfg.option = "blocks";
|
cfg.option = "blocks";
|
||||||
|
@ -615,7 +617,7 @@ static void doInitGlobalConfig() {
|
||||||
cfg.minValue = TSDB_MIN_TOTAL_BLOCKS;
|
cfg.minValue = TSDB_MIN_TOTAL_BLOCKS;
|
||||||
cfg.maxValue = TSDB_MAX_TOTAL_BLOCKS;
|
cfg.maxValue = TSDB_MAX_TOTAL_BLOCKS;
|
||||||
cfg.ptrLength = 0;
|
cfg.ptrLength = 0;
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_BYTE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
cfg.option = "days";
|
cfg.option = "days";
|
||||||
|
@ -1227,6 +1229,16 @@ static void doInitGlobalConfig() {
|
||||||
cfg.ptrLength = 0;
|
cfg.ptrLength = 0;
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
|
cfg.option = "maxBinaryDisplayWidth";
|
||||||
|
cfg.ptr = &tsMaxBinaryDisplayWidth;
|
||||||
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_CLIENT;
|
||||||
|
cfg.minValue = 1;
|
||||||
|
cfg.maxValue = 0x7fffffff;
|
||||||
|
cfg.ptrLength = 0;
|
||||||
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
|
taosInitConfigOption(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosInitGlobalCfg() {
|
void taosInitGlobalCfg() {
|
||||||
|
|
|
@ -31,16 +31,16 @@ void tsSetLocale() {
|
||||||
|
|
||||||
// default locale or user specified locale is not valid, abort launch
|
// default locale or user specified locale is not valid, abort launch
|
||||||
if (locale == NULL) {
|
if (locale == NULL) {
|
||||||
uForcePrint("Invalid locale:%s, please set the valid locale in config file", tsLocale);
|
uError("Invalid locale:%s, please set the valid locale in config file", tsLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(tsCharset) == 0) {
|
if (strlen(tsCharset) == 0) {
|
||||||
uForcePrint("failed to get charset, please set the valid charset in config file");
|
uError("failed to get charset, please set the valid charset in config file");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!taosValidateEncodec(tsCharset)) {
|
if (!taosValidateEncodec(tsCharset)) {
|
||||||
uForcePrint("Invalid charset:%s, please set the valid charset in config file", tsCharset);
|
uError("Invalid charset:%s, please set the valid charset in config file", tsCharset);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -188,7 +188,7 @@ public class TSDBDriver implements java.sql.Driver {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean acceptsURL(String url) throws SQLException {
|
public boolean acceptsURL(String url) throws SQLException {
|
||||||
return true;
|
return StringUtils.isNotBlank(url) && url.startsWith(URL_PREFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
|
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
|
||||||
|
|
|
@ -27,9 +27,9 @@
|
||||||
#include "tcq.h"
|
#include "tcq.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
#define cError(...) if (cqDebugFlag & DEBUG_ERROR) {taosPrintLog("ERROR CQ ", cqDebugFlag, __VA_ARGS__);}
|
#define cError(...) { if (cqDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR CQ ", cqDebugFlag, __VA_ARGS__); }}
|
||||||
#define cWarn(...) if (cqDebugFlag & DEBUG_WARN) {taosPrintLog("WARN CQ ", cqDebugFlag, __VA_ARGS__);}
|
#define cWarn(...) { if (cqDebugFlag & DEBUG_WARN) { taosPrintLog("WARN CQ ", cqDebugFlag, __VA_ARGS__); }}
|
||||||
#define cTrace(...) if (cqDebugFlag & DEBUG_TRACE) {taosPrintLog("CQ ", cqDebugFlag, __VA_ARGS__);}
|
#define cTrace(...) { if (cqDebugFlag & DEBUG_TRACE) { taosPrintLog("CQ ", cqDebugFlag, __VA_ARGS__); }}
|
||||||
#define cPrint(...) { taosPrintLog("CQ ", 255, __VA_ARGS__); }
|
#define cPrint(...) { taosPrintLog("CQ ", 255, __VA_ARGS__); }
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -24,9 +24,9 @@ extern "C" {
|
||||||
|
|
||||||
extern int32_t dDebugFlag;
|
extern int32_t dDebugFlag;
|
||||||
|
|
||||||
#define dError(...) if (dDebugFlag & DEBUG_ERROR) {taosPrintLog("ERROR DND ", 255, __VA_ARGS__); }
|
#define dError(...) { if (dDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR DND ", 255, __VA_ARGS__); }}
|
||||||
#define dWarn(...) if (dDebugFlag & DEBUG_WARN) {taosPrintLog("WARN DND ", dDebugFlag, __VA_ARGS__); }
|
#define dWarn(...) { if (dDebugFlag & DEBUG_WARN) { taosPrintLog("WARN DND ", dDebugFlag, __VA_ARGS__); }}
|
||||||
#define dTrace(...) if (dDebugFlag & DEBUG_TRACE) {taosPrintLog("DND ", dDebugFlag, __VA_ARGS__); }
|
#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", dDebugFlag, __VA_ARGS__); }}
|
||||||
#define dPrint(...) { taosPrintLog("DND ", 255, __VA_ARGS__); }
|
#define dPrint(...) { taosPrintLog("DND ", 255, __VA_ARGS__); }
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -46,145 +46,144 @@ static STaosError errors[] = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// rpc
|
// rpc
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_ACTION_IN_PROGRESS, 0, 1, "action in progress")
|
TAOS_DEFINE_ERROR(TSDB_CODE_ACTION_IN_PROGRESS, 0, 0x0001, "action in progress")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_ACTION_NEED_REPROCESSED, 0, 3, "action need to be reprocessed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_ACTION_NEED_REPROCESSED, 0, 0x0003, "action need to be reprocessed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MSG_NOT_PROCESSED, 0, 4, "message not processed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MSG_NOT_PROCESSED, 0, 0x0004, "message not processed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_ALREADY_PROCESSED, 0, 5, "message already processed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_ALREADY_PROCESSED, 0, 0x0005, "message already processed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_REDIRECT, 0, 6, "redirect")
|
TAOS_DEFINE_ERROR(TSDB_CODE_REDIRECT, 0, 0x0006, "redirect")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_LAST_SESSION_NOT_FINISHED, 0, 7, "last session not finished")
|
TAOS_DEFINE_ERROR(TSDB_CODE_LAST_SESSION_NOT_FINISHED, 0, 0x0007, "last session not finished")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MAX_SESSIONS, 0, 8, "max sessions") // too many sessions
|
TAOS_DEFINE_ERROR(TSDB_CODE_MAX_SESSIONS, 0, 0x0008, "max sessions") // too many sessions
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_SESSION_ID, 0, 9, "invalid session id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_SESSION_ID, 0, 0x0009, "invalid session id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TRAN_ID, 0, 10, "invalid transaction id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TRAN_ID, 0, 0x000A, "invalid transaction id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_TYPE, 0, 11, "invalid message type")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_TYPE, 0, 0x000B, "invalid message type")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_LEN, 0, 12, "invalid message length")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_LEN, 0, 0x000C, "invalid message length")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_CONTENT, 0, 13, "invalid message content")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_CONTENT, 0, 0x000D, "invalid message content")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_VERSION, 0, 14, "invalid message version")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_MSG_VERSION, 0, 0x000E, "invalid message version")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_UNEXPECTED_RESPONSE, 0, 15, "unexpected response")
|
TAOS_DEFINE_ERROR(TSDB_CODE_UNEXPECTED_RESPONSE, 0, 0x000F, "unexpected response")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_RESPONSE_TYPE, 0, 16, "invalid response type")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_RESPONSE_TYPE, 0, 0x0010, "invalid response type")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MISMATCHED_METER_ID, 0, 17, "mismatched meter id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MISMATCHED_METER_ID, 0, 0x0011, "mismatched meter id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_DISCONNECTED, 0, 18, "disconnected")
|
TAOS_DEFINE_ERROR(TSDB_CODE_DISCONNECTED, 0, 0x0012, "disconnected")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_READY, 0, 19, "not ready") // peer is not ready to process data
|
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_READY, 0, 0x0013, "not ready") // peer is not ready to process data
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_SLOW, 0, 20, "too slow")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_SLOW, 0, 0x0014, "too slow")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_OTHERS, 0, 21, "others")
|
TAOS_DEFINE_ERROR(TSDB_CODE_OTHERS, 0, 0x0015, "others")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_APP_ERROR, 0, 22, "app error")
|
TAOS_DEFINE_ERROR(TSDB_CODE_APP_ERROR, 0, 0x0016, "app error")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_ALREADY_THERE, 0, 23, "already there")
|
TAOS_DEFINE_ERROR(TSDB_CODE_ALREADY_THERE, 0, 0x0017, "already there")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_RESOURCE, 0, 14, "no resource")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_RESOURCE, 0, 0x0018, "no resource")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_OPS_NOT_SUPPORT, 0, 25, "operations not support")
|
TAOS_DEFINE_ERROR(TSDB_CODE_OPS_NOT_SUPPORT, 0, 0x0019, "operations not support")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_OPTION, 0, 26, "invalid option")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_OPTION, 0, 0x001A, "invalid option")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_CONFIGURED, 0, 27, "not configured")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_CONFIGURED, 0, 0x001B, "not configured")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NODE_OFFLINE, 0, 28, "node offline")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NODE_OFFLINE, 0, 0x001C, "node offline")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NETWORK_UNAVAIL, 0, 29, "network unavailable")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NETWORK_UNAVAIL, 0, 0x001D, "network unavailable")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_AUTH_REQUIRED, 0, 30, "auth required")
|
TAOS_DEFINE_ERROR(TSDB_CODE_AUTH_REQUIRED, 0, 0x001E, "auth required")
|
||||||
|
|
||||||
// db
|
// db
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_DB_NOT_SELECTED, 0, 100, "db not selected")
|
TAOS_DEFINE_ERROR(TSDB_CODE_DB_NOT_SELECTED, 0, 0x0100, "db not selected")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_DB_ALREADY_EXIST, 0, 101, "database aleady exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_DB_ALREADY_EXIST, 0, 0x0101, "database aleady exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_DB, 0, 102, "invalid database")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_DB, 0, 0x0102, "invalid database")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MONITOR_DB_FORBIDDEN, 0, 103, "monitor db forbidden")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MONITOR_DB_FORBIDDEN, 0, 0x0103, "monitor db forbidden")
|
||||||
|
|
||||||
// user
|
// user
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_USER_ALREADY_EXIST, 0, 150, "user already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_USER_ALREADY_EXIST, 0, 0x0180, "user already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_USER, 0, 151, "invalid user")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_USER, 0, 0x0181, "invalid user")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_PASS, 0, 152, "invalid password")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_PASS, 0, 0x0182, "invalid password")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_USER_FORMAT, 0, 153, "invalid user format")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_USER_FORMAT, 0, 0x0183, "invalid user format")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_PASS_FORMAT, 0, 154, "invalid password format")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_PASS_FORMAT, 0, 0x0184, "invalid password format")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_USER_FROM_CONN, 0, 155, "can not get user from conn")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_USER_FROM_CONN, 0, 0x0185, "can not get user from conn")
|
||||||
|
|
||||||
// table
|
// table
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TABLE_ALREADY_EXIST, 0, 200, "table already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TABLE_ALREADY_EXIST, 0, 0x0200, "table already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TABLE_ID, 0, 201, "invalid table id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TABLE_ID, 0, 0x0201, "invalid table id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TABLE_TYPE, 0, 202, "invalid table typee")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TABLE_TYPE, 0, 0x0202, "invalid table typee")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TABLE, 0, 203, "invalid table name")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TABLE, 0, 0x0203, "invalid table name")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_SUPER_TABLE, 0, 204, "no super table") // operation only available for super table
|
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_SUPER_TABLE, 0, 0x0204, "no super table") // operation only available for super table
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_ACTIVE_TABLE, 0, 205, "not active table")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_ACTIVE_TABLE, 0, 0x0205, "not active table")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TABLE_ID_MISMATCH, 0, 206, "table id mismatch")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TABLE_ID_MISMATCH, 0, 0x0206, "table id mismatch")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TAG_ALREAY_EXIST, 0, 207, "tag already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TAG_ALREAY_EXIST, 0, 0x0207, "tag already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TAG_NOT_EXIST, 0, 208, "tag not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TAG_NOT_EXIST, 0, 0x0208, "tag not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_FIELD_ALREAY_EXIST, 0, 209, "field already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_FIELD_ALREAY_EXIST, 0, 0x0209, "field already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_FIELD_NOT_EXIST, 0, 210, "field not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_FIELD_NOT_EXIST, 0, 0x020A, "field not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_COL_NAME_TOO_LONG, 0, 211, "column name too long")
|
TAOS_DEFINE_ERROR(TSDB_CODE_COL_NAME_TOO_LONG, 0, 0x020B, "column name too long")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_TAGS, 0, 211, "too many tags")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_TAGS, 0, 0x020C, "too many tags")
|
||||||
|
|
||||||
|
|
||||||
// dnode & mnode
|
// dnode & mnode
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_ENOUGH_DNODES, 0, 250, "no enough dnodes")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_ENOUGH_DNODES, 0, 0x0280, "no enough dnodes")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_DNODE_ALREADY_EXIST, 0, 251, "dnode already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_DNODE_ALREADY_EXIST, 0, 0x0281, "dnode already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_DNODE_NOT_EXIST, 0, 252, "dnode not exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_DNODE_NOT_EXIST, 0, 0x0282, "dnode not exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_MASTER, 0, 253, "no master")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_MASTER, 0, 0x0283, "no master")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_REMOVE_MASTER, 0, 254, "no remove master")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_REMOVE_MASTER, 0, 0x0284, "no remove master")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QUERY_ID, 0, 255, "invalid query id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QUERY_ID, 0, 0x0285, "invalid query id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_STREAM_ID, 0, 256, "invalid stream id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_STREAM_ID, 0, 0x0286, "invalid stream id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CONNECTION, 0, 257, "invalid connection")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CONNECTION, 0, 0x0287, "invalid connection")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_SDB_ERROR, 0, 258, "sdb error")
|
TAOS_DEFINE_ERROR(TSDB_CODE_SDB_ERROR, 0, 0x0288, "sdb error")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TIMESTAMP_OUT_OF_RANGE, 0, 259, "timestamp is out of range")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TIMESTAMP_OUT_OF_RANGE, 0, 0x0289, "timestamp is out of range")
|
||||||
|
|
||||||
// acct
|
// acct
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_ACCT_ALREADY_EXIST, 0, 300, "accounts already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_ACCT_ALREADY_EXIST, 0, 0x0300, "accounts already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_ACCT, 0, 301, "invalid account")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_ACCT, 0, 0x0301, "invalid account")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_ACCT_PARAMETER, 0, 302, "invalid account parameter")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_ACCT_PARAMETER, 0, 0x0302, "invalid account parameter")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_ACCTS, 0, 303, "too many accounts")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_ACCTS, 0, 0x0303, "too many accounts")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_USERS, 0, 304, "too many users")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_USERS, 0, 0x0304, "too many users")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_TABLES, 0, 305, "too many tables")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_TABLES, 0, 0x0305, "too many tables")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_DATABASES, 0, 306, "too many databases")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_DATABASES, 0, 0x0306, "too many databases")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_TIME_SERIES, 0, 307, "not enough time series")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TOO_MANY_TIME_SERIES, 0, 0x0307, "not enough time series")
|
||||||
|
|
||||||
// grant
|
// grant
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_AUTH_FAILURE, 0, 350, "auth failure")
|
TAOS_DEFINE_ERROR(TSDB_CODE_AUTH_FAILURE, 0, 0x0380, "auth failure")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_RIGHTS, 0, 351, "no rights")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_RIGHTS, 0, 0x0381, "no rights")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_WRITE_ACCESS, 0, 352, "no write access")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_WRITE_ACCESS, 0, 0x0382, "no write access")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_READ_ACCESS, 0, 353, "no read access")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_READ_ACCESS, 0, 0x0383, "no read access")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_EXPIRED, 0, 354, "grant expired")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_EXPIRED, 0, 0x0384, "grant expired")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_DNODE_LIMITED, 0, 355, "grant dnode limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_DNODE_LIMITED, 0, 0x0385, "grant dnode limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_ACCT_LIMITED, 0, 356, "grant account limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_ACCT_LIMITED, 0, 0x0386, "grant account limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_TIMESERIES_LIMITED, 0, 357, "grant timeseries limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_TIMESERIES_LIMITED, 0, 0x0387, "grant timeseries limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_DB_LIMITED, 0, 358, "grant db limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_DB_LIMITED, 0, 0x0388, "grant db limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_USER_LIMITED, 0, 359, "grant user limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_USER_LIMITED, 0, 0x0389, "grant user limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_CONN_LIMITED, 0, 360, "grant conn limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_CONN_LIMITED, 0, 0x038A, "grant conn limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_STREAM_LIMITED, 0, 361, "grant stream limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_STREAM_LIMITED, 0, 0x038B, "grant stream limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_SPEED_LIMITED, 0, 362, "grant speed limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_SPEED_LIMITED, 0, 0x038C, "grant speed limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_STORAGE_LIMITED, 0, 363, "grant storage limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_STORAGE_LIMITED, 0, 0x038D, "grant storage limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_QUERYTIME_LIMITED, 0, 364, "grant query time limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_QUERYTIME_LIMITED, 0, 0x038E, "grant query time limited")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_CPU_LIMITED, 0, 365, "grant cpu limited")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_CPU_LIMITED, 0, 0x038F, "grant cpu limited")
|
||||||
|
|
||||||
// server
|
// server
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VGROUP_ID, 0, 400, "invalid vgroup id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VGROUP_ID, 0, 0x0400, "invalid vgroup id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VNODE_ID, 0, 401, "invalid vnode id")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VNODE_ID, 0, 0x0401, "invalid vnode id")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_ACTIVE_VNODE, 0, 402, "not active vnode")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_ACTIVE_VNODE, 0, 0x0402, "not active vnode")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_VG_INIT_FAILED, 0, 403, "vg init failed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_VG_INIT_FAILED, 0, 0x0403, "vg init failed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_SERV_NO_DISKSPACE, 0, 404, "server no diskspace")
|
TAOS_DEFINE_ERROR(TSDB_CODE_SERV_NO_DISKSPACE, 0, 0x0404, "server no diskspace")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_SERV_OUT_OF_MEMORY, 0, 405, "server out of memory")
|
TAOS_DEFINE_ERROR(TSDB_CODE_SERV_OUT_OF_MEMORY, 0, 0x0405, "server out of memory")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NO_DISK_PERMISSIONS, 0, 406, "no disk permissions")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NO_DISK_PERMISSIONS, 0, 0x0406, "no disk permissions")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_FILE_CORRUPTED, 0, 407, "file corrupted")
|
TAOS_DEFINE_ERROR(TSDB_CODE_FILE_CORRUPTED, 0, 0x0407, "file corrupted")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MEMORY_CORRUPTED, 0, 408, "memory corrupted")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MEMORY_CORRUPTED, 0, 0x0408, "memory corrupted")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_SUCH_FILE_OR_DIR, 0, 409, "no such file or directory")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NOT_SUCH_FILE_OR_DIR, 0, 0x0409, "no such file or directory")
|
||||||
|
|
||||||
// client
|
// client
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CLIENT_VERSION, 0, 451, "invalid client version")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CLIENT_VERSION, 0, 0x0481, "invalid client version")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_CLI_OUT_OF_MEMORY, 0, 452, "client out of memory")
|
TAOS_DEFINE_ERROR(TSDB_CODE_CLI_OUT_OF_MEMORY, 0, 0x0482, "client out of memory")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_CLI_NO_DISKSPACE, 0, 453, "client no disk space")
|
TAOS_DEFINE_ERROR(TSDB_CODE_CLI_NO_DISKSPACE, 0, 0x0483, "client no disk space")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TIME_STAMP, 0, 454, "invalid timestamp")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TIME_STAMP, 0, 0x0484, "invalid timestamp")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_SQL, 0, 455, "invalid sql")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_SQL, 0, 0x0485, "invalid sql")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QUERY_CACHE_ERASED, 0, 456, "query cache erased")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QUERY_CACHE_ERASED, 0, 0x0486, "query cache erased")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QUERY_MSG, 0, 457, "invalid query message") // failed to validate the sql expression msg by vnode
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QUERY_MSG, 0, 0x0487, "invalid query message") // failed to validate the sql expression msg by vnode
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_SORTED_RES_TOO_MANY, 0, 458, "sorted res too many") // too many result for ordered super table projection query
|
TAOS_DEFINE_ERROR(TSDB_CODE_SORTED_RES_TOO_MANY, 0, 0x0488, "sorted res too many") // too many result for ordered super table projection query
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QHANDLE, 0, 459, "invalid handle")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_QHANDLE, 0, 0x0489, "invalid handle")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QUERY_CANCELLED, 0, 460, "query cancelled")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QUERY_CANCELLED, 0, 0x048A, "query cancelled")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_IE, 0, 461, "invalid ie")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_IE, 0, 0x048B, "invalid ie")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VALUE, 0, 462, "invalid value")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_VALUE, 0, 0x048C, "invalid value")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_FQDN, 0, 463, "invalid FQDN")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_FQDN, 0, 0x048D, "invalid FQDN")
|
||||||
|
|
||||||
// others
|
// others
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_FILE_FORMAT, 0, 500, "invalid file format")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_FILE_FORMAT, 0, 0x0500, "invalid file format")
|
||||||
|
|
||||||
// TSDB
|
// TSDB
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CONFIG, 0, 550, "invalid TSDB configuration")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_CONFIG, 0, 0x0580, "invalid TSDB configuration")
|
||||||
|
|
||||||
|
|
||||||
#ifdef TAOS_ERROR_C
|
#ifdef TAOS_ERROR_C
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TSDB_CODE_MAX_ERROR_CODE 120
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ typedef struct {
|
||||||
STSchema * schema;
|
STSchema * schema;
|
||||||
STSchema * tagSchema;
|
STSchema * tagSchema;
|
||||||
SDataRow tagValues;
|
SDataRow tagValues;
|
||||||
|
char * sql;
|
||||||
} STableCfg;
|
} STableCfg;
|
||||||
|
|
||||||
int tsdbInitTableCfg(STableCfg *config, ETableType type, uint64_t uid, int32_t tid);
|
int tsdbInitTableCfg(STableCfg *config, ETableType type, uint64_t uid, int32_t tid);
|
||||||
|
@ -101,6 +102,7 @@ int tsdbTableSetTagSchema(STableCfg *config, STSchema *pSchema, bool dup);
|
||||||
int tsdbTableSetTagValue(STableCfg *config, SDataRow row, bool dup);
|
int tsdbTableSetTagValue(STableCfg *config, SDataRow row, bool dup);
|
||||||
int tsdbTableSetName(STableCfg *config, char *name, bool dup);
|
int tsdbTableSetName(STableCfg *config, char *name, bool dup);
|
||||||
int tsdbTableSetSName(STableCfg *config, char *sname, bool dup);
|
int tsdbTableSetSName(STableCfg *config, char *sname, bool dup);
|
||||||
|
int tsdbTableSetStreamSql(STableCfg *config, char *sql, bool dup);
|
||||||
void tsdbClearTableCfg(STableCfg *config);
|
void tsdbClearTableCfg(STableCfg *config);
|
||||||
|
|
||||||
int32_t tsdbGetTableTagVal(TsdbRepoT *repo, STableId* id, int32_t colId, int16_t *type, int16_t *bytes, char **val);
|
int32_t tsdbGetTableTagVal(TsdbRepoT *repo, STableId* id, int32_t colId, int16_t *type, int16_t *bytes, char **val);
|
||||||
|
|
|
@ -29,18 +29,6 @@
|
||||||
#define MAX_COMMAND_SIZE 65536
|
#define MAX_COMMAND_SIZE 65536
|
||||||
#define HISTORY_FILE ".taos_history"
|
#define HISTORY_FILE ".taos_history"
|
||||||
|
|
||||||
#define BOOL_OUTPUT_LENGTH 6
|
|
||||||
#define TINYINT_OUTPUT_LENGTH 6
|
|
||||||
#define SMALLINT_OUTPUT_LENGTH 7
|
|
||||||
#define INT_OUTPUT_LENGTH 11
|
|
||||||
#define BIGINT_OUTPUT_LENGTH 21
|
|
||||||
#define FLOAT_OUTPUT_LENGTH 20
|
|
||||||
#define DOUBLE_OUTPUT_LENGTH 25
|
|
||||||
#define BINARY_OUTPUT_LENGTH 20
|
|
||||||
|
|
||||||
// dynamic config timestamp width according to maximum time precision
|
|
||||||
extern int32_t TIMESTAMP_OUTPUT_LENGTH;
|
|
||||||
|
|
||||||
typedef struct SShellHistory {
|
typedef struct SShellHistory {
|
||||||
char* hist[MAX_HISTORY_SIZE];
|
char* hist[MAX_HISTORY_SIZE];
|
||||||
int hstart;
|
int hstart;
|
||||||
|
@ -80,7 +68,7 @@ void get_history_path(char* history);
|
||||||
void cleanup_handler(void* arg);
|
void cleanup_handler(void* arg);
|
||||||
void exitShell();
|
void exitShell();
|
||||||
int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode);
|
int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode);
|
||||||
void shellPrintNChar(char* str, int width, bool printMode);
|
void shellPrintNChar(const char* str, int length, int width);
|
||||||
void shellGetGrantInfo(void *con);
|
void shellGetGrantInfo(void *con);
|
||||||
int isCommentLine(char *line);
|
int isCommentLine(char *line);
|
||||||
|
|
||||||
|
|
|
@ -335,53 +335,44 @@ void *shellLoopQuery(void *arg) {
|
||||||
tscError("failed to malloc command");
|
tscError("failed to malloc command");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
while (1) {
|
|
||||||
// Read command from shell.
|
|
||||||
|
|
||||||
|
do {
|
||||||
|
// Read command from shell.
|
||||||
memset(command, 0, MAX_COMMAND_SIZE);
|
memset(command, 0, MAX_COMMAND_SIZE);
|
||||||
set_terminal_mode();
|
set_terminal_mode();
|
||||||
shellReadCommand(con, command);
|
shellReadCommand(con, command);
|
||||||
reset_terminal_mode();
|
reset_terminal_mode();
|
||||||
|
} while (shellRunCommand(con, command) == 0);
|
||||||
// Run the command
|
|
||||||
shellRunCommand(con, command);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_cleanup_pop(1);
|
pthread_cleanup_pop(1);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(char *str, int width, bool printMode) {
|
void shellPrintNChar(const char *str, int length, int width) {
|
||||||
int col_left = width;
|
int pos = 0, cols = 0;
|
||||||
|
while (pos < length) {
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
while (col_left > 0) {
|
pos += mbtowc(&wc, str + pos, MB_CUR_MAX);
|
||||||
if (*str == '\0') break;
|
if (pos > length) {
|
||||||
char *tstr = str;
|
break;
|
||||||
int byte_width = mbtowc(&wc, tstr, MB_CUR_MAX);
|
}
|
||||||
if (byte_width <= 0) break;
|
|
||||||
int col_width = wcwidth(wc);
|
int w = wcwidth(wc);
|
||||||
if (col_width <= 0) {
|
if (w > 0) {
|
||||||
str += byte_width;
|
if (width > 0 && cols + w > width) {
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
if (col_left < col_width) break;
|
|
||||||
printf("%lc", wc);
|
printf("%lc", wc);
|
||||||
str += byte_width;
|
cols += w;
|
||||||
col_left -= col_width;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (col_left > 0) {
|
for (; cols < width; cols++) {
|
||||||
printf(" ");
|
putchar(' ');
|
||||||
col_left--;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!printMode) {
|
|
||||||
printf("|");
|
|
||||||
} else {
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_old_terminal_mode(struct termios *tio) {
|
int get_old_terminal_mode(struct termios *tio) {
|
||||||
/* Make sure stdin is a terminal. */
|
/* Make sure stdin is a terminal. */
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _BSD_SOURCE
|
||||||
|
#define _GNU_SOURCE
|
||||||
#define _XOPEN_SOURCE
|
#define _XOPEN_SOURCE
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
|
@ -35,6 +37,9 @@ int prompt_size = 6;
|
||||||
TAOS_RES *result = NULL;
|
TAOS_RES *result = NULL;
|
||||||
SShellHistory history;
|
SShellHistory history;
|
||||||
|
|
||||||
|
#define DEFAULT_MAX_BINARY_DISPLAY_WIDTH 30
|
||||||
|
extern int32_t tsMaxBinaryDisplayWidth;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Initialize the shell.
|
* FUNCTION: Initialize the shell.
|
||||||
*/
|
*/
|
||||||
|
@ -77,20 +82,15 @@ TAOS *shellInit(SShellArguments *args) {
|
||||||
// Check if it is temperory run
|
// Check if it is temperory run
|
||||||
if (args->commands != NULL || args->file[0] != 0) {
|
if (args->commands != NULL || args->file[0] != 0) {
|
||||||
if (args->commands != NULL) {
|
if (args->commands != NULL) {
|
||||||
char *token;
|
printf("%s%s\n", PROMPT_HEADER, args->commands);
|
||||||
token = strtok(args->commands, ";");
|
shellRunCommand(con, args->commands);
|
||||||
while (token != NULL) {
|
|
||||||
printf("%s%s\n", PROMPT_HEADER, token);
|
|
||||||
shellRunCommand(con, token);
|
|
||||||
token = strtok(NULL, ";");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args->file[0] != 0) {
|
if (args->file[0] != 0) {
|
||||||
source_file(con, args->file);
|
source_file(con, args->file);
|
||||||
}
|
}
|
||||||
taos_close(con);
|
|
||||||
|
|
||||||
|
taos_close(con);
|
||||||
write_history();
|
write_history();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -106,67 +106,66 @@ TAOS *shellInit(SShellArguments *args) {
|
||||||
return con;
|
return con;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellReplaceCtrlChar(char *str) {
|
|
||||||
_Bool ctrlOn = false;
|
|
||||||
char *pstr = NULL;
|
|
||||||
char quote = 0;
|
|
||||||
|
|
||||||
for (pstr = str; *str != '\0'; ++str) {
|
static bool isEmptyCommand(const char* cmd) {
|
||||||
if (ctrlOn) {
|
for (char c = *cmd++; c != 0; c = *cmd++) {
|
||||||
switch (*str) {
|
if (c != ' ' && c != '\t' && c != ';') {
|
||||||
case 'n':
|
return false;
|
||||||
*pstr = '\n';
|
|
||||||
pstr++;
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
*pstr = '\r';
|
|
||||||
pstr++;
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
*pstr = '\t';
|
|
||||||
pstr++;
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
*pstr++ = '\\';
|
|
||||||
*pstr++ = *str;
|
|
||||||
break;
|
|
||||||
case '\\':
|
|
||||||
*pstr = '\\';
|
|
||||||
pstr++;
|
|
||||||
break;
|
|
||||||
case '\'':
|
|
||||||
case '"':
|
|
||||||
if (quote) {
|
|
||||||
*pstr++ = '\\';
|
|
||||||
*pstr++ = *str;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
default:
|
|
||||||
*pstr = *str;
|
|
||||||
pstr++;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
ctrlOn = false;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t shellRunSingleCommand(TAOS *con, char *command) {
|
||||||
|
/* If command is empty just return */
|
||||||
|
if (isEmptyCommand(command)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Analyse the command.
|
||||||
|
if (regex_match(command, "^[ \t]*(quit|q|exit)[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
||||||
|
taos_close(con);
|
||||||
|
write_history();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regex_match(command, "^[\t ]*clear[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
||||||
|
// If clear the screen.
|
||||||
|
system("clear");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regex_match(command, "^[\t ]*set[ \t]+max_binary_display_width[ \t]+(default|[1-9][0-9]*)[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
||||||
|
strtok(command, " \t");
|
||||||
|
strtok(NULL, " \t");
|
||||||
|
char* p = strtok(NULL, " \t");
|
||||||
|
if (strcasecmp(p, "default") == 0) {
|
||||||
|
tsMaxBinaryDisplayWidth = DEFAULT_MAX_BINARY_DISPLAY_WIDTH;
|
||||||
} else {
|
} else {
|
||||||
if (*str == '\\') {
|
tsMaxBinaryDisplayWidth = atoi(p);
|
||||||
ctrlOn = true;
|
|
||||||
} else {
|
|
||||||
if (quote == *str) {
|
|
||||||
quote = 0;
|
|
||||||
} else if (*str == '\'' || *str == '"') {
|
|
||||||
quote = *str;
|
|
||||||
}
|
}
|
||||||
*pstr = *str;
|
return 0;
|
||||||
pstr++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (regex_match(command, "^[ \t]*source[\t ]+[^ ]+[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
||||||
|
/* If source file. */
|
||||||
|
char *c_ptr = strtok(command, " ;");
|
||||||
|
assert(c_ptr != NULL);
|
||||||
|
c_ptr = strtok(NULL, " ;");
|
||||||
|
assert(c_ptr != NULL);
|
||||||
|
source_file(con, c_ptr);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shellRunCommandOnServer(con, command);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
*pstr = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t shellRunCommand(TAOS* con, char* command) {
|
int32_t shellRunCommand(TAOS* con, char* command) {
|
||||||
/* If command is empty just return */
|
/* If command is empty just return */
|
||||||
if (regex_match(command, "^[ \t;]*$", REG_EXTENDED)) {
|
if (isEmptyCommand(command)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,32 +184,63 @@ int32_t shellRunCommand(TAOS *con, char *command) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shellReplaceCtrlChar(command);
|
bool esc = false;
|
||||||
|
char quote = 0, *cmd = command, *p = command;
|
||||||
|
for (char c = *command++; c != 0; c = *command++) {
|
||||||
|
if (esc) {
|
||||||
|
switch (c) {
|
||||||
|
case 'n':
|
||||||
|
c = '\n';
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
c = '\r';
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
c = '\t';
|
||||||
|
break;
|
||||||
|
case 'G':
|
||||||
|
*p++ = '\\';
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
case '"':
|
||||||
|
if (quote) {
|
||||||
|
*p++ = '\\';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*p++ = c;
|
||||||
|
esc = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Analyse the command.
|
if (c == '\\') {
|
||||||
if (regex_match(command, "^[ \t]*(quit|q|exit)[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
esc = true;
|
||||||
taos_close(con);
|
continue;
|
||||||
write_history();
|
}
|
||||||
|
|
||||||
|
if (quote == c) {
|
||||||
|
quote = 0;
|
||||||
|
} else if (c == '\'' || c == '"') {
|
||||||
|
quote = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p++ = c;
|
||||||
|
if (c == ';') {
|
||||||
|
c = *p;
|
||||||
|
*p = 0;
|
||||||
|
if (shellRunSingleCommand(con, cmd) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (regex_match(command, "^[\t ]*clear[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
}
|
||||||
// If clear the screen.
|
*p = c;
|
||||||
system("clear");
|
p = cmd;
|
||||||
return 0;
|
}
|
||||||
} else if (regex_match(command, "^[ \t]*source[\t ]+[^ ]+[ \t;]*$", REG_EXTENDED | REG_ICASE)) {
|
|
||||||
/* If source file. */
|
|
||||||
char *c_ptr = strtok(command, " ;");
|
|
||||||
assert(c_ptr != NULL);
|
|
||||||
c_ptr = strtok(NULL, " ;");
|
|
||||||
assert(c_ptr != NULL);
|
|
||||||
|
|
||||||
source_file(con, c_ptr);
|
|
||||||
} else {
|
|
||||||
shellRunCommandOnServer(con, command);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
*p = 0;
|
||||||
|
return shellRunSingleCommand(con, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void shellRunCommandOnServer(TAOS *con, char command[]) {
|
void shellRunCommandOnServer(TAOS *con, char command[]) {
|
||||||
int64_t st, et;
|
int64_t st, et;
|
||||||
wordexp_t full_path;
|
wordexp_t full_path;
|
||||||
|
@ -310,32 +340,91 @@ int regex_match(const char *s, const char *reg, int cflags) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
|
|
||||||
TAOS_ROW row = NULL;
|
|
||||||
int numOfRows = 0;
|
|
||||||
time_t tt;
|
|
||||||
char buf[25] = "\0";
|
|
||||||
struct tm *ptm;
|
|
||||||
int output_bytes = 0;
|
|
||||||
FILE * fp = NULL;
|
|
||||||
int num_fields = taos_field_count(con);
|
|
||||||
wordexp_t full_path;
|
|
||||||
|
|
||||||
assert(num_fields != 0);
|
static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
||||||
|
if (args.is_raw_time) {
|
||||||
result = taos_use_result(con);
|
sprintf(buf, "%" PRId64, val);
|
||||||
if (result == NULL) {
|
return buf;
|
||||||
taos_error(con);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fname != NULL) {
|
time_t tt;
|
||||||
|
if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
tt = (time_t)(val / 1000000);
|
||||||
|
} else {
|
||||||
|
tt = (time_t)(val / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm* ptm = localtime(&tt);
|
||||||
|
size_t pos = strftime(buf, 32, "%Y-%m-%d %H:%M:%S", ptm);
|
||||||
|
|
||||||
|
if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
sprintf(buf + pos, ".%06d", (int)(val % 1000000));
|
||||||
|
} else {
|
||||||
|
sprintf(buf + pos, ".%03d", (int)(val % 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void dumpFieldToFile(FILE* fp, const char* val, TAOS_FIELD* field, int32_t length, int precision) {
|
||||||
|
if (val == NULL) {
|
||||||
|
fprintf(fp, "%s", TSDB_DATA_NULL_STR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[TSDB_MAX_BYTES_PER_ROW];
|
||||||
|
switch (field->type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
fprintf(fp, "%d", ((((int)(*((char *)val))) == 1) ? 1 : 0));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
fprintf(fp, "%d", (int)(*((char *)val)));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
fprintf(fp, "%d", (int)(*((short *)val)));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
fprintf(fp, "%d", *((int *)val));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
fprintf(fp, "%" PRId64, *((int64_t *)val));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
fprintf(fp, "%.5f", GET_FLOAT_VAL(val));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
fprintf(fp, "%.9f", GET_DOUBLE_VAL(val));
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
memcpy(buf, val, length);
|
||||||
|
buf[length] = 0;
|
||||||
|
fprintf(fp, "\'%s\'", buf);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
formatTimestamp(buf, *(int64_t*)val, precision);
|
||||||
|
fprintf(fp, "'%s'", buf);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dumpResultToFile(const char* fname, TAOS_RES* result) {
|
||||||
|
TAOS_ROW row = taos_fetch_row(result);
|
||||||
|
if (row == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wordexp_t full_path;
|
||||||
|
|
||||||
if (wordexp(fname, &full_path, 0) != 0) {
|
if (wordexp(fname, &full_path, 0) != 0) {
|
||||||
fprintf(stderr, "ERROR: invalid file name: %s\n", fname);
|
fprintf(stderr, "ERROR: invalid file name: %s\n", fname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fp = fopen(full_path.we_wordv[0], "w");
|
FILE* fp = fopen(full_path.we_wordv[0], "w");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
fprintf(stderr, "ERROR: failed to open file: %s\n", full_path.we_wordv[0]);
|
fprintf(stderr, "ERROR: failed to open file: %s\n", full_path.we_wordv[0]);
|
||||||
wordfree(&full_path);
|
wordfree(&full_path);
|
||||||
|
@ -343,327 +432,255 @@ int shellDumpResult(TAOS *con, char *fname, int *error_no, bool printMode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
wordfree(&full_path);
|
wordfree(&full_path);
|
||||||
|
|
||||||
|
int num_fields = taos_num_fields(result);
|
||||||
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
|
int32_t* length = taos_fetch_lengths(result);
|
||||||
|
int precision = taos_result_precision(result);
|
||||||
|
|
||||||
|
for (int col = 0; col < num_fields; col++) {
|
||||||
|
if (col > 0) {
|
||||||
|
fprintf(fp, ",");
|
||||||
|
}
|
||||||
|
fprintf(fp, "%s", fields[col].name);
|
||||||
|
}
|
||||||
|
fputc('\n', fp);
|
||||||
|
|
||||||
|
int numOfRows = 0;
|
||||||
|
do {
|
||||||
|
for (int i = 0; i < num_fields; i++) {
|
||||||
|
if (i > 0) {
|
||||||
|
fputc(',', fp);
|
||||||
|
}
|
||||||
|
dumpFieldToFile(fp, row[i], fields +i, length[i], precision);
|
||||||
|
}
|
||||||
|
fputc('\n', fp);
|
||||||
|
|
||||||
|
numOfRows++;
|
||||||
|
row = taos_fetch_row(result);
|
||||||
|
} while( row != NULL);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
|
||||||
|
|
||||||
row = taos_fetch_row(result);
|
static void printField(const char* val, TAOS_FIELD* field, int width, int32_t length, int precision) {
|
||||||
int32_t* length = taos_fetch_lengths(result);
|
if (val == NULL) {
|
||||||
|
int w = width;
|
||||||
|
if (field->type < TSDB_DATA_TYPE_TINYINT || field->type > TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
w = 0;
|
||||||
|
}
|
||||||
|
w = printf("%*s", w, TSDB_DATA_NULL_STR);
|
||||||
|
for (; w < width; w++) {
|
||||||
|
putchar(' ');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char t_str[TSDB_MAX_BYTES_PER_ROW] = "\0";
|
char buf[TSDB_MAX_BYTES_PER_ROW];
|
||||||
int l[TSDB_MAX_COLUMNS] = {0};
|
switch (field->type) {
|
||||||
int maxLenColumnName = 0;
|
|
||||||
|
|
||||||
if (row) {
|
|
||||||
// Print the header indicator
|
|
||||||
if (fname == NULL) { // print to standard output
|
|
||||||
if (!printMode) {
|
|
||||||
for (int col = 0; col < num_fields; col++) {
|
|
||||||
switch (fields[col].type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
l[col] = MAX(BOOL_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*s", width, ((((int)(*((char *)val))) == 1) ? "true" : "false"));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
l[col] = MAX(TINYINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*d", width, (int)(*((char *)val)));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
l[col] = MAX(SMALLINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*d", width, (int)(*((short *)val)));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_INT:
|
case TSDB_DATA_TYPE_INT:
|
||||||
l[col] = MAX(INT_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*d", width, *((int *)val));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
l[col] = MAX(BIGINT_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*" PRId64, width, *((int64_t *)val));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
l[col] = MAX(FLOAT_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*.5f", width, GET_FLOAT_VAL(val));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
l[col] = MAX(DOUBLE_OUTPUT_LENGTH, strlen(fields[col].name));
|
printf("%*.9f", width, GET_DOUBLE_VAL(val));
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
l[col] = MAX(fields[col].bytes, strlen(fields[col].name));
|
shellPrintNChar(val, length, width);
|
||||||
/* l[col] = max(BINARY_OUTPUT_LENGTH, strlen(fields[col].name)); */
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
|
||||||
int32_t defaultWidth = TIMESTAMP_OUTPUT_LENGTH;
|
|
||||||
if (args.is_raw_time) {
|
|
||||||
defaultWidth = 14;
|
|
||||||
}
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
defaultWidth += 3;
|
|
||||||
}
|
|
||||||
l[col] = MAX(defaultWidth, strlen(fields[col].name));
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int spaces = (int)(l[col] - strlen(fields[col].name));
|
|
||||||
int left_space = spaces / 2;
|
|
||||||
int right_space = (spaces % 2 ? left_space + 1 : left_space);
|
|
||||||
printf("%*.s%s%*.s|", left_space, " ", fields[col].name, right_space, " ");
|
|
||||||
output_bytes += (l[col] + 1);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
for (int k = 0; k < output_bytes; k++) printf("=");
|
|
||||||
printf("\n");
|
|
||||||
} else {
|
|
||||||
for (int col = 0; col < num_fields; col++) {
|
|
||||||
if (strlen(fields[col].name) > maxLenColumnName) maxLenColumnName = strlen(fields[col].name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// print the elements
|
|
||||||
do {
|
|
||||||
if (!printMode) {
|
|
||||||
for (int i = 0; i < num_fields; i++) {
|
|
||||||
if (row[i] == NULL) {
|
|
||||||
printf("%*s|", l[i], TSDB_DATA_NULL_STR);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (fields[i].type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
printf("%*s|", l[i], ((((int)(*((char *)row[i]))) == 1) ? "true" : "false"));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
printf("%*d|", l[i], (int)(*((char *)row[i])));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
printf("%*d|", l[i], (int)(*((short *)row[i])));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
printf("%*d|", l[i], *((int *)row[i]));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
printf("%*" PRId64 "|", l[i], *((int64_t *)row[i]));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
|
||||||
float fv = 0;
|
|
||||||
fv = GET_FLOAT_VAL(row[i]);
|
|
||||||
printf("%*.5f|", l[i], fv);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
|
||||||
double dv = 0;
|
|
||||||
dv = GET_DOUBLE_VAL(row[i]);
|
|
||||||
printf("%*.9f|", l[i], dv);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
|
||||||
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
|
|
||||||
memcpy(t_str, row[i], length[i]);
|
|
||||||
/* printf("%-*s|",max(fields[i].bytes, strlen(fields[i].name)),
|
|
||||||
* t_str); */
|
|
||||||
/* printf("%-*s|", l[i], t_str); */
|
|
||||||
shellPrintNChar(t_str, l[i], printMode);
|
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
if (args.is_raw_time) {
|
formatTimestamp(buf, *(int64_t*)val, precision);
|
||||||
printf(" %" PRId64 "|", *(int64_t *)row[i]);
|
printf("%s", buf);
|
||||||
} else {
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
tt = (time_t)((*(int64_t *)row[i]) / 1000000);
|
|
||||||
} else {
|
|
||||||
tt = (time_t)((*(int64_t *)row[i]) / 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
ptm = localtime(&tt);
|
|
||||||
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
|
||||||
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
printf(" %s.%06d|", buf, (int)(*(int64_t *)row[i] % 1000000));
|
|
||||||
} else {
|
|
||||||
printf(" %s.%03d|", buf, (int)(*(int64_t *)row[i] % 1000));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("\n");
|
|
||||||
} else {
|
|
||||||
|
static int verticalPrintResult(TAOS_RES* result) {
|
||||||
|
TAOS_ROW row = taos_fetch_row(result);
|
||||||
|
if (row == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int num_fields = taos_num_fields(result);
|
||||||
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
|
int32_t* length = taos_fetch_lengths(result);
|
||||||
|
int precision = taos_result_precision(result);
|
||||||
|
|
||||||
|
int maxColNameLen = 0;
|
||||||
|
for (int col = 0; col < num_fields; col++) {
|
||||||
|
int len = strlen(fields[col].name);
|
||||||
|
if (len > maxColNameLen) {
|
||||||
|
maxColNameLen = len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int numOfRows = 0;
|
||||||
|
do {
|
||||||
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
||||||
for (int i = 0; i < num_fields; i++) {
|
for (int i = 0; i < num_fields; i++) {
|
||||||
// 1. print column name
|
TAOS_FIELD* field = fields + i;
|
||||||
int left_space = (int)(maxLenColumnName - strlen(fields[i].name));
|
|
||||||
printf("%*.s%s: ", left_space, " ", fields[i].name);
|
|
||||||
|
|
||||||
// 2. print column value
|
int padding = (int)(maxColNameLen - strlen(field->name));
|
||||||
if (row[i] == NULL) {
|
printf("%*.s%s: ", padding, " ", field->name);
|
||||||
printf("%s\n", TSDB_DATA_NULL_STR);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (fields[i].type) {
|
printField(row[i], field, 0, length[i], precision);
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
putchar('\n');
|
||||||
printf("%s\n", ((((int)(*((char *)row[i]))) == 1) ? "true" : "false"));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
printf("%d\n", (int)(*((char *)row[i])));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
printf("%d\n", (int)(*((short *)row[i])));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
printf("%d\n", *((int *)row[i]));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
printf("%" PRId64 "\n", *((int64_t *)row[i]));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
|
||||||
float fv = 0;
|
|
||||||
fv = GET_FLOAT_VAL(row[i]);
|
|
||||||
printf("%.5f\n", fv);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
|
||||||
double dv = 0;
|
|
||||||
dv = GET_DOUBLE_VAL(row[i]);
|
|
||||||
printf("%.9f\n", dv);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
|
||||||
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
|
|
||||||
memcpy(t_str, row[i], length[i]);
|
|
||||||
|
|
||||||
l[i] = MAX(fields[i].bytes, strlen(fields[i].name));
|
|
||||||
shellPrintNChar(t_str, l[i], printMode);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
if (args.is_raw_time) {
|
|
||||||
printf("%" PRId64 "\n", *(int64_t *)row[i]);
|
|
||||||
} else {
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
tt = (time_t)((*(int64_t *)row[i]) / 1000000);
|
|
||||||
} else {
|
|
||||||
tt = (time_t)((*(int64_t *)row[i]) / 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
ptm = localtime(&tt);
|
|
||||||
strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
|
|
||||||
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
printf("%s.%06d\n", buf, (int)(*(int64_t *)row[i] % 1000000));
|
|
||||||
} else {
|
|
||||||
printf("%s.%03d\n", buf, (int)(*(int64_t *)row[i] % 1000));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
} while ((row = taos_fetch_row(result)));
|
row = taos_fetch_row(result);
|
||||||
|
} while(row != NULL);
|
||||||
} else { // dump to file
|
|
||||||
// first write column
|
|
||||||
for (int col = 0; col < num_fields; col++) {
|
|
||||||
fprintf(fp, "%s", fields[col].name);
|
|
||||||
if (col < num_fields - 1) {
|
|
||||||
fprintf(fp, ",");
|
|
||||||
} else {
|
|
||||||
fprintf(fp, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
for (int i = 0; i < num_fields; i++) {
|
|
||||||
if (row[i]) {
|
|
||||||
switch (fields[i].type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
fprintf(fp, "%d", ((((int)(*((char *)row[i]))) == 1) ? 1 : 0));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
fprintf(fp, "%d", (int)(*((char *)row[i])));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
fprintf(fp, "%d", (int)(*((short *)row[i])));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
fprintf(fp, "%d", *((int *)row[i]));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
fprintf(fp, "%" PRId64, *((int64_t *)row[i]));
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
|
||||||
float fv = 0;
|
|
||||||
fv = GET_FLOAT_VAL(row[i]);
|
|
||||||
fprintf(fp, "%.5f", fv);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
|
||||||
double dv = 0;
|
|
||||||
dv = GET_DOUBLE_VAL(row[i]);
|
|
||||||
fprintf(fp, "%.9f", dv);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
|
||||||
memset(t_str, 0, TSDB_MAX_BYTES_PER_ROW);
|
|
||||||
memcpy(t_str, row[i], length[i]);
|
|
||||||
fprintf(fp, "\'%s\'", t_str);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
if (args.is_raw_time) {
|
|
||||||
fprintf(fp, "%" PRId64, *(int64_t *)row[i]);
|
|
||||||
} else {
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
tt = (time_t)((*(int64_t *)row[i]) / 1000000);
|
|
||||||
} else {
|
|
||||||
tt = (time_t)((*(int64_t *)row[i]) / 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
ptm = localtime(&tt);
|
|
||||||
strftime(buf, 64, "%Y-%m-%d %H:%M:%S", ptm);
|
|
||||||
|
|
||||||
if (taos_result_precision(result) == TSDB_TIME_PRECISION_MICRO) {
|
|
||||||
fprintf(fp, "\'%s.%06d\'", buf, (int)(*(int64_t *)row[i] % 1000000));
|
|
||||||
} else {
|
|
||||||
fprintf(fp, "\'%s.%03d\'", buf, (int)(*(int64_t *)row[i] % 1000));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(fp, "%s", TSDB_DATA_NULL_STR);
|
|
||||||
}
|
|
||||||
if (i < num_fields - 1) {
|
|
||||||
fprintf(fp, ",");
|
|
||||||
} else {
|
|
||||||
fprintf(fp, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
numOfRows++;
|
|
||||||
} while ((row = taos_fetch_row(result)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*error_no = taos_errno(con);
|
|
||||||
|
|
||||||
taos_free_result(result);
|
|
||||||
result = NULL;
|
|
||||||
|
|
||||||
if (fname != NULL) {
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return numOfRows;
|
return numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int calcColWidth(TAOS_FIELD* field, int precision) {
|
||||||
|
int width = strlen(field->name);
|
||||||
|
|
||||||
|
switch (field->type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
return MAX(5, width); // 'false'
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
return MAX(4, width); // '-127'
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
return MAX(6, width); // '-32767'
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
return MAX(11, width); // '-2147483648'
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
return MAX(21, width); // '-9223372036854775807'
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return MAX(20, width);
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
return MAX(25, width);
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
if (field->bytes > tsMaxBinaryDisplayWidth) {
|
||||||
|
return MAX(tsMaxBinaryDisplayWidth, width);
|
||||||
|
} else {
|
||||||
|
return MAX(field->bytes, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
if (args.is_raw_time) {
|
||||||
|
return MAX(14, width);
|
||||||
|
} else if (precision == TSDB_TIME_PRECISION_MICRO) {
|
||||||
|
return MAX(26, width); // '2020-01-01 00:00:00.000000'
|
||||||
|
} else {
|
||||||
|
return MAX(23, width); // '2020-01-01 00:00:00.000'
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void printHeader(TAOS_FIELD* fields, int* width, int num_fields) {
|
||||||
|
int rowWidth = 0;
|
||||||
|
for (int col = 0; col < num_fields; col++) {
|
||||||
|
TAOS_FIELD* field = fields + col;
|
||||||
|
int padding = (int)(width[col] - strlen(field->name));
|
||||||
|
int left = padding / 2;
|
||||||
|
printf(" %*.s%s%*.s |", left, " ", field->name, padding - left, " ");
|
||||||
|
rowWidth += width[col] + 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
putchar('\n');
|
||||||
|
for (int i = 0; i < rowWidth; i++) {
|
||||||
|
putchar('=');
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int horizontalPrintResult(TAOS_RES* result) {
|
||||||
|
TAOS_ROW row = taos_fetch_row(result);
|
||||||
|
if (row == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int num_fields = taos_num_fields(result);
|
||||||
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
|
int32_t* length = taos_fetch_lengths(result);
|
||||||
|
int precision = taos_result_precision(result);
|
||||||
|
|
||||||
|
int width[TSDB_MAX_COLUMNS];
|
||||||
|
for (int col = 0; col < num_fields; col++) {
|
||||||
|
width[col] = calcColWidth(fields + col, precision);
|
||||||
|
}
|
||||||
|
|
||||||
|
printHeader(fields, width, num_fields);
|
||||||
|
|
||||||
|
int numOfRows = 0;
|
||||||
|
do {
|
||||||
|
for (int i = 0; i < num_fields; i++) {
|
||||||
|
putchar(' ');
|
||||||
|
printField(row[i], fields + i, width[i], length[i], precision);
|
||||||
|
putchar(' ');
|
||||||
|
putchar('|');
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
numOfRows++;
|
||||||
|
row = taos_fetch_row(result);
|
||||||
|
} while(row != NULL);
|
||||||
|
|
||||||
|
return numOfRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int shellDumpResult(TAOS *con, char *fname, int *error_no, bool vertical) {
|
||||||
|
int numOfRows = 0;
|
||||||
|
|
||||||
|
TAOS_RES* result = taos_use_result(con);
|
||||||
|
if (result == NULL) {
|
||||||
|
taos_error(con);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fname != NULL) {
|
||||||
|
numOfRows = dumpResultToFile(fname, result);
|
||||||
|
} else if(vertical) {
|
||||||
|
numOfRows = verticalPrintResult(result);
|
||||||
|
} else {
|
||||||
|
numOfRows = horizontalPrintResult(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
*error_no = taos_errno(con);
|
||||||
|
taos_free_result(result);
|
||||||
|
return numOfRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void read_history() {
|
void read_history() {
|
||||||
// Initialize history
|
// Initialize history
|
||||||
memset(history.hist, 0, sizeof(char *) * MAX_HISTORY_SIZE);
|
memset(history.hist, 0, sizeof(char *) * MAX_HISTORY_SIZE);
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
#define _XOPEN_SOURCE
|
#define _XOPEN_SOURCE
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
|
|
|
@ -307,19 +307,13 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
do {
|
||||||
// Read command from shell.
|
// Read command from shell.
|
||||||
|
|
||||||
memset(command, 0, MAX_COMMAND_SIZE);
|
memset(command, 0, MAX_COMMAND_SIZE);
|
||||||
set_terminal_mode();
|
set_terminal_mode();
|
||||||
shellReadCommand(con, command);
|
shellReadCommand(con, command);
|
||||||
reset_terminal_mode();
|
reset_terminal_mode();
|
||||||
|
} while (shellRunCommand(con, command) == 0);
|
||||||
// Run the command
|
|
||||||
if (shellRunCommand(con, command) != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tfree(command);
|
tfree(command);
|
||||||
exitShell();
|
exitShell();
|
||||||
|
@ -329,34 +323,27 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(char *str, int width, bool printMode) {
|
void shellPrintNChar(const char *str, int length, int width) {
|
||||||
int col_left = width;
|
int pos = 0, cols = 0;
|
||||||
|
while (pos < length) {
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
while (col_left > 0) {
|
pos += mbtowc(&wc, str + pos, MB_CUR_MAX);
|
||||||
if (*str == '\0') break;
|
if (pos > length) {
|
||||||
char *tstr = str;
|
break;
|
||||||
int byte_width = mbtowc(&wc, tstr, MB_CUR_MAX);
|
}
|
||||||
if (byte_width <= 0) break;
|
|
||||||
int col_width = wcwidth(wc);
|
int w = wcwidth(wc);
|
||||||
if (col_width <= 0) {
|
if (w > 0) {
|
||||||
str += byte_width;
|
if (width > 0 && cols + w > width) {
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
if (col_left < col_width) break;
|
|
||||||
printf("%lc", wc);
|
printf("%lc", wc);
|
||||||
str += byte_width;
|
cols += w;
|
||||||
col_left -= col_width;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (col_left > 0) {
|
for (; cols < width; cols++) {
|
||||||
printf(" ");
|
putchar(' ');
|
||||||
col_left--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!printMode) {
|
|
||||||
printf("|");
|
|
||||||
} else {
|
|
||||||
printf("\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
|
|
||||||
TAOS* con;
|
TAOS* con;
|
||||||
pthread_t pid;
|
pthread_t pid;
|
||||||
int32_t TIMESTAMP_OUTPUT_LENGTH = 22;
|
|
||||||
|
|
||||||
// TODO: IMPLEMENT INTERRUPT HANDLER.
|
// TODO: IMPLEMENT INTERRUPT HANDLER.
|
||||||
void interruptHandler(int signum) {
|
void interruptHandler(int signum) {
|
||||||
|
|
|
@ -203,45 +203,42 @@ void *shellLoopQuery(void *arg) {
|
||||||
char *command = malloc(MAX_COMMAND_SIZE);
|
char *command = malloc(MAX_COMMAND_SIZE);
|
||||||
if (command == NULL) return NULL;
|
if (command == NULL) return NULL;
|
||||||
|
|
||||||
while (1) {
|
do {
|
||||||
memset(command, 0, MAX_COMMAND_SIZE);
|
memset(command, 0, MAX_COMMAND_SIZE);
|
||||||
shellPrintPrompt();
|
shellPrintPrompt();
|
||||||
|
|
||||||
// Read command from shell.
|
// Read command from shell.
|
||||||
shellReadCommand(con, command);
|
shellReadCommand(con, command);
|
||||||
|
} while (shellRunCommand(con, command) == 0);
|
||||||
// Run the command
|
|
||||||
shellRunCommand(con, command);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(char *str, int width, bool printMode) {
|
void shellPrintNChar(const char *str, int length, int width) {
|
||||||
int col_left = width;
|
int pos = 0, cols = 0;
|
||||||
|
while (pos < length) {
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
while (col_left > 0) {
|
int bytes = mbtowc(&wc, str + pos, MB_CUR_MAX);
|
||||||
if (*str == '\0') break;
|
pos += bytes;
|
||||||
char *tstr = str;
|
if (pos > length) {
|
||||||
int byte_width = mbtowc(&wc, tstr, MB_CUR_MAX);
|
break;
|
||||||
int col_width = byte_width;
|
}
|
||||||
if (col_left < col_width) break;
|
|
||||||
|
int w = bytes;
|
||||||
|
if (w > 0) {
|
||||||
|
if (width > 0 && cols + w > width) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
printf("%lc", wc);
|
printf("%lc", wc);
|
||||||
str += byte_width;
|
cols += w;
|
||||||
col_left -= col_width;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (col_left > 0) {
|
for (; cols < width; cols++) {
|
||||||
printf(" ");
|
putchar(' ');
|
||||||
col_left--;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!printMode) {
|
|
||||||
printf("|");
|
|
||||||
} else {
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void get_history_path(char *history) { sprintf(history, "%s/%s", ".", HISTORY_FILE); }
|
void get_history_path(char *history) { sprintf(history, "%s/%s", ".", HISTORY_FILE); }
|
||||||
|
|
||||||
|
|
|
@ -27,23 +27,23 @@ extern int32_t mDebugFlag;
|
||||||
extern int32_t sdbDebugFlag;
|
extern int32_t sdbDebugFlag;
|
||||||
|
|
||||||
// mnode log function
|
// mnode log function
|
||||||
#define mError(...) if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR MND ", 255, __VA_ARGS__); }
|
#define mError(...) { if (mDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR MND ", 255, __VA_ARGS__); }}
|
||||||
#define mWarn(...) if (mDebugFlag & DEBUG_WARN) { taosPrintLog("WARN MND ", mDebugFlag, __VA_ARGS__); }
|
#define mWarn(...) { if (mDebugFlag & DEBUG_WARN) { taosPrintLog("WARN MND ", mDebugFlag, __VA_ARGS__); }}
|
||||||
#define mTrace(...) if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", mDebugFlag, __VA_ARGS__); }
|
#define mTrace(...) { if (mDebugFlag & DEBUG_TRACE) { taosPrintLog("MND ", mDebugFlag, __VA_ARGS__); }}
|
||||||
#define mPrint(...) { taosPrintLog("MND ", 255, __VA_ARGS__); }
|
#define mPrint(...) { taosPrintLog("MND ", 255, __VA_ARGS__); }
|
||||||
|
|
||||||
#define mLError(...) monitorSaveLog(2, __VA_ARGS__); mError(__VA_ARGS__)
|
#define mLError(...) { monitorSaveLog(2, __VA_ARGS__); mError(__VA_ARGS__) }
|
||||||
#define mLWarn(...) monitorSaveLog(1, __VA_ARGS__); mWarn(__VA_ARGS__)
|
#define mLWarn(...) { monitorSaveLog(1, __VA_ARGS__); mWarn(__VA_ARGS__) }
|
||||||
#define mLPrint(...) monitorSaveLog(0, __VA_ARGS__); mPrint(__VA_ARGS__)
|
#define mLPrint(...) { monitorSaveLog(0, __VA_ARGS__); mPrint(__VA_ARGS__) }
|
||||||
|
|
||||||
#define sdbError(...) if (sdbDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR MND-SDB ", 255, __VA_ARGS__); }
|
#define sdbError(...) { if (sdbDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR MND-SDB ", 255, __VA_ARGS__); }}
|
||||||
#define sdbWarn(...) if (sdbDebugFlag & DEBUG_WARN) { taosPrintLog("WARN MND-SDB ", sdbDebugFlag, __VA_ARGS__); }
|
#define sdbWarn(...) { if (sdbDebugFlag & DEBUG_WARN) { taosPrintLog("WARN MND-SDB ", sdbDebugFlag, __VA_ARGS__); }}
|
||||||
#define sdbTrace(...) if (sdbDebugFlag & DEBUG_TRACE) { taosPrintLog("MND-SDB ", sdbDebugFlag, __VA_ARGS__);}
|
#define sdbTrace(...) { if (sdbDebugFlag & DEBUG_TRACE) { taosPrintLog("MND-SDB ", sdbDebugFlag, __VA_ARGS__);}}
|
||||||
#define sdbPrint(...) { taosPrintLog("MND-SDB ", 255, __VA_ARGS__); }
|
#define sdbPrint(...) { taosPrintLog("MND-SDB ", 255, __VA_ARGS__); }
|
||||||
|
|
||||||
#define sdbLError(...) monitorSaveLog(2, __VA_ARGS__); sdbError(__VA_ARGS__)
|
#define sdbLError(...) { monitorSaveLog(2, __VA_ARGS__); sdbError(__VA_ARGS__) }
|
||||||
#define sdbLWarn(...) monitorSaveLog(1, __VA_ARGS__); sdbWarn(__VA_ARGS__)
|
#define sdbLWarn(...) { monitorSaveLog(1, __VA_ARGS__); sdbWarn(__VA_ARGS__) }
|
||||||
#define sdbLPrint(...) monitorSaveLog(0, __VA_ARGS__); sdbPrint(__VA_ARGS__)
|
#define sdbLPrint(...) { monitorSaveLog(0, __VA_ARGS__); sdbPrint(__VA_ARGS__) }
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,11 +226,11 @@ static void taosGetSystemLocale() { // get and set default locale
|
||||||
if (cfg_locale && cfg_locale->cfgStatus < TAOS_CFG_CSTATUS_DEFAULT) {
|
if (cfg_locale && cfg_locale->cfgStatus < TAOS_CFG_CSTATUS_DEFAULT) {
|
||||||
locale = setlocale(LC_CTYPE, "");
|
locale = setlocale(LC_CTYPE, "");
|
||||||
if (locale == NULL) {
|
if (locale == NULL) {
|
||||||
uForcePrint("can't get locale from system, set it to en_US.UTF-8");
|
uError("can't get locale from system, set it to en_US.UTF-8");
|
||||||
strcpy(tsLocale, "en_US.UTF-8");
|
strcpy(tsLocale, "en_US.UTF-8");
|
||||||
} else {
|
} else {
|
||||||
strncpy(tsLocale, locale, tListLen(tsLocale));
|
strncpy(tsLocale, locale, tListLen(tsLocale));
|
||||||
uForcePrint("locale not configured, set to system default:%s", tsLocale);
|
uError("locale not configured, set to system default:%s", tsLocale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,10 +245,10 @@ static void taosGetSystemLocale() { // get and set default locale
|
||||||
strncpy(tsCharset, revisedCharset, tListLen(tsCharset));
|
strncpy(tsCharset, revisedCharset, tListLen(tsCharset));
|
||||||
|
|
||||||
free(revisedCharset);
|
free(revisedCharset);
|
||||||
uForcePrint("charset not configured, set to system default:%s", tsCharset);
|
uError("charset not configured, set to system default:%s", tsCharset);
|
||||||
} else {
|
} else {
|
||||||
strcpy(tsCharset, "UTF-8");
|
strcpy(tsCharset, "UTF-8");
|
||||||
uForcePrint("can't get locale and charset from system, set it to UTF-8");
|
uError("can't get locale and charset from system, set it to UTF-8");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,23 +20,10 @@
|
||||||
|
|
||||||
extern int32_t httpDebugFlag;
|
extern int32_t httpDebugFlag;
|
||||||
|
|
||||||
#define httpError(...) \
|
#define httpError(...) { if (httpDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR HTP ", 255, __VA_ARGS__); }}
|
||||||
if (httpDebugFlag & DEBUG_ERROR) { \
|
#define httpWarn(...) { if (httpDebugFlag & DEBUG_WARN) { taosPrintLog("WARN HTP ", httpDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR HTP ", 255, __VA_ARGS__); \
|
#define httpTrace(...) { if (httpDebugFlag & DEBUG_TRACE) { taosPrintLog("HTP ", httpDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define httpDump(...) { if (httpDebugFlag & DEBUG_TRACE) { taosPrintLongString("HTP ", httpDebugFlag, __VA_ARGS__); }}
|
||||||
#define httpWarn(...) \
|
#define httpPrint(...) { taosPrintLog("HTP ", 255, __VA_ARGS__); }
|
||||||
if (httpDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN HTP ", httpDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define httpTrace(...) \
|
|
||||||
if (httpDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("HTP ", httpDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define httpDump(...) \
|
|
||||||
if (httpDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLongString("HTP ", httpDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define httpPrint(...) \
|
|
||||||
{ taosPrintLog("HTP ", 255, __VA_ARGS__); }
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,20 +27,10 @@
|
||||||
#include "dnode.h"
|
#include "dnode.h"
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
|
|
||||||
#define monitorError(...) \
|
#define monitorError(...) { if (monitorDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR MON ", 255, __VA_ARGS__); }}
|
||||||
if (monitorDebugFlag & DEBUG_ERROR) { \
|
#define monitorWarn(...) { if (monitorDebugFlag & DEBUG_WARN) { taosPrintLog("WARN MON ", monitorDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR MON ", 255, __VA_ARGS__); \
|
#define monitorTrace(...) { if (monitorDebugFlag & DEBUG_TRACE) { taosPrintLog("MON ", monitorDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define monitorPrint(...) { taosPrintLog("MON ", 255, __VA_ARGS__); }
|
||||||
#define monitorWarn(...) \
|
|
||||||
if (monitorDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN MON ", monitorDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define monitorTrace(...) \
|
|
||||||
if (monitorDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("MON ", monitorDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define monitorPrint(...) \
|
|
||||||
{ taosPrintLog("MON ", 255, __VA_ARGS__); }
|
|
||||||
|
|
||||||
#define SQL_LENGTH 1024
|
#define SQL_LENGTH 1024
|
||||||
#define LOG_LEN_STR 100
|
#define LOG_LEN_STR 100
|
||||||
|
|
|
@ -24,23 +24,12 @@ extern "C" {
|
||||||
|
|
||||||
extern int32_t qDebugFlag;
|
extern int32_t qDebugFlag;
|
||||||
|
|
||||||
#define qTrace(...) \
|
#define qTrace(...) { if (qDebugFlag & DEBUG_TRACE) { taosPrintLog("QRY ", qDebugFlag, __VA_ARGS__); }}
|
||||||
if (qDebugFlag & DEBUG_TRACE) { \
|
#define qError(...) { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR QRY ", qDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("QRY ", qDebugFlag, __VA_ARGS__); \
|
#define qWarn(...) { if (qDebugFlag & DEBUG_WARN) { taosPrintLog("WARN QRY ", qDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
|
||||||
|
|
||||||
#define qError(...) \
|
|
||||||
if (qDebugFlag & DEBUG_ERROR) { \
|
|
||||||
taosPrintLog("ERROR QRY ", qDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define qWarn(...) \
|
|
||||||
if (qDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN QRY ", qDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TDENGINE_QUERY_CACHE_H
|
#endif // TDENGINE_QUERY_LOG_H
|
||||||
|
|
|
@ -5304,7 +5304,7 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
|
||||||
if (pColFilter->filterstr) {
|
if (pColFilter->filterstr) {
|
||||||
pColFilter->len = htobe64(pFilterMsg->len);
|
pColFilter->len = htobe64(pFilterMsg->len);
|
||||||
|
|
||||||
pColFilter->pz = (int64_t) calloc(1, pColFilter->len);
|
pColFilter->pz = (int64_t) calloc(1, pColFilter->len + 1 * TSDB_NCHAR_SIZE); // note: null-terminator
|
||||||
memcpy((void *)pColFilter->pz, pMsg, pColFilter->len);
|
memcpy((void *)pColFilter->pz, pMsg, pColFilter->len);
|
||||||
pMsg += (pColFilter->len + 1);
|
pMsg += (pColFilter->len + 1);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -24,27 +24,14 @@ extern "C" {
|
||||||
|
|
||||||
extern int32_t rpcDebugFlag;
|
extern int32_t rpcDebugFlag;
|
||||||
|
|
||||||
#define tError(...) \
|
#define tError(...) { if (rpcDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR RPC ", rpcDebugFlag, __VA_ARGS__); }}
|
||||||
if (rpcDebugFlag & DEBUG_ERROR) { \
|
#define tWarn(...) { if (rpcDebugFlag & DEBUG_WARN) { taosPrintLog("WARN RPC ", rpcDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR RPC ", rpcDebugFlag, __VA_ARGS__); \
|
#define tTrace(...) { if (rpcDebugFlag & DEBUG_TRACE) { taosPrintLog("RPC ", rpcDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define tDump(x, y) { if (rpcDebugFlag & DEBUG_DUMP) { taosDumpData((unsigned char *)x, y); }}
|
||||||
#define tWarn(...) \
|
#define tPrint(...) { taosPrintLog("RPC ", 255, __VA_ARGS__); }
|
||||||
if (rpcDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN RPC ", rpcDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define tTrace(...) \
|
|
||||||
if (rpcDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("RPC ", rpcDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define tPrint(...) \
|
|
||||||
{ taosPrintLog("RPC ", 255, __VA_ARGS__); }
|
|
||||||
#define tDump(x, y) \
|
|
||||||
if (rpcDebugFlag & DEBUG_DUMP) { \
|
|
||||||
taosDumpData((unsigned char *)x, y); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TDENGINE_RPC_CACHE_H
|
#endif // TDENGINE_RPC_LOG_H
|
||||||
|
|
|
@ -594,7 +594,10 @@ static SRpcConn *rpcAllocateServerConn(SRpcInfo *pRpc, SRecvInfo *pRecv) {
|
||||||
// check if it is already allocated
|
// check if it is already allocated
|
||||||
SRpcConn **ppConn = (SRpcConn **)(taosHashGet(pRpc->hash, hashstr, size));
|
SRpcConn **ppConn = (SRpcConn **)(taosHashGet(pRpc->hash, hashstr, size));
|
||||||
if (ppConn) pConn = *ppConn;
|
if (ppConn) pConn = *ppConn;
|
||||||
if (pConn) return pConn;
|
if (pConn) {
|
||||||
|
pConn->secured = 0;
|
||||||
|
return pConn;
|
||||||
|
}
|
||||||
|
|
||||||
int sid = taosAllocateId(pRpc->idPool);
|
int sid = taosAllocateId(pRpc->idPool);
|
||||||
if (sid <= 0) {
|
if (sid <= 0) {
|
||||||
|
|
|
@ -29,20 +29,10 @@ extern "C" {
|
||||||
|
|
||||||
extern int tsdbDebugFlag;
|
extern int tsdbDebugFlag;
|
||||||
|
|
||||||
#define tsdbError(...) \
|
#define tsdbError(...) { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("ERROR TDB ", tsdbDebugFlag, __VA_ARGS__); }}
|
||||||
if (tsdbDebugFlag & DEBUG_ERROR) { \
|
#define tsdbWarn(...) { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("WARN TDB ", tsdbDebugFlag, __VA_ARGS__); }}
|
||||||
taosPrintLog("ERROR TDB ", tsdbDebugFlag, __VA_ARGS__); \
|
#define tsdbTrace(...) { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }}
|
||||||
}
|
#define tsdbPrint(...) { taosPrintLog("TDB ", 255, __VA_ARGS__); }
|
||||||
#define tsdbWarn(...) \
|
|
||||||
if (tsdbDebugFlag & DEBUG_WARN) { \
|
|
||||||
taosPrintLog("WARN TDB ", tsdbDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define tsdbTrace(...) \
|
|
||||||
if (tsdbDebugFlag & DEBUG_TRACE) { \
|
|
||||||
taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); \
|
|
||||||
}
|
|
||||||
#define tsdbPrint(...) \
|
|
||||||
{ taosPrintLog("TDB ", 255, __VA_ARGS__); }
|
|
||||||
|
|
||||||
// ------------------------------ TSDB META FILE INTERFACES ------------------------------
|
// ------------------------------ TSDB META FILE INTERFACES ------------------------------
|
||||||
#define TSDB_META_FILE_NAME "meta"
|
#define TSDB_META_FILE_NAME "meta"
|
||||||
|
@ -96,11 +86,12 @@ typedef struct STable {
|
||||||
struct STable *next; // TODO: remove the next
|
struct STable *next; // TODO: remove the next
|
||||||
struct STable *prev;
|
struct STable *prev;
|
||||||
tstr * name; // NOTE: there a flexible string here
|
tstr * name; // NOTE: there a flexible string here
|
||||||
|
char * sql;
|
||||||
} STable;
|
} STable;
|
||||||
|
|
||||||
#define TSDB_GET_TABLE_LAST_KEY(tb) ((tb)->lastKey)
|
#define TSDB_GET_TABLE_LAST_KEY(tb) ((tb)->lastKey)
|
||||||
|
|
||||||
void * tsdbEncodeTable(STable *pTable, int *contLen);
|
void tsdbEncodeTable(STable *pTable, char *buf, int *contLen);
|
||||||
STable *tsdbDecodeTable(void *cont, int contLen);
|
STable *tsdbDecodeTable(void *cont, int contLen);
|
||||||
void tsdbFreeEncode(void *cont);
|
void tsdbFreeEncode(void *cont);
|
||||||
|
|
||||||
|
|
|
@ -446,7 +446,7 @@ int32_t tsdbInsertData(TsdbRepoT *repo, SSubmitMsg *pMsg, SShellSubmitRspMsg * p
|
||||||
*/
|
*/
|
||||||
int tsdbInitTableCfg(STableCfg *config, ETableType type, uint64_t uid, int32_t tid) {
|
int tsdbInitTableCfg(STableCfg *config, ETableType type, uint64_t uid, int32_t tid) {
|
||||||
if (config == NULL) return -1;
|
if (config == NULL) return -1;
|
||||||
if (type != TSDB_NORMAL_TABLE && type != TSDB_CHILD_TABLE) return -1;
|
if (type != TSDB_CHILD_TABLE && type != TSDB_NORMAL_TABLE && type != TSDB_STREAM_TABLE) return -1;
|
||||||
|
|
||||||
memset((void *)config, 0, sizeof(STableCfg));
|
memset((void *)config, 0, sizeof(STableCfg));
|
||||||
|
|
||||||
|
@ -455,6 +455,7 @@ int tsdbInitTableCfg(STableCfg *config, ETableType type, uint64_t uid, int32_t t
|
||||||
config->tableId.uid = uid;
|
config->tableId.uid = uid;
|
||||||
config->tableId.tid = tid;
|
config->tableId.tid = tid;
|
||||||
config->name = NULL;
|
config->name = NULL;
|
||||||
|
config->sql = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,12 +541,26 @@ int tsdbTableSetSName(STableCfg *config, char *sname, bool dup) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tsdbTableSetStreamSql(STableCfg *config, char *sql, bool dup) {
|
||||||
|
if (config->type != TSDB_STREAM_TABLE) return -1;
|
||||||
|
|
||||||
|
if (dup) {
|
||||||
|
config->sql = strdup(sql);
|
||||||
|
if (config->sql == NULL) return -1;
|
||||||
|
} else {
|
||||||
|
config->sql = sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void tsdbClearTableCfg(STableCfg *config) {
|
void tsdbClearTableCfg(STableCfg *config) {
|
||||||
if (config->schema) tdFreeSchema(config->schema);
|
if (config->schema) tdFreeSchema(config->schema);
|
||||||
if (config->tagSchema) tdFreeSchema(config->tagSchema);
|
if (config->tagSchema) tdFreeSchema(config->tagSchema);
|
||||||
if (config->tagValues) tdFreeDataRow(config->tagValues);
|
if (config->tagValues) tdFreeDataRow(config->tagValues);
|
||||||
tfree(config->name);
|
tfree(config->name);
|
||||||
tfree(config->sname);
|
tfree(config->sname);
|
||||||
|
tfree(config->sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbInitSubmitBlkIter(SSubmitBlk *pBlock, SSubmitBlkIter *pIter) {
|
int tsdbInitSubmitBlkIter(SSubmitBlk *pBlock, SSubmitBlkIter *pIter) {
|
||||||
|
@ -936,7 +951,7 @@ static SSkipListIterator **tsdbCreateTableIters(STsdbMeta *pMeta, int maxTables)
|
||||||
|
|
||||||
for (int tid = 1; tid < maxTables; tid++) {
|
for (int tid = 1; tid < maxTables; tid++) {
|
||||||
STable *pTable = pMeta->tables[tid];
|
STable *pTable = pMeta->tables[tid];
|
||||||
if (pTable == NULL || pTable->imem == NULL) continue;
|
if (pTable == NULL || pTable->imem == NULL || pTable->imem->numOfRows == 0) continue;
|
||||||
|
|
||||||
iters[tid] = tSkipListCreateIter(pTable->imem->pData);
|
iters[tid] = tSkipListCreateIter(pTable->imem->pData);
|
||||||
if (iters[tid] == NULL) goto _err;
|
if (iters[tid] == NULL) goto _err;
|
||||||
|
@ -973,7 +988,7 @@ static void *tsdbCommitData(void *arg) {
|
||||||
// Create the iterator to read from cache
|
// Create the iterator to read from cache
|
||||||
SSkipListIterator **iters = tsdbCreateTableIters(pMeta, pCfg->maxTables);
|
SSkipListIterator **iters = tsdbCreateTableIters(pMeta, pCfg->maxTables);
|
||||||
if (iters == NULL) {
|
if (iters == NULL) {
|
||||||
// TODO: deal with the error
|
ASSERT(0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1015,6 +1030,7 @@ _exit:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tsdbUnLockRepo(arg);
|
tsdbUnLockRepo(arg);
|
||||||
|
tsdbPrint("vgId:%d, commit over....", pRepo->config.tsdbId);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1196,7 +1212,7 @@ uint32_t tsdbGetFileInfo(TsdbRepoT *repo, char *name, uint32_t *index, int32_t *
|
||||||
// Map index to the file name
|
// Map index to the file name
|
||||||
int fid = (*index) / 3;
|
int fid = (*index) / 3;
|
||||||
|
|
||||||
if (fid > pFileH->numOfFGroups) {
|
if (fid >= pFileH->numOfFGroups) {
|
||||||
// return meta data file
|
// return meta data file
|
||||||
if ((*index) % 3 > 0) { // it is finished
|
if ((*index) % 3 > 0) { // it is finished
|
||||||
tfree(spath);
|
tfree(spath);
|
||||||
|
|
|
@ -15,7 +15,6 @@ static int32_t tsdbCheckTableCfg(STableCfg *pCfg);
|
||||||
static int tsdbAddTableToMeta(STsdbMeta *pMeta, STable *pTable, bool addIdx);
|
static int tsdbAddTableToMeta(STsdbMeta *pMeta, STable *pTable, bool addIdx);
|
||||||
static int tsdbAddTableIntoIndex(STsdbMeta *pMeta, STable *pTable);
|
static int tsdbAddTableIntoIndex(STsdbMeta *pMeta, STable *pTable);
|
||||||
static int tsdbRemoveTableFromIndex(STsdbMeta *pMeta, STable *pTable);
|
static int tsdbRemoveTableFromIndex(STsdbMeta *pMeta, STable *pTable);
|
||||||
static int tsdbEstimateTableEncodeSize(STable *pTable);
|
|
||||||
static int tsdbRemoveTableFromMeta(STsdbMeta *pMeta, STable *pTable, bool rmFromIdx);
|
static int tsdbRemoveTableFromMeta(STsdbMeta *pMeta, STable *pTable, bool rmFromIdx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,16 +27,10 @@ static int tsdbRemoveTableFromMeta(STsdbMeta *pMeta, STable *pTable, bool rm
|
||||||
* @return binary content for success
|
* @return binary content for success
|
||||||
* NULL fro failure
|
* NULL fro failure
|
||||||
*/
|
*/
|
||||||
void *tsdbEncodeTable(STable *pTable, int *contLen) {
|
void tsdbEncodeTable(STable *pTable, char *buf, int *contLen) {
|
||||||
if (pTable == NULL) return NULL;
|
if (pTable == NULL) return;
|
||||||
|
|
||||||
*contLen = tsdbEstimateTableEncodeSize(pTable);
|
void *ptr = buf;
|
||||||
if (*contLen < 0) return NULL;
|
|
||||||
|
|
||||||
void *ret = calloc(1, *contLen);
|
|
||||||
if (ret == NULL) return NULL;
|
|
||||||
|
|
||||||
void *ptr = ret;
|
|
||||||
T_APPEND_MEMBER(ptr, pTable, STable, type);
|
T_APPEND_MEMBER(ptr, pTable, STable, type);
|
||||||
// Encode name, todo refactor
|
// Encode name, todo refactor
|
||||||
*(int *)ptr = varDataLen(pTable->name);
|
*(int *)ptr = varDataLen(pTable->name);
|
||||||
|
@ -54,12 +47,17 @@ void *tsdbEncodeTable(STable *pTable, int *contLen) {
|
||||||
ptr = tdEncodeSchema(ptr, pTable->schema);
|
ptr = tdEncodeSchema(ptr, pTable->schema);
|
||||||
ptr = tdEncodeSchema(ptr, pTable->tagSchema);
|
ptr = tdEncodeSchema(ptr, pTable->tagSchema);
|
||||||
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
||||||
dataRowCpy(ptr, pTable->tagVal);
|
tdTagRowCpy(ptr, pTable->tagVal);
|
||||||
|
ptr = POINTER_SHIFT(ptr, dataRowLen(pTable->tagVal) + ((STagRow *)pTable->tagVal)->dataLen);
|
||||||
} else {
|
} else {
|
||||||
ptr = tdEncodeSchema(ptr, pTable->schema);
|
ptr = tdEncodeSchema(ptr, pTable->schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
if (pTable->type == TSDB_STREAM_TABLE) {
|
||||||
|
ptr = taosEncodeString(ptr, pTable->sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
*contLen = (char *)ptr - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -96,11 +94,16 @@ STable *tsdbDecodeTable(void *cont, int contLen) {
|
||||||
pTable->schema = tdDecodeSchema(&ptr);
|
pTable->schema = tdDecodeSchema(&ptr);
|
||||||
pTable->tagSchema = tdDecodeSchema(&ptr);
|
pTable->tagSchema = tdDecodeSchema(&ptr);
|
||||||
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
||||||
pTable->tagVal = tdDataRowDup(ptr);
|
pTable->tagVal = tdTagRowDecode(ptr);
|
||||||
|
ptr = POINTER_SHIFT(ptr, dataRowLen(pTable->tagVal) + ((STagRow *)pTable->tagVal)->dataLen);
|
||||||
} else {
|
} else {
|
||||||
pTable->schema = tdDecodeSchema(&ptr);
|
pTable->schema = tdDecodeSchema(&ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pTable->type == TSDB_STREAM_TABLE) {
|
||||||
|
ptr = taosDecodeString(ptr, &(pTable->sql));
|
||||||
|
}
|
||||||
|
|
||||||
pTable->lastKey = TSKEY_INITIAL_VAL;
|
pTable->lastKey = TSKEY_INITIAL_VAL;
|
||||||
return pTable;
|
return pTable;
|
||||||
}
|
}
|
||||||
|
@ -115,8 +118,10 @@ static char* getTagIndexKey(const void* pData) {
|
||||||
SDataRow row = elem->pTable->tagVal;
|
SDataRow row = elem->pTable->tagVal;
|
||||||
STSchema* pSchema = tsdbGetTableTagSchema(elem->pMeta, elem->pTable);
|
STSchema* pSchema = tsdbGetTableTagSchema(elem->pMeta, elem->pTable);
|
||||||
STColumn* pCol = &pSchema->columns[DEFAULT_TAG_INDEX_COLUMN];
|
STColumn* pCol = &pSchema->columns[DEFAULT_TAG_INDEX_COLUMN];
|
||||||
|
int16_t type = 0;
|
||||||
return tdGetRowDataOfCol(row, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset);
|
void * res = tdQueryTagByID(row, pCol->colId,&type);
|
||||||
|
ASSERT(type == pCol->type);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsdbRestoreTable(void *pHandle, void *cont, int contLen) {
|
int tsdbRestoreTable(void *pHandle, void *cont, int contLen) {
|
||||||
|
@ -212,7 +217,7 @@ int32_t tsdbFreeMeta(STsdbMeta *pMeta) {
|
||||||
}
|
}
|
||||||
|
|
||||||
STSchema *tsdbGetTableSchema(STsdbMeta *pMeta, STable *pTable) {
|
STSchema *tsdbGetTableSchema(STsdbMeta *pMeta, STable *pTable) {
|
||||||
if (pTable->type == TSDB_NORMAL_TABLE || pTable->type == TSDB_SUPER_TABLE) {
|
if (pTable->type == TSDB_NORMAL_TABLE || pTable->type == TSDB_SUPER_TABLE || pTable->type == TSDB_STREAM_TABLE) {
|
||||||
return pTable->schema;
|
return pTable->schema;
|
||||||
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
||||||
STable *pSuper = tsdbGetTableByUid(pMeta, pTable->superUid);
|
STable *pSuper = tsdbGetTableByUid(pMeta, pTable->superUid);
|
||||||
|
@ -256,8 +261,9 @@ int32_t tsdbGetTableTagVal(TsdbRepoT* repo, STableId* id, int32_t colId, int16_t
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataRow row = (SDataRow)pTable->tagVal;
|
SDataRow row = (SDataRow)pTable->tagVal;
|
||||||
char* d = tdGetRowDataOfCol(row, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset);
|
int16_t tagtype = 0;
|
||||||
|
char* d = tdQueryTagByID(row, pCol->colId, &tagtype);
|
||||||
|
//ASSERT((int8_t)tagtype == pCol->type)
|
||||||
*val = d;
|
*val = d;
|
||||||
*type = pCol->type;
|
*type = pCol->type;
|
||||||
*bytes = pCol->bytes;
|
*bytes = pCol->bytes;
|
||||||
|
@ -284,6 +290,76 @@ char* tsdbGetTableName(TsdbRepoT *repo, const STableId* id, int16_t* bytes) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static STable *tsdbNewTable(STableCfg *pCfg, bool isSuper) {
|
||||||
|
STable *pTable = NULL;
|
||||||
|
size_t tsize = 0;
|
||||||
|
|
||||||
|
pTable = (STable *)calloc(1, sizeof(STable));
|
||||||
|
if (pTable == NULL) {
|
||||||
|
terrno = TSDB_CODE_SERV_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
pTable->type = pCfg->type;
|
||||||
|
|
||||||
|
if (isSuper) {
|
||||||
|
pTable->type = TSDB_SUPER_TABLE;
|
||||||
|
pTable->tableId.uid = pCfg->superUid;
|
||||||
|
pTable->tableId.tid = -1;
|
||||||
|
pTable->superUid = TSDB_INVALID_SUPER_TABLE_ID;
|
||||||
|
pTable->schema = tdDupSchema(pCfg->schema);
|
||||||
|
pTable->tagSchema = tdDupSchema(pCfg->tagSchema);
|
||||||
|
|
||||||
|
tsize = strnlen(pCfg->sname, TSDB_TABLE_NAME_LEN);
|
||||||
|
pTable->name = calloc(1, tsize + VARSTR_HEADER_SIZE + 1);
|
||||||
|
if (pTable->name == NULL) {
|
||||||
|
terrno = TSDB_CODE_SERV_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
STR_WITH_SIZE_TO_VARSTR(pTable->name, pCfg->sname, tsize);
|
||||||
|
|
||||||
|
STColumn *pColSchema = schemaColAt(pTable->tagSchema, 0);
|
||||||
|
pTable->pIndex = tSkipListCreate(TSDB_SUPER_TABLE_SL_LEVEL, pColSchema->type, pColSchema->bytes, 1, 0, 0,
|
||||||
|
getTagIndexKey); // Allow duplicate key, no lock
|
||||||
|
if (pTable->pIndex == NULL) {
|
||||||
|
terrno = TSDB_CODE_SERV_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pTable->type = pCfg->type;
|
||||||
|
pTable->tableId.uid = pCfg->tableId.uid;
|
||||||
|
pTable->tableId.tid = pCfg->tableId.tid;
|
||||||
|
pTable->lastKey = TSKEY_INITIAL_VAL;
|
||||||
|
|
||||||
|
tsize = strnlen(pCfg->name, TSDB_TABLE_NAME_LEN);
|
||||||
|
pTable->name = calloc(1, tsize + VARSTR_HEADER_SIZE + 1);
|
||||||
|
if (pTable->name == NULL) {
|
||||||
|
terrno = TSDB_CODE_SERV_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
STR_WITH_SIZE_TO_VARSTR(pTable->name, pCfg->name, tsize);
|
||||||
|
|
||||||
|
if (pCfg->type == TSDB_CHILD_TABLE) {
|
||||||
|
pTable->superUid = pCfg->superUid;
|
||||||
|
pTable->tagVal = tdDataRowDup(pCfg->tagValues);
|
||||||
|
} else if (pCfg->type == TSDB_NORMAL_TABLE) {
|
||||||
|
pTable->superUid = -1;
|
||||||
|
pTable->schema = tdDupSchema(pCfg->schema);
|
||||||
|
} else {
|
||||||
|
ASSERT(pCfg->type == TSDB_STREAM_TABLE);
|
||||||
|
pTable->superUid = -1;
|
||||||
|
pTable->schema = tdDupSchema(pCfg->schema);
|
||||||
|
pTable->sql = strdup(pCfg->sql);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pTable;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tsdbFreeTable(pTable);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int tsdbCreateTable(TsdbRepoT *repo, STableCfg *pCfg) {
|
int tsdbCreateTable(TsdbRepoT *repo, STableCfg *pCfg) {
|
||||||
STsdbRepo *pRepo = (STsdbRepo *)repo;
|
STsdbRepo *pRepo = (STsdbRepo *)repo;
|
||||||
STsdbMeta *pMeta = pRepo->tsdbMeta;
|
STsdbMeta *pMeta = pRepo->tsdbMeta;
|
||||||
|
@ -304,62 +380,22 @@ int tsdbCreateTable(TsdbRepoT *repo, STableCfg *pCfg) {
|
||||||
super = tsdbGetTableByUid(pMeta, pCfg->superUid);
|
super = tsdbGetTableByUid(pMeta, pCfg->superUid);
|
||||||
if (super == NULL) { // super table not exists, try to create it
|
if (super == NULL) { // super table not exists, try to create it
|
||||||
newSuper = 1;
|
newSuper = 1;
|
||||||
// TODO: use function to implement create table object
|
super = tsdbNewTable(pCfg, true);
|
||||||
super = (STable *)calloc(1, sizeof(STable));
|
|
||||||
if (super == NULL) return -1;
|
if (super == NULL) return -1;
|
||||||
|
|
||||||
super->type = TSDB_SUPER_TABLE;
|
|
||||||
super->tableId.uid = pCfg->superUid;
|
|
||||||
super->tableId.tid = -1;
|
|
||||||
super->superUid = TSDB_INVALID_SUPER_TABLE_ID;
|
|
||||||
super->schema = tdDupSchema(pCfg->schema);
|
|
||||||
super->tagSchema = tdDupSchema(pCfg->tagSchema);
|
|
||||||
super->tagVal = NULL;
|
|
||||||
|
|
||||||
// todo refactor extract method
|
|
||||||
size_t size = strnlen(pCfg->sname, TSDB_TABLE_NAME_LEN);
|
|
||||||
super->name = calloc(1, size + VARSTR_HEADER_SIZE + 1);
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(super->name, pCfg->sname, size);
|
|
||||||
|
|
||||||
// index the first tag column
|
|
||||||
STColumn* pColSchema = schemaColAt(super->tagSchema, 0);
|
|
||||||
super->pIndex = tSkipListCreate(TSDB_SUPER_TABLE_SL_LEVEL, pColSchema->type, pColSchema->bytes,
|
|
||||||
1, 0, 1, getTagIndexKey); // Allow duplicate key, no lock
|
|
||||||
|
|
||||||
if (super->pIndex == NULL) {
|
|
||||||
tdFreeSchema(super->schema);
|
|
||||||
tdFreeSchema(super->tagSchema);
|
|
||||||
tdFreeDataRow(super->tagVal);
|
|
||||||
free(super);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (super->type != TSDB_SUPER_TABLE) return -1;
|
if (super->type != TSDB_SUPER_TABLE) return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STable *table = (STable *)calloc(1, sizeof(STable));
|
STable *table = tsdbNewTable(pCfg, false);
|
||||||
if (table == NULL) {
|
if (table == NULL) {
|
||||||
if (newSuper) tsdbFreeTable(super);
|
if (newSuper) {
|
||||||
|
tsdbFreeTable(super);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
table->tableId = pCfg->tableId;
|
|
||||||
|
|
||||||
size_t size = strnlen(pCfg->name, TSDB_TABLE_NAME_LEN);
|
|
||||||
table->name = calloc(1, size + VARSTR_HEADER_SIZE + 1);
|
|
||||||
STR_WITH_SIZE_TO_VARSTR(table->name, pCfg->name, size);
|
|
||||||
|
|
||||||
table->lastKey = TSKEY_INITIAL_VAL;
|
table->lastKey = TSKEY_INITIAL_VAL;
|
||||||
if (IS_CREATE_STABLE(pCfg)) { // TSDB_CHILD_TABLE
|
|
||||||
table->type = TSDB_CHILD_TABLE;
|
|
||||||
table->superUid = pCfg->superUid;
|
|
||||||
table->tagVal = tdDataRowDup(pCfg->tagValues);
|
|
||||||
} else { // TSDB_NORMAL_TABLE
|
|
||||||
table->type = TSDB_NORMAL_TABLE;
|
|
||||||
table->superUid = -1;
|
|
||||||
table->schema = tdDupSchema(pCfg->schema);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register to meta
|
// Register to meta
|
||||||
if (newSuper) {
|
if (newSuper) {
|
||||||
|
@ -373,15 +409,15 @@ int tsdbCreateTable(TsdbRepoT *repo, STableCfg *pCfg) {
|
||||||
|
|
||||||
// Write to meta file
|
// Write to meta file
|
||||||
int bufLen = 0;
|
int bufLen = 0;
|
||||||
|
char *buf = malloc(1024*1024);
|
||||||
if (newSuper) {
|
if (newSuper) {
|
||||||
void *buf = tsdbEncodeTable(super, &bufLen);
|
tsdbEncodeTable(super, buf, &bufLen);
|
||||||
tsdbInsertMetaRecord(pMeta->mfh, super->tableId.uid, buf, bufLen);
|
tsdbInsertMetaRecord(pMeta->mfh, super->tableId.uid, buf, bufLen);
|
||||||
tsdbFreeEncode(buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *buf = tsdbEncodeTable(table, &bufLen);
|
tsdbEncodeTable(table, buf, &bufLen);
|
||||||
tsdbInsertMetaRecord(pMeta->mfh, table->tableId.uid, buf, bufLen);
|
tsdbInsertMetaRecord(pMeta->mfh, table->tableId.uid, buf, bufLen);
|
||||||
tsdbFreeEncode(buf);
|
tfree(buf);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -439,13 +475,18 @@ static void tsdbFreeMemTable(SMemTable *pMemTable) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbFreeTable(STable *pTable) {
|
static int tsdbFreeTable(STable *pTable) {
|
||||||
// TODO: finish this function
|
if (pTable == NULL) return 0;
|
||||||
|
|
||||||
if (pTable->type == TSDB_CHILD_TABLE) {
|
if (pTable->type == TSDB_CHILD_TABLE) {
|
||||||
tdFreeDataRow(pTable->tagVal);
|
tdFreeTagRow(pTable->tagVal);
|
||||||
} else {
|
} else {
|
||||||
tdFreeSchema(pTable->schema);
|
tdFreeSchema(pTable->schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pTable->type == TSDB_STREAM_TABLE) {
|
||||||
|
tfree(pTable->sql);
|
||||||
|
}
|
||||||
|
|
||||||
// Free content
|
// Free content
|
||||||
if (TSDB_TABLE_IS_SUPER_TABLE(pTable)) {
|
if (TSDB_TABLE_IS_SUPER_TABLE(pTable)) {
|
||||||
tdFreeSchema(pTable->tagSchema);
|
tdFreeSchema(pTable->tagSchema);
|
||||||
|
@ -492,6 +533,9 @@ static int tsdbAddTableToMeta(STsdbMeta *pMeta, STable *pTable, bool addIdx) {
|
||||||
if (pTable->type == TSDB_CHILD_TABLE && addIdx) { // add STABLE to the index
|
if (pTable->type == TSDB_CHILD_TABLE && addIdx) { // add STABLE to the index
|
||||||
tsdbAddTableIntoIndex(pMeta, pTable);
|
tsdbAddTableIntoIndex(pMeta, pTable);
|
||||||
}
|
}
|
||||||
|
if (pTable->type == TSDB_STREAM_TABLE && addIdx) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
pMeta->nTables++;
|
pMeta->nTables++;
|
||||||
}
|
}
|
||||||
|
@ -523,7 +567,6 @@ static int tsdbRemoveTableFromMeta(STsdbMeta *pMeta, STable *pTable, bool rmFrom
|
||||||
|
|
||||||
tSkipListDestroyIter(pIter);
|
tSkipListDestroyIter(pIter);
|
||||||
|
|
||||||
// TODO: Remove the table from the list
|
|
||||||
if (pTable->prev != NULL) {
|
if (pTable->prev != NULL) {
|
||||||
pTable->prev->next = pTable->next;
|
pTable->prev->next = pTable->next;
|
||||||
if (pTable->next != NULL) {
|
if (pTable->next != NULL) {
|
||||||
|
@ -537,6 +580,9 @@ static int tsdbRemoveTableFromMeta(STsdbMeta *pMeta, STable *pTable, bool rmFrom
|
||||||
if (pTable->type == TSDB_CHILD_TABLE && rmFromIdx) {
|
if (pTable->type == TSDB_CHILD_TABLE && rmFromIdx) {
|
||||||
tsdbRemoveTableFromIndex(pMeta, pTable);
|
tsdbRemoveTableFromIndex(pMeta, pTable);
|
||||||
}
|
}
|
||||||
|
if (pTable->type == TSDB_STREAM_TABLE && rmFromIdx) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
pMeta->nTables--;
|
pMeta->nTables--;
|
||||||
}
|
}
|
||||||
|
@ -580,7 +626,9 @@ static int tsdbRemoveTableFromIndex(STsdbMeta *pMeta, STable *pTable) {
|
||||||
STSchema* pSchema = tsdbGetTableTagSchema(pMeta, pTable);
|
STSchema* pSchema = tsdbGetTableTagSchema(pMeta, pTable);
|
||||||
STColumn* pCol = &pSchema->columns[DEFAULT_TAG_INDEX_COLUMN];
|
STColumn* pCol = &pSchema->columns[DEFAULT_TAG_INDEX_COLUMN];
|
||||||
|
|
||||||
char* key = tdGetRowDataOfCol(pTable->tagVal, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset);
|
int16_t tagtype = 0;
|
||||||
|
char* key = tdQueryTagByID(pTable->tagVal, pCol->colId, &tagtype);
|
||||||
|
ASSERT(pCol->type == tagtype);
|
||||||
SArray* res = tSkipListGet(pSTable->pIndex, key);
|
SArray* res = tSkipListGet(pSTable->pIndex, key);
|
||||||
|
|
||||||
size_t size = taosArrayGetSize(res);
|
size_t size = taosArrayGetSize(res);
|
||||||
|
@ -599,25 +647,6 @@ static int tsdbRemoveTableFromIndex(STsdbMeta *pMeta, STable *pTable) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbEstimateTableEncodeSize(STable *pTable) {
|
|
||||||
int size = 0;
|
|
||||||
size += T_MEMBER_SIZE(STable, type);
|
|
||||||
size += sizeof(int) + varDataLen(pTable->name);
|
|
||||||
size += T_MEMBER_SIZE(STable, tableId);
|
|
||||||
size += T_MEMBER_SIZE(STable, superUid);
|
|
||||||
size += T_MEMBER_SIZE(STable, sversion);
|
|
||||||
|
|
||||||
if (pTable->type == TSDB_SUPER_TABLE) {
|
|
||||||
size += tdGetSchemaEncodeSize(pTable->schema);
|
|
||||||
size += tdGetSchemaEncodeSize(pTable->tagSchema);
|
|
||||||
} else if (pTable->type == TSDB_CHILD_TABLE) {
|
|
||||||
size += dataRowLen(pTable->tagVal);
|
|
||||||
} else {
|
|
||||||
size += tdGetSchemaEncodeSize(pTable->schema);
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *getTSTupleKey(const void * data) {
|
char *getTSTupleKey(const void * data) {
|
||||||
SDataRow row = (SDataRow)data;
|
SDataRow row = (SDataRow)data;
|
||||||
|
|
|
@ -1900,9 +1900,9 @@ int32_t tableGroupComparFn(const void *p1, const void *p2, const void *param) {
|
||||||
STColumn* pCol = schemaColAt(pTableGroupSupp->pTagSchema, colIndex);
|
STColumn* pCol = schemaColAt(pTableGroupSupp->pTagSchema, colIndex);
|
||||||
bytes = pCol->bytes;
|
bytes = pCol->bytes;
|
||||||
type = pCol->type;
|
type = pCol->type;
|
||||||
|
int16_t tgtype1, tgtype2 = 0;
|
||||||
f1 = tdGetRowDataOfCol(pTable1->tagVal, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset);
|
f1 = tdQueryTagByID(pTable1->tagVal, pCol->colId, &tgtype1);
|
||||||
f2 = tdGetRowDataOfCol(pTable2->tagVal, pCol->type, TD_DATA_ROW_HEAD_SIZE + pCol->offset);
|
f2 = tdQueryTagByID(pTable2->tagVal, pCol->colId, &tgtype2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ret = doCompare(f1, f2, type, bytes);
|
int32_t ret = doCompare(f1, f2, type, bytes);
|
||||||
|
@ -1990,12 +1990,14 @@ bool indexedNodeFilterFp(const void* pNode, void* param) {
|
||||||
val = (char*) elem->pTable->name;
|
val = (char*) elem->pTable->name;
|
||||||
type = TSDB_DATA_TYPE_BINARY;
|
type = TSDB_DATA_TYPE_BINARY;
|
||||||
} else {
|
} else {
|
||||||
STSchema* pTSchema = (STSchema*) pInfo->param; // todo table schema is identical to stable schema??
|
// STSchema* pTSchema = (STSchema*) pInfo->param; // todo table schema is identical to stable schema??
|
||||||
|
int16_t type;
|
||||||
int32_t offset = pTSchema->columns[pInfo->colIndex].offset;
|
// int32_t offset = pTSchema->columns[pInfo->colIndex].offset;
|
||||||
val = tdGetRowDataOfCol(elem->pTable->tagVal, pInfo->sch.type, TD_DATA_ROW_HEAD_SIZE + offset);
|
// val = tdGetRowDataOfCol(elem->pTable->tagVal, pInfo->sch.type, TD_DATA_ROW_HEAD_SIZE + offset);
|
||||||
|
val = tdQueryTagByID(elem->pTable->tagVal, pInfo->sch.colId, &type);
|
||||||
|
// ASSERT(pInfo->sch.type == type);
|
||||||
}
|
}
|
||||||
|
//todo :the val is possible to be null, so check it out carefully
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
if (pInfo->optr == TSDB_RELATION_IN) {
|
if (pInfo->optr == TSDB_RELATION_IN) {
|
||||||
|
|
|
@ -217,6 +217,28 @@ static FORCE_INLINE void *taosDecodeVariant64(void *buf, uint64_t *value) {
|
||||||
return NULL; // error happened
|
return NULL; // error happened
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosEncodeString(void *buf, char *value) {
|
||||||
|
size_t size = strlen(value);
|
||||||
|
|
||||||
|
buf = taosEncodeVariant64(buf, size);
|
||||||
|
memcpy(buf, value, size);
|
||||||
|
|
||||||
|
return POINTER_SHIFT(buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosDecodeString(void *buf, char **value) {
|
||||||
|
uint64_t size = 0;
|
||||||
|
|
||||||
|
buf = taosDecodeVariant64(buf, &size);
|
||||||
|
*value = (char *)malloc(size + 1);
|
||||||
|
if (*value == NULL) return NULL;
|
||||||
|
memcpy(*value, buf, size);
|
||||||
|
|
||||||
|
(*value)[size] = '\0';
|
||||||
|
|
||||||
|
return POINTER_SHIFT(buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _BSD_SOURCE
|
||||||
#define _XOPEN_SOURCE
|
#define _XOPEN_SOURCE
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,7 @@ static int32_t vnodeProcessSubmitMsg(SVnodeObj *pVnode, void *pCont, SRspRet *pR
|
||||||
static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pCont, SRspRet *pRet) {
|
static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pCont, SRspRet *pRet) {
|
||||||
SMDCreateTableMsg *pTable = pCont;
|
SMDCreateTableMsg *pTable = pCont;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
char sql[1024] = "\0";
|
||||||
|
|
||||||
vTrace("vgId:%d, table:%s, start to create", pVnode->vgId, pTable->tableId);
|
vTrace("vgId:%d, table:%s, start to create", pVnode->vgId, pTable->tableId);
|
||||||
int16_t numOfColumns = htons(pTable->numOfColumns);
|
int16_t numOfColumns = htons(pTable->numOfColumns);
|
||||||
|
@ -139,16 +140,23 @@ static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pCont, SRspRe
|
||||||
|
|
||||||
char *pTagData = pTable->data + totalCols * sizeof(SSchema);
|
char *pTagData = pTable->data + totalCols * sizeof(SSchema);
|
||||||
int accumBytes = 0;
|
int accumBytes = 0;
|
||||||
dataRow = tdNewDataRowFromSchema(pDestTagSchema);
|
//dataRow = tdNewDataRowFromSchema(pDestTagSchema);
|
||||||
|
dataRow = tdNewTagRowFromSchema(pDestTagSchema, numOfTags);
|
||||||
|
|
||||||
for (int i = 0; i < numOfTags; i++) {
|
for (int i = 0; i < numOfTags; i++) {
|
||||||
STColumn *pTCol = schemaColAt(pDestTagSchema, i);
|
STColumn *pTCol = schemaColAt(pDestTagSchema, i);
|
||||||
tdAppendColVal(dataRow, pTagData + accumBytes, pTCol->type, pTCol->bytes, pTCol->offset);
|
// tdAppendColVal(dataRow, pTagData + accumBytes, pTCol->type, pTCol->bytes, pTCol->offset);
|
||||||
|
tdAppendTagColVal(dataRow, pTagData + accumBytes, pTCol->type, pTCol->bytes, pTCol->colId);
|
||||||
accumBytes += htons(pSchema[i + numOfColumns].bytes);
|
accumBytes += htons(pSchema[i + numOfColumns].bytes);
|
||||||
}
|
}
|
||||||
tsdbTableSetTagValue(&tCfg, dataRow, false);
|
tsdbTableSetTagValue(&tCfg, dataRow, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pTable->tableType == TSDB_STREAM_TABLE) {
|
||||||
|
// TODO: set sql value
|
||||||
|
tsdbTableSetStreamSql(&tCfg, sql, false);
|
||||||
|
}
|
||||||
|
|
||||||
code = tsdbCreateTable(pVnode->tsdb, &tCfg);
|
code = tsdbCreateTable(pVnode->tsdb, &tCfg);
|
||||||
tdFreeDataRow(dataRow);
|
tdFreeDataRow(dataRow);
|
||||||
tfree(pDestTagSchema);
|
tfree(pDestTagSchema);
|
||||||
|
|
|
@ -129,4 +129,6 @@ python3 ./test.py -f user/pass_len.py
|
||||||
|
|
||||||
#query
|
#query
|
||||||
python3 ./test.py -f query/filter.py
|
python3 ./test.py -f query/filter.py
|
||||||
|
python3 ./test.py $1 -f query/filterCombo.py
|
||||||
|
python3 ./test.py $1 -f query/queryNormal.py
|
||||||
|
python3 ./test.py $1 -f query/queryError.py
|
||||||
|
|
|
@ -46,7 +46,6 @@ class TDTestCase:
|
||||||
tdLog.info('insert data until the first commit')
|
tdLog.info('insert data until the first commit')
|
||||||
dnodesDir = tdDnodes.getDnodesRootDir()
|
dnodesDir = tdDnodes.getDnodesRootDir()
|
||||||
dataDir = dnodesDir + '/dnode1/data/vnode'
|
dataDir = dnodesDir + '/dnode1/data/vnode'
|
||||||
tdLog.info('CBD: dataDir=%s' % dataDir)
|
|
||||||
startTime = self.startTime
|
startTime = self.startTime
|
||||||
rid0 = 1
|
rid0 = 1
|
||||||
while (True):
|
while (True):
|
||||||
|
|
|
@ -29,7 +29,8 @@ class TDTestCase:
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
|
|
||||||
tdLog.info("=============== step1")
|
tdLog.info("=============== step1")
|
||||||
tdSql.execute('create table tb (ts timestamp, speed int, temp float, note binary(5), flag bool)')
|
tdSql.execute(
|
||||||
|
'create table tb (ts timestamp, speed int, temp float, note binary(5), flag bool)')
|
||||||
|
|
||||||
numOfRecords = 0
|
numOfRecords = 0
|
||||||
randomList = [10, 50, 100, 500, 1000, 5000]
|
randomList = [10, 50, 100, 500, 1000, 5000]
|
||||||
|
@ -38,9 +39,11 @@ class TDTestCase:
|
||||||
tdLog.info("will insert %d records" % num)
|
tdLog.info("will insert %d records" % num)
|
||||||
for x in range(0, num):
|
for x in range(0, num):
|
||||||
tdLog.info(
|
tdLog.info(
|
||||||
'insert into tb values (now + %da, NULL, NULL, NULL, TRUE)' % x)
|
'insert into tb values (now + %da, NULL, NULL, NULL, TRUE)' %
|
||||||
|
x)
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
'insert into tb values (now + %da, NULL, NULL, NULL, TRUE)' % x)
|
'insert into tb values (now + %da, NULL, NULL, NULL, TRUE)' %
|
||||||
|
x)
|
||||||
|
|
||||||
numOfRecords = numOfRecords + num
|
numOfRecords = numOfRecords + num
|
||||||
|
|
||||||
|
@ -54,7 +57,6 @@ class TDTestCase:
|
||||||
tdDnodes.start(1)
|
tdDnodes.start(1)
|
||||||
tdLog.sleep(5)
|
tdLog.sleep(5)
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
tdLog.success("%s successfully executed" % __file__)
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.dnodes import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
tdLog.info("=============== step1")
|
||||||
|
tdSql.execute(
|
||||||
|
'create table tb (ts timestamp, speed int, temp float, note binary(4000), flag bool)')
|
||||||
|
|
||||||
|
numOfRecords = 1000000
|
||||||
|
dividend = 1000
|
||||||
|
tdLog.info("will insert %d records" % numOfRecords)
|
||||||
|
|
||||||
|
ts = 1500000000000
|
||||||
|
for i in range(0, numOfRecords):
|
||||||
|
|
||||||
|
if (i % dividend):
|
||||||
|
print(".", end="")
|
||||||
|
tdSql.execute(
|
||||||
|
'insert into tb values (%d + %da, NULL, NULL, NULL, TRUE)' %
|
||||||
|
(ts, i))
|
||||||
|
else:
|
||||||
|
print("a", end="")
|
||||||
|
tdSql.execute(
|
||||||
|
'insert into tb values (%d + %da, NULL, NULL, "a", FALSE)' %
|
||||||
|
(ts, i))
|
||||||
|
|
||||||
|
tdSql.query("select * from tb")
|
||||||
|
tdSql.checkRows(numOfRecords)
|
||||||
|
tdSql.checkData(numOfRecords - dividend, 3, 'a')
|
||||||
|
tdSql.checkData(numOfRecords - dividend - 1, 3, None)
|
||||||
|
|
||||||
|
tdLog.info("stop dnode to commit data to disk")
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
tdLog.info("dnodes:%d size is %d" % (1, tdDnodes.getDataSize(1)))
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,60 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import taos
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
print("==============step1")
|
||||||
|
tdSql.execute(
|
||||||
|
"create table if not exists st (ts timestamp, tagtype int, name nchar(16)) tags(dev nchar(50))")
|
||||||
|
tdSql.execute(
|
||||||
|
'CREATE TABLE if not exists dev_001 using st tags("dev_01")')
|
||||||
|
tdSql.execute(
|
||||||
|
'CREATE TABLE if not exists dev_002 using st tags("dev_02")')
|
||||||
|
|
||||||
|
print("==============step2")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
"""INSERT INTO dev_001(ts, tagtype, name) VALUES('2020-05-13 10:00:00.000', 1, 'first'),('2020-05-13 10:00:00.001', 2, 'second'),
|
||||||
|
('2020-05-13 10:00:00.002', 3, 'third') dev_002 VALUES('2020-05-13 10:00:00.003', 1, 'first'), ('2020-05-13 10:00:00.004', 2, 'second'),
|
||||||
|
('2020-05-13 10:00:00.005', 3, 'third')""")
|
||||||
|
|
||||||
|
# query with filter condition A OR condition B
|
||||||
|
tdSql.query("select * from db.st where ts > '2020-05-13 10:00:00.002' AND tagtype < 2")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
|
||||||
|
# query with filter condition A OR condition B, error expected
|
||||||
|
tdSql.error("select * from db.st where ts > '2020-05-13 10:00:00.002' OR tagtype < 2")
|
||||||
|
|
||||||
|
# illegal condition
|
||||||
|
tdSql.error("select * from db.st where ts != '2020-05-13 10:00:00.002' OR tagtype < 2")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,67 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import taos
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
print("==============step1")
|
||||||
|
tdSql.execute(
|
||||||
|
"create table if not exists st (ts timestamp, tagtype int, name nchar(16)) tags(dev nchar(50))")
|
||||||
|
tdSql.execute(
|
||||||
|
'CREATE TABLE if not exists dev_001 using st tags("dev_01")')
|
||||||
|
tdSql.execute(
|
||||||
|
'CREATE TABLE if not exists dev_002 using st tags("dev_02")')
|
||||||
|
|
||||||
|
print("==============step2")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
"""INSERT INTO dev_001(ts, tagtype, name) VALUES('2020-05-13 10:00:00.000', 1, 'first'),('2020-05-13 10:00:00.001', 2, 'second'),
|
||||||
|
('2020-05-13 10:00:00.002', 3, 'third') dev_002 VALUES('2020-05-13 10:00:00.003', 1, 'first'), ('2020-05-13 10:00:00.004', 2, 'second'),
|
||||||
|
('2020-05-13 10:00:00.005', 3, 'third')""")
|
||||||
|
|
||||||
|
"""Error expected here, but no errors
|
||||||
|
# query first .. as ..
|
||||||
|
tdSql.error("select first(*) as one from st")
|
||||||
|
|
||||||
|
# query last .. as ..
|
||||||
|
tdSql.error("select last(*) as latest from st")
|
||||||
|
"""
|
||||||
|
|
||||||
|
# query last row .. as ..
|
||||||
|
tdSql.error("select last_row as latest from st")
|
||||||
|
|
||||||
|
# query distinct on normal colnum
|
||||||
|
tdSql.error("select distinct tagtype from st")
|
||||||
|
|
||||||
|
# query .. order by non-time field
|
||||||
|
tdSql.error("select * from st order by name")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -0,0 +1,84 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import taos
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
print("==============step1")
|
||||||
|
|
||||||
|
tdSql.execute("create table stb1 (ts timestamp, c1 int, c2 float) tags(t1 int, t2 binary(10), t3 nchar(10))")
|
||||||
|
tdSql.execute("insert into tb1 using stb1 tags(1,'tb1', '表1') values ('2020-04-18 15:00:00.000', 1, 0.1), ('2020-04-18 15:00:01.000', 2, 0.1)")
|
||||||
|
tdSql.execute("insert into tb2 using stb1 tags(2,'tb2', '表2') values ('2020-04-18 15:00:02.000', 3, 2.1), ('2020-04-18 15:00:03.000', 4, 2.2)")
|
||||||
|
|
||||||
|
# join 2 tables -- bug exists
|
||||||
|
# tdSql.query("select * from tb1 a, tb2 b where a.ts = b.ts")
|
||||||
|
# tdSql.checkRows(1)
|
||||||
|
|
||||||
|
# join 3 tables -- bug exists
|
||||||
|
# tdSql.query("select stb_t.ts, stb_t.dscrption, stb_t.temperature, stb_p.id, stb_p.dscrption, stb_p.pressure,stb_v.velocity from stb_p, stb_t, stb_v where stb_p.ts=stb_t.ts and stb_p.ts=stb_v.ts and stb_p.id = stb_t.id")
|
||||||
|
|
||||||
|
# query count
|
||||||
|
tdSql.query("select count(*) from stb1")
|
||||||
|
tdSql.checkData(0, 0, 4)
|
||||||
|
|
||||||
|
# query first
|
||||||
|
tdSql.query("select first(*) from stb1")
|
||||||
|
tdSql.checkData(0, 1, 1)
|
||||||
|
|
||||||
|
# query last
|
||||||
|
tdSql.query("select last(*) from stb1")
|
||||||
|
tdSql.checkData(0, 1, 4)
|
||||||
|
|
||||||
|
# query as
|
||||||
|
tdSql.query("select t2 as number from stb1")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
# query first ... as
|
||||||
|
tdSql.query("select first(*) as begin from stb1")
|
||||||
|
tdSql.checkData(0, 1, 1)
|
||||||
|
|
||||||
|
# query last ... as
|
||||||
|
tdSql.query("select last(*) as end from stb1")
|
||||||
|
tdSql.checkData(0, 1, 4)
|
||||||
|
|
||||||
|
# query group .. by
|
||||||
|
tdSql.query("select sum(c1), t2 from stb1 group by t2")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
# query ... limit
|
||||||
|
tdSql.query("select * from stb1 limit 2")
|
||||||
|
tdSql.checkRows(2)
|
||||||
|
|
||||||
|
# query ... limit offset
|
||||||
|
tdSql.query("select * from stb1 limit 2 offset 3")
|
||||||
|
tdSql.checkRows(1)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -121,6 +121,7 @@ class Test:
|
||||||
tdDnodes.start(1)
|
tdDnodes.start(1)
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
|
|
||||||
|
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug("start to execute %s" % __file__)
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
|
|
@ -56,4 +56,10 @@ python3 ./test.py $1 -s && sleep 1
|
||||||
#query
|
#query
|
||||||
python3 ./test.py $1 -f query/filter.py
|
python3 ./test.py $1 -f query/filter.py
|
||||||
python3 ./test.py $1 -s && sleep 1
|
python3 ./test.py $1 -s && sleep 1
|
||||||
|
python3 ./test.py $1 -f query/filterCombo.py
|
||||||
|
python3 ./test.py $1 -s && sleep 1
|
||||||
|
python3 ./test.py $1 -f query/queryNormal.py
|
||||||
|
python3 ./test.py $1 -s && sleep 1
|
||||||
|
python3 ./test.py $1 -f query/queryError.py
|
||||||
|
python3 ./test.py $1 -s && sleep 1
|
||||||
|
|
||||||
|
|
|
@ -98,12 +98,16 @@ class TDTestCase:
|
||||||
# create a super table with name exceed max length
|
# create a super table with name exceed max length
|
||||||
sname = self.generateString(maxTableNameLen + 1)
|
sname = self.generateString(maxTableNameLen + 1)
|
||||||
tdLog.info("create a super table with length %d" % len(sname))
|
tdLog.info("create a super table with length %d" % len(sname))
|
||||||
tdSql.error("create table %s (ts timestamp, value int) tags(id int)" % sname)
|
tdSql.error(
|
||||||
|
"create table %s (ts timestamp, value int) tags(id int)" %
|
||||||
|
sname)
|
||||||
|
|
||||||
# create a super table with name of max length
|
# create a super table with name of max length
|
||||||
sname = self.generateString(maxTableNameLen)
|
sname = self.generateString(maxTableNameLen)
|
||||||
tdLog.info("create a super table with length %d" % len(sname))
|
tdLog.info("create a super table with length %d" % len(sname))
|
||||||
tdSql.execute("create table %s (ts timestamp, value int) tags(id int)" % sname)
|
tdSql.execute(
|
||||||
|
"create table %s (ts timestamp, value int) tags(id int)" %
|
||||||
|
sname)
|
||||||
tdLog.info("check table count, should be one")
|
tdLog.info("check table count, should be one")
|
||||||
tdSql.query('show stables')
|
tdSql.query('show stables')
|
||||||
tdSql.checkRows(1)
|
tdSql.checkRows(1)
|
||||||
|
|
|
@ -99,6 +99,19 @@ class TDDnode:
|
||||||
def setValgrind(self, value):
|
def setValgrind(self, value):
|
||||||
self.valgrind = value
|
self.valgrind = value
|
||||||
|
|
||||||
|
def getDataSize(self):
|
||||||
|
totalSize = 0
|
||||||
|
|
||||||
|
if (self.deployed == 1):
|
||||||
|
for dirpath, dirnames, filenames in os.walk(self.dataDir):
|
||||||
|
for f in filenames:
|
||||||
|
fp = os.path.join(dirpath, f)
|
||||||
|
|
||||||
|
if not os.path.islink(fp):
|
||||||
|
totalSize = totalSize + os.path.getsize(fp)
|
||||||
|
|
||||||
|
return totalSize
|
||||||
|
|
||||||
def deploy(self):
|
def deploy(self):
|
||||||
self.logDir = "%s/pysim/dnode%d/log" % (self.path, self.index)
|
self.logDir = "%s/pysim/dnode%d/log" % (self.path, self.index)
|
||||||
self.dataDir = "%s/pysim/dnode%d/data" % (self.path, self.index)
|
self.dataDir = "%s/pysim/dnode%d/data" % (self.path, self.index)
|
||||||
|
@ -384,6 +397,10 @@ class TDDnodes:
|
||||||
self.check(index)
|
self.check(index)
|
||||||
self.dnodes[index - 1].stop()
|
self.dnodes[index - 1].stop()
|
||||||
|
|
||||||
|
def getDataSize(self, index):
|
||||||
|
self.check(index)
|
||||||
|
return self.dnodes[index - 1].getDataSize()
|
||||||
|
|
||||||
def forcestop(self, index):
|
def forcestop(self, index):
|
||||||
self.check(index)
|
self.check(index)
|
||||||
self.dnodes[index - 1].forcestop()
|
self.dnodes[index - 1].forcestop()
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
run general/cache/new_metrics.sim
|
run general/cache/new_metrics.sim
|
||||||
|
run general/column/commit.sim
|
||||||
run general/compress/compress.sim
|
run general/compress/compress.sim
|
||||||
run general/compute/avg.sim
|
run general/compute/interval.sim
|
||||||
run general/compute/count.sim
|
|
||||||
run general/db/len.sim
|
|
||||||
run general/db/basic4.sim
|
run general/db/basic4.sim
|
||||||
|
run general/field/binary.sim
|
||||||
run general/http/restful_insert.sim
|
run general/http/restful_insert.sim
|
||||||
run general/import/basic.sim
|
|
||||||
run general/import/commit.sim
|
run general/import/commit.sim
|
||||||
run general/insert/query_file_memory.sim
|
run general/import/replica1.sim
|
||||||
|
run general/parser/auto_create_tb_drop_tb.sim
|
||||||
run general/parser/binary_escapeCharacter.sim
|
run general/parser/binary_escapeCharacter.sim
|
||||||
run general/parser/select_from_cache_disk.sim
|
run general/parser/select_from_cache_disk.sim
|
||||||
|
run general/stable/vnode3.sim
|
||||||
run general/table/autocreate.sim
|
run general/table/autocreate.sim
|
||||||
run general/table/column_name.sim
|
run general/table/fill.sim
|
||||||
run general/table/int.sim
|
|
||||||
run general/table/vgroup.sim
|
run general/table/vgroup.sim
|
||||||
run general/user/basic1.sim
|
run general/tag/filter.sim
|
||||||
run general/user/pass_alter.sim
|
|
||||||
run general/vector/single.sim
|
|
||||||
#run general/connection/connection.sim
|
|
||||||
run general/user/authority.sim
|
run general/user/authority.sim
|
||||||
|
run general/user/pass_alter.sim
|
||||||
|
run general/vector/metrics_mix.sim
|
||||||
|
run general/vector/table_field.sim
|
||||||
|
|
|
@ -96,6 +96,7 @@ echo "second ${HOSTNAME}:7200" >> $TAOS_CFG
|
||||||
echo "serverPort ${NODE}" >> $TAOS_CFG
|
echo "serverPort ${NODE}" >> $TAOS_CFG
|
||||||
echo "dataDir $DATA_DIR" >> $TAOS_CFG
|
echo "dataDir $DATA_DIR" >> $TAOS_CFG
|
||||||
echo "logDir $LOG_DIR" >> $TAOS_CFG
|
echo "logDir $LOG_DIR" >> $TAOS_CFG
|
||||||
|
echo "debugFlag 135" >> $TAOS_CFG
|
||||||
echo "dDebugFlag 135" >> $TAOS_CFG
|
echo "dDebugFlag 135" >> $TAOS_CFG
|
||||||
echo "mDebugFlag 135" >> $TAOS_CFG
|
echo "mDebugFlag 135" >> $TAOS_CFG
|
||||||
echo "sdbDebugFlag 135" >> $TAOS_CFG
|
echo "sdbDebugFlag 135" >> $TAOS_CFG
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# if [ $# != 2 || $# != 3 ]; then
|
||||||
|
# echo "argument list need input : "
|
||||||
|
# echo " -s start/stop"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
|
||||||
|
EXEC_OPTON=
|
||||||
|
while getopts "n:s:u:x:ct" arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
n)
|
||||||
|
NODE_NAME=$OPTARG
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
EXEC_OPTON=$OPTARG
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
CLEAR_OPTION="clear"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
SHELL_OPTION="true"
|
||||||
|
;;
|
||||||
|
u)
|
||||||
|
USERS=$OPTARG
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
SIGNAL=$OPTARG
|
||||||
|
;;
|
||||||
|
?)
|
||||||
|
echo "unkown argument"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
SCRIPT_DIR=`dirname $0`
|
||||||
|
cd $SCRIPT_DIR/../
|
||||||
|
SCRIPT_DIR=`pwd`
|
||||||
|
|
||||||
|
cd ../../
|
||||||
|
TAOS_DIR=`pwd`
|
||||||
|
|
||||||
|
BUILD_DIR=$TAOS_DIR/../debug/build
|
||||||
|
SIM_DIR=$TAOS_DIR/sim
|
||||||
|
NODE_DIR=$SIM_DIR/arbitrator
|
||||||
|
EXE_DIR=$BUILD_DIR/bin
|
||||||
|
LOG_DIR=$NODE_DIR/log
|
||||||
|
|
||||||
|
echo "------------ $EXEC_OPTON tarbitrator"
|
||||||
|
|
||||||
|
if [ "$EXEC_OPTON" = "start" ]; then
|
||||||
|
echo "------------ log path: $LOG_DIR"
|
||||||
|
nohup $EXE_DIR/tarbitrator -p 8000 -d 135 -g $LOG_DIR > /dev/null 2>&1 &
|
||||||
|
else
|
||||||
|
#relative path
|
||||||
|
PID=`ps -ef|grep tarbitrator | grep -v grep | awk '{print $2}'`
|
||||||
|
if [ -n "$PID" ]; then
|
||||||
|
sudo kill -9 $PID
|
||||||
|
sudo pkill -9 tarbitrator
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
|
@ -13,3 +13,12 @@ while [ -n "$PID" ]; do
|
||||||
fuser -k -n tcp 6030
|
fuser -k -n tcp 6030
|
||||||
PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
|
PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
|
||||||
done
|
done
|
||||||
|
|
||||||
|
PID=`ps -ef|grep -w tarbitrator | grep -v grep | awk '{print $2}'`
|
||||||
|
while [ -n "$PID" ]; do
|
||||||
|
echo kill -9 $PID
|
||||||
|
pkill -9 tarbitrator
|
||||||
|
fuser -k -n tcp 6040
|
||||||
|
PID=`ps -ef|grep -w tarbitrator | grep -v grep | awk '{print $2}'`
|
||||||
|
done
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,11 @@ CFG_DIR=$PRG_DIR/cfg
|
||||||
LOG_DIR=$PRG_DIR/log
|
LOG_DIR=$PRG_DIR/log
|
||||||
DATA_DIR=$PRG_DIR/data
|
DATA_DIR=$PRG_DIR/data
|
||||||
|
|
||||||
|
|
||||||
|
ARBITRATOR_PRG_DIR=$SIM_DIR/arbitrator
|
||||||
|
ARBITRATOR_LOG_DIR=$ARBITRATOR_PRG_DIR/log
|
||||||
|
|
||||||
|
|
||||||
chmod -R 777 $PRG_DIR
|
chmod -R 777 $PRG_DIR
|
||||||
echo "------------------------------------------------------------------------"
|
echo "------------------------------------------------------------------------"
|
||||||
echo "Start TDengine Testing Case ..."
|
echo "Start TDengine Testing Case ..."
|
||||||
|
@ -72,9 +77,12 @@ echo "CFG_DIR : $CFG_DIR"
|
||||||
|
|
||||||
rm -rf $LOG_DIR
|
rm -rf $LOG_DIR
|
||||||
rm -rf $CFG_DIR
|
rm -rf $CFG_DIR
|
||||||
|
rm -rf $ARBITRATOR_LOG_DIR
|
||||||
|
|
||||||
mkdir -p $PRG_DIR
|
mkdir -p $PRG_DIR
|
||||||
mkdir -p $LOG_DIR
|
mkdir -p $LOG_DIR
|
||||||
mkdir -p $CFG_DIR
|
mkdir -p $CFG_DIR
|
||||||
|
mkdir -p $ARBITRATOR_LOG_DIR
|
||||||
|
|
||||||
TAOS_CFG=$PRG_DIR/cfg/taos.cfg
|
TAOS_CFG=$PRG_DIR/cfg/taos.cfg
|
||||||
touch -f $TAOS_CFG
|
touch -f $TAOS_CFG
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
|
system sh/deploy.sh -n dnode3 -i 3
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c numOfMPeers -v 2
|
||||||
|
system sh/cfg.sh -n dnode2 -c numOfMPeers -v 2
|
||||||
|
system sh/cfg.sh -n dnode3 -c numOfMPeers -v 2
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c walLevel -v 1
|
||||||
|
system sh/cfg.sh -n dnode2 -c walLevel -v 1
|
||||||
|
system sh/cfg.sh -n dnode3 -c walLevel -v 1
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c balanceInterval -v 10
|
||||||
|
system sh/cfg.sh -n dnode2 -c balanceInterval -v 10
|
||||||
|
system sh/cfg.sh -n dnode3 -c balanceInterval -v 10
|
||||||
|
|
||||||
|
system sh/cfg.sh -n dnode1 -c arbitrator -v $arbitrator
|
||||||
|
system sh/cfg.sh -n dnode2 -c arbitrator -v $arbitrator
|
||||||
|
system sh/cfg.sh -n dnode3 -c arbitrator -v $arbitrator
|
||||||
|
|
||||||
|
print ============== step0: start tarbitrator
|
||||||
|
system sh/exec_tarbitrator.sh -s start
|
||||||
|
|
||||||
|
|
||||||
|
print ============== step1: replica is 1, and start 1 dnode
|
||||||
|
system sh/exec_up.sh -n dnode1 -s start
|
||||||
|
sleep 3000
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
$db = replica_db1
|
||||||
|
sql create database $db replica 1 maxTables 4
|
||||||
|
sql use $db
|
||||||
|
|
||||||
|
# create table , insert data
|
||||||
|
$stb = repl_stb
|
||||||
|
sql create table $stb (ts timestamp, c1 int) tags(t1 int)
|
||||||
|
$rowNum = 10
|
||||||
|
$tblNum = 12
|
||||||
|
|
||||||
|
$ts0 = 1420041600000
|
||||||
|
$ts = $ts0
|
||||||
|
$delta = 1
|
||||||
|
|
||||||
|
$i = 0
|
||||||
|
while $i < $tblNum
|
||||||
|
$tb = tb . $i
|
||||||
|
sql create table $tb using $stb tags( $i )
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
while $x < $rowNum
|
||||||
|
$xs = $x * $delta
|
||||||
|
$ts = $ts0 + $xs
|
||||||
|
sql insert into $tb values ( $ts , $x )
|
||||||
|
$x = $x + 1
|
||||||
|
endw
|
||||||
|
$i = $i + 1
|
||||||
|
endw
|
||||||
|
|
||||||
|
print ============== step2: add 1 new dnode, expect balanced
|
||||||
|
system sh/exec_up.sh -n dnode2 -s start
|
||||||
|
sql create dnode $hostname2
|
||||||
|
|
||||||
|
# expect after balanced, 2 vondes in dnode1, 1 vonde in dnode2
|
||||||
|
$x = 0
|
||||||
|
show2:
|
||||||
|
$x = $x + 1
|
||||||
|
sleep 2000
|
||||||
|
if $x == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
print dnode1 openVnodes $data2_1
|
||||||
|
print dnode2 openVnodes $data2_2
|
||||||
|
if $data2_1 != 2 then
|
||||||
|
goto show2
|
||||||
|
endi
|
||||||
|
if $data2_2 != 1 then
|
||||||
|
goto show2
|
||||||
|
endi
|
||||||
|
|
||||||
|
print ============== step4: stop dnode1, and wait dnode2 master
|
||||||
|
system sh/exec_up.sh -n dnode1 -s stop
|
||||||
|
|
||||||
|
$x = 0
|
||||||
|
loop_wait:
|
||||||
|
$x = $x + 1
|
||||||
|
sleep 2000
|
||||||
|
if $x == 10 then
|
||||||
|
print ERROR: after dnode1 stop, dnode2 didn't become a master!
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql show mnodes
|
||||||
|
$dnodeRole = $data2_1
|
||||||
|
print dnodeRole ==> $dnodeRole
|
||||||
|
|
||||||
|
if $dnodeRole != master then
|
||||||
|
goto loop_wait
|
||||||
|
endi
|
|
@ -47,6 +47,7 @@ print should not drop master
|
||||||
|
|
||||||
print ============== step4
|
print ============== step4
|
||||||
system sh/exec_up.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec_up.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
sleep 2000
|
||||||
sql_error show mnodes
|
sql_error show mnodes
|
||||||
print error of no master
|
print error of no master
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ endi
|
||||||
|
|
||||||
print ============== step3
|
print ============== step3
|
||||||
system sh/exec_up.sh -n dnode1 -s stop
|
system sh/exec_up.sh -n dnode1 -s stop
|
||||||
|
sleep 2000
|
||||||
sql_error show mnodes
|
sql_error show mnodes
|
||||||
|
|
||||||
print ============== step4
|
print ============== step4
|
||||||
|
|
|
@ -16,6 +16,6 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
add_executable(importOneRow importOneRow.c)
|
add_executable(importOneRow importOneRow.c)
|
||||||
target_link_libraries(importOneRow taos_static pthread)
|
target_link_libraries(importOneRow taos_static pthread)
|
||||||
|
|
||||||
add_executable(importPerTabe importPerTabe.c)
|
add_executable(importPerTable importPerTable.c)
|
||||||
target_link_libraries(importPerTabe taos_static pthread)
|
target_link_libraries(importPerTable taos_static pthread)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
|
@ -36,12 +36,17 @@ void simLogSql(char *sql) {
|
||||||
fflush(fp);
|
fflush(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *simParseArbitratorName(char *varName);
|
||||||
char *simParseHostName(char *varName);
|
char *simParseHostName(char *varName);
|
||||||
char *simGetVariable(SScript *script, char *varName, int varLen) {
|
char *simGetVariable(SScript *script, char *varName, int varLen) {
|
||||||
if (strncmp(varName, "hostname", 8) == 0) {
|
if (strncmp(varName, "hostname", 8) == 0) {
|
||||||
return simParseHostName(varName);
|
return simParseHostName(varName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strncmp(varName, "arbitrator", 10) == 0) {
|
||||||
|
return simParseArbitratorName(varName);
|
||||||
|
}
|
||||||
|
|
||||||
if (strncmp(varName, "error", varLen) == 0) return script->error;
|
if (strncmp(varName, "error", varLen) == 0) return script->error;
|
||||||
|
|
||||||
if (strncmp(varName, "rows", varLen) == 0) return script->rows;
|
if (strncmp(varName, "rows", varLen) == 0) return script->rows;
|
||||||
|
|
|
@ -29,6 +29,12 @@ int simDebugFlag = 135;
|
||||||
void simCloseTaosdConnect(SScript *script);
|
void simCloseTaosdConnect(SScript *script);
|
||||||
char simHostName[128];
|
char simHostName[128];
|
||||||
|
|
||||||
|
char *simParseArbitratorName(char *varName) {
|
||||||
|
static char hostName[140];
|
||||||
|
sprintf(hostName, "%s:%d", simHostName, 8000);
|
||||||
|
return hostName;
|
||||||
|
}
|
||||||
|
|
||||||
char *simParseHostName(char *varName) {
|
char *simParseHostName(char *varName) {
|
||||||
static char hostName[140];
|
static char hostName[140];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue