Merge branch 'develop' into hotfix/sangshuduo/fix-compile-error-for-release
This commit is contained in:
commit
af08259379
31
README.md
31
README.md
|
@ -2,7 +2,6 @@
|
||||||
[](https://ci.appveyor.com/project/sangshuduo/tdengine-2n8ge/branch/master)
|
[](https://ci.appveyor.com/project/sangshuduo/tdengine-2n8ge/branch/master)
|
||||||
[](https://coveralls.io/github/taosdata/TDengine?branch=develop)
|
[](https://coveralls.io/github/taosdata/TDengine?branch=develop)
|
||||||
[](https://bestpractices.coreinfrastructure.org/projects/4201)
|
[](https://bestpractices.coreinfrastructure.org/projects/4201)
|
||||||
[](https://hub.docker.com/repository/docker/tdengine/tdengine)
|
|
||||||
[](https://snapcraft.io/tdengine)
|
[](https://snapcraft.io/tdengine)
|
||||||
|
|
||||||
[](https://www.taosdata.com)
|
[](https://www.taosdata.com)
|
||||||
|
@ -92,6 +91,8 @@ cd TDengine
|
||||||
|
|
||||||
## Build TDengine
|
## Build TDengine
|
||||||
|
|
||||||
|
### On Linux platform
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir debug && cd debug
|
mkdir debug && cd debug
|
||||||
cmake .. && cmake --build .
|
cmake .. && cmake --build .
|
||||||
|
@ -109,6 +110,34 @@ aarch32:
|
||||||
cmake .. -DCPUTYPE=aarch32 && cmake --build .
|
cmake .. -DCPUTYPE=aarch32 && cmake --build .
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### On Windows platform
|
||||||
|
|
||||||
|
If you use the Visual Studio 2013, please open a command window by executing "cmd.exe".
|
||||||
|
Please specify "x86_amd64" for 64 bits Windows or specify "x86" is for 32 bits Windows when you execute vcvarsall.bat.
|
||||||
|
```
|
||||||
|
mkdir debug && cd debug
|
||||||
|
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" < x86_amd64 | x86 >
|
||||||
|
cmake .. -G "NMake Makefiles"
|
||||||
|
nmake
|
||||||
|
```
|
||||||
|
|
||||||
|
If you use the Visual Studio 2019, please open a command window by executing "cmd.exe".
|
||||||
|
Please specify "x64" for 64 bits Windows or specify "x86" is for 32 bits Windows when you execute vcvarsall.bat.
|
||||||
|
```
|
||||||
|
mkdir debug && cd debug
|
||||||
|
"c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" < x64 | x86 >
|
||||||
|
cmake .. -G "NMake Makefiles"
|
||||||
|
nmake
|
||||||
|
```
|
||||||
|
|
||||||
|
Or, you can open a command window by clicking Visual Studio 2019 menu "Tools -> Command Line -> Developer Command Prompt" or "Tools -> Command Line -> Developer PowerShell" then execute commands as follows:
|
||||||
|
```
|
||||||
|
mkdir debug && cd debug
|
||||||
|
cmake .. -G "NMake Makefiles"
|
||||||
|
nmake
|
||||||
|
```
|
||||||
|
|
||||||
|
# Quick Run
|
||||||
# Quick Run
|
# Quick Run
|
||||||
To quickly start a TDengine server after building, run the command below in terminal:
|
To quickly start a TDengine server after building, run the command below in terminal:
|
||||||
```cmd
|
```cmd
|
||||||
|
|
|
@ -13,7 +13,7 @@ ELSEIF (TD_WINDOWS)
|
||||||
IF (NOT TD_GODLL)
|
IF (NOT TD_GODLL)
|
||||||
#INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/src/connector/go DESTINATION connector)
|
#INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/src/connector/go DESTINATION connector)
|
||||||
#INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/src/connector/grafana DESTINATION connector)
|
#INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/src/connector/grafana DESTINATION connector)
|
||||||
#INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/src/connector/python DESTINATION connector)
|
INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/src/connector/python DESTINATION connector)
|
||||||
INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/tests/examples DESTINATION .)
|
INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/tests/examples DESTINATION .)
|
||||||
INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/packaging/cfg DESTINATION .)
|
INSTALL(DIRECTORY ${TD_COMMUNITY_DIR}/packaging/cfg DESTINATION .)
|
||||||
INSTALL(FILES ${TD_COMMUNITY_DIR}/src/inc/taos.h DESTINATION include)
|
INSTALL(FILES ${TD_COMMUNITY_DIR}/src/inc/taos.h DESTINATION include)
|
||||||
|
|
|
@ -110,6 +110,7 @@ TDengine缺省的时间戳是毫秒精度,但通过修改配置参数enableMic
|
||||||
|
|
||||||
**Tips**: 以上所有参数修改后都可以用show databases来确认是否修改成功。
|
**Tips**: 以上所有参数修改后都可以用show databases来确认是否修改成功。
|
||||||
|
|
||||||
|
|
||||||
- **显示系统所有数据库**
|
- **显示系统所有数据库**
|
||||||
```mysql
|
```mysql
|
||||||
SHOW DATABASES;
|
SHOW DATABASES;
|
||||||
|
|
|
@ -526,7 +526,7 @@ int tsParseValues(char **str, STableDataBlocks *pDataBlock, STableMeta *pTableMe
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
SStrToken sToken;
|
SStrToken sToken;
|
||||||
|
|
||||||
int16_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
|
|
||||||
SSchema *pSchema = tscGetTableSchema(pTableMeta);
|
SSchema *pSchema = tscGetTableSchema(pTableMeta);
|
||||||
STableComInfo tinfo = tscGetTableInfo(pTableMeta);
|
STableComInfo tinfo = tscGetTableInfo(pTableMeta);
|
||||||
|
|
|
@ -97,8 +97,8 @@ TAOS_DEFINE_ERROR(TSDB_CODE_TSC_APP_ERROR, 0, 0x0211, "Applicatio
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_ACTION_IN_PROGRESS, 0, 0x0212, "Action in progress")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_ACTION_IN_PROGRESS, 0, 0x0212, "Action in progress")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_DISCONNECTED, 0, 0x0213, "Disconnected from service")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_DISCONNECTED, 0, 0x0213, "Disconnected from service")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NO_WRITE_AUTH, 0, 0x0214, "No write permission")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NO_WRITE_AUTH, 0, 0x0214, "No write permission")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_CONN_KILLED, 0, 0x0215, "Connection killed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_CONN_KILLED, 0, 0x0215, "Connection killed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_SQL_SYNTAX_ERROR, 0, 0x0216, "Syntax errr in SQL")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_SQL_SYNTAX_ERROR, 0, 0x0216, "Syntax errr in SQL")
|
||||||
|
|
||||||
// mnode
|
// mnode
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_MSG_NOT_PROCESSED, 0, 0x0300, "Message not processed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_MSG_NOT_PROCESSED, 0, 0x0300, "Message not processed")
|
||||||
|
@ -247,6 +247,106 @@ TAOS_DEFINE_ERROR(TSDB_CODE_SYN_NOT_ENABLED, 0, 0x0901, "Sync modul
|
||||||
// wal
|
// wal
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_WAL_APP_ERROR, 0, 0x1000, "Unexpected generic error in wal")
|
TAOS_DEFINE_ERROR(TSDB_CODE_WAL_APP_ERROR, 0, 0x1000, "Unexpected generic error in wal")
|
||||||
|
|
||||||
|
// http
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_SERVER_OFFLINE, 0, 0x1100, "http server is not onlin")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_UNSUPPORT_URL, 0, 0x1101, "url is not support")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVLALID_URL, 0, 0x1102, "invalid url format")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_NO_ENOUGH_MEMORY, 0, 0x1103, "no enough memory")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_REQUSET_TOO_BIG, 0, 0x1104, "request size is too big")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_NO_AUTH_INFO, 0, 0x1105, "no auth info input")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_NO_MSG_INPUT, 0, 0x1106, "request is empty")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_NO_SQL_INPUT, 0, 0x1107, "no sql input")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_NO_EXEC_USEDB, 0, 0x1108, "no need to execute use db cmd")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_SESSION_FULL, 0, 0x1109, "session list was full")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_GEN_TAOSD_TOKEN_ERR, 0, 0x110A, "generate taosd token error")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_MULTI_REQUEST, 0, 0x110B, "size of multi request is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_CREATE_GZIP_FAILED, 0, 0x110C, "failed to create gzip")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_FINISH_GZIP_FAILED, 0, 0x110D, "failed to finish gzip")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_LOGIN_FAILED, 0, 0x110E, "failed to login")
|
||||||
|
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_VERSION, 0, 0x1120, "invalid http version")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_CONTENT_LENGTH, 0, 0x1121, "invalid content length")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_AUTH_TYPE, 0, 0x1122, "invalid type of Authorization")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_AUTH_FORMAT, 0, 0x1123, "invalid format of Authorization")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_BASIC_AUTH, 0, 0x1124, "invalid basic Authorization")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_INVALID_TAOSD_AUTH, 0, 0x1125, "invalid taosd Authorization")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_METHOD_FAILED, 0, 0x1126, "failed to parse method")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_TARGET_FAILED, 0, 0x1127, "failed to parse target")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_VERSION_FAILED, 0, 0x1128, "failed to parse http version")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_SP_FAILED, 0, 0x1129, "failed to parse sp")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_STATUS_FAILED, 0, 0x112A, "failed to parse status")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_PHRASE_FAILED, 0, 0x112B, "failed to parse phrase")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_CRLF_FAILED, 0, 0x112C, "failed to parse crlf")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_HEADER_FAILED, 0, 0x112D, "failed to parse header")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_HEADER_KEY_FAILED, 0, 0x112E, "failed to parse header key")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_HEADER_VAL_FAILED, 0, 0x112F, "failed to parse header val")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_CHUNK_SIZE_FAILED, 0, 0x1130, "failed to parse chunk size")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_CHUNK_FAILED, 0, 0x1131, "failed to parse chunk")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_END_FAILED, 0, 0x1132, "failed to parse end section")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_INVALID_STATE, 0, 0x1134, "invalid parse state")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_PARSE_ERROR_STATE, 0, 0x1135, "failed to parse error section")
|
||||||
|
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_GC_QUERY_NULL, 0, 0x1150, "query size is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_GC_QUERY_SIZE, 0, 0x1151, "query size can not more than 100")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_GC_REQ_PARSE_ERROR, 0, 0x1152, "parse grafana json error")
|
||||||
|
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_DB_NOT_INPUT, 0, 0x1160, "database name can not be null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_DB_TOO_LONG, 0, 0x1161, "database name too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_INVALID_JSON, 0, 0x1162, "invalid telegraf json fromat")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_METRICS_NULL, 0, 0x1163, "metrics size is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_METRICS_SIZE, 0, 0x1164, "metrics size can not more than 1K")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_METRIC_NULL, 0, 0x1165, "metric name not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_METRIC_TYPE, 0, 0x1166, "metric name type should be string")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_METRIC_NAME_NULL, 0, 0x1167, "metric name length is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_METRIC_NAME_LONG, 0, 0x1168, "metric name length too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TIMESTAMP_NULL, 0, 0x1169, "timestamp not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TIMESTAMP_TYPE, 0, 0x116A, "timestamp type should be integer")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TIMESTAMP_VAL_NULL, 0, 0x116B, "timestamp value smaller than 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAGS_NULL, 0, 0x116C, "tags not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAGS_SIZE_0, 0, 0x116D, "tags size is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAGS_SIZE_LONG, 0, 0x116E, "tags size too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAG_NULL, 0, 0x116F, "tag is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAG_NAME_NULL, 0, 0x1170, "tag name is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAG_NAME_SIZE, 0, 0x1171, "tag name length too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAG_VALUE_TYPE, 0, 0x1172, "tag value type should be number or string")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TAG_VALUE_NULL, 0, 0x1173, "tag value is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TABLE_NULL, 0, 0x1174, "table is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_TABLE_SIZE, 0, 0x1175, "table name length too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELDS_NULL, 0, 0x1176, "fields not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELDS_SIZE_0, 0, 0x1177, "fields size is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELDS_SIZE_LONG, 0, 0x1178, "fields size too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELD_NULL, 0, 0x1179, "field is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELD_NAME_NULL, 0, 0x117A, "field name is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELD_NAME_SIZE, 0, 0x117B, "field name length too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELD_VALUE_TYPE, 0, 0x117C, "field value type should be number or string")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_FIELD_VALUE_NULL, 0, 0x117D, "field value is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_HOST_NOT_STRING, 0, 0x117E, "host type should be string")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_TG_STABLE_NOT_EXIST, 0, 0x117F, "stable not exist")
|
||||||
|
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_DB_NOT_INPUT, 0, 0x1190, "database name can not be null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_DB_TOO_LONG, 0, 0x1191, "database name too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_INVALID_JSON, 0, 0x1192, "invalid opentsdb json fromat")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_METRICS_NULL, 0, 0x1193, "metrics size is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_METRICS_SIZE, 0, 0x1194, "metrics size can not more than 10K")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_METRIC_NULL, 0, 0x1195, "metric name not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_METRIC_TYPE, 0, 0x1196, "metric name type should be string")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_METRIC_NAME_NULL, 0, 0x1197, "metric name length is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_METRIC_NAME_LONG, 0, 0x1198, "metric name length can not more than 22")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TIMESTAMP_NULL, 0, 0x1199, "timestamp not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TIMESTAMP_TYPE, 0, 0x119A, "timestamp type should be integer")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TIMESTAMP_VAL_NULL, 0, 0x119B, "timestamp value smaller than 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAGS_NULL, 0, 0x119C, "tags not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAGS_SIZE_0, 0, 0x119D, "tags size is 0")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAGS_SIZE_LONG, 0, 0x119E, "tags size too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAG_NULL, 0, 0x119F, "tag is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAG_NAME_NULL, 0, 0x11A0, "tag name is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAG_NAME_SIZE, 0, 0x11A1, "tag name length too long")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAG_VALUE_TYPE, 0, 0x11A2, "tag value type should be boolean, number or string")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAG_VALUE_NULL, 0, 0x11A3, "tag value is null")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_TAG_VALUE_TOO_LONG, 0, 0x11A4, "tag value can not more than 64")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_VALUE_NULL, 0, 0x11A5, "value not find")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_OP_VALUE_TYPE, 0, 0x11A6, "value type should be boolean, number or string")
|
||||||
|
|
||||||
#ifdef TAOS_ERROR_C
|
#ifdef TAOS_ERROR_C
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
#ifndef TDENGINE_HTTP_TOKEN_H
|
#ifndef TDENGINE_HTTP_TOKEN_H
|
||||||
#define TDENGINE_HTTP_TOKEN_H
|
#define TDENGINE_HTTP_TOKEN_H
|
||||||
|
|
||||||
bool httpParseBasicAuthToken(HttpContext *pContext, char *token, int len);
|
int32_t httpParseBasicAuthToken(HttpContext *pContext, char *token, int32_t len);
|
||||||
bool httpParseTaosdAuthToken(HttpContext *pContext, char *token, int len);
|
int32_t httpParseTaosdAuthToken(HttpContext *pContext, char *token, int32_t len);
|
||||||
bool httpGenTaosdAuthToken(HttpContext *pContext, char *token, int maxLen);
|
int32_t httpGenTaosdAuthToken(HttpContext *pContext, char *token, int32_t maxLen);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TDENGINE_HTTP_CODE_H
|
|
||||||
#define TDENGINE_HTTP_CODE_H
|
|
||||||
|
|
||||||
//for fixed msg info
|
|
||||||
#define HTTP_SUCCESS 0
|
|
||||||
#define HTTP_SERVER_OFFLINE 1
|
|
||||||
#define HTTP_UNSUPPORT_URL 2
|
|
||||||
#define HTTP_PARSE_HTTP_METHOD_ERROR 3
|
|
||||||
#define HTTP_PARSE_HTTP_VERSION_ERROR 4
|
|
||||||
#define HTTP_PARSE_HEAD_ERROR 5
|
|
||||||
#define HTTP_REQUSET_TOO_BIG 6
|
|
||||||
#define HTTP_PARSE_BODY_ERROR 7
|
|
||||||
#define HTTP_PARSE_CHUNKED_BODY_ERROR 8
|
|
||||||
#define HTTP_PARSE_URL_ERROR 9
|
|
||||||
#define HTTP_INVALID_AUTH_TOKEN 10
|
|
||||||
#define HTTP_PARSE_USR_ERROR 11
|
|
||||||
#define HTTP_NO_SQL_INPUT 12
|
|
||||||
#define HTTP_SESSION_FULL 13
|
|
||||||
#define HTTP_NO_ENOUGH_MEMORY 14
|
|
||||||
#define HTTP_GEN_TAOSD_TOKEN_ERR 15
|
|
||||||
#define HTTP_INVALID_DB_TABLE 16
|
|
||||||
#define HTTP_NO_EXEC_USEDB 17
|
|
||||||
#define HTTP_PARSE_GC_REQ_ERROR 18
|
|
||||||
#define HTTP_INVALID_MULTI_REQUEST 19
|
|
||||||
#define HTTP_NO_MSG_INPUT 20
|
|
||||||
#define HTTP_NO_ENOUGH_SESSIONS 21
|
|
||||||
|
|
||||||
//telegraf
|
|
||||||
#define HTTP_TG_DB_NOT_INPUT 22
|
|
||||||
#define HTTP_TG_DB_TOO_LONG 23
|
|
||||||
#define HTTP_TG_INVALID_JSON 24
|
|
||||||
#define HTTP_TG_METRICS_NULL 25
|
|
||||||
#define HTTP_TG_METRICS_SIZE 26
|
|
||||||
#define HTTP_TG_METRIC_NULL 27
|
|
||||||
#define HTTP_TG_METRIC_TYPE 28
|
|
||||||
#define HTTP_TG_METRIC_NAME_NULL 29
|
|
||||||
#define HTTP_TG_METRIC_NAME_LONG 30
|
|
||||||
#define HTTP_TG_TIMESTAMP_NULL 31
|
|
||||||
#define HTTP_TG_TIMESTAMP_TYPE 32
|
|
||||||
#define HTTP_TG_TIMESTAMP_VAL_NULL 33
|
|
||||||
#define HTTP_TG_TAGS_NULL 34
|
|
||||||
#define HTTP_TG_TAGS_SIZE_0 35
|
|
||||||
#define HTTP_TG_TAGS_SIZE_LONG 36
|
|
||||||
#define HTTP_TG_TAG_NULL 37
|
|
||||||
#define HTTP_TG_TAG_NAME_NULL 38
|
|
||||||
#define HTTP_TG_TAG_NAME_SIZE 39
|
|
||||||
#define HTTP_TG_TAG_VALUE_TYPE 40
|
|
||||||
#define HTTP_TG_TAG_VALUE_NULL 41
|
|
||||||
#define HTTP_TG_TABLE_NULL 42
|
|
||||||
#define HTTP_TG_TABLE_SIZE 43
|
|
||||||
#define HTTP_TG_FIELDS_NULL 44
|
|
||||||
#define HTTP_TG_FIELDS_SIZE_0 45
|
|
||||||
#define HTTP_TG_FIELDS_SIZE_LONG 46
|
|
||||||
#define HTTP_TG_FIELD_NULL 47
|
|
||||||
#define HTTP_TG_FIELD_NAME_NULL 48
|
|
||||||
#define HTTP_TG_FIELD_NAME_SIZE 49
|
|
||||||
#define HTTP_TG_FIELD_VALUE_TYPE 50
|
|
||||||
#define HTTP_TG_FIELD_VALUE_NULL 51
|
|
||||||
#define HTTP_INVALID_BASIC_AUTH_TOKEN 52
|
|
||||||
#define HTTP_INVALID_TAOSD_AUTH_TOKEN 53
|
|
||||||
#define HTTP_TG_HOST_NOT_STRING 54
|
|
||||||
|
|
||||||
//grafana
|
|
||||||
#define HTTP_GC_QUERY_NULL 55
|
|
||||||
#define HTTP_GC_QUERY_SIZE 56
|
|
||||||
|
|
||||||
//opentsdb
|
|
||||||
#define HTTP_OP_DB_NOT_INPUT 57
|
|
||||||
#define HTTP_OP_DB_TOO_LONG 58
|
|
||||||
#define HTTP_OP_INVALID_JSON 59
|
|
||||||
#define HTTP_OP_METRICS_NULL 60
|
|
||||||
#define HTTP_OP_METRICS_SIZE 61
|
|
||||||
#define HTTP_OP_METRIC_NULL 62
|
|
||||||
#define HTTP_OP_METRIC_TYPE 63
|
|
||||||
#define HTTP_OP_METRIC_NAME_NULL 64
|
|
||||||
#define HTTP_OP_METRIC_NAME_LONG 65
|
|
||||||
#define HTTP_OP_TIMESTAMP_NULL 66
|
|
||||||
#define HTTP_OP_TIMESTAMP_TYPE 67
|
|
||||||
#define HTTP_OP_TIMESTAMP_VAL_NULL 68
|
|
||||||
#define HTTP_OP_TAGS_NULL 69
|
|
||||||
#define HTTP_OP_TAGS_SIZE_0 70
|
|
||||||
#define HTTP_OP_TAGS_SIZE_LONG 71
|
|
||||||
#define HTTP_OP_TAG_NULL 72
|
|
||||||
#define HTTP_OP_TAG_NAME_NULL 73
|
|
||||||
#define HTTP_OP_TAG_NAME_SIZE 74
|
|
||||||
#define HTTP_OP_TAG_VALUE_TYPE 75
|
|
||||||
#define HTTP_OP_TAG_VALUE_NULL 76
|
|
||||||
#define HTTP_OP_TAG_VALUE_TOO_LONG 77
|
|
||||||
#define HTTP_OP_VALUE_NULL 78
|
|
||||||
#define HTTP_OP_VALUE_TYPE 79
|
|
||||||
|
|
||||||
//tgf
|
|
||||||
#define HTTP_TG_STABLE_NOT_EXIST 80
|
|
||||||
|
|
||||||
extern char *httpMsg[];
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -25,7 +25,7 @@ const char *httpContextStateStr(HttpContextState state);
|
||||||
HttpContext *httpCreateContext(int32_t fd);
|
HttpContext *httpCreateContext(int32_t fd);
|
||||||
bool httpInitContext(HttpContext *pContext);
|
bool httpInitContext(HttpContext *pContext);
|
||||||
HttpContext *httpGetContext(void * pContext);
|
HttpContext *httpGetContext(void * pContext);
|
||||||
void httpReleaseContext(HttpContext *pContext);
|
void httpReleaseContext(HttpContext *pContext, bool clearRes);
|
||||||
void httpCloseContextByServer(HttpContext *pContext);
|
void httpCloseContextByServer(HttpContext *pContext);
|
||||||
void httpCloseContextByApp(HttpContext *pContext);
|
void httpCloseContextByApp(HttpContext *pContext);
|
||||||
void httpNotifyContextClose(HttpContext *pContext);
|
void httpNotifyContextClose(HttpContext *pContext);
|
||||||
|
|
|
@ -24,7 +24,7 @@ void gcCleanQueryJson(HttpContext *pContext);
|
||||||
|
|
||||||
void gcStartQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result);
|
void gcStartQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result);
|
||||||
void gcStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd);
|
void gcStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd);
|
||||||
bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows);
|
bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows);
|
||||||
|
|
||||||
void gcSendHeartBeatResp(HttpContext *pContext, HttpSqlCmd *cmd);
|
void gcSendHeartBeatResp(HttpContext *pContext, HttpSqlCmd *cmd);
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HTTP_GZIP_H
|
||||||
|
#define HTTP_GZIP_H
|
||||||
|
|
||||||
|
#define EHTTP_GZIP_CHUNK_SIZE_DEFAULT (1024*16)
|
||||||
|
|
||||||
|
typedef struct ehttp_gzip_s ehttp_gzip_t;
|
||||||
|
|
||||||
|
typedef struct ehttp_gzip_callbacks_s ehttp_gzip_callbacks_t;
|
||||||
|
typedef struct ehttp_gzip_conf_s ehttp_gzip_conf_t;
|
||||||
|
|
||||||
|
struct ehttp_gzip_callbacks_s {
|
||||||
|
void (*on_data)(ehttp_gzip_t *gzip, void *arg, const char *buf, int32_t len);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ehttp_gzip_conf_s {
|
||||||
|
int32_t get_header:2; // 0: not fetching header info
|
||||||
|
int32_t chunk_size; // 0: fallback to default: EHTTP_GZIP_CHUNK_SIZE_DEFAULT
|
||||||
|
};
|
||||||
|
|
||||||
|
ehttp_gzip_t* ehttp_gzip_create_decompressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg);
|
||||||
|
ehttp_gzip_t* ehttp_gzip_create_compressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg);
|
||||||
|
void ehttp_gzip_destroy(ehttp_gzip_t *gzip);
|
||||||
|
|
||||||
|
int32_t ehttp_gzip_write(ehttp_gzip_t *gzip, const char *buf, int32_t len);
|
||||||
|
int32_t ehttp_gzip_finish(ehttp_gzip_t *gzip);
|
||||||
|
|
||||||
|
#endif // _ehttp_gzip_h_9196791b_ac2a_4d73_9979_f4b41abbc4c0_
|
||||||
|
|
|
@ -24,56 +24,31 @@
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "httpCode.h"
|
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "httpJson.h"
|
#include "httpJson.h"
|
||||||
|
#include "httpParser.h"
|
||||||
|
|
||||||
#define HTTP_MAX_CMD_SIZE 1024
|
#define HTTP_MAX_CMD_SIZE 1024
|
||||||
#define HTTP_MAX_BUFFER_SIZE 1024*1024
|
#define HTTP_MAX_BUFFER_SIZE 1024*1024*8
|
||||||
|
|
||||||
#define HTTP_LABEL_SIZE 8
|
#define HTTP_LABEL_SIZE 8
|
||||||
#define HTTP_MAX_EVENTS 10
|
#define HTTP_MAX_EVENTS 10
|
||||||
#define HTTP_BUFFER_SIZE 1024*65 //65k
|
#define HTTP_BUFFER_INIT 4096
|
||||||
#define HTTP_DECOMPRESS_BUF_SIZE 1024*64
|
#define HTTP_BUFFER_SIZE 8388608
|
||||||
#define HTTP_STEP_SIZE 1024 //http message get process step by step
|
#define HTTP_STEP_SIZE 4096 //http message get process step by step
|
||||||
#define HTTP_MAX_URL 5 //http url stack size
|
|
||||||
#define HTTP_METHOD_SCANNER_SIZE 7 //http method fp size
|
#define HTTP_METHOD_SCANNER_SIZE 7 //http method fp size
|
||||||
#define HTTP_GC_TARGET_SIZE 512
|
#define HTTP_GC_TARGET_SIZE 512
|
||||||
|
|
||||||
#define HTTP_VERSION_10 0
|
|
||||||
#define HTTP_VERSION_11 1
|
|
||||||
//#define HTTP_VERSION_12 2
|
|
||||||
|
|
||||||
#define HTTP_UNCUNKED 0
|
|
||||||
#define HTTP_CHUNKED 1
|
|
||||||
|
|
||||||
#define HTTP_KEEPALIVE_NO_INPUT 0
|
|
||||||
#define HTTP_KEEPALIVE_ENABLE 1
|
|
||||||
#define HTTP_KEEPALIVE_DISABLE 2
|
|
||||||
|
|
||||||
#define HTTP_REQTYPE_OTHERS 0
|
|
||||||
#define HTTP_REQTYPE_LOGIN 1
|
|
||||||
#define HTTP_REQTYPE_HEARTBEAT 2
|
|
||||||
#define HTTP_REQTYPE_SINGLE_SQL 3
|
|
||||||
#define HTTP_REQTYPE_MULTI_SQL 4
|
|
||||||
|
|
||||||
#define HTTP_CHECK_BODY_ERROR -1
|
|
||||||
#define HTTP_CHECK_BODY_CONTINUE 0
|
|
||||||
#define HTTP_CHECK_BODY_SUCCESS 1
|
|
||||||
|
|
||||||
#define HTTP_READ_DATA_SUCCESS 0
|
|
||||||
#define HTTP_READ_DATA_FAILED 1
|
|
||||||
|
|
||||||
#define HTTP_WRITE_RETRY_TIMES 500
|
#define HTTP_WRITE_RETRY_TIMES 500
|
||||||
#define HTTP_WRITE_WAIT_TIME_MS 5
|
#define HTTP_WRITE_WAIT_TIME_MS 5
|
||||||
#define HTTP_EXPIRED_TIME 60000
|
|
||||||
#define HTTP_DELAY_CLOSE_TIME_MS 500
|
|
||||||
|
|
||||||
#define HTTP_COMPRESS_IDENTITY 0
|
|
||||||
#define HTTP_COMPRESS_GZIP 2
|
|
||||||
|
|
||||||
#define HTTP_SESSION_ID_LEN (TSDB_USER_LEN + TSDB_PASSWORD_LEN)
|
#define HTTP_SESSION_ID_LEN (TSDB_USER_LEN + TSDB_PASSWORD_LEN)
|
||||||
|
|
||||||
|
typedef enum HttpReqType {
|
||||||
|
HTTP_REQTYPE_OTHERS = 0,
|
||||||
|
HTTP_REQTYPE_LOGIN = 1,
|
||||||
|
HTTP_REQTYPE_HEARTBEAT = 2,
|
||||||
|
HTTP_REQTYPE_SINGLE_SQL = 3,
|
||||||
|
HTTP_REQTYPE_MULTI_SQL = 4
|
||||||
|
} HttpReqType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HTTP_SERVER_INIT,
|
HTTP_SERVER_INIT,
|
||||||
HTTP_SERVER_RUNNING,
|
HTTP_SERVER_RUNNING,
|
||||||
|
@ -82,21 +57,12 @@ typedef enum {
|
||||||
} HttpServerStatus;
|
} HttpServerStatus;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HTTP_CONTEXT_STATE_READY,
|
HTTP_CONTEXT_STATE_READY,
|
||||||
HTTP_CONTEXT_STATE_HANDLING,
|
HTTP_CONTEXT_STATE_HANDLING,
|
||||||
HTTP_CONTEXT_STATE_DROPPING,
|
HTTP_CONTEXT_STATE_DROPPING,
|
||||||
HTTP_CONTEXT_STATE_CLOSED
|
HTTP_CONTEXT_STATE_CLOSED
|
||||||
} HttpContextState;
|
} HttpContextState;
|
||||||
|
|
||||||
struct HttpContext;
|
|
||||||
struct HttpThread;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char id[HTTP_SESSION_ID_LEN];
|
|
||||||
int refCount;
|
|
||||||
void *taos;
|
|
||||||
} HttpSession;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
HTTP_CMD_TYPE_UN_SPECIFIED,
|
HTTP_CMD_TYPE_UN_SPECIFIED,
|
||||||
HTTP_CMD_TYPE_CREATE_DB,
|
HTTP_CMD_TYPE_CREATE_DB,
|
||||||
|
@ -108,6 +74,15 @@ typedef enum { HTTP_CMD_STATE_NOT_RUN_YET, HTTP_CMD_STATE_RUN_FINISHED } HttpSql
|
||||||
|
|
||||||
typedef enum { HTTP_CMD_RETURN_TYPE_WITH_RETURN, HTTP_CMD_RETURN_TYPE_NO_RETURN } HttpSqlCmdReturnType;
|
typedef enum { HTTP_CMD_RETURN_TYPE_WITH_RETURN, HTTP_CMD_RETURN_TYPE_NO_RETURN } HttpSqlCmdReturnType;
|
||||||
|
|
||||||
|
struct HttpContext;
|
||||||
|
struct HttpThread;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char id[HTTP_SESSION_ID_LEN];
|
||||||
|
int32_t refCount;
|
||||||
|
void * taos;
|
||||||
|
} HttpSession;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// used by single cmd
|
// used by single cmd
|
||||||
char *nativSql;
|
char *nativSql;
|
||||||
|
@ -157,34 +132,17 @@ typedef struct {
|
||||||
void (*setNextCmdFp)(struct HttpContext *pContext, HttpSqlCmd *cmd, int code);
|
void (*setNextCmdFp)(struct HttpContext *pContext, HttpSqlCmd *cmd, int code);
|
||||||
} HttpEncodeMethod;
|
} HttpEncodeMethod;
|
||||||
|
|
||||||
typedef struct {
|
typedef enum {
|
||||||
char *pos;
|
EHTTP_CONTEXT_PROCESS_FAILED = 0x01,
|
||||||
int32_t len;
|
EHTTP_CONTEXT_PARSER_FAILED = 0x02
|
||||||
} HttpBuf;
|
} EHTTP_CONTEXT_FAILED_CAUSE;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char buffer[HTTP_BUFFER_SIZE];
|
|
||||||
int bufsize;
|
|
||||||
char *pLast;
|
|
||||||
char *pCur;
|
|
||||||
HttpBuf method;
|
|
||||||
HttpBuf path[HTTP_MAX_URL]; // url: dbname/meter/query
|
|
||||||
HttpBuf data; // body content
|
|
||||||
HttpBuf token; // auth token
|
|
||||||
HttpDecodeMethod *pMethod;
|
|
||||||
} HttpParser;
|
|
||||||
|
|
||||||
typedef struct HttpContext {
|
typedef struct HttpContext {
|
||||||
int32_t refCount;
|
int32_t refCount;
|
||||||
int fd;
|
int32_t fd;
|
||||||
uint32_t accessTimes;
|
uint32_t accessTimes;
|
||||||
uint32_t lastAccessTime;
|
uint32_t lastAccessTime;
|
||||||
int32_t state;
|
int32_t state;
|
||||||
uint8_t httpVersion;
|
|
||||||
uint8_t httpChunked;
|
|
||||||
uint8_t httpKeepAlive; // http1.0 and not keep-alive, close connection immediately
|
|
||||||
uint8_t acceptEncoding;
|
|
||||||
uint8_t contentEncoding;
|
|
||||||
uint8_t reqType;
|
uint8_t reqType;
|
||||||
uint8_t parsed;
|
uint8_t parsed;
|
||||||
char ipstr[22];
|
char ipstr[22];
|
||||||
|
@ -194,12 +152,12 @@ typedef struct HttpContext {
|
||||||
void * ppContext;
|
void * ppContext;
|
||||||
HttpSession *session;
|
HttpSession *session;
|
||||||
z_stream gzipStream;
|
z_stream gzipStream;
|
||||||
HttpParser parser;
|
HttpParser *parser;
|
||||||
HttpSqlCmd singleCmd;
|
HttpSqlCmd singleCmd;
|
||||||
HttpSqlCmds *multiCmds;
|
HttpSqlCmds *multiCmds;
|
||||||
JsonBuf * jsonBuf;
|
JsonBuf * jsonBuf;
|
||||||
void * timer;
|
HttpEncodeMethod *encodeMethod;
|
||||||
HttpEncodeMethod * encodeMethod;
|
HttpDecodeMethod *decodeMethod;
|
||||||
struct HttpThread *pThread;
|
struct HttpThread *pThread;
|
||||||
} HttpContext;
|
} HttpContext;
|
||||||
|
|
||||||
|
@ -208,9 +166,9 @@ typedef struct HttpThread {
|
||||||
HttpContext * pHead;
|
HttpContext * pHead;
|
||||||
pthread_mutex_t threadMutex;
|
pthread_mutex_t threadMutex;
|
||||||
bool stop;
|
bool stop;
|
||||||
int pollFd;
|
int32_t pollFd;
|
||||||
int numOfContexts;
|
int32_t numOfContexts;
|
||||||
int threadId;
|
int32_t threadId;
|
||||||
char label[HTTP_LABEL_SIZE];
|
char label[HTTP_LABEL_SIZE];
|
||||||
bool (*processData)(HttpContext *pContext);
|
bool (*processData)(HttpContext *pContext);
|
||||||
} HttpThread;
|
} HttpThread;
|
||||||
|
@ -219,9 +177,9 @@ typedef struct HttpServer {
|
||||||
char label[HTTP_LABEL_SIZE];
|
char label[HTTP_LABEL_SIZE];
|
||||||
uint32_t serverIp;
|
uint32_t serverIp;
|
||||||
uint16_t serverPort;
|
uint16_t serverPort;
|
||||||
int fd;
|
int32_t fd;
|
||||||
int numOfThreads;
|
int32_t numOfThreads;
|
||||||
int methodScannerLen;
|
int32_t methodScannerLen;
|
||||||
int32_t requestNum;
|
int32_t requestNum;
|
||||||
int32_t status;
|
int32_t status;
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
|
|
@ -37,65 +37,65 @@ extern char JsonTrueTkn[];
|
||||||
extern char JsonFalseTkn[];
|
extern char JsonFalseTkn[];
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int size;
|
int32_t size;
|
||||||
int total;
|
int32_t total;
|
||||||
char* lst;
|
char* lst;
|
||||||
char buf[JSON_BUFFER_SIZE];
|
char buf[JSON_BUFFER_SIZE];
|
||||||
struct HttpContext* pContext;
|
struct HttpContext* pContext;
|
||||||
} JsonBuf;
|
} JsonBuf;
|
||||||
|
|
||||||
// http response
|
// http response
|
||||||
int httpWriteBuf(struct HttpContext* pContext, const char* buf, int sz);
|
int32_t httpWriteBuf(struct HttpContext* pContext, const char* buf, int32_t sz);
|
||||||
int httpWriteBufNoTrace(struct HttpContext* pContext, const char* buf, int sz);
|
int32_t httpWriteBufNoTrace(struct HttpContext* pContext, const char* buf, int32_t sz);
|
||||||
int httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int sz);
|
int32_t httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int32_t sz);
|
||||||
|
|
||||||
// builder callback
|
// builder callback
|
||||||
typedef void (*httpJsonBuilder)(JsonBuf* buf, void* jsnHandle);
|
typedef void (*httpJsonBuilder)(JsonBuf* buf, void* jsnHandle);
|
||||||
|
|
||||||
// buffer
|
// buffer
|
||||||
void httpInitJsonBuf(JsonBuf* buf, struct HttpContext* pContext);
|
void httpInitJsonBuf(JsonBuf* buf, struct HttpContext* pContext);
|
||||||
void httpWriteJsonBufHead(JsonBuf* buf);
|
void httpWriteJsonBufHead(JsonBuf* buf);
|
||||||
int httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast);
|
int32_t httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast);
|
||||||
void httpWriteJsonBufEnd(JsonBuf* buf);
|
void httpWriteJsonBufEnd(JsonBuf* buf);
|
||||||
|
|
||||||
// value
|
// value
|
||||||
void httpJsonString(JsonBuf* buf, char* sVal, int len);
|
void httpJsonString(JsonBuf* buf, char* sVal, int32_t len);
|
||||||
void httpJsonOriginString(JsonBuf* buf, char* sVal, int len);
|
void httpJsonOriginString(JsonBuf* buf, char* sVal, int32_t len);
|
||||||
void httpJsonStringForTransMean(JsonBuf* buf, char* SVal, int maxLen);
|
void httpJsonStringForTransMean(JsonBuf* buf, char* SVal, int32_t maxLen);
|
||||||
void httpJsonInt64(JsonBuf* buf, int64_t num);
|
void httpJsonInt64(JsonBuf* buf, int64_t num);
|
||||||
void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us);
|
void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us);
|
||||||
void httpJsonUtcTimestamp(JsonBuf* buf, int64_t t, bool us);
|
void httpJsonUtcTimestamp(JsonBuf* buf, int64_t t, bool us);
|
||||||
void httpJsonInt(JsonBuf* buf, int num);
|
void httpJsonInt(JsonBuf* buf, int32_t num);
|
||||||
void httpJsonFloat(JsonBuf* buf, float num);
|
void httpJsonFloat(JsonBuf* buf, float num);
|
||||||
void httpJsonDouble(JsonBuf* buf, double num);
|
void httpJsonDouble(JsonBuf* buf, double num);
|
||||||
void httpJsonNull(JsonBuf* buf);
|
void httpJsonNull(JsonBuf* buf);
|
||||||
void httpJsonBool(JsonBuf* buf, int val);
|
void httpJsonBool(JsonBuf* buf, int32_t val);
|
||||||
|
|
||||||
// pair
|
// pair
|
||||||
void httpJsonPair(JsonBuf* buf, char* name, int nameLen, char* sVal, int valLen);
|
void httpJsonPair(JsonBuf* buf, char* name, int32_t nameLen, char* sVal, int32_t valLen);
|
||||||
void httpJsonPairOriginString(JsonBuf* buf, char* name, int nameLen, char* sVal, int valLen);
|
void httpJsonPairOriginString(JsonBuf* buf, char* name, int32_t nameLen, char* sVal, int32_t valLen);
|
||||||
void httpJsonPairHead(JsonBuf* buf, char* name, int len);
|
void httpJsonPairHead(JsonBuf* buf, char* name, int32_t len);
|
||||||
void httpJsonPairIntVal(JsonBuf* buf, char* name, int nNameLen, int num);
|
void httpJsonPairIntVal(JsonBuf* buf, char* name, int32_t nNameLen, int32_t num);
|
||||||
void httpJsonPairInt64Val(JsonBuf* buf, char* name, int nNameLen, int64_t num);
|
void httpJsonPairInt64Val(JsonBuf* buf, char* name, int32_t nNameLen, int64_t num);
|
||||||
void httpJsonPairBoolVal(JsonBuf* buf, char* name, int nNameLen, int num);
|
void httpJsonPairBoolVal(JsonBuf* buf, char* name, int32_t nNameLen, int32_t num);
|
||||||
void httpJsonPairFloatVal(JsonBuf* buf, char* name, int nNameLen, float num);
|
void httpJsonPairFloatVal(JsonBuf* buf, char* name, int32_t nNameLen, float num);
|
||||||
void httpJsonPairDoubleVal(JsonBuf* buf, char* name, int nNameLen, double num);
|
void httpJsonPairDoubleVal(JsonBuf* buf, char* name, int32_t nNameLen, double num);
|
||||||
void httpJsonPairNullVal(JsonBuf* buf, char* name, int nNameLen);
|
void httpJsonPairNullVal(JsonBuf* buf, char* name, int32_t nNameLen);
|
||||||
|
|
||||||
// object
|
// object
|
||||||
void httpJsonPairArray(JsonBuf* buf, char* name, int nLen, httpJsonBuilder builder, void* dsHandle);
|
void httpJsonPairArray(JsonBuf* buf, char* name, int32_t nLen, httpJsonBuilder builder, void* dsHandle);
|
||||||
void httpJsonPairObject(JsonBuf* buf, char* name, int nLen, httpJsonBuilder builder, void* dsHandle);
|
void httpJsonPairObject(JsonBuf* buf, char* name, int32_t nLen, httpJsonBuilder builder, void* dsHandle);
|
||||||
void httpJsonObject(JsonBuf* buf, httpJsonBuilder fnBuilder, void* dsHandle);
|
void httpJsonObject(JsonBuf* buf, httpJsonBuilder fnBuilder, void* dsHandle);
|
||||||
void httpJsonArray(JsonBuf* buf, httpJsonBuilder fnBuidler, void* jsonHandle);
|
void httpJsonArray(JsonBuf* buf, httpJsonBuilder fnBuidler, void* jsonHandle);
|
||||||
|
|
||||||
// print
|
// print
|
||||||
void httpJsonTestBuf(JsonBuf* buf, int safety);
|
void httpJsonTestBuf(JsonBuf* buf, int32_t safety);
|
||||||
void httpJsonToken(JsonBuf* buf, char c);
|
void httpJsonToken(JsonBuf* buf, char c);
|
||||||
void httpJsonItemToken(JsonBuf* buf);
|
void httpJsonItemToken(JsonBuf* buf);
|
||||||
void httpJsonPrint(JsonBuf* buf, const char* json, int len);
|
void httpJsonPrint(JsonBuf* buf, const char* json, int32_t len);
|
||||||
|
|
||||||
// quick
|
// quick
|
||||||
void httpJsonPairStatus(JsonBuf* buf, int code);
|
void httpJsonPairStatus(JsonBuf* buf, int32_t code);
|
||||||
|
|
||||||
// http json printer
|
// http json printer
|
||||||
JsonBuf* httpMallocJsonBuf(struct HttpContext* pContext);
|
JsonBuf* httpMallocJsonBuf(struct HttpContext* pContext);
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HTTP_PARSER_H
|
||||||
|
#define HTTP_PARSER_H
|
||||||
|
#include "httpGzip.h"
|
||||||
|
|
||||||
|
#define HTTP_MAX_URL 5 // http url stack size
|
||||||
|
|
||||||
|
typedef enum HTTP_PARSER_STATE {
|
||||||
|
HTTP_PARSER_BEGIN,
|
||||||
|
HTTP_PARSER_REQUEST_OR_RESPONSE,
|
||||||
|
HTTP_PARSER_METHOD,
|
||||||
|
HTTP_PARSER_TARGET,
|
||||||
|
HTTP_PARSER_HTTP_VERSION,
|
||||||
|
HTTP_PARSER_SP,
|
||||||
|
HTTP_PARSER_STATUS_CODE,
|
||||||
|
HTTP_PARSER_REASON_PHRASE,
|
||||||
|
HTTP_PARSER_CRLF,
|
||||||
|
HTTP_PARSER_HEADER,
|
||||||
|
HTTP_PARSER_HEADER_KEY,
|
||||||
|
HTTP_PARSER_HEADER_VAL,
|
||||||
|
HTTP_PARSER_CHUNK_SIZE,
|
||||||
|
HTTP_PARSER_CHUNK,
|
||||||
|
HTTP_PARSER_END,
|
||||||
|
HTTP_PARSER_ERROR,
|
||||||
|
} HTTP_PARSER_STATE;
|
||||||
|
|
||||||
|
typedef enum HTTP_AUTH_TYPE {
|
||||||
|
HTTP_INVALID_AUTH,
|
||||||
|
HTTP_BASIC_AUTH,
|
||||||
|
HTTP_TAOSD_AUTH
|
||||||
|
} HTTP_AUTH_TYPE;
|
||||||
|
|
||||||
|
typedef enum HTTP_VERSION {
|
||||||
|
HTTP_VERSION_10 = 0,
|
||||||
|
HTTP_VERSION_11 = 1,
|
||||||
|
HTTP_VERSION_12 = 2,
|
||||||
|
HTTP_INVALID_VERSION
|
||||||
|
} HTTP_VERSION;
|
||||||
|
|
||||||
|
typedef enum HTTP_KEEPALIVE {
|
||||||
|
HTTP_KEEPALIVE_NO_INPUT = 0,
|
||||||
|
HTTP_KEEPALIVE_ENABLE = 1,
|
||||||
|
HTTP_KEEPALIVE_DISABLE = 2
|
||||||
|
} HTTP_KEEPALIVE;
|
||||||
|
|
||||||
|
typedef struct HttpString {
|
||||||
|
char * str;
|
||||||
|
int32_t pos;
|
||||||
|
int32_t size;
|
||||||
|
} HttpString;
|
||||||
|
|
||||||
|
typedef struct HttpStatus {
|
||||||
|
int32_t code;
|
||||||
|
char * desc;
|
||||||
|
} HttpStatus;
|
||||||
|
|
||||||
|
typedef struct HttpStack{
|
||||||
|
int8_t *stacks;
|
||||||
|
int32_t pos;
|
||||||
|
int32_t size;
|
||||||
|
} HttpStack;
|
||||||
|
|
||||||
|
struct HttpContext;
|
||||||
|
typedef struct HttpParser {
|
||||||
|
struct HttpContext *pContext;
|
||||||
|
ehttp_gzip_t *gzip;
|
||||||
|
HttpStack stacks;
|
||||||
|
HttpString str;
|
||||||
|
HttpString body;
|
||||||
|
HttpString path[HTTP_MAX_URL];
|
||||||
|
char * method;
|
||||||
|
char * target;
|
||||||
|
char * version;
|
||||||
|
char * reasonPhrase;
|
||||||
|
char * key;
|
||||||
|
char * val;
|
||||||
|
char * authContent;
|
||||||
|
int8_t httpVersion;
|
||||||
|
int8_t acceptEncodingGzip;
|
||||||
|
int8_t acceptEncodingChunked;
|
||||||
|
int8_t contentLengthSpecified;
|
||||||
|
int8_t contentChunked;
|
||||||
|
int8_t transferGzip;
|
||||||
|
int8_t transferChunked;
|
||||||
|
int8_t keepAlive;
|
||||||
|
int8_t authType;
|
||||||
|
int32_t contentLength;
|
||||||
|
int32_t chunkSize;
|
||||||
|
int32_t receivedChunkSize;
|
||||||
|
int32_t receivedSize;
|
||||||
|
int32_t statusCode;
|
||||||
|
int8_t inited;
|
||||||
|
int8_t parsed;
|
||||||
|
int16_t httpCode;
|
||||||
|
int32_t parseCode;
|
||||||
|
} HttpParser;
|
||||||
|
|
||||||
|
void httpInitParser(HttpParser *parser);
|
||||||
|
HttpParser *httpCreateParser(struct HttpContext *pContext);
|
||||||
|
void httpClearParser(HttpParser *parser);
|
||||||
|
void httpDestroyParser(HttpParser *parser);
|
||||||
|
int32_t httpParseBuf(HttpParser *parser, const char *buf, int32_t len);
|
||||||
|
char * httpGetStatusDesc(int32_t statusCode);
|
||||||
|
|
||||||
|
#endif
|
|
@ -32,9 +32,7 @@ enum _httpRespTempl {
|
||||||
|
|
||||||
extern const char *httpRespTemplate[];
|
extern const char *httpRespTemplate[];
|
||||||
|
|
||||||
void httpSendErrorResp(HttpContext *pContext, int errNo);
|
void httpSendErrorResp(HttpContext *pContext, int32_t errNo);
|
||||||
void httpSendErrorRespWithDesc(HttpContext *pContext, int errNo, char *desc);
|
|
||||||
void httpSendTaosdErrorResp(HttpContext *pContext, int errCode);
|
|
||||||
void httpSendTaosdInvalidSqlErrorResp(HttpContext *pContext, char* errMsg);
|
void httpSendTaosdInvalidSqlErrorResp(HttpContext *pContext, char* errMsg);
|
||||||
void httpSendSuccResp(HttpContext *pContext, char *desc);
|
void httpSendSuccResp(HttpContext *pContext, char *desc);
|
||||||
void httpSendOptionResp(HttpContext *pContext, char *desc);
|
void httpSendOptionResp(HttpContext *pContext, char *desc);
|
||||||
|
|
|
@ -43,12 +43,12 @@
|
||||||
#define REST_TIMESTAMP_FMT_TIMESTAMP 1
|
#define REST_TIMESTAMP_FMT_TIMESTAMP 1
|
||||||
#define REST_TIMESTAMP_FMT_UTC_STRING 2
|
#define REST_TIMESTAMP_FMT_UTC_STRING 2
|
||||||
|
|
||||||
void restBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int affect_rows);
|
void restBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int32_t affect_rows);
|
||||||
|
|
||||||
void restStartSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result);
|
void restStartSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result);
|
||||||
bool restBuildSqlTimestampJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows);
|
bool restBuildSqlTimestampJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows);
|
||||||
bool restBuildSqlLocalTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows);
|
bool restBuildSqlLocalTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows);
|
||||||
bool restBuildSqlUtcTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows);
|
bool restBuildSqlUtcTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows);
|
||||||
void restStopSqlJson(HttpContext *pContext, HttpSqlCmd *cmd);
|
void restStopSqlJson(HttpContext *pContext, HttpSqlCmd *cmd);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -21,8 +21,7 @@
|
||||||
bool httpInitConnect();
|
bool httpInitConnect();
|
||||||
void httpCleanUpConnect();
|
void httpCleanUpConnect();
|
||||||
|
|
||||||
void *httpInitServer(char *ip, uint16_t port, char *label, int numOfThreads, void *fp, void *shandle);
|
void *httpInitServer(char *ip, uint16_t port, char *label, int32_t numOfThreads, void *fp, void *shandle);
|
||||||
void httpCleanUpServer(HttpServer *pServer);
|
void httpCleanUpServer(HttpServer *pServer);
|
||||||
int httpReadDataImp(HttpContext *pContext);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,20 +19,20 @@
|
||||||
|
|
||||||
int32_t httpAddToSqlCmdBuffer(HttpContext *pContext, const char *const format, ...);
|
int32_t httpAddToSqlCmdBuffer(HttpContext *pContext, const char *const format, ...);
|
||||||
int32_t httpAddToSqlCmdBufferNoTerminal(HttpContext *pContext, const char *const format, ...);
|
int32_t httpAddToSqlCmdBufferNoTerminal(HttpContext *pContext, const char *const format, ...);
|
||||||
int32_t httpAddToSqlCmdBufferWithSize(HttpContext *pContext, int mallocSize);
|
int32_t httpAddToSqlCmdBufferWithSize(HttpContext *pContext, int32_t mallocSize);
|
||||||
int32_t httpAddToSqlCmdBufferTerminal(HttpContext *pContext);
|
int32_t httpAddToSqlCmdBufferTerminal(HttpContext *pContext);
|
||||||
|
|
||||||
bool httpMallocMultiCmds(HttpContext *pContext, int cmdSize, int bufferSize);
|
bool httpMallocMultiCmds(HttpContext *pContext, int32_t cmdSize, int32_t bufferSize);
|
||||||
bool httpReMallocMultiCmdsSize(HttpContext *pContext, int cmdSize);
|
bool httpReMallocMultiCmdsSize(HttpContext *pContext, int32_t cmdSize);
|
||||||
bool httpReMallocMultiCmdsBuffer(HttpContext *pContext, int bufferSize);
|
bool httpReMallocMultiCmdsBuffer(HttpContext *pContext, int32_t bufferSize);
|
||||||
void httpFreeMultiCmds(HttpContext *pContext);
|
void httpFreeMultiCmds(HttpContext *pContext);
|
||||||
|
|
||||||
HttpSqlCmd *httpNewSqlCmd(HttpContext *pContext);
|
HttpSqlCmd *httpNewSqlCmd(HttpContext *pContext);
|
||||||
HttpSqlCmd *httpCurrSqlCmd(HttpContext *pContext);
|
HttpSqlCmd *httpCurrSqlCmd(HttpContext *pContext);
|
||||||
int httpCurSqlCmdPos(HttpContext *pContext);
|
int32_t httpCurSqlCmdPos(HttpContext *pContext);
|
||||||
|
|
||||||
void httpTrimTableName(char *name);
|
void httpTrimTableName(char *name);
|
||||||
int httpShrinkTableName(HttpContext *pContext, int pos, char *name);
|
int32_t httpShrinkTableName(HttpContext *pContext, int32_t pos, char *name);
|
||||||
char *httpGetCmdsString(HttpContext *pContext, int pos);
|
char * httpGetCmdsString(HttpContext *pContext, int32_t pos);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,8 +24,8 @@ void tgInitQueryJson(HttpContext *pContext);
|
||||||
void tgCleanQueryJson(HttpContext *pContext);
|
void tgCleanQueryJson(HttpContext *pContext);
|
||||||
void tgStartQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result);
|
void tgStartQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result);
|
||||||
void tgStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd);
|
void tgStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd);
|
||||||
void tgBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int affect_rows);
|
void tgBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int32_t affect_rows);
|
||||||
bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int code);
|
bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int32_t code);
|
||||||
void tgSetNextCmd(struct HttpContext *pContext, HttpSqlCmd *cmd, int code);
|
void tgSetNextCmd(struct HttpContext *pContext, HttpSqlCmd *cmd, int32_t code);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -17,21 +17,19 @@
|
||||||
#define TDENGINE_HTTP_UTIL_H
|
#define TDENGINE_HTTP_UTIL_H
|
||||||
|
|
||||||
bool httpCheckUsedbSql(char *sql);
|
bool httpCheckUsedbSql(char *sql);
|
||||||
void httpTimeToString(time_t t, char *buf, int buflen);
|
void httpTimeToString(time_t t, char *buf, int32_t buflen);
|
||||||
|
|
||||||
bool httpUrlMatch(HttpContext *pContext, int pos, char *cmp);
|
bool httpUrlMatch(HttpContext *pContext, int32_t pos, char *cmp);
|
||||||
bool httpParseRequest(HttpContext *pContext);
|
bool httpParseRequest(HttpContext *pContext);
|
||||||
int httpCheckReadCompleted(HttpContext *pContext);
|
int32_t httpCheckReadCompleted(HttpContext *pContext);
|
||||||
void httpReadDirtyData(HttpContext *pContext);
|
void httpReadDirtyData(HttpContext *pContext);
|
||||||
|
|
||||||
int httpGzipDeCompress(char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData);
|
int32_t httpGzipDeCompress(char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData);
|
||||||
int httpGzipCompressInit(HttpContext *pContext);
|
int32_t httpGzipCompressInit(HttpContext *pContext);
|
||||||
int httpGzipCompress(HttpContext *pContext, char *inSrcData, int32_t inSrcDataLen,
|
int32_t httpGzipCompress(HttpContext *pContext, char *inSrcData, int32_t inSrcDataLen,
|
||||||
char *outDestData, int32_t *outDestDataLen, bool isTheLast);
|
char *outDestData, int32_t *outDestDataLen, bool isTheLast);
|
||||||
|
|
||||||
// http request parser
|
// http request parser
|
||||||
void httpAddMethod(HttpServer *pServer, HttpDecodeMethod *pMethod);
|
void httpAddMethod(HttpServer *pServer, HttpDecodeMethod *pMethod);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,85 +23,80 @@
|
||||||
|
|
||||||
#define KEY_DES_4 4971256377704625728L
|
#define KEY_DES_4 4971256377704625728L
|
||||||
|
|
||||||
bool httpParseBasicAuthToken(HttpContext *pContext, char *token, int len) {
|
int32_t httpParseBasicAuthToken(HttpContext *pContext, char *token, int32_t len) {
|
||||||
token[len] = '\0';
|
token[len] = '\0';
|
||||||
int outlen = 0;
|
int32_t outlen = 0;
|
||||||
char *base64 = (char *)base64_decode(token, len, &outlen);
|
char *base64 = (char *)base64_decode(token, len, &outlen);
|
||||||
if (base64 == NULL || outlen == 0) {
|
if (base64 == NULL || outlen == 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, basic token:%s parsed error", pContext, pContext->fd, pContext->ipstr, token);
|
httpError("context:%p, fd:%d, basic token:%s parsed error", pContext, pContext->fd, token);
|
||||||
free(base64);
|
free(base64);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *user = strstr(base64, ":");
|
char *user = strstr(base64, ":");
|
||||||
if (user == NULL) {
|
if (user == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, basic token:%s invalid format", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, basic token:%s invalid format", pContext, pContext->fd, token);
|
||||||
token);
|
|
||||||
free(base64);
|
free(base64);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int user_len = (int)(user - base64);
|
int32_t user_len = (int32_t)(user - base64);
|
||||||
if (user_len < 1 || user_len >= TSDB_USER_LEN) {
|
if (user_len < 1 || user_len >= TSDB_USER_LEN) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, basic token:%s parse user error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, basic token:%s parse user error", pContext, pContext->fd, token);
|
||||||
token);
|
|
||||||
free(base64);
|
free(base64);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
strncpy(pContext->user, base64, (size_t)user_len);
|
strncpy(pContext->user, base64, (size_t)user_len);
|
||||||
pContext->user[user_len] = 0;
|
pContext->user[user_len] = 0;
|
||||||
|
|
||||||
char *password = user + 1;
|
char *password = user + 1;
|
||||||
int pass_len = (int)((base64 + outlen) - password);
|
int32_t pass_len = (int32_t)((base64 + outlen) - password);
|
||||||
if (pass_len < 1 || pass_len >= TSDB_PASSWORD_LEN) {
|
if (pass_len < 1 || pass_len >= TSDB_PASSWORD_LEN) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, basic token:%s parse password error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, basic token:%s parse password error", pContext, pContext->fd, token);
|
||||||
token);
|
|
||||||
free(base64);
|
free(base64);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
strncpy(pContext->pass, password, (size_t)pass_len);
|
strncpy(pContext->pass, password, (size_t)pass_len);
|
||||||
pContext->pass[pass_len] = 0;
|
pContext->pass[pass_len] = 0;
|
||||||
|
|
||||||
free(base64);
|
free(base64);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, basic token parsed success, user:%s", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, basic token parsed success, user:%s", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
return 0;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpParseTaosdAuthToken(HttpContext *pContext, char *token, int len) {
|
int32_t httpParseTaosdAuthToken(HttpContext *pContext, char *token, int32_t len) {
|
||||||
token[len] = '\0';
|
token[len] = '\0';
|
||||||
int outlen = 0;
|
int32_t outlen = 0;
|
||||||
unsigned char *base64 = base64_decode(token, len, &outlen);
|
unsigned char *base64 = base64_decode(token, len, &outlen);
|
||||||
if (base64 == NULL || outlen == 0) {
|
if (base64 == NULL || outlen == 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, taosd token:%s parsed error", pContext, pContext->fd, pContext->ipstr, token);
|
httpError("context:%p, fd:%d, taosd token:%s parsed error", pContext, pContext->fd, token);
|
||||||
if (base64) free(base64);
|
if (base64) free(base64);
|
||||||
return false;
|
return 01;
|
||||||
}
|
}
|
||||||
if (outlen != (TSDB_USER_LEN + TSDB_PASSWORD_LEN)) {
|
if (outlen != (TSDB_USER_LEN + TSDB_PASSWORD_LEN)) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, taosd token:%s length error", pContext, pContext->fd, pContext->ipstr, token);
|
httpError("context:%p, fd:%d, taosd token:%s length error", pContext, pContext->fd, token);
|
||||||
free(base64);
|
free(base64);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *descrypt = taosDesDecode(KEY_DES_4, (char *)base64, outlen);
|
char *descrypt = taosDesDecode(KEY_DES_4, (char *)base64, outlen);
|
||||||
if (descrypt == NULL) {
|
if (descrypt == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, taosd token:%s descrypt error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, taosd token:%s descrypt error", pContext, pContext->fd, token);
|
||||||
token);
|
|
||||||
free(base64);
|
free(base64);
|
||||||
return false;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(pContext->user, descrypt, sizeof(pContext->user));
|
tstrncpy(pContext->user, descrypt, sizeof(pContext->user));
|
||||||
tstrncpy(pContext->pass, descrypt + TSDB_USER_LEN, sizeof(pContext->pass));
|
tstrncpy(pContext->pass, descrypt + TSDB_USER_LEN, sizeof(pContext->pass));
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, taosd token:%s parsed success, user:%s", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, taosd token:%s parsed success, user:%s", pContext, pContext->fd, token,
|
||||||
pContext->ipstr, token, pContext->user);
|
pContext->user);
|
||||||
free(base64);
|
free(base64);
|
||||||
free(descrypt);
|
free(descrypt);
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpGenTaosdAuthToken(HttpContext *pContext, char *token, int maxLen) {
|
int32_t httpGenTaosdAuthToken(HttpContext *pContext, char *token, int32_t maxLen) {
|
||||||
char buffer[sizeof(pContext->user) + sizeof(pContext->pass)] = {0};
|
char buffer[sizeof(pContext->user) + sizeof(pContext->pass)] = {0};
|
||||||
size_t size = sizeof(pContext->user);
|
size_t size = sizeof(pContext->user);
|
||||||
tstrncpy(buffer, pContext->user, size);
|
tstrncpy(buffer, pContext->user, size);
|
||||||
|
@ -116,7 +111,7 @@ bool httpGenTaosdAuthToken(HttpContext *pContext, char *token, int maxLen) {
|
||||||
free(encrypt);
|
free(encrypt);
|
||||||
free(base64);
|
free(base64);
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, gen taosd token:%s", pContext, pContext->fd, pContext->ipstr, token);
|
httpDebug("context:%p, fd:%d, generate taosd token:%s", pContext, pContext->fd, token);
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,108 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
|
|
||||||
|
|
||||||
char* httpMsg[] = {
|
|
||||||
"success", // 0
|
|
||||||
"http server is not online", // 1
|
|
||||||
"http url is not support", // 2
|
|
||||||
"http method parse error", // 3
|
|
||||||
"http version should be 1.0, 1.1 or 1.2", // 4
|
|
||||||
"http head parse error", // 5
|
|
||||||
"request size is too big",
|
|
||||||
"http body size invalid",
|
|
||||||
"http chunked body parse error", // 8
|
|
||||||
"http url parse error", // 9
|
|
||||||
"invalid type of Authorization",
|
|
||||||
"no auth info input",
|
|
||||||
"no sql input",
|
|
||||||
"session list was full",
|
|
||||||
"no enough memory to alloc sqls",
|
|
||||||
"generate taosd token error",
|
|
||||||
"db and table can not be null",
|
|
||||||
"no need to execute use db cmd",
|
|
||||||
"parse grafana json error",
|
|
||||||
"size of multi request is 0", // 19
|
|
||||||
"request is empty", // 20
|
|
||||||
"no enough connections for http", // 21
|
|
||||||
|
|
||||||
// telegraf
|
|
||||||
"database name can not be null", // 22
|
|
||||||
"database name too long",
|
|
||||||
"invalid telegraf json fromat",
|
|
||||||
"metrics size is 0",
|
|
||||||
"metrics size can not more than 1K", // 26
|
|
||||||
"metric name not find",
|
|
||||||
"metric name type should be string",
|
|
||||||
"metric name length is 0",
|
|
||||||
"metric name length too long",
|
|
||||||
"timestamp not find", // 31
|
|
||||||
"timestamp type should be integer",
|
|
||||||
"timestamp value smaller than 0",
|
|
||||||
"tags not find",
|
|
||||||
"tags size is 0",
|
|
||||||
"tags size too long", // 36
|
|
||||||
"tag is null",
|
|
||||||
"tag name is null",
|
|
||||||
"tag name length too long", // 39
|
|
||||||
"tag value type should be number or string",
|
|
||||||
"tag value is null",
|
|
||||||
"table is null", // 42
|
|
||||||
"table name length too long",
|
|
||||||
"fields not find", // 44
|
|
||||||
"fields size is 0",
|
|
||||||
"fields size too long",
|
|
||||||
"field is null", // 47
|
|
||||||
"field name is null",
|
|
||||||
"field name length too long", // 49
|
|
||||||
"field value type should be number or string",
|
|
||||||
"field value is null", // 51
|
|
||||||
"parse basic auth token error",
|
|
||||||
"parse http auth token error",
|
|
||||||
"host type should be string",
|
|
||||||
|
|
||||||
// grafana
|
|
||||||
"query size is 0", // 55
|
|
||||||
"query size can not more than 100",
|
|
||||||
|
|
||||||
// opentsdb
|
|
||||||
"database name can not be null", // 57
|
|
||||||
"database name too long",
|
|
||||||
"invalid opentsdb json fromat", // 59
|
|
||||||
"metrics size is 0",
|
|
||||||
"metrics size can not more than 10K", // 61
|
|
||||||
"metric name not find",
|
|
||||||
"metric name type should be string",
|
|
||||||
"metric name length is 0",
|
|
||||||
"metric name length can not more than 22",
|
|
||||||
"timestamp not find",
|
|
||||||
"timestamp type should be integer",
|
|
||||||
"timestamp value smaller than 0",
|
|
||||||
"tags not find",
|
|
||||||
"tags size is 0",
|
|
||||||
"tags size too long", // 71
|
|
||||||
"tag is null",
|
|
||||||
"tag name is null",
|
|
||||||
"tag name length too long", // 74
|
|
||||||
"tag value type should be boolean, number or string",
|
|
||||||
"tag value is null",
|
|
||||||
"tag value can not more than 64", // 77
|
|
||||||
"value not find",
|
|
||||||
"value type should be boolean, number or string",
|
|
||||||
"stable not exist",
|
|
||||||
|
|
||||||
};
|
|
|
@ -26,6 +26,10 @@
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
#include "httpSql.h"
|
#include "httpSql.h"
|
||||||
#include "httpSession.h"
|
#include "httpSession.h"
|
||||||
|
#include "httpContext.h"
|
||||||
|
#include "httpParser.h"
|
||||||
|
|
||||||
|
static void httpDestroyContext(void *data);
|
||||||
|
|
||||||
static void httpRemoveContextFromEpoll(HttpContext *pContext) {
|
static void httpRemoveContextFromEpoll(HttpContext *pContext) {
|
||||||
HttpThread *pThread = pContext->pThread;
|
HttpThread *pThread = pContext->pThread;
|
||||||
|
@ -54,6 +58,11 @@ static void httpDestroyContext(void *data) {
|
||||||
httpFreeJsonBuf(pContext);
|
httpFreeJsonBuf(pContext);
|
||||||
httpFreeMultiCmds(pContext);
|
httpFreeMultiCmds(pContext);
|
||||||
|
|
||||||
|
if (pContext->parser) {
|
||||||
|
httpDestroyParser(pContext->parser);
|
||||||
|
pContext->parser = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
taosTFree(pContext);
|
taosTFree(pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,9 +113,9 @@ HttpContext *httpCreateContext(int32_t fd) {
|
||||||
if (pContext == NULL) return NULL;
|
if (pContext == NULL) return NULL;
|
||||||
|
|
||||||
pContext->fd = fd;
|
pContext->fd = fd;
|
||||||
pContext->httpVersion = HTTP_VERSION_10;
|
|
||||||
pContext->lastAccessTime = taosGetTimestampSec();
|
pContext->lastAccessTime = taosGetTimestampSec();
|
||||||
pContext->state = HTTP_CONTEXT_STATE_READY;
|
pContext->state = HTTP_CONTEXT_STATE_READY;
|
||||||
|
pContext->parser = httpCreateParser(pContext);
|
||||||
|
|
||||||
uint64_t handleVal = (uint64_t)pContext;
|
uint64_t handleVal = (uint64_t)pContext;
|
||||||
HttpContext **ppContext = taosCachePut(tsHttpServer.contextCache, &handleVal, sizeof(int64_t), &pContext, sizeof(int64_t), 3000);
|
HttpContext **ppContext = taosCachePut(tsHttpServer.contextCache, &handleVal, sizeof(int64_t), &pContext, sizeof(int64_t), 3000);
|
||||||
|
@ -122,27 +131,33 @@ HttpContext *httpCreateContext(int32_t fd) {
|
||||||
HttpContext *httpGetContext(void *ptr) {
|
HttpContext *httpGetContext(void *ptr) {
|
||||||
uint64_t handleVal = (uint64_t)ptr;
|
uint64_t handleVal = (uint64_t)ptr;
|
||||||
HttpContext **ppContext = taosCacheAcquireByKey(tsHttpServer.contextCache, &handleVal, sizeof(HttpContext *));
|
HttpContext **ppContext = taosCacheAcquireByKey(tsHttpServer.contextCache, &handleVal, sizeof(HttpContext *));
|
||||||
|
ASSERT(ppContext);
|
||||||
|
ASSERT(*ppContext);
|
||||||
|
|
||||||
if (ppContext) {
|
if (ppContext) {
|
||||||
HttpContext *pContext = *ppContext;
|
HttpContext *pContext = *ppContext;
|
||||||
if (pContext) {
|
if (pContext) {
|
||||||
int32_t refCount = atomic_add_fetch_32(&pContext->refCount, 1);
|
int32_t refCount = atomic_add_fetch_32(&pContext->refCount, 1);
|
||||||
httpDebug("context:%p, fd:%d, is accquired, data:%p refCount:%d", pContext, pContext->fd, ppContext, refCount);
|
httpTrace("context:%p, fd:%d, is accquired, data:%p refCount:%d", pContext, pContext->fd, ppContext, refCount);
|
||||||
return pContext;
|
return pContext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpReleaseContext(HttpContext *pContext) {
|
void httpReleaseContext(HttpContext *pContext, bool clearRes) {
|
||||||
int32_t refCount = atomic_sub_fetch_32(&pContext->refCount, 1);
|
int32_t refCount = atomic_sub_fetch_32(&pContext->refCount, 1);
|
||||||
if (refCount < 0) {
|
if (refCount < 0) {
|
||||||
httpError("context:%p, is already released, refCount:%d", pContext, refCount);
|
httpError("context:%p, is already released, refCount:%d", pContext, refCount);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clearRes) {
|
||||||
|
httpClearParser(pContext->parser);
|
||||||
|
}
|
||||||
|
|
||||||
HttpContext **ppContext = pContext->ppContext;
|
HttpContext **ppContext = pContext->ppContext;
|
||||||
httpDebug("context:%p, is released, data:%p refCount:%d", pContext, ppContext, refCount);
|
httpTrace("context:%p, is released, data:%p refCount:%d", pContext, ppContext, refCount);
|
||||||
|
|
||||||
if (tsHttpServer.contextCache != NULL) {
|
if (tsHttpServer.contextCache != NULL) {
|
||||||
taosCacheRelease(tsHttpServer.contextCache, (void **)(&ppContext), false);
|
taosCacheRelease(tsHttpServer.contextCache, (void **)(&ppContext), false);
|
||||||
|
@ -155,79 +170,66 @@ void httpReleaseContext(HttpContext *pContext) {
|
||||||
bool httpInitContext(HttpContext *pContext) {
|
bool httpInitContext(HttpContext *pContext) {
|
||||||
pContext->accessTimes++;
|
pContext->accessTimes++;
|
||||||
pContext->lastAccessTime = taosGetTimestampSec();
|
pContext->lastAccessTime = taosGetTimestampSec();
|
||||||
pContext->httpVersion = HTTP_VERSION_10;
|
|
||||||
pContext->httpKeepAlive = HTTP_KEEPALIVE_NO_INPUT;
|
|
||||||
pContext->httpChunked = HTTP_UNCUNKED;
|
|
||||||
pContext->acceptEncoding = HTTP_COMPRESS_IDENTITY;
|
|
||||||
pContext->contentEncoding = HTTP_COMPRESS_IDENTITY;
|
|
||||||
pContext->reqType = HTTP_REQTYPE_OTHERS;
|
pContext->reqType = HTTP_REQTYPE_OTHERS;
|
||||||
pContext->encodeMethod = NULL;
|
pContext->encodeMethod = NULL;
|
||||||
pContext->timer = NULL;
|
|
||||||
memset(&pContext->singleCmd, 0, sizeof(HttpSqlCmd));
|
memset(&pContext->singleCmd, 0, sizeof(HttpSqlCmd));
|
||||||
|
|
||||||
HttpParser *pParser = &pContext->parser;
|
|
||||||
memset(pParser, 0, sizeof(HttpParser));
|
|
||||||
pParser->pCur = pParser->pLast = pParser->buffer;
|
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, accessTimes:%d, parsed:%d", pContext, pContext->fd, pContext->ipstr,
|
httpTrace("context:%p, fd:%d, parsed:%d", pContext, pContext->fd, pContext->parsed);
|
||||||
pContext->accessTimes, pContext->parsed);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpCloseContextByApp(HttpContext *pContext) {
|
void httpCloseContextByApp(HttpContext *pContext) {
|
||||||
|
HttpParser *parser = pContext->parser;
|
||||||
pContext->parsed = false;
|
pContext->parsed = false;
|
||||||
bool keepAlive = true;
|
bool keepAlive = true;
|
||||||
|
|
||||||
if (pContext->httpVersion == HTTP_VERSION_10 && pContext->httpKeepAlive != HTTP_KEEPALIVE_ENABLE) {
|
if (parser->httpVersion == HTTP_VERSION_10 && parser->keepAlive != HTTP_KEEPALIVE_ENABLE) {
|
||||||
keepAlive = false;
|
keepAlive = false;
|
||||||
} else if (pContext->httpVersion != HTTP_VERSION_10 && pContext->httpKeepAlive == HTTP_KEEPALIVE_DISABLE) {
|
} else if (parser->httpVersion != HTTP_VERSION_10 && parser->keepAlive == HTTP_KEEPALIVE_DISABLE) {
|
||||||
keepAlive = false;
|
keepAlive = false;
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keepAlive) {
|
if (keepAlive) {
|
||||||
if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_HANDLING, HTTP_CONTEXT_STATE_READY)) {
|
if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_HANDLING, HTTP_CONTEXT_STATE_READY)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:handling, keepAlive:true, reuse context", pContext, pContext->fd,
|
httpTrace("context:%p, fd:%d, last state:handling, keepAlive:true, reuse context", pContext, pContext->fd);
|
||||||
pContext->ipstr);
|
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:dropping, keepAlive:true, close connect", pContext, pContext->fd,
|
httpTrace("context:%p, fd:%d, ast state:dropping, keepAlive:true, close connect", pContext, pContext->fd);
|
||||||
pContext->ipstr);
|
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_READY)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_READY)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:ready, keepAlive:true, reuse context", pContext, pContext->fd,
|
httpTrace("context:%p, fd:%d, last state:ready, keepAlive:true, reuse context", pContext, pContext->fd);
|
||||||
pContext->ipstr);
|
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:ready, keepAlive:true, close connect", pContext, pContext->fd,
|
httpTrace("context:%p, fd:%d, last state:ready, keepAlive:true, close connect", pContext, pContext->fd);
|
||||||
pContext->ipstr);
|
|
||||||
} else {
|
} else {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpError("context:%p, fd:%d, ip:%s, last state:%s:%d, keepAlive:true, close connect", pContext, pContext->fd,
|
httpError("context:%p, fd:%d, last state:%s:%d, keepAlive:true, close connect", pContext, pContext->fd,
|
||||||
pContext->ipstr, httpContextStateStr(pContext->state), pContext->state);
|
httpContextStateStr(pContext->state), pContext->state);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:%s:%d, keepAlive:false, close context", pContext, pContext->fd,
|
httpTrace("context:%p, fd:%d, ilast state:%s:%d, keepAlive:false, close context", pContext, pContext->fd,
|
||||||
pContext->ipstr, httpContextStateStr(pContext->state), pContext->state);
|
httpContextStateStr(pContext->state), pContext->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
httpReleaseContext(pContext);
|
httpReleaseContext(pContext, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpCloseContextByServer(HttpContext *pContext) {
|
void httpCloseContextByServer(HttpContext *pContext) {
|
||||||
if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_HANDLING, HTTP_CONTEXT_STATE_DROPPING)) {
|
if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_HANDLING, HTTP_CONTEXT_STATE_DROPPING)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, still used by app", pContext, pContext->fd, pContext->ipstr);
|
httpTrace("context:%p, fd:%d, epoll finished, still used by app", pContext, pContext->fd);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_DROPPING)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_DROPPING)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll already finished, wait app finished", pContext, pContext->fd, pContext->ipstr);
|
httpTrace("context:%p, fd:%d, epoll already finished, wait app finished", pContext, pContext->fd);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, close connect", pContext, pContext->fd, pContext->ipstr);
|
httpTrace("context:%p, fd:%d, epoll finished, close connect", pContext, pContext->fd);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, will be closed soon", pContext, pContext->fd, pContext->ipstr);
|
httpTrace("context:%p, fd:%d, epoll finished, will be closed soon", pContext, pContext->fd);
|
||||||
} else {
|
} else {
|
||||||
httpError("context:%p, fd:%d, ip:%s, unknown state:%d", pContext, pContext->fd, pContext->ipstr, pContext->state);
|
httpError("context:%p, fd:%d, unknown state:%d", pContext, pContext->fd, pContext->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
pContext->parsed = false;
|
pContext->parsed = false;
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpReleaseContext(pContext);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,12 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "gcHandle.h"
|
#include "httpGcHandle.h"
|
||||||
#include "gcJson.h"
|
#include "httpGcJson.h"
|
||||||
#include "taosdef.h"
|
|
||||||
|
|
||||||
static HttpDecodeMethod gcDecodeMethod = {"grafana", gcProcessRequest};
|
static HttpDecodeMethod gcDecodeMethod = {"grafana", gcProcessRequest};
|
||||||
static HttpEncodeMethod gcHeartBeatMethod = {
|
static HttpEncodeMethod gcHeartBeatMethod = {
|
||||||
|
@ -47,28 +48,27 @@ static HttpEncodeMethod gcQueryMethod = {
|
||||||
void gcInitHandle(HttpServer* pServer) { httpAddMethod(pServer, &gcDecodeMethod); }
|
void gcInitHandle(HttpServer* pServer) { httpAddMethod(pServer, &gcDecodeMethod); }
|
||||||
|
|
||||||
bool gcGetUserFromUrl(HttpContext* pContext) {
|
bool gcGetUserFromUrl(HttpContext* pContext) {
|
||||||
HttpParser* pParser = &pContext->parser;
|
HttpParser* pParser = pContext->parser;
|
||||||
if (pParser->path[GC_USER_URL_POS].len >= TSDB_USER_LEN || pParser->path[GC_USER_URL_POS].len <= 0) {
|
if (pParser->path[GC_USER_URL_POS].pos >= TSDB_USER_LEN || pParser->path[GC_USER_URL_POS].pos <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(pContext->user, pParser->path[GC_USER_URL_POS].pos, TSDB_USER_LEN);
|
tstrncpy(pContext->user, pParser->path[GC_USER_URL_POS].str, TSDB_USER_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gcGetPassFromUrl(HttpContext* pContext) {
|
bool gcGetPassFromUrl(HttpContext* pContext) {
|
||||||
HttpParser* pParser = &pContext->parser;
|
HttpParser* pParser = pContext->parser;
|
||||||
if (pParser->path[GC_PASS_URL_POS].len >= TSDB_PASSWORD_LEN || pParser->path[GC_PASS_URL_POS].len <= 0) {
|
if (pParser->path[GC_PASS_URL_POS].pos >= TSDB_PASSWORD_LEN || pParser->path[GC_PASS_URL_POS].pos <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(pContext->pass, pParser->path[GC_PASS_URL_POS].pos, TSDB_PASSWORD_LEN);
|
tstrncpy(pContext->pass, pParser->path[GC_PASS_URL_POS].str, TSDB_PASSWORD_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gcProcessLoginRequest(HttpContext* pContext) {
|
bool gcProcessLoginRequest(HttpContext* pContext) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process grafana login msg", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, process grafana login msg", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
pContext->reqType = HTTP_REQTYPE_LOGIN;
|
pContext->reqType = HTTP_REQTYPE_LOGIN;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -143,65 +143,61 @@ bool gcProcessLoginRequest(HttpContext* pContext) {
|
||||||
//}]
|
//}]
|
||||||
|
|
||||||
bool gcProcessQueryRequest(HttpContext* pContext) {
|
bool gcProcessQueryRequest(HttpContext* pContext) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, process grafana query msg", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, process grafana query msg", pContext, pContext->fd);
|
||||||
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
char* filter = pContext->parser->body.str;
|
||||||
char* filter = pParser->data.pos;
|
|
||||||
if (filter == NULL) {
|
if (filter == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_MSG_INPUT);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_MSG_INPUT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* root = cJSON_Parse(filter);
|
cJSON* root = cJSON_Parse(filter);
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_GC_REQ_ERROR);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_GC_REQ_PARSE_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int size = cJSON_GetArraySize(root);
|
int32_t size = cJSON_GetArraySize(root);
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_GC_QUERY_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_GC_QUERY_NULL);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size > 100) {
|
if (size > 100) {
|
||||||
httpSendErrorResp(pContext, HTTP_GC_QUERY_SIZE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_GC_QUERY_SIZE);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!httpMallocMultiCmds(pContext, size, HTTP_BUFFER_SIZE)) {
|
if (!httpMallocMultiCmds(pContext, size, HTTP_BUFFER_SIZE)) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
cJSON* query = cJSON_GetArrayItem(root, i);
|
cJSON* query = cJSON_GetArrayItem(root, i);
|
||||||
if (query == NULL) continue;
|
if (query == NULL) continue;
|
||||||
|
|
||||||
cJSON* refId = cJSON_GetObjectItem(query, "refId");
|
cJSON* refId = cJSON_GetObjectItem(query, "refId");
|
||||||
if (refId == NULL || refId->valuestring == NULL || strlen(refId->valuestring) == 0) {
|
if (refId == NULL || refId->valuestring == NULL || strlen(refId->valuestring) == 0) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, refId is null", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, refId is null", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int refIdBuffer = httpAddToSqlCmdBuffer(pContext, refId->valuestring);
|
int32_t refIdBuffer = httpAddToSqlCmdBuffer(pContext, refId->valuestring);
|
||||||
if (refIdBuffer == -1) {
|
if (refIdBuffer == -1) {
|
||||||
httpWarn("context:%p, fd:%d, ip:%s, user:%s, refId buffer is full", pContext, pContext->fd, pContext->ipstr,
|
httpWarn("context:%p, fd:%d, user:%s, refId buffer is full", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* alias = cJSON_GetObjectItem(query, "alias");
|
cJSON* alias = cJSON_GetObjectItem(query, "alias");
|
||||||
int aliasBuffer = -1;
|
int32_t aliasBuffer = -1;
|
||||||
if (!(alias == NULL || alias->valuestring == NULL || strlen(alias->valuestring) == 0)) {
|
if (!(alias == NULL || alias->valuestring == NULL || strlen(alias->valuestring) == 0)) {
|
||||||
aliasBuffer = httpAddToSqlCmdBuffer(pContext, alias->valuestring);
|
aliasBuffer = httpAddToSqlCmdBuffer(pContext, alias->valuestring);
|
||||||
if (aliasBuffer == -1) {
|
if (aliasBuffer == -1) {
|
||||||
httpWarn("context:%p, fd:%d, ip:%s, user:%s, alias buffer is full", pContext, pContext->fd, pContext->ipstr,
|
httpWarn("context:%p, fd:%d, user:%s, alias buffer is full", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -211,21 +207,19 @@ bool gcProcessQueryRequest(HttpContext* pContext) {
|
||||||
|
|
||||||
cJSON* sql = cJSON_GetObjectItem(query, "sql");
|
cJSON* sql = cJSON_GetObjectItem(query, "sql");
|
||||||
if (sql == NULL || sql->valuestring == NULL || strlen(sql->valuestring) == 0) {
|
if (sql == NULL || sql->valuestring == NULL || strlen(sql->valuestring) == 0) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, sql is null", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, sql is null", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sqlBuffer = httpAddToSqlCmdBuffer(pContext, sql->valuestring);
|
int32_t sqlBuffer = httpAddToSqlCmdBuffer(pContext, sql->valuestring);
|
||||||
if (sqlBuffer == -1) {
|
if (sqlBuffer == -1) {
|
||||||
httpWarn("context:%p, fd:%d, ip:%s, user:%s, sql buffer is full", pContext, pContext->fd, pContext->ipstr,
|
httpWarn("context:%p, fd:%d, user:%s, sql buffer is full", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpSqlCmd* cmd = httpNewSqlCmd(pContext);
|
HttpSqlCmd* cmd = httpNewSqlCmd(pContext);
|
||||||
if (cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -237,8 +231,8 @@ bool gcProcessQueryRequest(HttpContext* pContext) {
|
||||||
cmd->timestamp = httpAddToSqlCmdBufferWithSize(pContext, HTTP_GC_TARGET_SIZE + 1); // hack way
|
cmd->timestamp = httpAddToSqlCmdBufferWithSize(pContext, HTTP_GC_TARGET_SIZE + 1); // hack way
|
||||||
|
|
||||||
if (cmd->timestamp == -1) {
|
if (cmd->timestamp == -1) {
|
||||||
httpWarn("context:%p, fd:%d, ip:%s, user:%s, cant't malloc target size, sql buffer is full",
|
httpWarn("context:%p, fd:%d, user:%s, cant't malloc target size, sql buffer is full", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user);
|
pContext->user);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,7 +245,7 @@ bool gcProcessQueryRequest(HttpContext* pContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gcProcessHeartbeatRequest(HttpContext* pContext) {
|
bool gcProcessHeartbeatRequest(HttpContext* pContext) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, process grafana heartbeat msg", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, process grafana heartbeat msg", pContext, pContext->fd);
|
||||||
pContext->reqType = HTTP_REQTYPE_HEARTBEAT;
|
pContext->reqType = HTTP_REQTYPE_HEARTBEAT;
|
||||||
pContext->encodeMethod = &gcHeartBeatMethod;
|
pContext->encodeMethod = &gcHeartBeatMethod;
|
||||||
return true;
|
return true;
|
||||||
|
@ -267,7 +261,7 @@ bool gcProcessRequest(struct HttpContext* pContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(pContext->user) == 0 || strlen(pContext->pass) == 0) {
|
if (strlen(pContext->user) == 0 || strlen(pContext->pass) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_USR_ERROR);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_AUTH_INFO);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "gcHandle.h"
|
#include "httpGcHandle.h"
|
||||||
#include "gcJson.h"
|
#include "httpGcJson.h"
|
||||||
#include "httpJson.h"
|
#include "httpJson.h"
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
|
|
||||||
|
@ -54,8 +54,8 @@ void gcWriteTargetStartJson(JsonBuf *jsonBuf, char *refId, char *target) {
|
||||||
httpJsonToken(jsonBuf, JsonObjStt);
|
httpJsonToken(jsonBuf, JsonObjStt);
|
||||||
|
|
||||||
// target section
|
// target section
|
||||||
httpJsonPair(jsonBuf, "refId", 5, refId, (int)strlen(refId));
|
httpJsonPair(jsonBuf, "refId", 5, refId, (int32_t)strlen(refId));
|
||||||
httpJsonPair(jsonBuf, "target", 6, target, (int)strlen(target));
|
httpJsonPair(jsonBuf, "target", 6, target, (int32_t)strlen(target));
|
||||||
|
|
||||||
// data begin
|
// data begin
|
||||||
httpJsonPairHead(jsonBuf, "datapoints", 10);
|
httpJsonPairHead(jsonBuf, "datapoints", 10);
|
||||||
|
@ -82,25 +82,25 @@ void gcStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows) {
|
bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
|
||||||
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
||||||
if (jsonBuf == NULL) return false;
|
if (jsonBuf == NULL) return false;
|
||||||
|
|
||||||
int num_fields = taos_num_fields(result);
|
int32_t num_fields = taos_num_fields(result);
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
if (num_fields == 0) {
|
if (num_fields == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int precision = taos_result_precision(result);
|
int32_t precision = taos_result_precision(result);
|
||||||
|
|
||||||
// such as select count(*) from sys.cpu
|
// such as select count(*) from sys.cpu
|
||||||
// such as select count(*) from sys.cpu group by ipaddr
|
// such as select count(*) from sys.cpu group by ipaddr
|
||||||
// such as select count(*) from sys.cpu interval(1d)
|
// such as select count(*) from sys.cpu interval(1d)
|
||||||
// such as select count(*) from sys.cpu interval(1d) group by ipaddr
|
// such as select count(*) from sys.cpu interval(1d) group by ipaddr
|
||||||
// such as select count(*) count(*) from sys.cpu group by ipaddr interval(1d)
|
// such as select count(*) count(*) from sys.cpu group by ipaddr interval(1d)
|
||||||
int dataFields = -1;
|
int32_t dataFields = -1;
|
||||||
int groupFields = -1;
|
int32_t groupFields = -1;
|
||||||
bool hasTimestamp = fields[0].type == TSDB_DATA_TYPE_TIMESTAMP;
|
bool hasTimestamp = fields[0].type == TSDB_DATA_TYPE_TIMESTAMP;
|
||||||
if (hasTimestamp) {
|
if (hasTimestamp) {
|
||||||
dataFields = 1;
|
dataFields = 1;
|
||||||
|
@ -119,7 +119,7 @@ bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
|
||||||
}
|
}
|
||||||
cmd->numOfRows += numOfRows;
|
cmd->numOfRows += numOfRows;
|
||||||
|
|
||||||
for (int k = 0; k < numOfRows; ++k) {
|
for (int32_t k = 0; k < numOfRows; ++k) {
|
||||||
TAOS_ROW row = taos_fetch_row(result);
|
TAOS_ROW row = taos_fetch_row(result);
|
||||||
if (row == NULL) {
|
if (row == NULL) {
|
||||||
cmd->numOfRows--;
|
cmd->numOfRows--;
|
||||||
|
@ -130,9 +130,9 @@ bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
|
||||||
// for group by
|
// for group by
|
||||||
if (groupFields != -1) {
|
if (groupFields != -1) {
|
||||||
char target[HTTP_GC_TARGET_SIZE] = {0};
|
char target[HTTP_GC_TARGET_SIZE] = {0};
|
||||||
int len;
|
int32_t len;
|
||||||
len = snprintf(target,HTTP_GC_TARGET_SIZE,"%s{",aliasBuffer);
|
len = snprintf(target,HTTP_GC_TARGET_SIZE,"%s{",aliasBuffer);
|
||||||
for (int i = dataFields + 1; i<num_fields; i++){
|
for (int32_t i = dataFields + 1; i<num_fields; i++){
|
||||||
switch (fields[i].type) {
|
switch (fields[i].type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
@ -188,7 +188,7 @@ bool gcBuildQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonToken(jsonBuf, JsonArrStt);
|
httpJsonToken(jsonBuf, JsonArrStt);
|
||||||
|
|
||||||
for (int i = dataFields; i >= 0; i--) {
|
for (int32_t i = dataFields; i >= 0; i--) {
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
if (row[i] == NULL) {
|
if (row[i] == NULL) {
|
||||||
httpJsonOriginString(jsonBuf, "null", 4);
|
httpJsonOriginString(jsonBuf, "null", 4);
|
||||||
|
@ -253,13 +253,13 @@ void gcSendHeartBeatResp(HttpContext *pContext, HttpSqlCmd *cmd) {
|
||||||
httpInitJsonBuf(jsonBuf, pContext);
|
httpInitJsonBuf(jsonBuf, pContext);
|
||||||
|
|
||||||
httpJsonToken(jsonBuf, JsonObjStt);
|
httpJsonToken(jsonBuf, JsonObjStt);
|
||||||
httpJsonPair(jsonBuf, "message", (int)strlen("message"), desc, (int)strlen(desc));
|
httpJsonPair(jsonBuf, "message", (int32_t)strlen("message"), desc, (int32_t)strlen(desc));
|
||||||
httpJsonToken(jsonBuf, JsonObjEnd);
|
httpJsonToken(jsonBuf, JsonObjEnd);
|
||||||
|
|
||||||
char head[1024];
|
char head[1024];
|
||||||
|
|
||||||
int hLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_GRAFANA], httpVersionStr[pContext->httpVersion],
|
int32_t hLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_GRAFANA], httpVersionStr[pContext->parser->httpVersion],
|
||||||
httpKeepAliveStr[pContext->httpKeepAlive], (jsonBuf->lst - jsonBuf->buf));
|
httpKeepAliveStr[pContext->parser->keepAlive], (jsonBuf->lst - jsonBuf->buf));
|
||||||
httpWriteBuf(pContext, head, hLen);
|
httpWriteBuf(pContext, head, hLen);
|
||||||
httpWriteBuf(pContext, jsonBuf->buf, (int)(jsonBuf->lst - jsonBuf->buf));
|
httpWriteBuf(pContext, jsonBuf->buf, (int32_t)(jsonBuf->lst - jsonBuf->buf));
|
||||||
}
|
}
|
|
@ -0,0 +1,167 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "zlib.h"
|
||||||
|
#include "httpGzip.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EHTTP_GZIP_INITING,
|
||||||
|
EHTTP_GZIP_READY,
|
||||||
|
EHTTP_GZIP_CLOSED,
|
||||||
|
} EHTTP_GZIP_STATE;
|
||||||
|
|
||||||
|
struct ehttp_gzip_s {
|
||||||
|
ehttp_gzip_conf_t conf;
|
||||||
|
ehttp_gzip_callbacks_t callbacks;
|
||||||
|
void *arg;
|
||||||
|
z_stream *gzip;
|
||||||
|
gz_header *header;
|
||||||
|
char *chunk;
|
||||||
|
|
||||||
|
int32_t state;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void dummy_on_data(ehttp_gzip_t *gzip, void *arg, const char *buf, int32_t len) {
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ehttp_gzip_cleanup(ehttp_gzip_t *gzip) {
|
||||||
|
switch(gzip->state) {
|
||||||
|
case EHTTP_GZIP_READY: {
|
||||||
|
inflateEnd(gzip->gzip);
|
||||||
|
} break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
if (gzip->gzip) {
|
||||||
|
free(gzip->gzip);
|
||||||
|
gzip->gzip = NULL;
|
||||||
|
}
|
||||||
|
if (gzip->header) {
|
||||||
|
free(gzip->header);
|
||||||
|
gzip->header = NULL;
|
||||||
|
}
|
||||||
|
if (gzip->chunk) {
|
||||||
|
free(gzip->chunk);
|
||||||
|
gzip->chunk = NULL;
|
||||||
|
}
|
||||||
|
gzip->state = EHTTP_GZIP_CLOSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
ehttp_gzip_t* ehttp_gzip_create_decompressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg) {
|
||||||
|
ehttp_gzip_t *gzip = (ehttp_gzip_t*)calloc(1, sizeof(*gzip));
|
||||||
|
if (!gzip) return NULL;
|
||||||
|
|
||||||
|
do {
|
||||||
|
gzip->conf = conf;
|
||||||
|
gzip->callbacks = callbacks;
|
||||||
|
gzip->arg = arg;
|
||||||
|
if (gzip->callbacks.on_data == NULL) gzip->callbacks.on_data = dummy_on_data;
|
||||||
|
gzip->gzip = (z_stream*)calloc(1, sizeof(*gzip->gzip));
|
||||||
|
if (gzip->conf.get_header) {
|
||||||
|
gzip->header = (gz_header*)calloc(1, sizeof(*gzip->header));
|
||||||
|
}
|
||||||
|
if (gzip->conf.chunk_size<=0) gzip->conf.chunk_size = EHTTP_GZIP_CHUNK_SIZE_DEFAULT;
|
||||||
|
gzip->chunk = (char*)malloc(gzip->conf.chunk_size);
|
||||||
|
if (!gzip->gzip || (gzip->conf.get_header && !gzip->header) || !gzip->chunk) break;
|
||||||
|
gzip->gzip->zalloc = Z_NULL;
|
||||||
|
gzip->gzip->zfree = Z_NULL;
|
||||||
|
gzip->gzip->opaque = Z_NULL;
|
||||||
|
|
||||||
|
// 863 windowBits can also be greater than 15 for optional gzip decoding. Add
|
||||||
|
// 864 32 to windowBits to enable zlib and gzip decoding with automatic header
|
||||||
|
// 865 detection, or add 16 to decode only the gzip format (the zlib format will
|
||||||
|
// 866 return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
|
||||||
|
// 867 CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
|
||||||
|
// 868 below), inflate() will not automatically decode concatenated gzip streams.
|
||||||
|
// 869 inflate() will return Z_STREAM_END at the end of the gzip stream. The state
|
||||||
|
// 870 would need to be reset to continue decoding a subsequent gzip stream.
|
||||||
|
int32_t ret = inflateInit2(gzip->gzip, 32); // 32/16? 32/16 + MAX_WBITS
|
||||||
|
if (ret != Z_OK) break;
|
||||||
|
if (gzip->header) {
|
||||||
|
ret = inflateGetHeader(gzip->gzip, gzip->header);
|
||||||
|
}
|
||||||
|
if (ret != Z_OK) break;
|
||||||
|
|
||||||
|
gzip->gzip->next_out = (z_const Bytef*)gzip->chunk;
|
||||||
|
gzip->gzip->avail_out = gzip->conf.chunk_size;
|
||||||
|
gzip->state = EHTTP_GZIP_READY;
|
||||||
|
return gzip;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
ehttp_gzip_destroy(gzip);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ehttp_gzip_t* ehttp_gzip_create_compressor(ehttp_gzip_conf_t conf, ehttp_gzip_callbacks_t callbacks, void *arg);
|
||||||
|
|
||||||
|
void ehttp_gzip_destroy(ehttp_gzip_t *gzip) {
|
||||||
|
ehttp_gzip_cleanup(gzip);
|
||||||
|
|
||||||
|
free(gzip);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ehttp_gzip_write(ehttp_gzip_t *gzip, const char *buf, int32_t len) {
|
||||||
|
if (gzip->state != EHTTP_GZIP_READY) return -1;
|
||||||
|
if (len <= 0) return 0;
|
||||||
|
|
||||||
|
gzip->gzip->next_in = (z_const Bytef*)buf;
|
||||||
|
gzip->gzip->avail_in = len;
|
||||||
|
|
||||||
|
while (gzip->gzip->avail_in) {
|
||||||
|
int32_t ret;
|
||||||
|
if (gzip->header) {
|
||||||
|
ret = inflate(gzip->gzip, Z_BLOCK);
|
||||||
|
} else {
|
||||||
|
ret = inflate(gzip->gzip, Z_SYNC_FLUSH);
|
||||||
|
}
|
||||||
|
if (ret != Z_OK && ret != Z_STREAM_END) return -1;
|
||||||
|
|
||||||
|
if (gzip->gzip->avail_out>0) {
|
||||||
|
if (ret!=Z_STREAM_END) continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t len = gzip->gzip->next_out - (z_const Bytef*)gzip->chunk;
|
||||||
|
|
||||||
|
gzip->gzip->next_out[0] = '\0';
|
||||||
|
gzip->callbacks.on_data(gzip, gzip->arg, gzip->chunk, len);
|
||||||
|
gzip->gzip->next_out = (z_const Bytef*)gzip->chunk;
|
||||||
|
gzip->gzip->avail_out = gzip->conf.chunk_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ehttp_gzip_finish(ehttp_gzip_t *gzip) {
|
||||||
|
if (gzip->state != EHTTP_GZIP_READY) return -1;
|
||||||
|
|
||||||
|
gzip->gzip->next_in = NULL;
|
||||||
|
gzip->gzip->avail_in = 0;
|
||||||
|
|
||||||
|
int32_t ret;
|
||||||
|
ret = inflate(gzip->gzip, Z_FINISH);
|
||||||
|
|
||||||
|
if (ret != Z_STREAM_END) return -1;
|
||||||
|
|
||||||
|
int32_t len = gzip->gzip->next_out - (z_const Bytef*)gzip->chunk;
|
||||||
|
|
||||||
|
gzip->gzip->next_out[0] = '\0';
|
||||||
|
gzip->callbacks.on_data(gzip, gzip->arg, gzip->chunk, len);
|
||||||
|
gzip->gzip->next_out = NULL;
|
||||||
|
gzip->gzip->avail_out = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -15,382 +15,33 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taos.h"
|
|
||||||
#include "tglobal.h"
|
|
||||||
#include "tsocket.h"
|
|
||||||
#include "ttimer.h"
|
|
||||||
#include "httpInt.h"
|
#include "httpInt.h"
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
#include "httpAuth.h"
|
|
||||||
#include "httpServer.h"
|
|
||||||
#include "httpContext.h"
|
#include "httpContext.h"
|
||||||
#include "httpHandle.h"
|
#include "httpHandle.h"
|
||||||
|
|
||||||
void httpToLowerUrl(char* url) {
|
|
||||||
/*ignore case */
|
|
||||||
while (*url) {
|
|
||||||
if (*url >= 'A' && *url <= 'Z') {
|
|
||||||
*url = *url | 0x20;
|
|
||||||
}
|
|
||||||
url++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpUrlMatch(HttpContext* pContext, int pos, char* cmp) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
|
|
||||||
if (pos < 0 || pos >= HTTP_MAX_URL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pParser->path[pos].len <= 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(pParser->path[pos].pos, cmp) != 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// /account/db/meter HTTP/1.1\r\nHost
|
|
||||||
bool httpParseURL(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
char* pSeek;
|
|
||||||
char* pEnd = strchr(pParser->pLast, ' ');
|
|
||||||
if (pEnd == NULL) {
|
|
||||||
httpSendErrorResp(pContext, HTTP_UNSUPPORT_URL);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*pParser->pLast != '/') {
|
|
||||||
httpSendErrorResp(pContext, HTTP_UNSUPPORT_URL);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
pParser->pLast++;
|
|
||||||
|
|
||||||
for (int i = 0; i < HTTP_MAX_URL; i++) {
|
|
||||||
pSeek = strchr(pParser->pLast, '/');
|
|
||||||
if (pSeek == NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pParser->path[i].pos = pParser->pLast;
|
|
||||||
if (pSeek <= pEnd) {
|
|
||||||
pParser->path[i].len = (int16_t)(pSeek - pParser->pLast);
|
|
||||||
pParser->path[i].pos[pParser->path[i].len] = 0;
|
|
||||||
httpToLowerUrl(pParser->path[i].pos);
|
|
||||||
pParser->pLast = pSeek + 1;
|
|
||||||
} else {
|
|
||||||
pParser->path[i].len = (int16_t)(pEnd - pParser->pLast);
|
|
||||||
pParser->path[i].pos[pParser->path[i].len] = 0;
|
|
||||||
httpToLowerUrl(pParser->path[i].pos);
|
|
||||||
pParser->pLast = pEnd + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pParser->pLast = pEnd + 1;
|
|
||||||
|
|
||||||
if (pParser->path[0].len == 0) {
|
|
||||||
httpSendErrorResp(pContext, HTTP_UNSUPPORT_URL);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpParseHttpVersion(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
char* pEnd = strchr(pParser->pLast, '1');
|
|
||||||
if (pEnd == NULL) {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, can't find http version at position:%s", pContext, pContext->fd,
|
|
||||||
pContext->ipstr, pParser->pLast);
|
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_HTTP_VERSION_ERROR);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*(pEnd + 1) != '.') {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, can't find http version at position:%s", pContext, pContext->fd,
|
|
||||||
pContext->ipstr, pParser->pLast);
|
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_HTTP_VERSION_ERROR);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*(pEnd + 2) == '0')
|
|
||||||
pContext->httpVersion = HTTP_VERSION_10;
|
|
||||||
else if (*(pEnd + 2) == '1')
|
|
||||||
pContext->httpVersion = HTTP_VERSION_11;
|
|
||||||
else if (*(pEnd + 2) == '2')
|
|
||||||
pContext->httpVersion = HTTP_VERSION_11;
|
|
||||||
else
|
|
||||||
pContext->httpVersion = HTTP_VERSION_10;
|
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, httpVersion:1.%d", pContext, pContext->fd, pContext->ipstr,
|
|
||||||
pContext->httpVersion);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpGetNextLine(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
while (pParser->buffer + pParser->bufsize - pParser->pCur++ > 0) {
|
|
||||||
if (*(pParser->pCur) == '\n' && *(pParser->pCur - 1) == '\r') {
|
|
||||||
// cut the string
|
|
||||||
*pParser->pCur = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_HEAD_ERROR);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpGetHttpMethod(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
|
|
||||||
char* pSeek = strchr(pParser->pLast, ' ');
|
|
||||||
if (pSeek == NULL) {
|
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_HTTP_METHOD_ERROR);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
pParser->method.pos = pParser->pLast;
|
|
||||||
pParser->method.len = (int16_t)(pSeek - pParser->pLast);
|
|
||||||
pParser->method.pos[pParser->method.len] = 0;
|
|
||||||
pParser->pLast = pSeek + 1;
|
|
||||||
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, httpMethod:%s", pContext, pContext->fd, pContext->ipstr, pParser->method.pos);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpGetDecodeMethod(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
|
|
||||||
HttpServer* pServer = &tsHttpServer;
|
|
||||||
int methodLen = pServer->methodScannerLen;
|
|
||||||
for (int i = 0; i < methodLen; i++) {
|
|
||||||
HttpDecodeMethod* method = pServer->methodScanner[i];
|
|
||||||
if (strcmp(method->module, pParser->path[0].pos) != 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
pParser->pMethod = method;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, error:the url is not support, method:%s, path:%s",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, pParser->method.pos, pParser->path[0].pos);
|
|
||||||
httpSendErrorResp(pContext, HTTP_UNSUPPORT_URL);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpParseHead(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
if (strncasecmp(pParser->pLast, "Content-Length: ", 16) == 0) {
|
|
||||||
pParser->data.len = (int32_t)atoi(pParser->pLast + 16);
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, Content-Length:%d", pContext, pContext->fd, pContext->ipstr,
|
|
||||||
pParser->data.len);
|
|
||||||
} else if (strncasecmp(pParser->pLast, "Accept-Encoding: ", 17) == 0) {
|
|
||||||
if (tsHttpEnableCompress && strstr(pParser->pLast + 17, "gzip") != NULL) {
|
|
||||||
pContext->acceptEncoding = HTTP_COMPRESS_GZIP;
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, Accept-Encoding:gzip", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
} else {
|
|
||||||
pContext->acceptEncoding = HTTP_COMPRESS_IDENTITY;
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, Accept-Encoding:identity", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
}
|
|
||||||
} else if (strncasecmp(pParser->pLast, "Content-Encoding: ", 18) == 0) {
|
|
||||||
if (strstr(pParser->pLast + 18, "gzip") != NULL) {
|
|
||||||
pContext->contentEncoding = HTTP_COMPRESS_GZIP;
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, Content-Encoding:gzip", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
} else {
|
|
||||||
pContext->contentEncoding = HTTP_COMPRESS_IDENTITY;
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, Content-Encoding:identity", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
}
|
|
||||||
} else if (strncasecmp(pParser->pLast, "Connection: ", 12) == 0) {
|
|
||||||
if (strncasecmp(pParser->pLast + 12, "Keep-Alive", 10) == 0) {
|
|
||||||
pContext->httpKeepAlive = HTTP_KEEPALIVE_ENABLE;
|
|
||||||
} else {
|
|
||||||
pContext->httpKeepAlive = HTTP_KEEPALIVE_DISABLE;
|
|
||||||
}
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, keepAlive:%d", pContext, pContext->fd, pContext->ipstr,
|
|
||||||
pContext->httpKeepAlive);
|
|
||||||
} else if (strncasecmp(pParser->pLast, "Transfer-Encoding: ", 19) == 0) {
|
|
||||||
if (strncasecmp(pParser->pLast + 19, "chunked", 7) == 0) {
|
|
||||||
pContext->httpChunked = HTTP_CHUNKED;
|
|
||||||
}
|
|
||||||
} else if (strncasecmp(pParser->pLast, "Authorization: ", 15) == 0) {
|
|
||||||
if (strncasecmp(pParser->pLast + 15, "Basic ", 6) == 0) {
|
|
||||||
pParser->token.pos = pParser->pLast + 21;
|
|
||||||
pParser->token.len = (int16_t)(pParser->pCur - pParser->token.pos - 1);
|
|
||||||
bool parsed = httpParseBasicAuthToken(pContext, pParser->token.pos, pParser->token.len);
|
|
||||||
if (!parsed) {
|
|
||||||
httpSendErrorResp(pContext, HTTP_INVALID_BASIC_AUTH_TOKEN);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (strncasecmp(pParser->pLast + 15, "Taosd ", 6) == 0) {
|
|
||||||
pParser->token.pos = pParser->pLast + 21;
|
|
||||||
pParser->token.len = (int16_t)(pParser->pCur - pParser->token.pos - 1);
|
|
||||||
bool parsed = httpParseTaosdAuthToken(pContext, pParser->token.pos, pParser->token.len);
|
|
||||||
if (!parsed) {
|
|
||||||
httpSendErrorResp(pContext, HTTP_INVALID_TAOSD_AUTH_TOKEN);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
httpSendErrorResp(pContext, HTTP_INVALID_AUTH_TOKEN);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpParseChunkedBody(HttpContext* pContext, HttpParser* pParser, bool test) {
|
|
||||||
char* pEnd = pParser->buffer + pParser->bufsize;
|
|
||||||
char* pRet = pParser->data.pos;
|
|
||||||
char* pSize = pParser->data.pos;
|
|
||||||
size_t size = strtoul(pSize, NULL, 16);
|
|
||||||
if (size <= 0) return false;
|
|
||||||
|
|
||||||
while (size > 0) {
|
|
||||||
char* pData = strstr(pSize, "\r\n");
|
|
||||||
if (pData == NULL || pData >= pEnd) return false;
|
|
||||||
pData += 2;
|
|
||||||
|
|
||||||
pSize = strstr(pData, "\r\n");
|
|
||||||
if (pSize == NULL || pSize >= pEnd) return false;
|
|
||||||
if ((size_t)(pSize - pData) != size) return false;
|
|
||||||
pSize += 2;
|
|
||||||
|
|
||||||
if (!test) {
|
|
||||||
memmove(pRet, pData, size);
|
|
||||||
pRet += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
size = strtoul(pSize, NULL, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!test) {
|
|
||||||
*pRet = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int httpReadChunkedBody(HttpContext* pContext, HttpParser* pParser) {
|
|
||||||
bool parsedOk = httpParseChunkedBody(pContext, pParser, true);
|
|
||||||
if (parsedOk) {
|
|
||||||
httpParseChunkedBody(pContext, pParser, false);
|
|
||||||
return HTTP_CHECK_BODY_SUCCESS;
|
|
||||||
} else {
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, chunked body not finished, continue read", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
if (httpReadDataImp(pContext) != HTTP_READ_DATA_SUCCESS) {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, read chunked request error", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
return HTTP_CHECK_BODY_ERROR;
|
|
||||||
} else {
|
|
||||||
return HTTP_CHECK_BODY_CONTINUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int httpReadUnChunkedBody(HttpContext* pContext, HttpParser* pParser) {
|
|
||||||
int dataReadLen = pParser->bufsize - (int)(pParser->data.pos - pParser->buffer);
|
|
||||||
if (dataReadLen > pParser->data.len) {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, un-chunked body length invalid, read size:%d dataReadLen:%d > pContext->data.len:%d",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->parser.bufsize, dataReadLen, pParser->data.len);
|
|
||||||
return HTTP_CHECK_BODY_ERROR;
|
|
||||||
} else if (dataReadLen < pParser->data.len) {
|
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, un-chunked body not finished, read size:%d dataReadLen:%d < pContext->data.len:%d, continue read",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->parser.bufsize, dataReadLen, pParser->data.len);
|
|
||||||
return HTTP_CHECK_BODY_CONTINUE;
|
|
||||||
} else {
|
|
||||||
return HTTP_CHECK_BODY_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpParseRequest(HttpContext* pContext) {
|
|
||||||
HttpParser *pParser = &pContext->parser;
|
|
||||||
if (pContext->parsed) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
httpTraceL("context:%p, fd:%d, ip:%s, thread:%s, numOfContexts:%d, read size:%d, raw data:\n%s", pContext,
|
|
||||||
pContext->fd, pContext->ipstr, pContext->pThread->label, pContext->pThread->numOfContexts,
|
|
||||||
pContext->parser.bufsize, pContext->parser.buffer);
|
|
||||||
|
|
||||||
if (!httpGetHttpMethod(pContext)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!httpParseURL(pContext)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!httpParseHttpVersion(pContext)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!httpGetDecodeMethod(pContext)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (!httpGetNextLine(pContext)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Empty line, end of the HTTP HEAD
|
|
||||||
if (pParser->pCur - pParser->pLast == 1) {
|
|
||||||
pParser->data.pos = ++pParser->pCur;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!httpParseHead(pContext)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
pParser->pLast = ++pParser->pCur;
|
|
||||||
} while (1);
|
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, parse http head ok", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
|
|
||||||
pContext->parsed = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int httpCheckReadCompleted(HttpContext* pContext) {
|
|
||||||
HttpParser* pParser = &pContext->parser;
|
|
||||||
|
|
||||||
if (pContext->httpChunked == HTTP_UNCUNKED) {
|
|
||||||
return httpReadUnChunkedBody(pContext, pParser);
|
|
||||||
} else {
|
|
||||||
return httpReadChunkedBody(pContext, pParser);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool httpDecodeRequest(HttpContext* pContext) {
|
bool httpDecodeRequest(HttpContext* pContext) {
|
||||||
HttpParser* pParser = &pContext->parser;
|
if (pContext->decodeMethod->decodeFp == NULL) {
|
||||||
if (pParser->pMethod->decodeFp == NULL) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (*pParser->pMethod->decodeFp)(pContext);
|
return (*pContext->decodeMethod->decodeFp)(pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the request from http pServer
|
* Process the request from http pServer
|
||||||
*/
|
*/
|
||||||
bool httpProcessData(HttpContext* pContext) {
|
bool httpProcessData(HttpContext* pContext) {
|
||||||
|
|
||||||
if (!httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_HANDLING)) {
|
if (!httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_HANDLING)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s not in ready state, stop process request",
|
httpTrace("context:%p, fd:%d, state:%s not in ready state, stop process request", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state));
|
httpContextStateStr(pContext->state));
|
||||||
httpCloseContextByApp(pContext);
|
httpCloseContextByApp(pContext);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle Cross-domain request
|
// handle Cross-domain request
|
||||||
if (strcmp(pContext->parser.method.pos, "OPTIONS") == 0) {
|
if (strcmp(pContext->parser->method, "OPTIONS") == 0) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, process options request", pContext, pContext->fd, pContext->ipstr);
|
httpTrace("context:%p, fd:%d, process options request", pContext, pContext->fd);
|
||||||
httpSendOptionResp(pContext, "process options request success");
|
httpSendOptionResp(pContext, "process options request success");
|
||||||
} else {
|
} else {
|
||||||
if (!httpDecodeRequest(pContext)) {
|
if (!httpDecodeRequest(pContext)) {
|
||||||
|
|
|
@ -17,9 +17,9 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
#include "tglobal.h"
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "httpCode.h"
|
|
||||||
#include "httpJson.h"
|
#include "httpJson.h"
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
#include "httpUtil.h"
|
#include "httpUtil.h"
|
||||||
|
@ -38,28 +38,26 @@ char JsonNulTkn[] = "null";
|
||||||
char JsonTrueTkn[] = "true";
|
char JsonTrueTkn[] = "true";
|
||||||
char JsonFalseTkn[] = "false";
|
char JsonFalseTkn[] = "false";
|
||||||
|
|
||||||
int httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int sz) {
|
int32_t httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int32_t sz) {
|
||||||
int len;
|
int32_t len;
|
||||||
int countWait = 0;
|
int32_t countWait = 0;
|
||||||
int writeLen = 0;
|
int32_t writeLen = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (pContext->fd > 2){
|
if (pContext->fd > 2){
|
||||||
len = (int)taosSend(pContext->fd, buf + writeLen, (size_t)(sz - writeLen), MSG_NOSIGNAL);
|
len = (int32_t)taosSend(pContext->fd, buf + writeLen, (size_t)(sz - writeLen), MSG_NOSIGNAL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, socket write errno:%d, times:%d",
|
httpDebug("context:%p, fd:%d, socket write errno:%d, times:%d", pContext, pContext->fd, errno, countWait);
|
||||||
pContext, pContext->fd, pContext->ipstr, errno, countWait);
|
|
||||||
if (++countWait > HTTP_WRITE_RETRY_TIMES) break;
|
if (++countWait > HTTP_WRITE_RETRY_TIMES) break;
|
||||||
taosMsleep(HTTP_WRITE_WAIT_TIME_MS);
|
taosMsleep(HTTP_WRITE_WAIT_TIME_MS);
|
||||||
continue;
|
continue;
|
||||||
} else if (len == 0) {
|
} else if (len == 0) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, socket write errno:%d, connect already closed",
|
httpDebug("context:%p, fd:%d, socket write errno:%d, connect already closed", pContext, pContext->fd, errno);
|
||||||
pContext, pContext->fd, pContext->ipstr, errno);
|
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
countWait = 0;
|
countWait = 0;
|
||||||
|
@ -70,36 +68,35 @@ int httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int sz) {
|
||||||
return writeLen;
|
return writeLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpWriteBuf(struct HttpContext *pContext, const char *buf, int sz) {
|
int32_t httpWriteBuf(struct HttpContext* pContext, const char* buf, int32_t sz) {
|
||||||
int writeSz = httpWriteBufByFd(pContext, buf, sz);
|
int32_t writeSz = httpWriteBufByFd(pContext, buf, sz);
|
||||||
if (writeSz != sz) {
|
if (writeSz != sz) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, dataSize:%d, writeSize:%d, failed to send response:\n%s",
|
httpError("context:%p, fd:%d, dataSize:%d, writeSize:%d, failed to send response:\n%s", pContext, pContext->fd, sz,
|
||||||
pContext, pContext->fd, pContext->ipstr, sz, writeSz, buf);
|
writeSz, buf);
|
||||||
} else {
|
} else {
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, dataSize:%d, writeSize:%d, response:\n%s", pContext, pContext->fd,
|
httpTrace("context:%p, fd:%d, dataSize:%d, writeSize:%d, response:\n%s", pContext, pContext->fd, sz, writeSz, buf);
|
||||||
pContext->ipstr, sz, writeSz, buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return writeSz;
|
return writeSz;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpWriteBufNoTrace(struct HttpContext *pContext, const char *buf, int sz) {
|
int32_t httpWriteBufNoTrace(struct HttpContext *pContext, const char *buf, int32_t sz) {
|
||||||
int writeSz = httpWriteBufByFd(pContext, buf, sz);
|
int32_t writeSz = httpWriteBufByFd(pContext, buf, sz);
|
||||||
if (writeSz != sz) {
|
if (writeSz != sz) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, dataSize:%d, writeSize:%d, failed to send response",
|
httpError("context:%p, fd:%d, dataSize:%d, writeSize:%d, failed to send response", pContext, pContext->fd, sz,
|
||||||
pContext, pContext->fd, pContext->ipstr, sz, writeSz);
|
writeSz);
|
||||||
}
|
}
|
||||||
|
|
||||||
return writeSz;
|
return writeSz;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast) {
|
int32_t httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast) {
|
||||||
int remain = 0;
|
int32_t remain = 0;
|
||||||
char sLen[24];
|
char sLen[24];
|
||||||
uint64_t srcLen = (uint64_t) (buf->lst - buf->buf);
|
uint64_t srcLen = (uint64_t) (buf->lst - buf->buf);
|
||||||
|
|
||||||
if (buf->pContext->fd <= 0) {
|
if (buf->pContext->fd <= 0) {
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, write json body error", buf->pContext, buf->pContext->fd, buf->pContext->ipstr);
|
httpTrace("context:%p, fd:%d, write json body error", buf->pContext, buf->pContext->fd);
|
||||||
buf->pContext->fd = -1;
|
buf->pContext->fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,44 +108,44 @@ int httpWriteJsonBufBody(JsonBuf* buf, bool isTheLast) {
|
||||||
* The remote endpoint then decodes the stream by concatenating the chunks and uncompressing the result.
|
* The remote endpoint then decodes the stream by concatenating the chunks and uncompressing the result.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (buf->pContext->acceptEncoding == HTTP_COMPRESS_IDENTITY) {
|
if (buf->pContext->parser->acceptEncodingGzip == 0 || !tsHttpEnableCompress) {
|
||||||
if (buf->lst == buf->buf) {
|
if (buf->lst == buf->buf) {
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, no data need dump", buf->pContext, buf->pContext->fd, buf->pContext->ipstr);
|
httpTrace("context:%p, fd:%d, no data need dump", buf->pContext, buf->pContext->fd);
|
||||||
return 0; // there is no data to dump.
|
return 0; // there is no data to dump.
|
||||||
} else {
|
} else {
|
||||||
int len = sprintf(sLen, "%lx\r\n", srcLen);
|
int32_t len = sprintf(sLen, "%lx\r\n", srcLen);
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, write body, chunkSize:%" PRIu64 ", response:\n%s",
|
httpTrace("context:%p, fd:%d, write body, chunkSize:%" PRIu64 ", response:\n%s", buf->pContext, buf->pContext->fd,
|
||||||
buf->pContext, buf->pContext->fd, buf->pContext->ipstr, srcLen, buf->buf);
|
srcLen, buf->buf);
|
||||||
httpWriteBufNoTrace(buf->pContext, sLen, len);
|
httpWriteBufNoTrace(buf->pContext, sLen, len);
|
||||||
remain = httpWriteBufNoTrace(buf->pContext, buf->buf, (int) srcLen);
|
remain = httpWriteBufNoTrace(buf->pContext, buf->buf, (int32_t)srcLen);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char compressBuf[JSON_BUFFER_SIZE] = {0};
|
char compressBuf[JSON_BUFFER_SIZE] = {0};
|
||||||
int32_t compressBufLen = JSON_BUFFER_SIZE;
|
int32_t compressBufLen = JSON_BUFFER_SIZE;
|
||||||
int ret = httpGzipCompress(buf->pContext, buf->buf, srcLen, compressBuf, &compressBufLen, isTheLast);
|
int32_t ret = httpGzipCompress(buf->pContext, buf->buf, srcLen, compressBuf, &compressBufLen, isTheLast);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
if (compressBufLen > 0) {
|
if (compressBufLen > 0) {
|
||||||
int len = sprintf(sLen, "%x\r\n", compressBufLen);
|
int32_t len = sprintf(sLen, "%x\r\n", compressBufLen);
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, write body, chunkSize:%" PRIu64 ", compressSize:%d, last:%d, response:\n%s",
|
httpTrace("context:%p, fd:%d, write body, chunkSize:%" PRIu64 ", compressSize:%d, last:%d, response:\n%s",
|
||||||
buf->pContext, buf->pContext->fd, buf->pContext->ipstr, srcLen, compressBufLen, isTheLast, buf->buf);
|
buf->pContext, buf->pContext->fd, srcLen, compressBufLen, isTheLast, buf->buf);
|
||||||
httpWriteBufNoTrace(buf->pContext, sLen, len);
|
httpWriteBufNoTrace(buf->pContext, sLen, len);
|
||||||
remain = httpWriteBufNoTrace(buf->pContext, (const char *) compressBuf, (int) compressBufLen);
|
remain = httpWriteBufNoTrace(buf->pContext, (const char*)compressBuf, compressBufLen);
|
||||||
} else {
|
} else {
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, last:%d, compress already dumped, response:\n%s",
|
httpTrace("context:%p, fd:%d, last:%d, compress already dumped, response:\n%s", buf->pContext,
|
||||||
buf->pContext, buf->pContext->fd, buf->pContext->ipstr, isTheLast, buf->buf);
|
buf->pContext->fd, isTheLast, buf->buf);
|
||||||
return 0; // there is no data to dump.
|
return 0; // there is no data to dump.
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
httpError("context:%p, fd:%d, ip:%s, failed to compress data, chunkSize:%" PRIu64 ", last:%d, error:%d, response:\n%s",
|
httpError("context:%p, fd:%d, failed to compress data, chunkSize:%" PRIu64 ", last:%d, error:%d, response:\n%s",
|
||||||
buf->pContext, buf->pContext->fd, buf->pContext->ipstr, srcLen, isTheLast, ret, buf->buf);
|
buf->pContext, buf->pContext->fd, srcLen, isTheLast, ret, buf->buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
httpWriteBufNoTrace(buf->pContext, "\r\n", 2);
|
httpWriteBufNoTrace(buf->pContext, "\r\n", 2);
|
||||||
buf->total += (int) (buf->lst - buf->buf);
|
buf->total += (int32_t)(buf->lst - buf->buf);
|
||||||
buf->lst = buf->buf;
|
buf->lst = buf->buf;
|
||||||
memset(buf->buf, 0, (size_t) buf->size);
|
memset(buf->buf, 0, (size_t)buf->size);
|
||||||
return remain;
|
return remain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,14 +155,14 @@ void httpWriteJsonBufHead(JsonBuf* buf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char msg[1024] = {0};
|
char msg[1024] = {0};
|
||||||
int len = -1;
|
int32_t len = -1;
|
||||||
|
|
||||||
if (buf->pContext->acceptEncoding == HTTP_COMPRESS_IDENTITY) {
|
if (buf->pContext->parser->acceptEncodingGzip == 0 || !tsHttpEnableCompress) {
|
||||||
len = sprintf(msg, httpRespTemplate[HTTP_RESPONSE_CHUNKED_UN_COMPRESS], httpVersionStr[buf->pContext->httpVersion],
|
len = sprintf(msg, httpRespTemplate[HTTP_RESPONSE_CHUNKED_UN_COMPRESS], httpVersionStr[buf->pContext->parser->httpVersion],
|
||||||
httpKeepAliveStr[buf->pContext->httpKeepAlive]);
|
httpKeepAliveStr[buf->pContext->parser->keepAlive]);
|
||||||
} else {
|
} else {
|
||||||
len = sprintf(msg, httpRespTemplate[HTTP_RESPONSE_CHUNKED_COMPRESS], httpVersionStr[buf->pContext->httpVersion],
|
len = sprintf(msg, httpRespTemplate[HTTP_RESPONSE_CHUNKED_COMPRESS], httpVersionStr[buf->pContext->parser->httpVersion],
|
||||||
httpKeepAliveStr[buf->pContext->httpKeepAlive]);
|
httpKeepAliveStr[buf->pContext->parser->keepAlive]);
|
||||||
}
|
}
|
||||||
|
|
||||||
httpWriteBuf(buf->pContext, (const char*)msg, len);
|
httpWriteBuf(buf->pContext, (const char*)msg, len);
|
||||||
|
@ -173,7 +170,7 @@ void httpWriteJsonBufHead(JsonBuf* buf) {
|
||||||
|
|
||||||
void httpWriteJsonBufEnd(JsonBuf* buf) {
|
void httpWriteJsonBufEnd(JsonBuf* buf) {
|
||||||
if (buf->pContext->fd <= 0) {
|
if (buf->pContext->fd <= 0) {
|
||||||
httpTrace("context:%p, fd:%d, ip:%s, json buf fd is 0", buf->pContext, buf->pContext->fd, buf->pContext->ipstr);
|
httpTrace("context:%p, fd:%d, json buf fd is 0", buf->pContext, buf->pContext->fd);
|
||||||
buf->pContext->fd = -1;
|
buf->pContext->fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,11 +185,11 @@ void httpInitJsonBuf(JsonBuf* buf, struct HttpContext* pContext) {
|
||||||
buf->pContext = pContext;
|
buf->pContext = pContext;
|
||||||
memset(buf->lst, 0, JSON_BUFFER_SIZE);
|
memset(buf->lst, 0, JSON_BUFFER_SIZE);
|
||||||
|
|
||||||
if (pContext->acceptEncoding == HTTP_COMPRESS_GZIP) {
|
if (pContext->parser->acceptEncodingGzip == 1 && tsHttpEnableCompress) {
|
||||||
httpGzipCompressInit(buf->pContext);
|
httpGzipCompressInit(buf->pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, json buffer initialized", buf->pContext, buf->pContext->fd, buf->pContext->ipstr);
|
httpTrace("context:%p, fd:%d, json buffer initialized", buf->pContext, buf->pContext->fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonItemToken(JsonBuf* buf) {
|
void httpJsonItemToken(JsonBuf* buf) {
|
||||||
|
@ -203,19 +200,19 @@ void httpJsonItemToken(JsonBuf* buf) {
|
||||||
if (buf->lst > buf->buf) httpJsonToken(buf, JsonItmTkn);
|
if (buf->lst > buf->buf) httpJsonToken(buf, JsonItmTkn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonString(JsonBuf* buf, char* sVal, int len) {
|
void httpJsonString(JsonBuf* buf, char* sVal, int32_t len) {
|
||||||
httpJsonItemToken(buf);
|
httpJsonItemToken(buf);
|
||||||
httpJsonToken(buf, JsonStrStt);
|
httpJsonToken(buf, JsonStrStt);
|
||||||
httpJsonPrint(buf, sVal, len);
|
httpJsonPrint(buf, sVal, len);
|
||||||
httpJsonToken(buf, JsonStrEnd);
|
httpJsonToken(buf, JsonStrEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonOriginString(JsonBuf* buf, char* sVal, int len) {
|
void httpJsonOriginString(JsonBuf* buf, char* sVal, int32_t len) {
|
||||||
httpJsonItemToken(buf);
|
httpJsonItemToken(buf);
|
||||||
httpJsonPrint(buf, sVal, len);
|
httpJsonPrint(buf, sVal, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonStringForTransMean(JsonBuf* buf, char* sVal, int maxLen) {
|
void httpJsonStringForTransMean(JsonBuf* buf, char* sVal, int32_t maxLen) {
|
||||||
httpJsonItemToken(buf);
|
httpJsonItemToken(buf);
|
||||||
httpJsonToken(buf, JsonStrStt);
|
httpJsonToken(buf, JsonStrStt);
|
||||||
|
|
||||||
|
@ -224,18 +221,18 @@ void httpJsonStringForTransMean(JsonBuf* buf, char* sVal, int maxLen) {
|
||||||
char* lastPos = sVal;
|
char* lastPos = sVal;
|
||||||
char* curPos = sVal;
|
char* curPos = sVal;
|
||||||
|
|
||||||
for (int i = 0; i < maxLen; ++i) {
|
for (int32_t i = 0; i < maxLen; ++i) {
|
||||||
if (*curPos == 0) {
|
if (*curPos == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*curPos == '\"') {
|
if (*curPos == '\"') {
|
||||||
httpJsonPrint(buf, lastPos, (int)(curPos - lastPos));
|
httpJsonPrint(buf, lastPos, (int32_t)(curPos - lastPos));
|
||||||
curPos++;
|
curPos++;
|
||||||
lastPos = curPos;
|
lastPos = curPos;
|
||||||
httpJsonPrint(buf, "\\\"", 2);
|
httpJsonPrint(buf, "\\\"", 2);
|
||||||
} else if (*curPos == '\\') {
|
} else if (*curPos == '\\') {
|
||||||
httpJsonPrint(buf, lastPos, (int)(curPos - lastPos));
|
httpJsonPrint(buf, lastPos, (int32_t)(curPos - lastPos));
|
||||||
curPos++;
|
curPos++;
|
||||||
lastPos = curPos;
|
lastPos = curPos;
|
||||||
httpJsonPrint(buf, "\\\\", 2);
|
httpJsonPrint(buf, "\\\\", 2);
|
||||||
|
@ -245,7 +242,7 @@ void httpJsonStringForTransMean(JsonBuf* buf, char* sVal, int maxLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*lastPos) {
|
if (*lastPos) {
|
||||||
httpJsonPrint(buf, lastPos, (int)(curPos - lastPos));
|
httpJsonPrint(buf, lastPos, (int32_t)(curPos - lastPos));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,14 +258,14 @@ void httpJsonInt64(JsonBuf* buf, int64_t num) {
|
||||||
void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us) {
|
void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us) {
|
||||||
char ts[35] = {0};
|
char ts[35] = {0};
|
||||||
struct tm *ptm;
|
struct tm *ptm;
|
||||||
int precision = 1000;
|
int32_t precision = 1000;
|
||||||
if (us) {
|
if (us) {
|
||||||
precision = 1000000;
|
precision = 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t tt = t / precision;
|
time_t tt = t / precision;
|
||||||
ptm = localtime(&tt);
|
ptm = localtime(&tt);
|
||||||
int length = (int) strftime(ts, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
int32_t length = (int32_t) strftime(ts, 35, "%Y-%m-%d %H:%M:%S", ptm);
|
||||||
if (us) {
|
if (us) {
|
||||||
length += snprintf(ts + length, 8, ".%06ld", t % precision);
|
length += snprintf(ts + length, 8, ".%06ld", t % precision);
|
||||||
} else {
|
} else {
|
||||||
|
@ -281,25 +278,25 @@ void httpJsonTimestamp(JsonBuf* buf, int64_t t, bool us) {
|
||||||
void httpJsonUtcTimestamp(JsonBuf* buf, int64_t t, bool us) {
|
void httpJsonUtcTimestamp(JsonBuf* buf, int64_t t, bool us) {
|
||||||
char ts[40] = {0};
|
char ts[40] = {0};
|
||||||
struct tm *ptm;
|
struct tm *ptm;
|
||||||
int precision = 1000;
|
int32_t precision = 1000;
|
||||||
if (us) {
|
if (us) {
|
||||||
precision = 1000000;
|
precision = 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t tt = t / precision;
|
time_t tt = t / precision;
|
||||||
ptm = localtime(&tt);
|
ptm = localtime(&tt);
|
||||||
int length = (int) strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", ptm);
|
int32_t length = (int32_t)strftime(ts, 40, "%Y-%m-%dT%H:%M:%S", ptm);
|
||||||
if (us) {
|
if (us) {
|
||||||
length += snprintf(ts + length, 8, ".%06ld", t % precision);
|
length += snprintf(ts + length, 8, ".%06ld", t % precision);
|
||||||
} else {
|
} else {
|
||||||
length += snprintf(ts + length, 5, ".%03ld", t % precision);
|
length += snprintf(ts + length, 5, ".%03ld", t % precision);
|
||||||
}
|
}
|
||||||
length += (int) strftime(ts + length, 40 - length, "%z", ptm);
|
length += (int32_t)strftime(ts + length, 40 - length, "%z", ptm);
|
||||||
|
|
||||||
httpJsonString(buf, ts, length);
|
httpJsonString(buf, ts, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonInt(JsonBuf* buf, int num) {
|
void httpJsonInt(JsonBuf* buf, int32_t num) {
|
||||||
httpJsonItemToken(buf);
|
httpJsonItemToken(buf);
|
||||||
httpJsonTestBuf(buf, MAX_NUM_STR_SZ);
|
httpJsonTestBuf(buf, MAX_NUM_STR_SZ);
|
||||||
buf->lst += snprintf(buf->lst, MAX_NUM_STR_SZ, "%d", num);
|
buf->lst += snprintf(buf->lst, MAX_NUM_STR_SZ, "%d", num);
|
||||||
|
@ -331,65 +328,65 @@ void httpJsonDouble(JsonBuf* buf, double num) {
|
||||||
|
|
||||||
void httpJsonNull(JsonBuf* buf) { httpJsonString(buf, "null", 4); }
|
void httpJsonNull(JsonBuf* buf) { httpJsonString(buf, "null", 4); }
|
||||||
|
|
||||||
void httpJsonBool(JsonBuf* buf, int val) {
|
void httpJsonBool(JsonBuf* buf, int32_t val) {
|
||||||
if (val == 0)
|
if (val == 0)
|
||||||
httpJsonPrint(buf, JsonFalseTkn, sizeof(JsonFalseTkn));
|
httpJsonPrint(buf, JsonFalseTkn, sizeof(JsonFalseTkn));
|
||||||
else
|
else
|
||||||
httpJsonPrint(buf, JsonTrueTkn, sizeof(JsonTrueTkn));
|
httpJsonPrint(buf, JsonTrueTkn, sizeof(JsonTrueTkn));
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairHead(JsonBuf* buf, char* name, int len) {
|
void httpJsonPairHead(JsonBuf* buf, char* name, int32_t len) {
|
||||||
httpJsonItemToken(buf);
|
httpJsonItemToken(buf);
|
||||||
httpJsonString(buf, name, len);
|
httpJsonString(buf, name, len);
|
||||||
httpJsonToken(buf, JsonPairTkn);
|
httpJsonToken(buf, JsonPairTkn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPair(JsonBuf* buf, char* name, int nameLen, char* sVal, int valLen) {
|
void httpJsonPair(JsonBuf* buf, char* name, int32_t nameLen, char* sVal, int32_t valLen) {
|
||||||
httpJsonPairHead(buf, name, nameLen);
|
httpJsonPairHead(buf, name, nameLen);
|
||||||
httpJsonString(buf, sVal, valLen);
|
httpJsonString(buf, sVal, valLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairOriginString(JsonBuf* buf, char* name, int nameLen, char* sVal, int valLen) {
|
void httpJsonPairOriginString(JsonBuf* buf, char* name, int32_t nameLen, char* sVal, int32_t valLen) {
|
||||||
httpJsonPairHead(buf, name, nameLen);
|
httpJsonPairHead(buf, name, nameLen);
|
||||||
httpJsonOriginString(buf, sVal, valLen);
|
httpJsonOriginString(buf, sVal, valLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairIntVal(JsonBuf* buf, char* name, int nNameLen, int num) {
|
void httpJsonPairIntVal(JsonBuf* buf, char* name, int32_t nNameLen, int32_t num) {
|
||||||
httpJsonPairHead(buf, name, nNameLen);
|
httpJsonPairHead(buf, name, nNameLen);
|
||||||
httpJsonInt(buf, num);
|
httpJsonInt(buf, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairInt64Val(JsonBuf* buf, char* name, int nNameLen, int64_t num) {
|
void httpJsonPairInt64Val(JsonBuf* buf, char* name, int32_t nNameLen, int64_t num) {
|
||||||
httpJsonPairHead(buf, name, nNameLen);
|
httpJsonPairHead(buf, name, nNameLen);
|
||||||
httpJsonInt64(buf, num);
|
httpJsonInt64(buf, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairBoolVal(JsonBuf* buf, char* name, int nNameLen, int num) {
|
void httpJsonPairBoolVal(JsonBuf* buf, char* name, int32_t nNameLen, int32_t num) {
|
||||||
httpJsonPairHead(buf, name, nNameLen);
|
httpJsonPairHead(buf, name, nNameLen);
|
||||||
httpJsonBool(buf, num);
|
httpJsonBool(buf, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairFloatVal(JsonBuf* buf, char* name, int nNameLen, float num) {
|
void httpJsonPairFloatVal(JsonBuf* buf, char* name, int32_t nNameLen, float num) {
|
||||||
httpJsonPairHead(buf, name, nNameLen);
|
httpJsonPairHead(buf, name, nNameLen);
|
||||||
httpJsonFloat(buf, num);
|
httpJsonFloat(buf, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairDoubleVal(JsonBuf* buf, char* name, int nNameLen, double num) {
|
void httpJsonPairDoubleVal(JsonBuf* buf, char* name, int32_t nNameLen, double num) {
|
||||||
httpJsonPairHead(buf, name, nNameLen);
|
httpJsonPairHead(buf, name, nNameLen);
|
||||||
httpJsonDouble(buf, num);
|
httpJsonDouble(buf, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairNullVal(JsonBuf* buf, char* name, int nNameLen) {
|
void httpJsonPairNullVal(JsonBuf* buf, char* name, int32_t nNameLen) {
|
||||||
httpJsonPairHead(buf, name, nNameLen);
|
httpJsonPairHead(buf, name, nNameLen);
|
||||||
httpJsonNull(buf);
|
httpJsonNull(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairArray(JsonBuf* buf, char* name, int len, httpJsonBuilder fnBuilder, void* dsHandle) {
|
void httpJsonPairArray(JsonBuf* buf, char* name, int32_t len, httpJsonBuilder fnBuilder, void* dsHandle) {
|
||||||
httpJsonPairHead(buf, name, len);
|
httpJsonPairHead(buf, name, len);
|
||||||
httpJsonArray(buf, fnBuilder, dsHandle);
|
httpJsonArray(buf, fnBuilder, dsHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairObject(JsonBuf* buf, char* name, int len, httpJsonBuilder fnBuilder, void* dsHandle) {
|
void httpJsonPairObject(JsonBuf* buf, char* name, int32_t len, httpJsonBuilder fnBuilder, void* dsHandle) {
|
||||||
httpJsonPairHead(buf, name, len);
|
httpJsonPairHead(buf, name, len);
|
||||||
httpJsonObject(buf, fnBuilder, dsHandle);
|
httpJsonObject(buf, fnBuilder, dsHandle);
|
||||||
}
|
}
|
||||||
|
@ -408,7 +405,7 @@ void httpJsonArray(JsonBuf* buf, httpJsonBuilder fnBuilder, void* jsonHandle) {
|
||||||
httpJsonToken(buf, JsonArrEnd);
|
httpJsonToken(buf, JsonArrEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonTestBuf(JsonBuf* buf, int safety) {
|
void httpJsonTestBuf(JsonBuf* buf, int32_t safety) {
|
||||||
if ((buf->lst - buf->buf + safety) < buf->size) return;
|
if ((buf->lst - buf->buf + safety) < buf->size) return;
|
||||||
// buf->slot = *buf->lst;
|
// buf->slot = *buf->lst;
|
||||||
httpWriteJsonBufBody(buf, false);
|
httpWriteJsonBufBody(buf, false);
|
||||||
|
@ -419,7 +416,7 @@ void httpJsonToken(JsonBuf* buf, char c) {
|
||||||
*buf->lst++ = c;
|
*buf->lst++ = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPrint(JsonBuf* buf, const char* json, int len) {
|
void httpJsonPrint(JsonBuf* buf, const char* json, int32_t len) {
|
||||||
if (len == 0 || len >= JSON_BUFFER_SIZE) {
|
if (len == 0 || len >= JSON_BUFFER_SIZE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -435,7 +432,7 @@ void httpJsonPrint(JsonBuf* buf, const char* json, int len) {
|
||||||
buf->lst += len;
|
buf->lst += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpJsonPairStatus(JsonBuf* buf, int code) {
|
void httpJsonPairStatus(JsonBuf* buf, int32_t code) {
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
httpJsonPair(buf, "status", 6, "succ", 4);
|
httpJsonPair(buf, "status", 6, "succ", 4);
|
||||||
} else {
|
} else {
|
||||||
|
@ -448,7 +445,7 @@ void httpJsonPairStatus(JsonBuf* buf, int code) {
|
||||||
} else if (code == TSDB_CODE_MND_INVALID_TABLE_NAME) {
|
} else if (code == TSDB_CODE_MND_INVALID_TABLE_NAME) {
|
||||||
httpJsonPair(buf, "desc", 4, "failed to create table", 22);
|
httpJsonPair(buf, "desc", 4, "failed to create table", 22);
|
||||||
} else {
|
} else {
|
||||||
httpJsonPair(buf, "desc", 4, (char*)tstrerror(code), (int)strlen(tstrerror(code)));
|
httpJsonPair(buf, "desc", 4, (char*)tstrerror(code), (int32_t)strlen(tstrerror(code)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -39,15 +39,15 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *param;
|
void *param;
|
||||||
void *result;
|
void *result;
|
||||||
int numOfRows;
|
int32_t numOfRows;
|
||||||
void (*fp)(void *param, void *result, int numOfRows);
|
void (*fp)(void *param, void *result, int32_t numOfRows);
|
||||||
} SHttpResult;
|
} SHttpResult;
|
||||||
|
|
||||||
static SHttpWorkerPool tsHttpPool;
|
static SHttpWorkerPool tsHttpPool;
|
||||||
static taos_qset tsHttpQset;
|
static taos_qset tsHttpQset;
|
||||||
static taos_queue tsHttpQueue;
|
static taos_queue tsHttpQueue;
|
||||||
|
|
||||||
void httpDispatchToResultQueue(void *param, TAOS_RES *result, int numOfRows, void (*fp)(void *param, void *result, int numOfRows)) {
|
void httpDispatchToResultQueue(void *param, TAOS_RES *result, int32_t numOfRows, void (*fp)(void *param, void *result, int32_t numOfRows)) {
|
||||||
if (tsHttpQueue != NULL) {
|
if (tsHttpQueue != NULL) {
|
||||||
SHttpResult *pMsg = (SHttpResult *)taosAllocateQitem(sizeof(SHttpResult));
|
SHttpResult *pMsg = (SHttpResult *)taosAllocateQitem(sizeof(SHttpResult));
|
||||||
pMsg->param = param;
|
pMsg->param = param;
|
||||||
|
@ -71,7 +71,7 @@ static void *httpProcessResultQueue(void *param) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpDebug("context:%p, res:%p will be processed in result queue", pMsg->param, pMsg->result);
|
httpTrace("context:%p, res:%p will be processed in result queue", pMsg->param, pMsg->result);
|
||||||
(*pMsg->fp)(pMsg->param, pMsg->result, pMsg->numOfRows);
|
(*pMsg->fp)(pMsg->param, pMsg->result, pMsg->numOfRows);
|
||||||
taosFreeQitem(pMsg);
|
taosFreeQitem(pMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
#include "httpCode.h"
|
|
||||||
#include "httpJson.h"
|
#include "httpJson.h"
|
||||||
#include "httpContext.h"
|
#include "httpContext.h"
|
||||||
|
|
||||||
|
@ -45,155 +44,112 @@ const char *httpRespTemplate[] = {
|
||||||
"%s 200 OK\r\nAccess-Control-Allow-Origin:*\r\n%sAccess-Control-Allow-Methods:POST, GET, OPTIONS, DELETE, PUT\r\nAccess-Control-Allow-Headers:Accept, Content-Type\r\nContent-Type: application/json;charset=utf-8\r\nContent-Length: %d\r\n\r\n"
|
"%s 200 OK\r\nAccess-Control-Allow-Origin:*\r\n%sAccess-Control-Allow-Methods:POST, GET, OPTIONS, DELETE, PUT\r\nAccess-Control-Allow-Headers:Accept, Content-Type\r\nContent-Type: application/json;charset=utf-8\r\nContent-Length: %d\r\n\r\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
static void httpSendErrorRespImp(HttpContext *pContext, int httpCode, char *httpCodeStr, int errNo, char *desc) {
|
static void httpSendErrorRespImp(HttpContext *pContext, int32_t httpCode, char *httpCodeStr, int32_t errNo, const char *desc) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, code:%d, error:%s", pContext, pContext->fd, pContext->ipstr, httpCode, desc);
|
httpError("context:%p, fd:%d, code:%d, error:%s", pContext, pContext->fd, httpCode, desc);
|
||||||
|
|
||||||
char head[512] = {0};
|
char head[512] = {0};
|
||||||
char body[512] = {0};
|
char body[512] = {0};
|
||||||
|
|
||||||
int bodyLen = sprintf(body, httpRespTemplate[HTTP_RESPONSE_JSON_ERROR], errNo, desc);
|
int32_t bodyLen = sprintf(body, httpRespTemplate[HTTP_RESPONSE_JSON_ERROR], errNo, desc);
|
||||||
int headLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_ERROR], httpVersionStr[pContext->httpVersion], httpCode,
|
int32_t headLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_ERROR], httpVersionStr[pContext->parser->httpVersion],
|
||||||
httpCodeStr, httpKeepAliveStr[pContext->httpKeepAlive], bodyLen);
|
httpCode, httpCodeStr, httpKeepAliveStr[pContext->parser->keepAlive], bodyLen);
|
||||||
|
|
||||||
httpWriteBuf(pContext, head, headLen);
|
httpWriteBuf(pContext, head, headLen);
|
||||||
httpWriteBuf(pContext, body, bodyLen);
|
httpWriteBuf(pContext, body, bodyLen);
|
||||||
httpCloseContextByApp(pContext);
|
httpCloseContextByApp(pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpSendErrorRespWithDesc(HttpContext *pContext, int errNo, char *desc) {
|
void httpSendErrorResp(HttpContext *pContext, int32_t errNo) {
|
||||||
int httpCode = 500;
|
int32_t httpCode = 500;
|
||||||
char *httpCodeStr = "Internal Server Error";
|
if (errNo == TSDB_CODE_SUCCESS)
|
||||||
switch (errNo) {
|
httpCode = 200;
|
||||||
case HTTP_SUCCESS:
|
else if (errNo == TSDB_CODE_HTTP_SERVER_OFFLINE)
|
||||||
httpCode = 200;
|
httpCode = 404;
|
||||||
httpCodeStr = "OK";
|
else if (errNo == TSDB_CODE_HTTP_UNSUPPORT_URL)
|
||||||
break;
|
httpCode = 404;
|
||||||
case HTTP_SERVER_OFFLINE:
|
else if (errNo == TSDB_CODE_HTTP_INVLALID_URL)
|
||||||
case HTTP_UNSUPPORT_URL:
|
httpCode = 404;
|
||||||
httpCode = 404;
|
else if (errNo == TSDB_CODE_HTTP_NO_ENOUGH_MEMORY)
|
||||||
httpCodeStr = "Not Found";
|
httpCode = 507;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_REQUSET_TOO_BIG)
|
||||||
case HTTP_PARSE_HTTP_METHOD_ERROR:
|
httpCode = 413;
|
||||||
httpCode = 405;
|
else if (errNo == TSDB_CODE_HTTP_NO_AUTH_INFO)
|
||||||
httpCodeStr = "Method Not Allowed";
|
httpCode = 401;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_NO_MSG_INPUT)
|
||||||
case HTTP_PARSE_HTTP_VERSION_ERROR:
|
httpCode = 400;
|
||||||
httpCode = 505;
|
else if (errNo == TSDB_CODE_HTTP_NO_SQL_INPUT)
|
||||||
httpCodeStr = "HTTP Version Not Supported";
|
httpCode = 400;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_NO_EXEC_USEDB)
|
||||||
case HTTP_PARSE_HEAD_ERROR:
|
httpCode = 400;
|
||||||
httpCode = 406;
|
else if (errNo == TSDB_CODE_HTTP_SESSION_FULL)
|
||||||
httpCodeStr = "Not Acceptable";
|
httpCode = 421;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_GEN_TAOSD_TOKEN_ERR)
|
||||||
case HTTP_REQUSET_TOO_BIG:
|
httpCode = 507;
|
||||||
httpCode = 413;
|
else if (errNo == TSDB_CODE_HTTP_INVALID_MULTI_REQUEST)
|
||||||
httpCodeStr = "Request Entity Too Large";
|
httpCode = 400;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_CREATE_GZIP_FAILED)
|
||||||
case HTTP_PARSE_BODY_ERROR:
|
httpCode = 507;
|
||||||
case HTTP_PARSE_CHUNKED_BODY_ERROR:
|
else if (errNo == TSDB_CODE_HTTP_FINISH_GZIP_FAILED)
|
||||||
httpCode = 409;
|
httpCode = 507;
|
||||||
httpCodeStr = "Conflict";
|
else if (errNo == TSDB_CODE_HTTP_INVALID_VERSION)
|
||||||
break;
|
httpCode = 406;
|
||||||
case HTTP_PARSE_URL_ERROR:
|
else if (errNo == TSDB_CODE_HTTP_INVALID_CONTENT_LENGTH)
|
||||||
httpCode = 414;
|
httpCode = 406;
|
||||||
httpCodeStr = "Request-URI Invalid";
|
else if (errNo == TSDB_CODE_HTTP_INVALID_AUTH_TYPE)
|
||||||
break;
|
httpCode = 406;
|
||||||
case HTTP_INVALID_AUTH_TOKEN:
|
else if (errNo == TSDB_CODE_HTTP_INVALID_AUTH_FORMAT)
|
||||||
case HTTP_PARSE_USR_ERROR:
|
httpCode = 406;
|
||||||
httpCode = 401;
|
else if (errNo == TSDB_CODE_HTTP_INVALID_BASIC_AUTH)
|
||||||
httpCodeStr = "Unauthorized";
|
httpCode = 406;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_INVALID_TAOSD_AUTH)
|
||||||
case HTTP_NO_SQL_INPUT:
|
httpCode = 406;
|
||||||
httpCode = 400;
|
else if (errNo == TSDB_CODE_HTTP_PARSE_METHOD_FAILED)
|
||||||
httpCodeStr = "Bad Request";
|
httpCode = 406;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_PARSE_TARGET_FAILED)
|
||||||
case HTTP_SESSION_FULL:
|
httpCode = 406;
|
||||||
httpCode = 421;
|
else if (errNo == TSDB_CODE_HTTP_PARSE_VERSION_FAILED)
|
||||||
httpCodeStr = "Too many connections";
|
httpCode = 406;
|
||||||
break;
|
else if (errNo == TSDB_CODE_HTTP_PARSE_SP_FAILED)
|
||||||
case HTTP_NO_ENOUGH_MEMORY:
|
httpCode = 406;
|
||||||
case HTTP_GEN_TAOSD_TOKEN_ERR:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_STATUS_FAILED)
|
||||||
httpCode = 507;
|
httpCode = 406;
|
||||||
httpCodeStr = "Insufficient Storage";
|
else if (errNo == TSDB_CODE_HTTP_PARSE_PHRASE_FAILED)
|
||||||
break;
|
httpCode = 406;
|
||||||
case HTTP_INVALID_DB_TABLE:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_CRLF_FAILED)
|
||||||
case HTTP_NO_EXEC_USEDB:
|
httpCode = 406;
|
||||||
case HTTP_PARSE_GC_REQ_ERROR:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_HEADER_FAILED)
|
||||||
case HTTP_INVALID_MULTI_REQUEST:
|
httpCode = 406;
|
||||||
case HTTP_NO_MSG_INPUT:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_HEADER_KEY_FAILED)
|
||||||
httpCode = 400;
|
httpCode = 406;
|
||||||
httpCodeStr = "Bad Request";
|
else if (errNo == TSDB_CODE_HTTP_PARSE_HEADER_VAL_FAILED)
|
||||||
break;
|
httpCode = 406;
|
||||||
case HTTP_NO_ENOUGH_SESSIONS:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_CHUNK_SIZE_FAILED)
|
||||||
httpCode = 421;
|
httpCode = 406;
|
||||||
httpCodeStr = "Too many connections";
|
else if (errNo == TSDB_CODE_HTTP_PARSE_CHUNK_FAILED)
|
||||||
break;
|
httpCode = 406;
|
||||||
// telegraf
|
else if (errNo == TSDB_CODE_HTTP_PARSE_END_FAILED)
|
||||||
case HTTP_TG_DB_NOT_INPUT:
|
httpCode = 406;
|
||||||
case HTTP_TG_DB_TOO_LONG:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_INVALID_STATE)
|
||||||
case HTTP_TG_INVALID_JSON:
|
httpCode = 406;
|
||||||
case HTTP_TG_METRICS_NULL:
|
else if (errNo == TSDB_CODE_HTTP_PARSE_ERROR_STATE)
|
||||||
case HTTP_TG_METRICS_SIZE:
|
httpCode = 406;
|
||||||
case HTTP_TG_METRIC_NULL:
|
else
|
||||||
case HTTP_TG_METRIC_TYPE:
|
httpCode = 400;
|
||||||
case HTTP_TG_METRIC_NAME_NULL:
|
|
||||||
case HTTP_TG_METRIC_NAME_LONG:
|
if (pContext->parser->httpCode != 0) {
|
||||||
case HTTP_TG_TIMESTAMP_NULL:
|
httpCode = pContext->parser->httpCode;
|
||||||
case HTTP_TG_TIMESTAMP_TYPE:
|
|
||||||
case HTTP_TG_TIMESTAMP_VAL_NULL:
|
|
||||||
case HTTP_TG_TAGS_NULL:
|
|
||||||
case HTTP_TG_TAGS_SIZE_0:
|
|
||||||
case HTTP_TG_TAGS_SIZE_LONG:
|
|
||||||
case HTTP_TG_TAG_NULL:
|
|
||||||
case HTTP_TG_TAG_NAME_NULL:
|
|
||||||
case HTTP_TG_TAG_NAME_SIZE:
|
|
||||||
case HTTP_TG_TAG_VALUE_TYPE:
|
|
||||||
case HTTP_TG_TAG_VALUE_NULL:
|
|
||||||
case HTTP_TG_TABLE_NULL:
|
|
||||||
case HTTP_TG_TABLE_SIZE:
|
|
||||||
case HTTP_TG_FIELDS_NULL:
|
|
||||||
case HTTP_TG_FIELDS_SIZE_0:
|
|
||||||
case HTTP_TG_FIELDS_SIZE_LONG:
|
|
||||||
case HTTP_TG_FIELD_NULL:
|
|
||||||
case HTTP_TG_FIELD_NAME_NULL:
|
|
||||||
case HTTP_TG_FIELD_NAME_SIZE:
|
|
||||||
case HTTP_TG_FIELD_VALUE_TYPE:
|
|
||||||
case HTTP_TG_FIELD_VALUE_NULL:
|
|
||||||
case HTTP_INVALID_BASIC_AUTH_TOKEN:
|
|
||||||
case HTTP_INVALID_TAOSD_AUTH_TOKEN:
|
|
||||||
case HTTP_TG_HOST_NOT_STRING:
|
|
||||||
// grafana
|
|
||||||
case HTTP_GC_QUERY_NULL:
|
|
||||||
case HTTP_GC_QUERY_SIZE:
|
|
||||||
httpCode = 400;
|
|
||||||
httpCodeStr = "Bad Request";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, error:%d not recognized", pContext, pContext->fd, pContext->ipstr, errNo);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desc == NULL) {
|
char *httpCodeStr = httpGetStatusDesc(httpCode);
|
||||||
httpSendErrorRespImp(pContext, httpCode, httpCodeStr, errNo + 5000, httpMsg[errNo]);
|
httpSendErrorRespImp(pContext, httpCode, httpCodeStr, errNo & 0XFFFF, tstrerror(errNo));
|
||||||
} else {
|
|
||||||
httpSendErrorRespImp(pContext, httpCode, httpCodeStr, errNo + 5000, desc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpSendErrorResp(HttpContext *pContext, int errNo) { httpSendErrorRespWithDesc(pContext, errNo, NULL); }
|
void httpSendTaosdInvalidSqlErrorResp(HttpContext *pContext, char *errMsg) {
|
||||||
|
int32_t httpCode = 400;
|
||||||
|
char temp[512] = {0};
|
||||||
|
int32_t len = sprintf(temp, "invalid SQL: %s", errMsg);
|
||||||
|
|
||||||
void httpSendTaosdErrorResp(HttpContext *pContext, int errCode) {
|
for (int32_t i = 0; i < len; ++i) {
|
||||||
int httpCode = 400;
|
|
||||||
|
|
||||||
httpSendErrorRespImp(pContext, httpCode, "Bad Request", errCode & 0XFFFF, (char*)tstrerror(errCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
void httpSendTaosdInvalidSqlErrorResp(HttpContext *pContext, char* errMsg) {
|
|
||||||
int httpCode = 400;
|
|
||||||
char temp[512] = {0};
|
|
||||||
int len = sprintf(temp, "invalid SQL: %s", errMsg);
|
|
||||||
|
|
||||||
for (int i = 0; i < len; ++i) {
|
|
||||||
if (temp[i] == '\"') {
|
if (temp[i] == '\"') {
|
||||||
temp[i] = '\'';
|
temp[i] = '\'';
|
||||||
} else if (temp[i] == '\n') {
|
} else if (temp[i] == '\n') {
|
||||||
|
@ -208,9 +164,9 @@ void httpSendSuccResp(HttpContext *pContext, char *desc) {
|
||||||
char head[1024] = {0};
|
char head[1024] = {0};
|
||||||
char body[1024] = {0};
|
char body[1024] = {0};
|
||||||
|
|
||||||
int bodyLen = sprintf(body, httpRespTemplate[HTTP_RESPONSE_JSON_OK], HTTP_SUCCESS, desc);
|
int32_t bodyLen = sprintf(body, httpRespTemplate[HTTP_RESPONSE_JSON_OK], TSDB_CODE_SUCCESS, desc);
|
||||||
int headLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_OK], httpVersionStr[pContext->httpVersion],
|
int32_t headLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_OK], httpVersionStr[pContext->parser->httpVersion],
|
||||||
httpKeepAliveStr[pContext->httpKeepAlive], bodyLen);
|
httpKeepAliveStr[pContext->parser->keepAlive], bodyLen);
|
||||||
|
|
||||||
httpWriteBuf(pContext, head, headLen);
|
httpWriteBuf(pContext, head, headLen);
|
||||||
httpWriteBuf(pContext, body, bodyLen);
|
httpWriteBuf(pContext, body, bodyLen);
|
||||||
|
@ -221,9 +177,9 @@ void httpSendOptionResp(HttpContext *pContext, char *desc) {
|
||||||
char head[1024] = {0};
|
char head[1024] = {0};
|
||||||
char body[1024] = {0};
|
char body[1024] = {0};
|
||||||
|
|
||||||
int bodyLen = sprintf(body, httpRespTemplate[HTTP_RESPONSE_JSON_OK], HTTP_SUCCESS, desc);
|
int32_t bodyLen = sprintf(body, httpRespTemplate[HTTP_RESPONSE_JSON_OK], TSDB_CODE_SUCCESS, desc);
|
||||||
int headLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_OPTIONS], httpVersionStr[pContext->httpVersion],
|
int32_t headLen = sprintf(head, httpRespTemplate[HTTP_RESPONSE_OPTIONS], httpVersionStr[pContext->parser->httpVersion],
|
||||||
httpKeepAliveStr[pContext->httpKeepAlive], bodyLen);
|
httpKeepAliveStr[pContext->parser->keepAlive], bodyLen);
|
||||||
|
|
||||||
httpWriteBuf(pContext, head, headLen);
|
httpWriteBuf(pContext, head, headLen);
|
||||||
httpWriteBuf(pContext, body, bodyLen);
|
httpWriteBuf(pContext, body, bodyLen);
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "restHandle.h"
|
#include "httpRestHandle.h"
|
||||||
#include "restJson.h"
|
#include "httpRestJson.h"
|
||||||
|
|
||||||
static HttpDecodeMethod restDecodeMethod = {"rest", restProcessRequest};
|
static HttpDecodeMethod restDecodeMethod = {"rest", restProcessRequest};
|
||||||
static HttpDecodeMethod restDecodeMethod2 = {"restful", restProcessRequest};
|
static HttpDecodeMethod restDecodeMethod2 = {"restful", restProcessRequest};
|
||||||
|
@ -60,39 +61,37 @@ void restInitHandle(HttpServer* pServer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restGetUserFromUrl(HttpContext* pContext) {
|
bool restGetUserFromUrl(HttpContext* pContext) {
|
||||||
HttpParser* pParser = &pContext->parser;
|
HttpParser* pParser = pContext->parser;
|
||||||
if (pParser->path[REST_USER_URL_POS].len >= TSDB_USER_LEN || pParser->path[REST_USER_URL_POS].len <= 0) {
|
if (pParser->path[REST_USER_URL_POS].pos >= TSDB_USER_LEN || pParser->path[REST_USER_URL_POS].pos <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(pContext->user, pParser->path[REST_USER_URL_POS].pos, TSDB_USER_LEN);
|
tstrncpy(pContext->user, pParser->path[REST_USER_URL_POS].str, TSDB_USER_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restGetPassFromUrl(HttpContext* pContext) {
|
bool restGetPassFromUrl(HttpContext* pContext) {
|
||||||
HttpParser* pParser = &pContext->parser;
|
HttpParser* pParser = pContext->parser;
|
||||||
if (pParser->path[REST_PASS_URL_POS].len >= TSDB_PASSWORD_LEN || pParser->path[REST_PASS_URL_POS].len <= 0) {
|
if (pParser->path[REST_PASS_URL_POS].pos >= TSDB_PASSWORD_LEN || pParser->path[REST_PASS_URL_POS].pos <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(pContext->pass, pParser->path[REST_PASS_URL_POS].pos, TSDB_PASSWORD_LEN);
|
tstrncpy(pContext->pass, pParser->path[REST_PASS_URL_POS].str, TSDB_PASSWORD_LEN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restProcessLoginRequest(HttpContext* pContext) {
|
bool restProcessLoginRequest(HttpContext* pContext) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process restful login msg", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, process restful login msg", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
pContext->reqType = HTTP_REQTYPE_LOGIN;
|
pContext->reqType = HTTP_REQTYPE_LOGIN;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restProcessSqlRequest(HttpContext* pContext, int timestampFmt) {
|
bool restProcessSqlRequest(HttpContext* pContext, int32_t timestampFmt) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process restful sql msg", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, process restful sql msg", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
|
|
||||||
char* sql = pContext->parser.data.pos;
|
char* sql = pContext->parser->body.str;
|
||||||
if (sql == NULL) {
|
if (sql == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_SQL_INPUT);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_SQL_INPUT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +100,7 @@ bool restProcessSqlRequest(HttpContext* pContext, int timestampFmt) {
|
||||||
* for async test
|
* for async test
|
||||||
*
|
*
|
||||||
if (httpCheckUsedbSql(sql)) {
|
if (httpCheckUsedbSql(sql)) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_EXEC_USEDB);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_EXEC_USEDB);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
@ -128,7 +127,7 @@ bool restProcessRequest(struct HttpContext* pContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(pContext->user) == 0 || strlen(pContext->pass) == 0) {
|
if (strlen(pContext->user) == 0 || strlen(pContext->pass) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_USR_ERROR);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_AUTH_INFO);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,6 +142,6 @@ bool restProcessRequest(struct HttpContext* pContext) {
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_URL_ERROR);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_INVLALID_URL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
|
@ -18,10 +18,10 @@
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "httpJson.h"
|
#include "httpJson.h"
|
||||||
#include "restHandle.h"
|
#include "httpRestHandle.h"
|
||||||
#include "restJson.h"
|
#include "httpRestJson.h"
|
||||||
|
|
||||||
void restBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int affect_rows) {
|
void restBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int32_t affect_rows) {
|
||||||
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
||||||
if (jsonBuf == NULL) return;
|
if (jsonBuf == NULL) return;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ void restStartSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result)
|
||||||
if (jsonBuf == NULL) return;
|
if (jsonBuf == NULL) return;
|
||||||
|
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
int num_fields = taos_num_fields(result);
|
int32_t num_fields = taos_num_fields(result);
|
||||||
|
|
||||||
httpInitJsonBuf(jsonBuf, pContext);
|
httpInitJsonBuf(jsonBuf, pContext);
|
||||||
httpWriteJsonBufHead(jsonBuf);
|
httpWriteJsonBufHead(jsonBuf);
|
||||||
|
@ -66,9 +66,9 @@ void restStartSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result)
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonString(jsonBuf, REST_JSON_AFFECT_ROWS, REST_JSON_AFFECT_ROWS_LEN);
|
httpJsonString(jsonBuf, REST_JSON_AFFECT_ROWS, REST_JSON_AFFECT_ROWS_LEN);
|
||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < num_fields; ++i) {
|
for (int32_t i = 0; i < num_fields; ++i) {
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonString(jsonBuf, fields[i].name, (int)strlen(fields[i].name));
|
httpJsonString(jsonBuf, fields[i].name, (int32_t)strlen(fields[i].name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,16 +83,16 @@ void restStartSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result)
|
||||||
httpJsonToken(jsonBuf, JsonArrStt);
|
httpJsonToken(jsonBuf, JsonArrStt);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows, int timestampFormat) {
|
bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows, int32_t timestampFormat) {
|
||||||
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
||||||
if (jsonBuf == NULL) return false;
|
if (jsonBuf == NULL) return false;
|
||||||
|
|
||||||
cmd->numOfRows += numOfRows;
|
cmd->numOfRows += numOfRows;
|
||||||
|
|
||||||
int num_fields = taos_num_fields(result);
|
int32_t num_fields = taos_num_fields(result);
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
|
|
||||||
for (int k = 0; k < numOfRows; ++k) {
|
for (int32_t k = 0; k < numOfRows; ++k) {
|
||||||
TAOS_ROW row = taos_fetch_row(result);
|
TAOS_ROW row = taos_fetch_row(result);
|
||||||
if (row == NULL) {
|
if (row == NULL) {
|
||||||
cmd->numOfRows--;
|
cmd->numOfRows--;
|
||||||
|
@ -104,7 +104,7 @@ bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonToken(jsonBuf, JsonArrStt);
|
httpJsonToken(jsonBuf, JsonArrStt);
|
||||||
|
|
||||||
for (int i = 0; i < num_fields; i++) {
|
for (int32_t i = 0; i < num_fields; i++) {
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
|
|
||||||
if (row[i] == NULL) {
|
if (row[i] == NULL) {
|
||||||
|
@ -155,33 +155,31 @@ bool restBuildSqlJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->numOfRows >= tsRestRowLimit) {
|
if (cmd->numOfRows >= tsRestRowLimit) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, retrieve rows:%d larger than limit:%d, abort retrieve", pContext,
|
httpDebug("context:%p, fd:%d, user:%s, retrieve rows:%d larger than limit:%d, abort retrieve", pContext,
|
||||||
pContext->fd, pContext->ipstr, pContext->user, cmd->numOfRows, tsRestRowLimit);
|
pContext->fd, pContext->user, cmd->numOfRows, tsRestRowLimit);
|
||||||
return false;
|
return false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (pContext->fd <= 0) {
|
if (pContext->fd <= 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, connection is closed, abort retrieve", pContext, pContext->fd,
|
httpError("context:%p, fd:%d, user:%s, connection is closed, abort retrieve", pContext, pContext->fd,
|
||||||
pContext->ipstr, pContext->user);
|
pContext->user);
|
||||||
return false;
|
return false;
|
||||||
}
|
} else {
|
||||||
else {
|
httpDebug("context:%p, fd:%d, user:%s, total rows:%d retrieved", pContext, pContext->fd, pContext->user,
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, total rows:%d retrieved", pContext, pContext->fd, pContext->ipstr,
|
cmd->numOfRows);
|
||||||
pContext->user, cmd->numOfRows);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restBuildSqlTimestampJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows) {
|
bool restBuildSqlTimestampJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
|
||||||
return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_TIMESTAMP);
|
return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_TIMESTAMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restBuildSqlLocalTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows) {
|
bool restBuildSqlLocalTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
|
||||||
return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_LOCAL_STRING);
|
return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_LOCAL_STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool restBuildSqlUtcTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int numOfRows) {
|
bool restBuildSqlUtcTimeStringJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result, int32_t numOfRows) {
|
||||||
return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_UTC_STRING);
|
return restBuildSqlJson(pContext,cmd, result, numOfRows, REST_TIMESTAMP_FMT_UTC_STRING);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
#define EPOLLWAKEUP (1u << 29)
|
#define EPOLLWAKEUP (1u << 29)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static bool httpReadData(HttpContext *pContext);
|
||||||
|
|
||||||
static void httpStopThread(HttpThread* pThread) {
|
static void httpStopThread(HttpThread* pThread) {
|
||||||
pThread->stop = true;
|
pThread->stop = true;
|
||||||
|
|
||||||
|
@ -59,7 +61,7 @@ void httpCleanUpConnect() {
|
||||||
if (pServer->pThreads == NULL) return;
|
if (pServer->pThreads == NULL) return;
|
||||||
|
|
||||||
pthread_join(pServer->thread, NULL);
|
pthread_join(pServer->thread, NULL);
|
||||||
for (int i = 0; i < pServer->numOfThreads; ++i) {
|
for (int32_t i = 0; i < pServer->numOfThreads; ++i) {
|
||||||
HttpThread* pThread = pServer->pThreads + i;
|
HttpThread* pThread = pServer->pThreads + i;
|
||||||
if (pThread != NULL) {
|
if (pThread != NULL) {
|
||||||
httpStopThread(pThread);
|
httpStopThread(pThread);
|
||||||
|
@ -69,119 +71,11 @@ void httpCleanUpConnect() {
|
||||||
httpDebug("http server:%s is cleaned up", pServer->label);
|
httpDebug("http server:%s is cleaned up", pServer->label);
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpReadDataImp(HttpContext *pContext) {
|
|
||||||
HttpParser *pParser = &pContext->parser;
|
|
||||||
|
|
||||||
while (pParser->bufsize <= (HTTP_BUFFER_SIZE - HTTP_STEP_SIZE)) {
|
|
||||||
int nread = (int)taosReadSocket(pContext->fd, pParser->buffer + pParser->bufsize, HTTP_STEP_SIZE);
|
|
||||||
if (nread >= 0 && nread < HTTP_STEP_SIZE) {
|
|
||||||
pParser->bufsize += nread;
|
|
||||||
break;
|
|
||||||
} else if (nread < 0) {
|
|
||||||
if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, read from socket error:%d, wait another event",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, errno);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, read from socket error:%d, close connect",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, errno);
|
|
||||||
return HTTP_READ_DATA_FAILED;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pParser->bufsize += nread;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pParser->bufsize >= (HTTP_BUFFER_SIZE - HTTP_STEP_SIZE)) {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, thread:%s, request big than:%d",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->pThread->label, HTTP_BUFFER_SIZE);
|
|
||||||
return HTTP_REQUSET_TOO_BIG;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pParser->buffer[pParser->bufsize] = 0;
|
|
||||||
|
|
||||||
return HTTP_READ_DATA_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool httpDecompressData(HttpContext *pContext) {
|
|
||||||
if (pContext->contentEncoding != HTTP_COMPRESS_GZIP) {
|
|
||||||
httpTraceL("context:%p, fd:%d, ip:%s, content:%s", pContext, pContext->fd, pContext->ipstr, pContext->parser.data.pos);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *decompressBuf = calloc(HTTP_DECOMPRESS_BUF_SIZE, 1);
|
|
||||||
int32_t decompressBufLen = HTTP_DECOMPRESS_BUF_SIZE;
|
|
||||||
size_t bufsize = sizeof(pContext->parser.buffer) - (pContext->parser.data.pos - pContext->parser.buffer) - 1;
|
|
||||||
if (decompressBufLen > (int)bufsize) {
|
|
||||||
decompressBufLen = (int)bufsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = httpGzipDeCompress(pContext->parser.data.pos, pContext->parser.data.len, decompressBuf, &decompressBufLen);
|
|
||||||
|
|
||||||
if (ret == 0) {
|
|
||||||
memcpy(pContext->parser.data.pos, decompressBuf, decompressBufLen);
|
|
||||||
pContext->parser.data.pos[decompressBufLen] = 0;
|
|
||||||
httpTraceL("context:%p, fd:%d, ip:%s, rawSize:%d, decompressSize:%d, content:%s", pContext, pContext->fd,
|
|
||||||
pContext->ipstr, pContext->parser.data.len, decompressBufLen, decompressBuf);
|
|
||||||
pContext->parser.data.len = decompressBufLen;
|
|
||||||
} else {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, failed to decompress data, rawSize:%d, error:%d",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->parser.data.len, ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(decompressBuf);
|
|
||||||
return ret == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool httpReadData(HttpContext *pContext) {
|
|
||||||
if (!pContext->parsed) {
|
|
||||||
httpInitContext(pContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t code = httpReadDataImp(pContext);
|
|
||||||
if (code != HTTP_READ_DATA_SUCCESS) {
|
|
||||||
if (code == HTTP_READ_DATA_FAILED) {
|
|
||||||
httpReleaseContext(pContext);
|
|
||||||
} else {
|
|
||||||
httpSendErrorResp(pContext, code);
|
|
||||||
httpNotifyContextClose(pContext);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!httpParseRequest(pContext)) {
|
|
||||||
httpNotifyContextClose(pContext);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ret = httpCheckReadCompleted(pContext);
|
|
||||||
if (ret == HTTP_CHECK_BODY_CONTINUE) {
|
|
||||||
//httpDebug("context:%p, fd:%d, ip:%s, not finished yet, wait another event", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
httpReleaseContext(pContext);
|
|
||||||
return false;
|
|
||||||
} else if (ret == HTTP_CHECK_BODY_SUCCESS){
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, thread:%s, read size:%d, dataLen:%d",
|
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->pThread->label, pContext->parser.bufsize, pContext->parser.data.len);
|
|
||||||
if (httpDecompressData(pContext)) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
httpNotifyContextClose(pContext);
|
|
||||||
httpReleaseContext(pContext);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
httpError("context:%p, fd:%d, ip:%s, failed to read http body, close connect", pContext, pContext->fd, pContext->ipstr);
|
|
||||||
httpNotifyContextClose(pContext);
|
|
||||||
httpReleaseContext(pContext);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void httpProcessHttpData(void *param) {
|
static void httpProcessHttpData(void *param) {
|
||||||
HttpServer *pServer = &tsHttpServer;
|
HttpServer *pServer = &tsHttpServer;
|
||||||
HttpThread *pThread = (HttpThread *)param;
|
HttpThread *pThread = (HttpThread *)param;
|
||||||
HttpContext *pContext;
|
HttpContext *pContext;
|
||||||
int fdNum;
|
int32_t fdNum;
|
||||||
|
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
|
@ -198,7 +92,7 @@ static void httpProcessHttpData(void *param) {
|
||||||
}
|
}
|
||||||
if (fdNum <= 0) continue;
|
if (fdNum <= 0) continue;
|
||||||
|
|
||||||
for (int i = 0; i < fdNum; ++i) {
|
for (int32_t i = 0; i < fdNum; ++i) {
|
||||||
pContext = httpGetContext(events[i].data.ptr);
|
pContext = httpGetContext(events[i].data.ptr);
|
||||||
if (pContext == NULL) {
|
if (pContext == NULL) {
|
||||||
httpError("context:%p, is already released, close connect", events[i].data.ptr);
|
httpError("context:%p, is already released, close connect", events[i].data.ptr);
|
||||||
|
@ -208,49 +102,51 @@ static void httpProcessHttpData(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events[i].events & EPOLLPRI) {
|
if (events[i].events & EPOLLPRI) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s, EPOLLPRI events occured, accessed:%d, close connect",
|
httpDebug("context:%p, fd:%d, state:%s, EPOLLPRI events occured, accessed:%d, close connect", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->accessTimes);
|
pContext->fd, httpContextStateStr(pContext->state), pContext->accessTimes);
|
||||||
httpCloseContextByServer(pContext);
|
httpCloseContextByServer(pContext);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events[i].events & EPOLLRDHUP) {
|
if (events[i].events & EPOLLRDHUP) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s, EPOLLRDHUP events occured, accessed:%d, close connect",
|
httpDebug("context:%p, fd:%d, state:%s, EPOLLRDHUP events occured, accessed:%d, close connect", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->accessTimes);
|
pContext->fd, httpContextStateStr(pContext->state), pContext->accessTimes);
|
||||||
httpCloseContextByServer(pContext);
|
httpCloseContextByServer(pContext);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events[i].events & EPOLLERR) {
|
if (events[i].events & EPOLLERR) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s, EPOLLERR events occured, accessed:%d, close connect",
|
httpDebug("context:%p, fd:%d, state:%s, EPOLLERR events occured, accessed:%d, close connect", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->accessTimes);
|
pContext->fd, httpContextStateStr(pContext->state), pContext->accessTimes);
|
||||||
httpCloseContextByServer(pContext);
|
httpCloseContextByServer(pContext);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events[i].events & EPOLLHUP) {
|
if (events[i].events & EPOLLHUP) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s, EPOLLHUP events occured, accessed:%d, close connect",
|
httpDebug("context:%p, fd:%d, state:%s, EPOLLHUP events occured, accessed:%d, close connect", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->accessTimes);
|
pContext->fd, httpContextStateStr(pContext->state), pContext->accessTimes);
|
||||||
httpCloseContextByServer(pContext);
|
httpCloseContextByServer(pContext);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_READY)) {
|
if (!httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_READY)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s, not in ready state, ignore read events",
|
httpDebug("context:%p, fd:%d, state:%s, not in ready state, ignore read events", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state));
|
httpContextStateStr(pContext->state));
|
||||||
httpReleaseContext(pContext);
|
httpReleaseContext(pContext, true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pServer->status != HTTP_SERVER_RUNNING) {
|
if (pServer->status != HTTP_SERVER_RUNNING) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, state:%s, server is not running, accessed:%d, close connect", pContext,
|
httpDebug("context:%p, fd:%d, state:%s, server is not running, accessed:%d, close connect", pContext,
|
||||||
pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->accessTimes);
|
pContext->fd, httpContextStateStr(pContext->state), pContext->accessTimes);
|
||||||
httpSendErrorResp(pContext, HTTP_SERVER_OFFLINE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_SERVER_OFFLINE);
|
||||||
httpNotifyContextClose(pContext);
|
httpNotifyContextClose(pContext);
|
||||||
} else {
|
} else {
|
||||||
if (httpReadData(pContext)) {
|
if (httpReadData(pContext)) {
|
||||||
(*(pThread->processData))(pContext);
|
(*(pThread->processData))(pContext);
|
||||||
atomic_fetch_add_32(&pServer->requestNum, 1);
|
atomic_fetch_add_32(&pServer->requestNum, 1);
|
||||||
|
} else {
|
||||||
|
httpReleaseContext(pContext, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -258,13 +154,13 @@ static void httpProcessHttpData(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *httpAcceptHttpConnection(void *arg) {
|
static void *httpAcceptHttpConnection(void *arg) {
|
||||||
int connFd = -1;
|
int32_t connFd = -1;
|
||||||
struct sockaddr_in clientAddr;
|
struct sockaddr_in clientAddr;
|
||||||
int threadId = 0;
|
int32_t threadId = 0;
|
||||||
HttpServer * pServer = &tsHttpServer;
|
HttpServer * pServer = &tsHttpServer;
|
||||||
HttpThread * pThread = NULL;
|
HttpThread * pThread = NULL;
|
||||||
HttpContext * pContext = NULL;
|
HttpContext * pContext = NULL;
|
||||||
int totalFds = 0;
|
int32_t totalFds = 0;
|
||||||
|
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
sigemptyset(&set);
|
sigemptyset(&set);
|
||||||
|
@ -284,7 +180,7 @@ static void *httpAcceptHttpConnection(void *arg) {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
socklen_t addrlen = sizeof(clientAddr);
|
socklen_t addrlen = sizeof(clientAddr);
|
||||||
connFd = (int)accept(pServer->fd, (struct sockaddr *)&clientAddr, &addrlen);
|
connFd = (int32_t)accept(pServer->fd, (struct sockaddr *)&clientAddr, &addrlen);
|
||||||
if (connFd == -1) {
|
if (connFd == -1) {
|
||||||
if (errno == EINVAL) {
|
if (errno == EINVAL) {
|
||||||
httpDebug("http server:%s socket was shutdown, exiting...", pServer->label);
|
httpDebug("http server:%s socket was shutdown, exiting...", pServer->label);
|
||||||
|
@ -295,7 +191,7 @@ static void *httpAcceptHttpConnection(void *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
totalFds = 1;
|
totalFds = 1;
|
||||||
for (int i = 0; i < pServer->numOfThreads; ++i) {
|
for (int32_t i = 0; i < pServer->numOfThreads; ++i) {
|
||||||
totalFds += pServer->pThreads[i].numOfContexts;
|
totalFds += pServer->pThreads[i].numOfContexts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,7 +228,7 @@ static void *httpAcceptHttpConnection(void *arg) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, thread:%s, failed to add http fd for epoll, error:%s", pContext, connFd,
|
httpError("context:%p, fd:%d, ip:%s, thread:%s, failed to add http fd for epoll, error:%s", pContext, connFd,
|
||||||
pContext->ipstr, pThread->label, strerror(errno));
|
pContext->ipstr, pThread->label, strerror(errno));
|
||||||
taosClose(pContext->fd);
|
taosClose(pContext->fd);
|
||||||
httpReleaseContext(pContext);
|
httpReleaseContext(pContext, true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,7 +255,7 @@ bool httpInitConnect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpThread *pThread = pServer->pThreads;
|
HttpThread *pThread = pServer->pThreads;
|
||||||
for (int i = 0; i < pServer->numOfThreads; ++i) {
|
for (int32_t i = 0; i < pServer->numOfThreads; ++i) {
|
||||||
sprintf(pThread->label, "%s%d", pServer->label, i);
|
sprintf(pThread->label, "%s%d", pServer->label, i);
|
||||||
pThread->processData = pServer->processData;
|
pThread->processData = pServer->processData;
|
||||||
pThread->threadId = i;
|
pThread->threadId = i;
|
||||||
|
@ -405,3 +301,59 @@ bool httpInitConnect() {
|
||||||
pServer->serverPort, pServer->numOfThreads);
|
pServer->serverPort, pServer->numOfThreads);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool httpReadData(HttpContext *pContext) {
|
||||||
|
HttpParser *pParser = pContext->parser;
|
||||||
|
if (!pParser->inited) {
|
||||||
|
httpInitParser(pParser);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pParser->parsed) {
|
||||||
|
httpDebug("context:%p, fd:%d, not in ready state, parsed:%d", pContext, pContext->fd, pParser->parsed);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pContext->accessTimes++;
|
||||||
|
pContext->lastAccessTime = taosGetTimestampSec();
|
||||||
|
|
||||||
|
char buf[HTTP_STEP_SIZE + 1] = {0};
|
||||||
|
int32_t nread = (int32_t)taosReadSocket(pContext->fd, buf, HTTP_STEP_SIZE);
|
||||||
|
if (nread > 0) {
|
||||||
|
buf[nread] = '\0';
|
||||||
|
httpTraceL("context:%p, fd:%d, nread:%d content:%s", pContext, pContext->fd, nread, buf);
|
||||||
|
int32_t ok = httpParseBuf(pParser, buf, nread);
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
httpError("context:%p, fd:%d, parse failed, ret:%d code:%d close connect", pContext, pContext->fd, ok, pParser->parseCode);
|
||||||
|
httpSendErrorResp(pContext, pParser->parseCode);
|
||||||
|
httpNotifyContextClose(pContext);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pParser->parseCode) {
|
||||||
|
httpError("context:%p, fd:%d, parse failed, code:%d close connect", pContext, pContext->fd, pParser->parseCode);
|
||||||
|
httpSendErrorResp(pContext, pParser->parseCode);
|
||||||
|
httpNotifyContextClose(pContext);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pParser->parsed) {
|
||||||
|
httpTrace("context:%p, fd:%d, read not over yet, len:%d", pContext, pContext->fd, pParser->body.pos);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
httpDebug("context:%p, fd:%d, totalLen:%d", pContext, pContext->fd, pParser->body.pos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (nread < 0) {
|
||||||
|
if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||||
|
httpDebug("context:%p, fd:%d, read from socket error:%d, wait another event", pContext, pContext->fd, errno);
|
||||||
|
return false; // later again
|
||||||
|
} else {
|
||||||
|
httpError("context:%p, fd:%d, read from socket error:%d, close connect", pContext, pContext->fd, errno);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
httpError("context:%p, fd:%d, nread:%d, wait another event", pContext, pContext->fd, nread);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tcache.h"
|
#include "tcache.h"
|
||||||
#include "httpInt.h"
|
#include "httpInt.h"
|
||||||
|
@ -39,15 +40,15 @@ void httpCreateSession(HttpContext *pContext, void *taos) {
|
||||||
// taosCacheRelease(server->sessionCache, (void **)&temp, false);
|
// taosCacheRelease(server->sessionCache, (void **)&temp, false);
|
||||||
|
|
||||||
if (pContext->session == NULL) {
|
if (pContext->session == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, error:%s", pContext, pContext->fd, pContext->ipstr, pContext->user,
|
httpError("context:%p, fd:%d, user:%s, error:%s", pContext, pContext->fd, pContext->user,
|
||||||
httpMsg[HTTP_SESSION_FULL]);
|
tstrerror(TSDB_CODE_HTTP_SESSION_FULL));
|
||||||
taos_close(taos);
|
taos_close(taos);
|
||||||
pthread_mutex_unlock(&server->serverMutex);
|
pthread_mutex_unlock(&server->serverMutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, create a new session:%p:%p sessionRef:%d", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, user:%s, create a new session:%p:%p sessionRef:%d", pContext, pContext->fd,
|
||||||
pContext->ipstr, pContext->user, pContext->session, pContext->session->taos, pContext->session->refCount);
|
pContext->user, pContext->session, pContext->session->taos, pContext->session->refCount);
|
||||||
pthread_mutex_unlock(&server->serverMutex);
|
pthread_mutex_unlock(&server->serverMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,11 +62,10 @@ static void httpFetchSessionImp(HttpContext *pContext) {
|
||||||
pContext->session = taosCacheAcquireByKey(server->sessionCache, sessionId, len);
|
pContext->session = taosCacheAcquireByKey(server->sessionCache, sessionId, len);
|
||||||
if (pContext->session != NULL) {
|
if (pContext->session != NULL) {
|
||||||
atomic_add_fetch_32(&pContext->session->refCount, 1);
|
atomic_add_fetch_32(&pContext->session->refCount, 1);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, find an exist session:%p:%p, sessionRef:%d", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, user:%s, find an exist session:%p:%p, sessionRef:%d", pContext, pContext->fd,
|
||||||
pContext->ipstr, pContext->user, pContext->session, pContext->session->taos, pContext->session->refCount);
|
pContext->user, pContext->session, pContext->session->taos, pContext->session->refCount);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, session not found", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, session not found", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&server->serverMutex);
|
pthread_mutex_unlock(&server->serverMutex);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tnote.h"
|
#include "tnote.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "tsclient.h"
|
#include "tsclient.h"
|
||||||
#include "httpInt.h"
|
#include "httpInt.h"
|
||||||
#include "httpContext.h"
|
#include "httpContext.h"
|
||||||
|
@ -56,18 +57,18 @@ void httpProcessMultiSqlRetrieveCallBackImp(void *param, TAOS_RES *result, int n
|
||||||
|
|
||||||
if (isContinue) {
|
if (isContinue) {
|
||||||
// retrieve next batch of rows
|
// retrieve next batch of rows
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, continue retrieve, numOfRows:%d, sql:%s",
|
httpDebug("context:%p, fd:%d, user:%s, process pos:%d, continue retrieve, numOfRows:%d, sql:%s", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, numOfRows, sql);
|
pContext->fd, pContext->user, multiCmds->pos, numOfRows, sql);
|
||||||
taos_fetch_rows_a(result, httpProcessMultiSqlRetrieveCallBack, param);
|
taos_fetch_rows_a(result, httpProcessMultiSqlRetrieveCallBack, param);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, stop retrieve, numOfRows:%d, sql:%s",
|
httpDebug("context:%p, fd:%d, user:%s, process pos:%d, stop retrieve, numOfRows:%d, sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, numOfRows, sql);
|
pContext->user, multiCmds->pos, numOfRows, sql);
|
||||||
|
|
||||||
if (numOfRows < 0) {
|
if (numOfRows < 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, retrieve failed code:%s, sql:%s",
|
httpError("context:%p, fd:%d, user:%s, process pos:%d, retrieve failed code:%s, sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, tstrerror(numOfRows), sql);
|
pContext->user, multiCmds->pos, tstrerror(numOfRows), sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
|
|
||||||
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN && encode->stopJsonFp) {
|
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN && encode->stopJsonFp) {
|
||||||
|
@ -94,20 +95,20 @@ void httpProcessMultiSqlCallBackImp(void *param, TAOS_RES *result, int code) {
|
||||||
char * sql = httpGetCmdsString(pContext, singleCmd->sql);
|
char * sql = httpGetCmdsString(pContext, singleCmd->sql);
|
||||||
|
|
||||||
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
||||||
httpWarn("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, code:%s:inprogress, sql:%s",
|
httpWarn("context:%p, fd:%d, user:%s, process pos:%d, code:%s:inprogress, sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, tstrerror(code), sql);
|
pContext->user, multiCmds->pos, tstrerror(code), sql);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
if (encode->checkFinishedFp != NULL && !encode->checkFinishedFp(pContext, singleCmd, code)) {
|
if (encode->checkFinishedFp != NULL && !encode->checkFinishedFp(pContext, singleCmd, code)) {
|
||||||
singleCmd->code = code;
|
singleCmd->code = code;
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process pos jump to:%d, last code:%s, last sql:%s",
|
httpDebug("context:%p, fd:%d, user:%s, process pos jump to:%d, last code:%s, last sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos + 1, tstrerror(code), sql);
|
pContext->user, multiCmds->pos + 1, tstrerror(code), sql);
|
||||||
} else {
|
} else {
|
||||||
singleCmd->code = code;
|
singleCmd->code = code;
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, error code:%s, sql:%s",
|
httpError("context:%p, fd:%d, user:%s, process pos:%d, error code:%s, sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, tstrerror(code), sql);
|
pContext->user, multiCmds->pos, tstrerror(code), sql);
|
||||||
|
|
||||||
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN) {
|
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN) {
|
||||||
if (encode->startJsonFp) (encode->startJsonFp)(pContext, singleCmd, result);
|
if (encode->startJsonFp) (encode->startJsonFp)(pContext, singleCmd, result);
|
||||||
|
@ -125,8 +126,8 @@ void httpProcessMultiSqlCallBackImp(void *param, TAOS_RES *result, int code) {
|
||||||
if (isUpdate) {
|
if (isUpdate) {
|
||||||
// not select or show commands
|
// not select or show commands
|
||||||
int affectRows = taos_affected_rows(result);
|
int affectRows = taos_affected_rows(result);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, affect rows:%d, sql:%s",
|
httpDebug("context:%p, fd:%d, user:%s, process pos:%d, affect rows:%d, sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, affectRows, sql);
|
pContext->user, multiCmds->pos, affectRows, sql);
|
||||||
|
|
||||||
singleCmd->code = 0;
|
singleCmd->code = 0;
|
||||||
|
|
||||||
|
@ -151,8 +152,8 @@ void httpProcessMultiSqlCallBackImp(void *param, TAOS_RES *result, int code) {
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
httpProcessMultiSql(pContext);
|
httpProcessMultiSql(pContext);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, start retrieve, sql:%s",
|
httpDebug("context:%p, fd:%d, user:%s, process pos:%d, start retrieve, sql:%s", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, sql);
|
pContext->user, multiCmds->pos, sql);
|
||||||
|
|
||||||
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN && encode->startJsonFp) {
|
if (singleCmd->cmdReturnType == HTTP_CMD_RETURN_TYPE_WITH_RETURN && encode->startJsonFp) {
|
||||||
(encode->startJsonFp)(pContext, singleCmd, result);
|
(encode->startJsonFp)(pContext, singleCmd, result);
|
||||||
|
@ -170,8 +171,8 @@ void httpProcessMultiSql(HttpContext *pContext) {
|
||||||
HttpEncodeMethod *encode = pContext->encodeMethod;
|
HttpEncodeMethod *encode = pContext->encodeMethod;
|
||||||
|
|
||||||
if (multiCmds->pos >= multiCmds->size) {
|
if (multiCmds->pos >= multiCmds->size) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, size:%d, stop mulit-querys",
|
httpDebug("context:%p, fd:%d, user:%s, process pos:%d, size:%d, stop mulit-querys", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos, multiCmds->size);
|
pContext->user, multiCmds->pos, multiCmds->size);
|
||||||
if (encode->cleanJsonFp) {
|
if (encode->cleanJsonFp) {
|
||||||
(encode->cleanJsonFp)(pContext);
|
(encode->cleanJsonFp)(pContext);
|
||||||
}
|
}
|
||||||
|
@ -182,8 +183,8 @@ void httpProcessMultiSql(HttpContext *pContext) {
|
||||||
HttpSqlCmd *cmd = multiCmds->cmds + multiCmds->pos;
|
HttpSqlCmd *cmd = multiCmds->cmds + multiCmds->pos;
|
||||||
|
|
||||||
char *sql = httpGetCmdsString(pContext, cmd->sql);
|
char *sql = httpGetCmdsString(pContext, cmd->sql);
|
||||||
httpTraceL("context:%p, fd:%d, ip:%s, user:%s, process pos:%d, start query, sql:%s", pContext, pContext->fd,
|
httpTraceL("context:%p, fd:%d, user:%s, process pos:%d, start query, sql:%s", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, multiCmds->pos, sql);
|
multiCmds->pos, sql);
|
||||||
taosNotePrintHttp(sql);
|
taosNotePrintHttp(sql);
|
||||||
taos_query_a(pContext->session->taos, sql, httpProcessMultiSqlCallBack, (void *)pContext);
|
taos_query_a(pContext->session->taos, sql, httpProcessMultiSqlCallBack, (void *)pContext);
|
||||||
}
|
}
|
||||||
|
@ -193,12 +194,12 @@ void httpProcessMultiSqlCmd(HttpContext *pContext) {
|
||||||
|
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
if (multiCmds == NULL || multiCmds->size <= 0 || multiCmds->pos >= multiCmds->size || multiCmds->pos < 0) {
|
if (multiCmds == NULL || multiCmds->size <= 0 || multiCmds->pos >= multiCmds->size || multiCmds->pos < 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_INVALID_MULTI_REQUEST);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_INVALID_MULTI_REQUEST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, start multi-querys pos:%d, size:%d", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, user:%s, start multi-querys pos:%d, size:%d", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, multiCmds->pos, multiCmds->size);
|
multiCmds->pos, multiCmds->size);
|
||||||
HttpEncodeMethod *encode = pContext->encodeMethod;
|
HttpEncodeMethod *encode = pContext->encodeMethod;
|
||||||
if (encode->initJsonFp) {
|
if (encode->initJsonFp) {
|
||||||
(encode->initJsonFp)(pContext);
|
(encode->initJsonFp)(pContext);
|
||||||
|
@ -226,24 +227,23 @@ void httpProcessSingleSqlRetrieveCallBackImp(void *param, TAOS_RES *result, int
|
||||||
#if 0
|
#if 0
|
||||||
// todo refactor
|
// todo refactor
|
||||||
if (tscResultsetFetchCompleted(result)) {
|
if (tscResultsetFetchCompleted(result)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, resultset fetch completed", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, resultset fetch completed", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
isContinue = false;
|
isContinue = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (isContinue) {
|
if (isContinue) {
|
||||||
// retrieve next batch of rows
|
// retrieve next batch of rows
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, continue retrieve, numOfRows:%d", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, user:%s, continue retrieve, numOfRows:%d", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, numOfRows);
|
numOfRows);
|
||||||
taos_fetch_rows_a(result, httpProcessSingleSqlRetrieveCallBack, param);
|
taos_fetch_rows_a(result, httpProcessSingleSqlRetrieveCallBack, param);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, stop retrieve, numOfRows:%d", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, stop retrieve, numOfRows:%d", pContext, pContext->fd, pContext->user,
|
||||||
pContext->user, numOfRows);
|
numOfRows);
|
||||||
|
|
||||||
if (numOfRows < 0) {
|
if (numOfRows < 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, retrieve failed, code:%s", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, retrieve failed, code:%s", pContext, pContext->fd, pContext->user,
|
||||||
pContext->user, tstrerror(numOfRows));
|
tstrerror(numOfRows));
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
|
@ -269,21 +269,21 @@ void httpProcessSingleSqlCallBackImp(void *param, TAOS_RES *result, int unUsedCo
|
||||||
HttpEncodeMethod *encode = pContext->encodeMethod;
|
HttpEncodeMethod *encode = pContext->encodeMethod;
|
||||||
|
|
||||||
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, query error, taos:%p, code:%s:inprogress, sqlObj:%p",
|
httpError("context:%p, fd:%d, user:%s, query error, taos:%p, code:%s:inprogress, sqlObj:%p", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, pContext->session->taos, tstrerror(code), (SSqlObj *)result);
|
pContext->user, pContext->session->taos, tstrerror(code), (SSqlObj *)result);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
SSqlObj *pObj = (SSqlObj *)result;
|
SSqlObj *pObj = (SSqlObj *)result;
|
||||||
if (code == TSDB_CODE_TSC_INVALID_SQL) {
|
if (code == TSDB_CODE_TSC_INVALID_SQL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, query error, taos:%p, code:%s, sqlObj:%p, error:%s",
|
httpError("context:%p, fd:%d, user:%s, query error, taos:%p, code:%s, sqlObj:%p, error:%s", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, pContext->session->taos, tstrerror(code), pObj, pObj->cmd.payload);
|
pContext->fd, pContext->user, pContext->session->taos, tstrerror(code), pObj, pObj->cmd.payload);
|
||||||
httpSendTaosdInvalidSqlErrorResp(pContext, pObj->cmd.payload);
|
httpSendTaosdInvalidSqlErrorResp(pContext, pObj->cmd.payload);
|
||||||
} else {
|
} else {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, query error, taos:%p, code:%s, sqlObj:%p",
|
httpError("context:%p, fd:%d, user:%s, query error, taos:%p, code:%s, sqlObj:%p", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, pContext->session->taos, tstrerror(code), pObj);
|
pContext->user, pContext->session->taos, tstrerror(code), pObj);
|
||||||
httpSendTaosdErrorResp(pContext, code);
|
httpSendErrorResp(pContext, code);
|
||||||
}
|
}
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
return;
|
return;
|
||||||
|
@ -294,8 +294,8 @@ void httpProcessSingleSqlCallBackImp(void *param, TAOS_RES *result, int unUsedCo
|
||||||
// not select or show commands
|
// not select or show commands
|
||||||
int affectRows = taos_affected_rows(result);
|
int affectRows = taos_affected_rows(result);
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, affect rows:%d, stop query, sqlObj:%p",
|
httpDebug("context:%p, fd:%d, user:%s, affect rows:%d, stop query, sqlObj:%p", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, affectRows, result);
|
pContext->user, affectRows, result);
|
||||||
|
|
||||||
if (encode->startJsonFp) {
|
if (encode->startJsonFp) {
|
||||||
(encode->startJsonFp)(pContext, &pContext->singleCmd, result);
|
(encode->startJsonFp)(pContext, &pContext->singleCmd, result);
|
||||||
|
@ -312,8 +312,7 @@ void httpProcessSingleSqlCallBackImp(void *param, TAOS_RES *result, int unUsedCo
|
||||||
taos_free_result(result);
|
taos_free_result(result);
|
||||||
httpCloseContextByApp(pContext);
|
httpCloseContextByApp(pContext);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, start retrieve", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, user:%s, start retrieve", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
|
|
||||||
if (encode->startJsonFp) {
|
if (encode->startJsonFp) {
|
||||||
(encode->startJsonFp)(pContext, &pContext->singleCmd, result);
|
(encode->startJsonFp)(pContext, &pContext->singleCmd, result);
|
||||||
|
@ -333,25 +332,23 @@ void httpProcessSingleSqlCmd(HttpContext *pContext) {
|
||||||
HttpSession *pSession = pContext->session;
|
HttpSession *pSession = pContext->session;
|
||||||
|
|
||||||
if (sql == NULL || sql[0] == 0) {
|
if (sql == NULL || sql[0] == 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, error:no sql input", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, error:no sql input", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_SQL_INPUT);
|
||||||
httpSendErrorResp(pContext, HTTP_NO_SQL_INPUT);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpTraceL("context:%p, fd:%d, ip:%s, user:%s, start query, sql:%s", pContext, pContext->fd, pContext->ipstr,
|
httpTraceL("context:%p, fd:%d, user:%s, start query, sql:%s", pContext, pContext->fd, pContext->user, sql);
|
||||||
pContext->user, sql);
|
|
||||||
taosNotePrintHttp(sql);
|
taosNotePrintHttp(sql);
|
||||||
taos_query_a(pSession->taos, sql, httpProcessSingleSqlCallBack, (void *)pContext);
|
taos_query_a(pSession->taos, sql, httpProcessSingleSqlCallBack, (void *)pContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpProcessLoginCmd(HttpContext *pContext) {
|
void httpProcessLoginCmd(HttpContext *pContext) {
|
||||||
char token[128] = {0};
|
char token[128] = {0};
|
||||||
if (!httpGenTaosdAuthToken(pContext, token, 128)) {
|
if (httpGenTaosdAuthToken(pContext, token, 128) != 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_GEN_TAOSD_TOKEN_ERR);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_GEN_TAOSD_TOKEN_ERR);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, login via http, return token:%s",
|
httpDebug("context:%p, fd:%d, user:%s, login via http, return token:%s", pContext, pContext->fd, pContext->user,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, token);
|
token);
|
||||||
httpSendSuccResp(pContext, token);
|
httpSendSuccResp(pContext, token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,25 +394,24 @@ void httpProcessRequestCb(void *param, TAOS_RES *result, int code) {
|
||||||
if (pContext == NULL) return;
|
if (pContext == NULL) return;
|
||||||
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, login error, code:%s", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, login error, code:%s", pContext, pContext->fd, pContext->user,
|
||||||
pContext->user, tstrerror(code));
|
tstrerror(code));
|
||||||
httpSendTaosdErrorResp(pContext, code);
|
httpSendErrorResp(pContext, code);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, connect tdengine success, taos:%p", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, user:%s, connect tdengine success, taos:%p", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, pContext->taos);
|
pContext->taos);
|
||||||
if (pContext->taos == NULL) {
|
if (pContext->taos == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, login error, taos is empty", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, login error, taos is empty", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_LOGIN_FAILED);
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_SESSIONS);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpCreateSession(pContext, pContext->taos);
|
httpCreateSession(pContext, pContext->taos);
|
||||||
|
|
||||||
if (pContext->session == NULL) {
|
if (pContext->session == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_SESSION_FULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_SESSION_FULL);
|
||||||
httpCloseContextByApp(pContext);
|
httpCloseContextByApp(pContext);
|
||||||
} else {
|
} else {
|
||||||
httpExecCmd(pContext);
|
httpExecCmd(pContext);
|
||||||
|
@ -428,8 +424,8 @@ void httpProcessRequest(HttpContext *pContext) {
|
||||||
if (pContext->session == NULL || pContext->reqType == HTTP_REQTYPE_LOGIN) {
|
if (pContext->session == NULL || pContext->reqType == HTTP_REQTYPE_LOGIN) {
|
||||||
taos_connect_a(NULL, pContext->user, pContext->pass, "", 0, httpProcessRequestCb, (void *)pContext,
|
taos_connect_a(NULL, pContext->user, pContext->pass, "", 0, httpProcessRequestCb, (void *)pContext,
|
||||||
&(pContext->taos));
|
&(pContext->taos));
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, user:%s, try connect tdengine, taos:%p", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, user:%s, try connect tdengine, taos:%p", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, pContext->taos);
|
pContext->taos);
|
||||||
} else {
|
} else {
|
||||||
httpExecCmd(pContext);
|
httpExecCmd(pContext);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,9 @@
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
#include "httpHandle.h"
|
#include "httpHandle.h"
|
||||||
#include "httpQueue.h"
|
#include "httpQueue.h"
|
||||||
#include "gcHandle.h"
|
#include "httpGcHandle.h"
|
||||||
#include "restHandle.h"
|
#include "httpRestHandle.h"
|
||||||
#include "tgHandle.h"
|
#include "httpTgHandle.h"
|
||||||
|
|
||||||
#ifndef _ADMIN
|
#ifndef _ADMIN
|
||||||
void adminInitHandle(HttpServer* pServer) {}
|
void adminInitHandle(HttpServer* pServer) {}
|
||||||
|
@ -37,9 +37,9 @@ void opInitHandle(HttpServer* pServer) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
HttpServer tsHttpServer;
|
HttpServer tsHttpServer;
|
||||||
void taosInitNote(int numOfNoteLines, int maxNotes, char* lable);
|
void taosInitNote(int32_t numOfNoteLines, int32_t maxNotes, char* lable);
|
||||||
|
|
||||||
int httpInitSystem() {
|
int32_t httpInitSystem() {
|
||||||
strcpy(tsHttpServer.label, "rest");
|
strcpy(tsHttpServer.label, "rest");
|
||||||
tsHttpServer.serverIp = 0;
|
tsHttpServer.serverIp = 0;
|
||||||
tsHttpServer.serverPort = tsHttpPort;
|
tsHttpServer.serverPort = tsHttpPort;
|
||||||
|
@ -60,7 +60,7 @@ int httpInitSystem() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpStartSystem() {
|
int32_t httpStartSystem() {
|
||||||
httpInfo("start http server ...");
|
httpInfo("start http server ...");
|
||||||
|
|
||||||
if (tsHttpServer.status != HTTP_SERVER_INIT) {
|
if (tsHttpServer.status != HTTP_SERVER_INIT) {
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "httpInt.h"
|
#include "httpInt.h"
|
||||||
#include "tgHandle.h"
|
#include "httpTgHandle.h"
|
||||||
#include "tgJson.h"
|
#include "httpTgJson.h"
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -83,16 +83,16 @@ static const char DEFAULT_TELEGRAF_CFG[] =
|
||||||
"]}";
|
"]}";
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name;
|
char * name;
|
||||||
char *tbName;
|
char * tbName;
|
||||||
char **fields;
|
char ** fields;
|
||||||
int fieldNum;
|
int32_t fieldNum;
|
||||||
} STgSchema;
|
} STgSchema;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
STgSchema *schemas;
|
STgSchema *schemas;
|
||||||
int size;
|
int32_t size;
|
||||||
int pos;
|
int32_t pos;
|
||||||
} STgSchemas;
|
} STgSchemas;
|
||||||
|
|
||||||
static STgSchemas tgSchemas = {0};
|
static STgSchemas tgSchemas = {0};
|
||||||
|
@ -107,7 +107,7 @@ void tgFreeSchema(STgSchema *schema) {
|
||||||
schema->tbName = NULL;
|
schema->tbName = NULL;
|
||||||
}
|
}
|
||||||
if (schema->fields != NULL) {
|
if (schema->fields != NULL) {
|
||||||
for (int f = 0; f < schema->fieldNum; ++f) {
|
for (int32_t f = 0; f < schema->fieldNum; ++f) {
|
||||||
if (schema->fields[f] != NULL) {
|
if (schema->fields[f] != NULL) {
|
||||||
free(schema->fields[f]);
|
free(schema->fields[f]);
|
||||||
schema->fields[f] = NULL;
|
schema->fields[f] = NULL;
|
||||||
|
@ -121,7 +121,7 @@ void tgFreeSchema(STgSchema *schema) {
|
||||||
|
|
||||||
void tgFreeSchemas() {
|
void tgFreeSchemas() {
|
||||||
if (tgSchemas.schemas != NULL) {
|
if (tgSchemas.schemas != NULL) {
|
||||||
for (int s = 0; s < tgSchemas.size; ++s) {
|
for (int32_t s = 0; s < tgSchemas.size; ++s) {
|
||||||
tgFreeSchema(&tgSchemas.schemas[s]);
|
tgFreeSchema(&tgSchemas.schemas[s]);
|
||||||
}
|
}
|
||||||
free(tgSchemas.schemas);
|
free(tgSchemas.schemas);
|
||||||
|
@ -130,7 +130,7 @@ void tgFreeSchemas() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tgInitSchemas(int size) {
|
void tgInitSchemas(int32_t size) {
|
||||||
tgFreeSchemas();
|
tgFreeSchemas();
|
||||||
tgSchemas.schemas = calloc(sizeof(STgSchema), size);
|
tgSchemas.schemas = calloc(sizeof(STgSchema), size);
|
||||||
tgSchemas.size = 0;
|
tgSchemas.size = 0;
|
||||||
|
@ -154,7 +154,7 @@ void tgParseSchemaMetric(cJSON *metric) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
}
|
}
|
||||||
int nameLen = (int)strlen(name->valuestring);
|
int32_t nameLen = (int32_t)strlen(name->valuestring);
|
||||||
if (nameLen == 0) {
|
if (nameLen == 0) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
|
@ -177,7 +177,7 @@ void tgParseSchemaMetric(cJSON *metric) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
}
|
}
|
||||||
int tbnameLen = (int)strlen(tbname->valuestring);
|
int32_t tbnameLen = (int32_t)strlen(tbname->valuestring);
|
||||||
if (tbnameLen == 0) {
|
if (tbnameLen == 0) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
|
@ -191,7 +191,7 @@ void tgParseSchemaMetric(cJSON *metric) {
|
||||||
if (fields == NULL) {
|
if (fields == NULL) {
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
}
|
}
|
||||||
int fieldSize = cJSON_GetArraySize(fields);
|
int32_t fieldSize = cJSON_GetArraySize(fields);
|
||||||
if (fieldSize <= 0 || fieldSize > TSDB_MAX_COLUMNS) {
|
if (fieldSize <= 0 || fieldSize > TSDB_MAX_COLUMNS) {
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,7 @@ void tgParseSchemaMetric(cJSON *metric) {
|
||||||
if (fieldSize > 0) {
|
if (fieldSize > 0) {
|
||||||
schema.fields = calloc(sizeof(STgSchema), (size_t)fieldSize);
|
schema.fields = calloc(sizeof(STgSchema), (size_t)fieldSize);
|
||||||
schema.fieldNum = fieldSize;
|
schema.fieldNum = fieldSize;
|
||||||
for (int i = 0; i < fieldSize; i++) {
|
for (int32_t i = 0; i < fieldSize; i++) {
|
||||||
cJSON *field = cJSON_GetArrayItem(fields, i);
|
cJSON *field = cJSON_GetArrayItem(fields, i);
|
||||||
if (field == NULL) {
|
if (field == NULL) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
|
@ -209,7 +209,7 @@ void tgParseSchemaMetric(cJSON *metric) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
}
|
}
|
||||||
int nameLen = (int)strlen(field->valuestring);
|
int32_t nameLen = (int32_t)strlen(field->valuestring);
|
||||||
if (nameLen == 0 || nameLen >= TSDB_TABLE_NAME_LEN) {
|
if (nameLen == 0 || nameLen >= TSDB_TABLE_NAME_LEN) {
|
||||||
parsedOk = false;
|
parsedOk = false;
|
||||||
goto ParseEnd;
|
goto ParseEnd;
|
||||||
|
@ -227,13 +227,13 @@ ParseEnd:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int tgParseSchema(const char *content, char*fileName) {
|
int32_t tgParseSchema(const char *content, char*fileName) {
|
||||||
cJSON *root = cJSON_Parse(content);
|
cJSON *root = cJSON_Parse(content);
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
httpError("failed to parse telegraf schema file:%s, invalid json format, content:%s", fileName, content);
|
httpError("failed to parse telegraf schema file:%s, invalid json format, content:%s", fileName, content);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int size = 0;
|
int32_t size = 0;
|
||||||
cJSON *metrics = cJSON_GetObjectItem(root, "metrics");
|
cJSON *metrics = cJSON_GetObjectItem(root, "metrics");
|
||||||
if (metrics != NULL) {
|
if (metrics != NULL) {
|
||||||
size = cJSON_GetArraySize(metrics);
|
size = cJSON_GetArraySize(metrics);
|
||||||
|
@ -244,7 +244,7 @@ int tgParseSchema(const char *content, char*fileName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tgInitSchemas(size);
|
tgInitSchemas(size);
|
||||||
for (int i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
cJSON *metric = cJSON_GetArrayItem(metrics, i);
|
cJSON *metric = cJSON_GetArrayItem(metrics, i);
|
||||||
if (metric != NULL) {
|
if (metric != NULL) {
|
||||||
tgParseSchemaMetric(metric);
|
tgParseSchemaMetric(metric);
|
||||||
|
@ -260,7 +260,7 @@ int tgParseSchema(const char *content, char*fileName) {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tgReadSchema(char *fileName) {
|
int32_t tgReadSchema(char *fileName) {
|
||||||
FILE *fp = fopen(fileName, "r");
|
FILE *fp = fopen(fileName, "r");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -286,7 +286,7 @@ int tgReadSchema(char *fileName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
content[contentSize] = 0;
|
content[contentSize] = 0;
|
||||||
int schemaNum = tgParseSchema(content, fileName);
|
int32_t schemaNum = tgParseSchema(content, fileName);
|
||||||
|
|
||||||
free(content);
|
free(content);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
@ -313,53 +313,53 @@ void tgCleanupHandle() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tgGetUserFromUrl(HttpContext *pContext) {
|
bool tgGetUserFromUrl(HttpContext *pContext) {
|
||||||
HttpParser *pParser = &pContext->parser;
|
HttpParser *pParser = pContext->parser;
|
||||||
if (pParser->path[TG_USER_URL_POS].len >= TSDB_USER_LEN || pParser->path[TG_USER_URL_POS].len <= 0) {
|
if (pParser->path[TG_USER_URL_POS].pos >= TSDB_USER_LEN || pParser->path[TG_USER_URL_POS].pos <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(pContext->user, pParser->path[TG_USER_URL_POS].pos, sizeof(pContext->user));
|
tstrncpy(pContext->user, pParser->path[TG_USER_URL_POS].str, sizeof(pContext->user));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tgGetPassFromUrl(HttpContext *pContext) {
|
bool tgGetPassFromUrl(HttpContext *pContext) {
|
||||||
HttpParser *pParser = &pContext->parser;
|
HttpParser *pParser = pContext->parser;
|
||||||
if (pParser->path[TG_PASS_URL_POS].len >= TSDB_PASSWORD_LEN || pParser->path[TG_PASS_URL_POS].len <= 0) {
|
if (pParser->path[TG_PASS_URL_POS].pos >= TSDB_PASSWORD_LEN || pParser->path[TG_PASS_URL_POS].pos <= 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(pContext->pass, pParser->path[TG_PASS_URL_POS].pos, sizeof(pContext->pass));
|
tstrncpy(pContext->pass, pParser->path[TG_PASS_URL_POS].str, sizeof(pContext->pass));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *tgGetDbFromUrl(HttpContext *pContext) {
|
char *tgGetDbFromUrl(HttpContext *pContext) {
|
||||||
HttpParser *pParser = &pContext->parser;
|
HttpParser *pParser = pContext->parser;
|
||||||
if (pParser->path[TG_DB_URL_POS].len <= 0) {
|
if (pParser->path[TG_DB_URL_POS].pos <= 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_DB_NOT_INPUT);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_DB_NOT_INPUT);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pParser->path[TG_DB_URL_POS].len >= TSDB_DB_NAME_LEN) {
|
if (pParser->path[TG_DB_URL_POS].pos >= TSDB_DB_NAME_LEN) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_DB_TOO_LONG);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_DB_TOO_LONG);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pParser->path[TG_DB_URL_POS].pos;
|
return pParser->path[TG_DB_URL_POS].str;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *tgGetStableName(char *stname, cJSON *fields, int fieldsSize) {
|
char *tgGetStableName(char *stname, cJSON *fields, int32_t fieldsSize) {
|
||||||
for (int s = 0; s < tgSchemas.size; ++s) {
|
for (int32_t s = 0; s < tgSchemas.size; ++s) {
|
||||||
STgSchema *schema = &tgSchemas.schemas[s];
|
STgSchema *schema = &tgSchemas.schemas[s];
|
||||||
if (strcasecmp(schema->name, stname) != 0) {
|
if (strcasecmp(schema->name, stname) != 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool schemaMatched = true;
|
bool schemaMatched = true;
|
||||||
for (int f = 0; f < schema->fieldNum; ++f) {
|
for (int32_t f = 0; f < schema->fieldNum; ++f) {
|
||||||
char *fieldName = schema->fields[f];
|
char *fieldName = schema->fields[f];
|
||||||
bool fieldMatched = false;
|
bool fieldMatched = false;
|
||||||
|
|
||||||
for (int i = 0; i < fieldsSize; i++) {
|
for (int32_t i = 0; i < fieldsSize; i++) {
|
||||||
cJSON *field = cJSON_GetArrayItem(fields, i);
|
cJSON *field = cJSON_GetArrayItem(fields, i);
|
||||||
if (strcasecmp(field->string, fieldName) == 0) {
|
if (strcasecmp(field->string, fieldName) == 0) {
|
||||||
fieldMatched = true;
|
fieldMatched = true;
|
||||||
|
@ -401,70 +401,70 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
// metric name
|
// metric name
|
||||||
cJSON *name = cJSON_GetObjectItem(metric, "name");
|
cJSON *name = cJSON_GetObjectItem(metric, "name");
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRIC_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRIC_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (name->type != cJSON_String) {
|
if (name->type != cJSON_String) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRIC_TYPE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRIC_TYPE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (name->valuestring == NULL) {
|
if (name->valuestring == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRIC_NAME_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRIC_NAME_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int nameLen = (int)strlen(name->valuestring);
|
int32_t nameLen = (int32_t)strlen(name->valuestring);
|
||||||
if (nameLen == 0) {
|
if (nameLen == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRIC_NAME_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRIC_NAME_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (nameLen >= TSDB_TABLE_NAME_LEN - 8) {
|
if (nameLen >= TSDB_TABLE_NAME_LEN - 8) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRIC_NAME_LONG);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRIC_NAME_LONG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// timestamp
|
// timestamp
|
||||||
cJSON *timestamp = cJSON_GetObjectItem(metric, "timestamp");
|
cJSON *timestamp = cJSON_GetObjectItem(metric, "timestamp");
|
||||||
if (timestamp == NULL) {
|
if (timestamp == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TIMESTAMP_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TIMESTAMP_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (timestamp->type != cJSON_Number) {
|
if (timestamp->type != cJSON_Number) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TIMESTAMP_TYPE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TIMESTAMP_TYPE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (timestamp->valueint <= 0) {
|
if (timestamp->valueint <= 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TIMESTAMP_VAL_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TIMESTAMP_VAL_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// tags
|
// tags
|
||||||
cJSON *tags = cJSON_GetObjectItem(metric, "tags");
|
cJSON *tags = cJSON_GetObjectItem(metric, "tags");
|
||||||
if (tags == NULL) {
|
if (tags == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAGS_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAGS_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tagsSize = cJSON_GetArraySize(tags);
|
int32_t tagsSize = cJSON_GetArraySize(tags);
|
||||||
if (tagsSize <= 0) {
|
if (tagsSize <= 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAGS_SIZE_0);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAGS_SIZE_0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tagsSize > TG_MAX_SORT_TAG_SIZE) {
|
if (tagsSize > TG_MAX_SORT_TAG_SIZE) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAGS_SIZE_LONG);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAGS_SIZE_LONG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *host = NULL;
|
cJSON *host = NULL;
|
||||||
|
|
||||||
for (int i = 0; i < tagsSize; i++) {
|
for (int32_t i = 0; i < tagsSize; i++) {
|
||||||
cJSON *tag = cJSON_GetArrayItem(tags, i);
|
cJSON *tag = cJSON_GetArrayItem(tags, i);
|
||||||
if (tag == NULL) {
|
if (tag == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAG_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAG_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (tag->string == NULL || strlen(tag->string) == 0) {
|
if (tag->string == NULL || strlen(tag->string) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAG_NAME_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAG_NAME_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,19 +474,19 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
*/
|
*/
|
||||||
if (0) {
|
if (0) {
|
||||||
if (strlen(tag->string) >= TSDB_COL_NAME_LEN) {
|
if (strlen(tag->string) >= TSDB_COL_NAME_LEN) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAG_NAME_SIZE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAG_NAME_SIZE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tag->type != cJSON_Number && tag->type != cJSON_String) {
|
if (tag->type != cJSON_Number && tag->type != cJSON_String) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAG_VALUE_TYPE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAG_VALUE_TYPE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tag->type == cJSON_String) {
|
if (tag->type == cJSON_String) {
|
||||||
if (tag->valuestring == NULL || strlen(tag->valuestring) == 0) {
|
if (tag->valuestring == NULL || strlen(tag->valuestring) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TAG_VALUE_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TAG_VALUE_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -497,46 +497,46 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (host == NULL) {
|
if (host == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TABLE_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TABLE_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (host->type != cJSON_String) {
|
if (host->type != cJSON_String) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_HOST_NOT_STRING);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_HOST_NOT_STRING);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(host->valuestring) >= TSDB_TABLE_NAME_LEN - 1) {
|
if (strlen(host->valuestring) >= TSDB_TABLE_NAME_LEN - 1) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_TABLE_SIZE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_TABLE_SIZE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fields
|
// fields
|
||||||
cJSON *fields = cJSON_GetObjectItem(metric, "fields");
|
cJSON *fields = cJSON_GetObjectItem(metric, "fields");
|
||||||
if (fields == NULL) {
|
if (fields == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELDS_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELDS_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fieldsSize = cJSON_GetArraySize(fields);
|
int32_t fieldsSize = cJSON_GetArraySize(fields);
|
||||||
if (fieldsSize <= 0) {
|
if (fieldsSize <= 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELDS_SIZE_0);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELDS_SIZE_0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fieldsSize > (TSDB_MAX_COLUMNS - TSDB_MAX_TAGS - 1)) {
|
if (fieldsSize > (TSDB_MAX_COLUMNS - TSDB_MAX_TAGS - 1)) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELDS_SIZE_LONG);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELDS_SIZE_LONG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < fieldsSize; i++) {
|
for (int32_t i = 0; i < fieldsSize; i++) {
|
||||||
cJSON *field = cJSON_GetArrayItem(fields, i);
|
cJSON *field = cJSON_GetArrayItem(fields, i);
|
||||||
if (field == NULL) {
|
if (field == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELD_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELD_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (field->string == NULL || strlen(field->string) == 0) {
|
if (field->string == NULL || strlen(field->string) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELD_NAME_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELD_NAME_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -545,17 +545,17 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
*/
|
*/
|
||||||
if (0) {
|
if (0) {
|
||||||
if (strlen(field->string) >= TSDB_COL_NAME_LEN) {
|
if (strlen(field->string) >= TSDB_COL_NAME_LEN) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELD_NAME_SIZE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELD_NAME_SIZE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (field->type != cJSON_Number && field->type != cJSON_String) {
|
if (field->type != cJSON_Number && field->type != cJSON_String) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELD_VALUE_TYPE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELD_VALUE_TYPE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (field->type == cJSON_String) {
|
if (field->type == cJSON_String) {
|
||||||
if (field->valuestring == NULL || strlen(field->valuestring) == 0) {
|
if (field->valuestring == NULL || strlen(field->valuestring) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_FIELD_VALUE_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_FIELD_VALUE_NULL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -564,7 +564,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
// assembling cmds
|
// assembling cmds
|
||||||
HttpSqlCmd *stable_cmd = httpNewSqlCmd(pContext);
|
HttpSqlCmd *stable_cmd = httpNewSqlCmd(pContext);
|
||||||
if (stable_cmd == NULL) {
|
if (stable_cmd == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
stable_cmd->cmdType = HTTP_CMD_TYPE_CREATE_STBALE;
|
stable_cmd->cmdType = HTTP_CMD_TYPE_CREATE_STBALE;
|
||||||
|
@ -572,18 +572,18 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
|
|
||||||
HttpSqlCmd *table_cmd = httpNewSqlCmd(pContext);
|
HttpSqlCmd *table_cmd = httpNewSqlCmd(pContext);
|
||||||
if (table_cmd == NULL) {
|
if (table_cmd == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
table_cmd->cmdType = HTTP_CMD_TYPE_INSERT;
|
table_cmd->cmdType = HTTP_CMD_TYPE_INSERT;
|
||||||
|
|
||||||
// order by tag name
|
// order by tag name
|
||||||
cJSON *orderedTags[TG_MAX_SORT_TAG_SIZE] = {0};
|
cJSON *orderedTags[TG_MAX_SORT_TAG_SIZE] = {0};
|
||||||
int orderTagsLen = 0;
|
int32_t orderTagsLen = 0;
|
||||||
for (int i = 0; i < tagsSize; ++i) {
|
for (int32_t i = 0; i < tagsSize; ++i) {
|
||||||
cJSON *tag = cJSON_GetArrayItem(tags, i);
|
cJSON *tag = cJSON_GetArrayItem(tags, i);
|
||||||
orderedTags[orderTagsLen++] = tag;
|
orderedTags[orderTagsLen++] = tag;
|
||||||
for (int j = orderTagsLen - 1; j >= 1; --j) {
|
for (int32_t j = orderTagsLen - 1; j >= 1; --j) {
|
||||||
cJSON *tag1 = orderedTags[j];
|
cJSON *tag1 = orderedTags[j];
|
||||||
cJSON *tag2 = orderedTags[j - 1];
|
cJSON *tag2 = orderedTags[j - 1];
|
||||||
if (strcasecmp(tag1->string, "host") == 0 || strcmp(tag1->string, tag2->string) < 0) {
|
if (strcasecmp(tag1->string, "host") == 0 || strcmp(tag1->string, tag2->string) < 0) {
|
||||||
|
@ -609,7 +609,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
httpShrinkTableName(pContext, table_cmd->stable, httpGetCmdsString(pContext, table_cmd->stable));
|
httpShrinkTableName(pContext, table_cmd->stable, httpGetCmdsString(pContext, table_cmd->stable));
|
||||||
|
|
||||||
// stable tag for detail
|
// stable tag for detail
|
||||||
for (int i = 0; i < orderTagsLen; ++i) {
|
for (int32_t i = 0; i < orderTagsLen; ++i) {
|
||||||
cJSON *tag = orderedTags[i];
|
cJSON *tag = orderedTags[i];
|
||||||
stable_cmd->tagNames[i] = table_cmd->tagNames[i] = httpAddToSqlCmdBuffer(pContext, tag->string);
|
stable_cmd->tagNames[i] = table_cmd->tagNames[i] = httpAddToSqlCmdBuffer(pContext, tag->string);
|
||||||
|
|
||||||
|
@ -631,7 +631,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
} else {
|
} else {
|
||||||
table_cmd->table = stable_cmd->table = httpAddToSqlCmdBufferNoTerminal(pContext, "%s_%d_%d_%s", stname, fieldsSize, orderTagsLen, host->valuestring);
|
table_cmd->table = stable_cmd->table = httpAddToSqlCmdBufferNoTerminal(pContext, "%s_%d_%d_%s", stname, fieldsSize, orderTagsLen, host->valuestring);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < orderTagsLen; ++i) {
|
for (int32_t i = 0; i < orderTagsLen; ++i) {
|
||||||
cJSON *tag = orderedTags[i];
|
cJSON *tag = orderedTags[i];
|
||||||
if (tag == host) continue;
|
if (tag == host) continue;
|
||||||
if (tag->type == cJSON_String)
|
if (tag->type == cJSON_String)
|
||||||
|
@ -653,7 +653,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
// assembling create stable sql
|
// assembling create stable sql
|
||||||
stable_cmd->sql = httpAddToSqlCmdBufferNoTerminal(pContext, "create table if not exists %s.%s(ts timestamp", db,
|
stable_cmd->sql = httpAddToSqlCmdBufferNoTerminal(pContext, "create table if not exists %s.%s(ts timestamp", db,
|
||||||
httpGetCmdsString(pContext, table_cmd->stable));
|
httpGetCmdsString(pContext, table_cmd->stable));
|
||||||
for (int i = 0; i < fieldsSize; ++i) {
|
for (int32_t i = 0; i < fieldsSize; ++i) {
|
||||||
cJSON *field = cJSON_GetArrayItem(fields, i);
|
cJSON *field = cJSON_GetArrayItem(fields, i);
|
||||||
char * field_type = "double";
|
char * field_type = "double";
|
||||||
if (field->type == cJSON_String)
|
if (field->type == cJSON_String)
|
||||||
|
@ -668,7 +668,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
}
|
}
|
||||||
httpAddToSqlCmdBufferNoTerminal(pContext, ") tags(");
|
httpAddToSqlCmdBufferNoTerminal(pContext, ") tags(");
|
||||||
|
|
||||||
for (int i = 0; i < orderTagsLen; ++i) {
|
for (int32_t i = 0; i < orderTagsLen; ++i) {
|
||||||
cJSON *tag = orderedTags[i];
|
cJSON *tag = orderedTags[i];
|
||||||
char * tag_type = "bigint";
|
char * tag_type = "bigint";
|
||||||
if (tag->type == cJSON_String)
|
if (tag->type == cJSON_String)
|
||||||
|
@ -689,7 +689,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
table_cmd->sql = httpAddToSqlCmdBufferNoTerminal(pContext, "import into %s.%s using %s.%s tags(", db,
|
table_cmd->sql = httpAddToSqlCmdBufferNoTerminal(pContext, "import into %s.%s using %s.%s tags(", db,
|
||||||
httpGetCmdsString(pContext, table_cmd->table), db,
|
httpGetCmdsString(pContext, table_cmd->table), db,
|
||||||
httpGetCmdsString(pContext, table_cmd->stable));
|
httpGetCmdsString(pContext, table_cmd->stable));
|
||||||
for (int i = 0; i < orderTagsLen; ++i) {
|
for (int32_t i = 0; i < orderTagsLen; ++i) {
|
||||||
cJSON *tag = orderedTags[i];
|
cJSON *tag = orderedTags[i];
|
||||||
if (i != orderTagsLen - 1) {
|
if (i != orderTagsLen - 1) {
|
||||||
if (tag->type == cJSON_Number)
|
if (tag->type == cJSON_Number)
|
||||||
|
@ -719,7 +719,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
}
|
}
|
||||||
|
|
||||||
httpAddToSqlCmdBufferNoTerminal(pContext, " values(%" PRId64 ",", timestamp->valueint);
|
httpAddToSqlCmdBufferNoTerminal(pContext, " values(%" PRId64 ",", timestamp->valueint);
|
||||||
for (int i = 0; i < fieldsSize; ++i) {
|
for (int32_t i = 0; i < fieldsSize; ++i) {
|
||||||
cJSON *field = cJSON_GetArrayItem(fields, i);
|
cJSON *field = cJSON_GetArrayItem(fields, i);
|
||||||
if (i != fieldsSize - 1) {
|
if (i != fieldsSize - 1) {
|
||||||
if (field->type == cJSON_Number)
|
if (field->type == cJSON_Number)
|
||||||
|
@ -800,48 +800,46 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
bool tgProcessQueryRequest(HttpContext *pContext, char *db) {
|
bool tgProcessQueryRequest(HttpContext *pContext, char *db) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, process telegraf query msg", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, process telegraf query msg", pContext, pContext->fd);
|
||||||
|
|
||||||
HttpParser *pParser = &pContext->parser;
|
char *filter = pContext->parser->body.str;
|
||||||
char * filter = pParser->data.pos;
|
|
||||||
if (filter == NULL) {
|
if (filter == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_MSG_INPUT);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_MSG_INPUT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *root = cJSON_Parse(filter);
|
cJSON *root = cJSON_Parse(filter);
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_INVALID_JSON);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_INVALID_JSON);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *metrics = cJSON_GetObjectItem(root, "metrics");
|
cJSON *metrics = cJSON_GetObjectItem(root, "metrics");
|
||||||
if (metrics != NULL) {
|
if (metrics != NULL) {
|
||||||
int size = cJSON_GetArraySize(metrics);
|
int32_t size = cJSON_GetArraySize(metrics);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, multiple metrics:%d at one time", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, multiple metrics:%d at one time", pContext, pContext->fd, size);
|
||||||
size);
|
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRICS_NULL);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRICS_NULL);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cmdSize = size * 2 + 1;
|
int32_t cmdSize = size * 2 + 1;
|
||||||
if (cmdSize > HTTP_MAX_CMD_SIZE) {
|
if (cmdSize > HTTP_MAX_CMD_SIZE) {
|
||||||
httpSendErrorResp(pContext, HTTP_TG_METRICS_SIZE);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_TG_METRICS_SIZE);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!httpMallocMultiCmds(pContext, cmdSize, HTTP_BUFFER_SIZE)) {
|
if (!httpMallocMultiCmds(pContext, cmdSize, HTTP_BUFFER_SIZE)) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpSqlCmd *cmd = httpNewSqlCmd(pContext);
|
HttpSqlCmd *cmd = httpNewSqlCmd(pContext);
|
||||||
if (cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -849,7 +847,7 @@ bool tgProcessQueryRequest(HttpContext *pContext, char *db) {
|
||||||
cmd->cmdReturnType = HTTP_CMD_RETURN_TYPE_NO_RETURN;
|
cmd->cmdReturnType = HTTP_CMD_RETURN_TYPE_NO_RETURN;
|
||||||
cmd->sql = httpAddToSqlCmdBuffer(pContext, "create database if not exists %s", db);
|
cmd->sql = httpAddToSqlCmdBuffer(pContext, "create database if not exists %s", db);
|
||||||
|
|
||||||
for (int i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
cJSON *metric = cJSON_GetArrayItem(metrics, i);
|
cJSON *metric = cJSON_GetArrayItem(metrics, i);
|
||||||
if (metric != NULL) {
|
if (metric != NULL) {
|
||||||
if (!tgProcessSingleMetric(pContext, metric, db)) {
|
if (!tgProcessSingleMetric(pContext, metric, db)) {
|
||||||
|
@ -859,17 +857,17 @@ bool tgProcessQueryRequest(HttpContext *pContext, char *db) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, single metric", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, single metric", pContext, pContext->fd);
|
||||||
|
|
||||||
if (!httpMallocMultiCmds(pContext, 3, HTTP_BUFFER_SIZE)) {
|
if (!httpMallocMultiCmds(pContext, 3, HTTP_BUFFER_SIZE)) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpSqlCmd *cmd = httpNewSqlCmd(pContext);
|
HttpSqlCmd *cmd = httpNewSqlCmd(pContext);
|
||||||
if (cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
httpSendErrorResp(pContext, HTTP_NO_ENOUGH_MEMORY);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_ENOUGH_MEMORY);
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -894,7 +892,7 @@ bool tgProcessQueryRequest(HttpContext *pContext, char *db) {
|
||||||
|
|
||||||
bool tgProcessRquest(struct HttpContext *pContext) {
|
bool tgProcessRquest(struct HttpContext *pContext) {
|
||||||
if (strlen(pContext->user) == 0 || strlen(pContext->pass) == 0) {
|
if (strlen(pContext->user) == 0 || strlen(pContext->pass) == 0) {
|
||||||
httpSendErrorResp(pContext, HTTP_PARSE_USR_ERROR);
|
httpSendErrorResp(pContext, TSDB_CODE_HTTP_NO_AUTH_INFO);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
#include "httpLog.h"
|
#include "httpLog.h"
|
||||||
#include "httpJson.h"
|
#include "httpJson.h"
|
||||||
#include "httpResp.h"
|
#include "httpResp.h"
|
||||||
#include "tgHandle.h"
|
#include "httpTgHandle.h"
|
||||||
#include "tgJson.h"
|
#include "httpTgJson.h"
|
||||||
|
|
||||||
void tgInitQueryJson(HttpContext *pContext) {
|
void tgInitQueryJson(HttpContext *pContext) {
|
||||||
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
||||||
|
@ -61,19 +61,19 @@ void tgStartQueryJson(HttpContext *pContext, HttpSqlCmd *cmd, TAOS_RES *result)
|
||||||
// data
|
// data
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonPair(jsonBuf, "metric", 6, httpGetCmdsString(pContext, cmd->stable),
|
httpJsonPair(jsonBuf, "metric", 6, httpGetCmdsString(pContext, cmd->stable),
|
||||||
(int)strlen(httpGetCmdsString(pContext, cmd->metric)));
|
(int32_t)strlen(httpGetCmdsString(pContext, cmd->metric)));
|
||||||
|
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonPair(jsonBuf, "stable", 6, httpGetCmdsString(pContext, cmd->stable),
|
httpJsonPair(jsonBuf, "stable", 6, httpGetCmdsString(pContext, cmd->stable),
|
||||||
(int)strlen(httpGetCmdsString(pContext, cmd->stable)));
|
(int32_t)strlen(httpGetCmdsString(pContext, cmd->stable)));
|
||||||
|
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonPair(jsonBuf, "table", 5, httpGetCmdsString(pContext, cmd->table),
|
httpJsonPair(jsonBuf, "table", 5, httpGetCmdsString(pContext, cmd->table),
|
||||||
(int)strlen(httpGetCmdsString(pContext, cmd->table)));
|
(int32_t)strlen(httpGetCmdsString(pContext, cmd->table)));
|
||||||
|
|
||||||
httpJsonItemToken(jsonBuf);
|
httpJsonItemToken(jsonBuf);
|
||||||
httpJsonPair(jsonBuf, "timestamp", 9, httpGetCmdsString(pContext, cmd->timestamp),
|
httpJsonPair(jsonBuf, "timestamp", 9, httpGetCmdsString(pContext, cmd->timestamp),
|
||||||
(int)strlen(httpGetCmdsString(pContext, cmd->timestamp))); // hack way
|
(int32_t)strlen(httpGetCmdsString(pContext, cmd->timestamp))); // hack way
|
||||||
}
|
}
|
||||||
|
|
||||||
void tgStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd) {
|
void tgStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd) {
|
||||||
|
@ -88,7 +88,7 @@ void tgStopQueryJson(HttpContext *pContext, HttpSqlCmd *cmd) {
|
||||||
httpJsonToken(jsonBuf, JsonObjEnd);
|
httpJsonToken(jsonBuf, JsonObjEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tgBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int affect_rows) {
|
void tgBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int32_t affect_rows) {
|
||||||
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
JsonBuf *jsonBuf = httpMallocJsonBuf(pContext);
|
||||||
if (jsonBuf == NULL) return;
|
if (jsonBuf == NULL) return;
|
||||||
|
|
||||||
|
@ -96,10 +96,10 @@ void tgBuildSqlAffectRowsJson(HttpContext *pContext, HttpSqlCmd *cmd, int affect
|
||||||
httpJsonPairIntVal(jsonBuf, "affected_rows", 13, affect_rows);
|
httpJsonPairIntVal(jsonBuf, "affected_rows", 13, affect_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int code) {
|
bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int32_t code) {
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, check telegraf command, code:%s, state:%d, type:%d, rettype:%d, tags:%d",
|
httpDebug("context:%p, fd:%d, check telegraf command, code:%s, state:%d, type:%d, rettype:%d, tags:%d", pContext,
|
||||||
pContext, pContext->fd, pContext->ipstr, tstrerror(code), cmd->cmdState, cmd->cmdType, cmd->cmdReturnType, cmd->tagNum);
|
pContext->fd, tstrerror(code), cmd->cmdState, cmd->cmdType, cmd->cmdReturnType, cmd->tagNum);
|
||||||
|
|
||||||
if (cmd->cmdType == HTTP_CMD_TYPE_INSERT) {
|
if (cmd->cmdType == HTTP_CMD_TYPE_INSERT) {
|
||||||
if (cmd->cmdState == HTTP_CMD_STATE_NOT_RUN_YET) {
|
if (cmd->cmdState == HTTP_CMD_STATE_NOT_RUN_YET) {
|
||||||
|
@ -107,16 +107,14 @@ bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int code) {
|
||||||
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
||||||
if (multiCmds->cmds[0].cmdState == HTTP_CMD_STATE_NOT_RUN_YET) {
|
if (multiCmds->cmds[0].cmdState == HTTP_CMD_STATE_NOT_RUN_YET) {
|
||||||
multiCmds->pos = (int16_t)-1;
|
multiCmds->pos = (int16_t)-1;
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, import failed, try create database", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, import failed, try create database", pContext, pContext->fd);
|
||||||
pContext->ipstr);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (code == TSDB_CODE_MND_INVALID_TABLE_NAME) {
|
} else if (code == TSDB_CODE_MND_INVALID_TABLE_NAME) {
|
||||||
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
||||||
if (multiCmds->cmds[multiCmds->pos - 1].cmdState == HTTP_CMD_STATE_NOT_RUN_YET) {
|
if (multiCmds->cmds[multiCmds->pos - 1].cmdState == HTTP_CMD_STATE_NOT_RUN_YET) {
|
||||||
multiCmds->pos = (int16_t)(multiCmds->pos - 2);
|
multiCmds->pos = (int16_t)(multiCmds->pos - 2);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, import failed, try create stable", pContext, pContext->fd,
|
httpDebug("context:%p, fd:%d, import failed, try create stable", pContext, pContext->fd);
|
||||||
pContext->ipstr);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -125,22 +123,21 @@ bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int code) {
|
||||||
}
|
}
|
||||||
} else if (cmd->cmdType == HTTP_CMD_TYPE_CREATE_DB) {
|
} else if (cmd->cmdType == HTTP_CMD_TYPE_CREATE_DB) {
|
||||||
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, code:%s, create database failed", pContext, pContext->fd, pContext->ipstr,
|
httpDebug("context:%p, fd:%d, code:%s, create database failed", pContext, pContext->fd, tstrerror(code));
|
||||||
tstrerror(code));
|
|
||||||
} else if (cmd->cmdType == HTTP_CMD_TYPE_CREATE_STBALE) {
|
} else if (cmd->cmdType == HTTP_CMD_TYPE_CREATE_STBALE) {
|
||||||
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED;
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, code:%s, create stable failed", pContext, pContext->fd, pContext->ipstr, tstrerror(code));
|
httpDebug("context:%p, fd:%d, code:%s, create stable failed", pContext, pContext->fd, tstrerror(code));
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tgSetNextCmd(struct HttpContext *pContext, HttpSqlCmd *cmd, int code) {
|
void tgSetNextCmd(struct HttpContext *pContext, HttpSqlCmd *cmd, int32_t code) {
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, get telegraf next command, pos:%d, code:%s, state:%d, type:%d, rettype:%d, tags:%d",
|
httpDebug("context:%p, fd:%d, get telegraf next command, pos:%d, code:%s, state:%d, type:%d, rettype:%d, tags:%d",
|
||||||
pContext, pContext->fd, pContext->ipstr, multiCmds->pos, tstrerror(code), cmd->cmdState, cmd->cmdType,
|
pContext, pContext->fd, multiCmds->pos, tstrerror(code), cmd->cmdState, cmd->cmdType, cmd->cmdReturnType,
|
||||||
cmd->cmdReturnType, cmd->tagNum);
|
cmd->tagNum);
|
||||||
|
|
||||||
if (cmd->cmdType == HTTP_CMD_TYPE_INSERT) {
|
if (cmd->cmdType == HTTP_CMD_TYPE_INSERT) {
|
||||||
multiCmds->pos = (int16_t)(multiCmds->pos + 2);
|
multiCmds->pos = (int16_t)(multiCmds->pos + 2);
|
|
@ -29,7 +29,7 @@ bool httpCheckUsedbSql(char *sql) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpTimeToString(time_t t, char *buf, int buflen) {
|
void httpTimeToString(time_t t, char *buf, int32_t buflen) {
|
||||||
memset(buf, 0, (size_t)buflen);
|
memset(buf, 0, (size_t)buflen);
|
||||||
char ts[32] = {0};
|
char ts[32] = {0};
|
||||||
|
|
||||||
|
@ -44,13 +44,13 @@ int32_t httpAddToSqlCmdBuffer(HttpContext *pContext, const char *const format, .
|
||||||
HttpSqlCmds *cmd = pContext->multiCmds;
|
HttpSqlCmds *cmd = pContext->multiCmds;
|
||||||
if (cmd->buffer == NULL) return -1;
|
if (cmd->buffer == NULL) return -1;
|
||||||
|
|
||||||
int remainLength = cmd->bufferSize - cmd->bufferPos;
|
int32_t remainLength = cmd->bufferSize - cmd->bufferPos;
|
||||||
if (remainLength < 4096) {
|
if (remainLength < 4096) {
|
||||||
if (!httpReMallocMultiCmdsBuffer(pContext, cmd->bufferSize * 2)) return -1;
|
if (!httpReMallocMultiCmdsBuffer(pContext, cmd->bufferSize * 2)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *buffer = cmd->buffer + cmd->bufferPos;
|
char * buffer = cmd->buffer + cmd->bufferPos;
|
||||||
int len = 0;
|
int32_t len = 0;
|
||||||
|
|
||||||
va_list argpointer;
|
va_list argpointer;
|
||||||
va_start(argpointer, format);
|
va_start(argpointer, format);
|
||||||
|
@ -76,13 +76,13 @@ int32_t httpAddToSqlCmdBufferNoTerminal(HttpContext *pContext, const char *const
|
||||||
HttpSqlCmds *cmd = pContext->multiCmds;
|
HttpSqlCmds *cmd = pContext->multiCmds;
|
||||||
if (cmd->buffer == NULL) return -1;
|
if (cmd->buffer == NULL) return -1;
|
||||||
|
|
||||||
int remainLength = cmd->bufferSize - cmd->bufferPos;
|
int32_t remainLength = cmd->bufferSize - cmd->bufferPos;
|
||||||
if (remainLength < 4096) {
|
if (remainLength < 4096) {
|
||||||
if (!httpReMallocMultiCmdsBuffer(pContext, cmd->bufferSize * 2)) return -1;
|
if (!httpReMallocMultiCmdsBuffer(pContext, cmd->bufferSize * 2)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *buffer = cmd->buffer + cmd->bufferPos;
|
char * buffer = cmd->buffer + cmd->bufferPos;
|
||||||
int len = 0;
|
int32_t len = 0;
|
||||||
|
|
||||||
va_list argpointer;
|
va_list argpointer;
|
||||||
va_start(argpointer, format);
|
va_start(argpointer, format);
|
||||||
|
@ -107,7 +107,7 @@ int32_t httpAddToSqlCmdBufferTerminal(HttpContext *pContext) {
|
||||||
HttpSqlCmds *cmd = pContext->multiCmds;
|
HttpSqlCmds *cmd = pContext->multiCmds;
|
||||||
if (cmd->buffer == NULL) return -1;
|
if (cmd->buffer == NULL) return -1;
|
||||||
|
|
||||||
int remainLength = cmd->bufferSize - cmd->bufferPos;
|
int32_t remainLength = cmd->bufferSize - cmd->bufferPos;
|
||||||
if (remainLength < 4096) {
|
if (remainLength < 4096) {
|
||||||
if (!httpReMallocMultiCmdsBuffer(pContext, cmd->bufferSize * 2)) return -1;
|
if (!httpReMallocMultiCmdsBuffer(pContext, cmd->bufferSize * 2)) return -1;
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ int32_t httpAddToSqlCmdBufferTerminal(HttpContext *pContext) {
|
||||||
return (int32_t)(buffer - cmd->buffer);
|
return (int32_t)(buffer - cmd->buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t httpAddToSqlCmdBufferWithSize(HttpContext *pContext, int mallocSize) {
|
int32_t httpAddToSqlCmdBufferWithSize(HttpContext *pContext, int32_t mallocSize) {
|
||||||
HttpSqlCmds *cmd = pContext->multiCmds;
|
HttpSqlCmds *cmd = pContext->multiCmds;
|
||||||
if (cmd->buffer == NULL) return -1;
|
if (cmd->buffer == NULL) return -1;
|
||||||
|
|
||||||
|
@ -139,18 +139,17 @@ int32_t httpAddToSqlCmdBufferWithSize(HttpContext *pContext, int mallocSize) {
|
||||||
return (int32_t)(buffer - cmd->buffer);
|
return (int32_t)(buffer - cmd->buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpMallocMultiCmds(HttpContext *pContext, int cmdSize, int bufferSize) {
|
bool httpMallocMultiCmds(HttpContext *pContext, int32_t cmdSize, int32_t bufferSize) {
|
||||||
if (cmdSize > HTTP_MAX_CMD_SIZE) {
|
if (cmdSize > HTTP_MAX_CMD_SIZE) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, mulitcmd size:%d large then %d", pContext, pContext->fd,
|
httpError("context:%p, fd:%d, user:%s, mulitcmd size:%d large then %d", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, cmdSize, HTTP_MAX_CMD_SIZE);
|
cmdSize, HTTP_MAX_CMD_SIZE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pContext->multiCmds == NULL) {
|
if (pContext->multiCmds == NULL) {
|
||||||
pContext->multiCmds = (HttpSqlCmds *)malloc(sizeof(HttpSqlCmds));
|
pContext->multiCmds = (HttpSqlCmds *)malloc(sizeof(HttpSqlCmds));
|
||||||
if (pContext->multiCmds == NULL) {
|
if (pContext->multiCmds == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, malloc multiCmds error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, malloc multiCmds error", pContext, pContext->fd, pContext->user);
|
||||||
pContext->user);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memset(pContext->multiCmds, 0, sizeof(HttpSqlCmds));
|
memset(pContext->multiCmds, 0, sizeof(HttpSqlCmds));
|
||||||
|
@ -161,7 +160,7 @@ bool httpMallocMultiCmds(HttpContext *pContext, int cmdSize, int bufferSize) {
|
||||||
free(multiCmds->cmds);
|
free(multiCmds->cmds);
|
||||||
multiCmds->cmds = (HttpSqlCmd *)malloc((size_t)cmdSize * sizeof(HttpSqlCmd));
|
multiCmds->cmds = (HttpSqlCmd *)malloc((size_t)cmdSize * sizeof(HttpSqlCmd));
|
||||||
if (multiCmds->cmds == NULL) {
|
if (multiCmds->cmds == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, malloc cmds:%d error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, malloc cmds:%d error", pContext, pContext->fd,
|
||||||
pContext->user, cmdSize);
|
pContext->user, cmdSize);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -172,8 +171,8 @@ bool httpMallocMultiCmds(HttpContext *pContext, int cmdSize, int bufferSize) {
|
||||||
free(multiCmds->buffer);
|
free(multiCmds->buffer);
|
||||||
multiCmds->buffer = (char *)malloc((size_t)bufferSize);
|
multiCmds->buffer = (char *)malloc((size_t)bufferSize);
|
||||||
if (multiCmds->buffer == NULL) {
|
if (multiCmds->buffer == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, malloc buffer:%d error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, malloc buffer:%d error", pContext, pContext->fd, pContext->user,
|
||||||
pContext->user, bufferSize);
|
bufferSize);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
multiCmds->bufferSize = bufferSize;
|
multiCmds->bufferSize = bufferSize;
|
||||||
|
@ -187,19 +186,18 @@ bool httpMallocMultiCmds(HttpContext *pContext, int cmdSize, int bufferSize) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpReMallocMultiCmdsSize(HttpContext *pContext, int cmdSize) {
|
bool httpReMallocMultiCmdsSize(HttpContext *pContext, int32_t cmdSize) {
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
|
|
||||||
if (cmdSize > HTTP_MAX_CMD_SIZE) {
|
if (cmdSize > HTTP_MAX_CMD_SIZE) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, mulitcmd size:%d large then %d", pContext, pContext->fd,
|
httpError("context:%p, fd:%d, user:%s, mulitcmd size:%d large then %d", pContext, pContext->fd, pContext->user,
|
||||||
pContext->ipstr, pContext->user, cmdSize, HTTP_MAX_CMD_SIZE);
|
cmdSize, HTTP_MAX_CMD_SIZE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiCmds->cmds = (HttpSqlCmd *)realloc(multiCmds->cmds, (size_t)cmdSize * sizeof(HttpSqlCmd));
|
multiCmds->cmds = (HttpSqlCmd *)realloc(multiCmds->cmds, (size_t)cmdSize * sizeof(HttpSqlCmd));
|
||||||
if (multiCmds->cmds == NULL) {
|
if (multiCmds->cmds == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, malloc cmds:%d error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, malloc cmds:%d error", pContext, pContext->fd, pContext->user, cmdSize);
|
||||||
pContext->user, cmdSize);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memset(multiCmds->cmds + multiCmds->maxSize, 0, (size_t)(cmdSize - multiCmds->maxSize) * sizeof(HttpSqlCmd));
|
memset(multiCmds->cmds + multiCmds->maxSize, 0, (size_t)(cmdSize - multiCmds->maxSize) * sizeof(HttpSqlCmd));
|
||||||
|
@ -208,19 +206,18 @@ bool httpReMallocMultiCmdsSize(HttpContext *pContext, int cmdSize) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpReMallocMultiCmdsBuffer(HttpContext *pContext, int bufferSize) {
|
bool httpReMallocMultiCmdsBuffer(HttpContext *pContext, int32_t bufferSize) {
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
|
|
||||||
if (bufferSize > HTTP_MAX_BUFFER_SIZE) {
|
if (bufferSize > HTTP_MAX_BUFFER_SIZE) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, mulitcmd buffer size:%d large then %d",
|
httpError("context:%p, fd:%d, user:%s, mulitcmd buffer size:%d large then %d", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, pContext->user, bufferSize, HTTP_MAX_BUFFER_SIZE);
|
pContext->user, bufferSize, HTTP_MAX_BUFFER_SIZE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
multiCmds->buffer = (char *)realloc(multiCmds->buffer, (size_t)bufferSize);
|
multiCmds->buffer = (char *)realloc(multiCmds->buffer, (size_t)bufferSize);
|
||||||
if (multiCmds->buffer == NULL) {
|
if (multiCmds->buffer == NULL) {
|
||||||
httpError("context:%p, fd:%d, ip:%s, user:%s, malloc buffer:%d error", pContext, pContext->fd, pContext->ipstr,
|
httpError("context:%p, fd:%d, user:%s, malloc buffer:%d error", pContext, pContext->fd, pContext->user, bufferSize);
|
||||||
pContext->user, bufferSize);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memset(multiCmds->buffer + multiCmds->bufferSize, 0, (size_t)(bufferSize - multiCmds->bufferSize));
|
memset(multiCmds->buffer + multiCmds->bufferSize, 0, (size_t)(bufferSize - multiCmds->bufferSize));
|
||||||
|
@ -261,7 +258,7 @@ bool httpCompareMethod(HttpDecodeMethod *pSrc, HttpDecodeMethod *pCmp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpAddMethod(HttpServer *pServer, HttpDecodeMethod *pMethod) {
|
void httpAddMethod(HttpServer *pServer, HttpDecodeMethod *pMethod) {
|
||||||
int pos = 0;
|
int32_t pos = 0;
|
||||||
for (pos = 0; pos < pServer->methodScannerLen; ++pos) {
|
for (pos = 0; pos < pServer->methodScannerLen; ++pos) {
|
||||||
if (httpCompareMethod(pServer->methodScanner[pos], pMethod)) {
|
if (httpCompareMethod(pServer->methodScanner[pos], pMethod)) {
|
||||||
break;
|
break;
|
||||||
|
@ -296,13 +293,13 @@ HttpSqlCmd *httpCurrSqlCmd(HttpContext *pContext) {
|
||||||
return multiCmds->cmds + multiCmds->size - 1;
|
return multiCmds->cmds + multiCmds->size - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpNextSqlCmdPos(HttpContext *pContext) {
|
int32_t httpNextSqlCmdPos(HttpContext *pContext) {
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
return multiCmds->size;
|
return multiCmds->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpTrimTableName(char *name) {
|
void httpTrimTableName(char *name) {
|
||||||
for (int i = 0; name[i] != 0; i++) {
|
for (int32_t i = 0; name[i] != 0; i++) {
|
||||||
if (name[i] == ' ' || name[i] == ':' || name[i] == '.' || name[i] == '-' || name[i] == '/' || name[i] == '\'')
|
if (name[i] == ' ' || name[i] == ':' || name[i] == '.' || name[i] == '-' || name[i] == '/' || name[i] == '\'')
|
||||||
name[i] = '_';
|
name[i] = '_';
|
||||||
if (i == TSDB_TABLE_NAME_LEN) {
|
if (i == TSDB_TABLE_NAME_LEN) {
|
||||||
|
@ -312,9 +309,9 @@ void httpTrimTableName(char *name) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpShrinkTableName(HttpContext *pContext, int pos, char *name) {
|
int32_t httpShrinkTableName(HttpContext *pContext, int32_t pos, char *name) {
|
||||||
int len = 0;
|
int32_t len = 0;
|
||||||
for (int i = 0; name[i] != 0; i++) {
|
for (int32_t i = 0; name[i] != 0; i++) {
|
||||||
if (name[i] == ' ' || name[i] == ':' || name[i] == '.' || name[i] == '-' || name[i] == '/' || name[i] == '\'' ||
|
if (name[i] == ' ' || name[i] == ':' || name[i] == '.' || name[i] == '-' || name[i] == '/' || name[i] == '\'' ||
|
||||||
name[i] == '\"')
|
name[i] == '\"')
|
||||||
name[i] = '_';
|
name[i] = '_';
|
||||||
|
@ -330,7 +327,7 @@ int httpShrinkTableName(HttpContext *pContext, int pos, char *name) {
|
||||||
MD5Update(&context, (uint8_t *)name, (uint32_t)len);
|
MD5Update(&context, (uint8_t *)name, (uint32_t)len);
|
||||||
MD5Final(&context);
|
MD5Final(&context);
|
||||||
|
|
||||||
int table_name = httpAddToSqlCmdBuffer(
|
int32_t table_name = httpAddToSqlCmdBuffer(
|
||||||
pContext, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", context.digest[0],
|
pContext, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", context.digest[0],
|
||||||
context.digest[1], context.digest[2], context.digest[3], context.digest[4], context.digest[5], context.digest[6],
|
context.digest[1], context.digest[2], context.digest[3], context.digest[4], context.digest[5], context.digest[6],
|
||||||
context.digest[7], context.digest[8], context.digest[9], context.digest[10], context.digest[11],
|
context.digest[7], context.digest[8], context.digest[9], context.digest[10], context.digest[11],
|
||||||
|
@ -343,7 +340,7 @@ int httpShrinkTableName(HttpContext *pContext, int pos, char *name) {
|
||||||
return table_name;
|
return table_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *httpGetCmdsString(HttpContext *pContext, int pos) {
|
char *httpGetCmdsString(HttpContext *pContext, int32_t pos) {
|
||||||
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
HttpSqlCmds *multiCmds = pContext->multiCmds;
|
||||||
if (pos < 0 || pos >= multiCmds->bufferSize) {
|
if (pos < 0 || pos >= multiCmds->bufferSize) {
|
||||||
return "";
|
return "";
|
||||||
|
@ -352,8 +349,8 @@ char *httpGetCmdsString(HttpContext *pContext, int pos) {
|
||||||
return multiCmds->buffer + pos;
|
return multiCmds->buffer + pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpGzipDeCompress(char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData) {
|
int32_t httpGzipDeCompress(char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData) {
|
||||||
int err = 0;
|
int32_t err = 0;
|
||||||
z_stream gzipStream = {0};
|
z_stream gzipStream = {0};
|
||||||
|
|
||||||
static char dummyHead[2] = {
|
static char dummyHead[2] = {
|
||||||
|
@ -396,7 +393,7 @@ int httpGzipDeCompress(char *srcData, int32_t nSrcData, char *destData, int32_t
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpGzipCompressInit(HttpContext *pContext) {
|
int32_t httpGzipCompressInit(HttpContext *pContext) {
|
||||||
pContext->gzipStream.zalloc = (alloc_func) 0;
|
pContext->gzipStream.zalloc = (alloc_func) 0;
|
||||||
pContext->gzipStream.zfree = (free_func) 0;
|
pContext->gzipStream.zfree = (free_func) 0;
|
||||||
pContext->gzipStream.opaque = (voidpf) 0;
|
pContext->gzipStream.opaque = (voidpf) 0;
|
||||||
|
@ -407,8 +404,8 @@ int httpGzipCompressInit(HttpContext *pContext) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpGzipCompress(HttpContext *pContext, char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData, bool isTheLast) {
|
int32_t httpGzipCompress(HttpContext *pContext, char *srcData, int32_t nSrcData, char *destData, int32_t *nDestData, bool isTheLast) {
|
||||||
int err = 0;
|
int32_t err = 0;
|
||||||
pContext->gzipStream.next_in = (Bytef *) srcData;
|
pContext->gzipStream.next_in = (Bytef *) srcData;
|
||||||
pContext->gzipStream.avail_in = (uLong) nSrcData;
|
pContext->gzipStream.avail_in = (uLong) nSrcData;
|
||||||
pContext->gzipStream.next_out = (Bytef *) destData;
|
pContext->gzipStream.next_out = (Bytef *) destData;
|
||||||
|
@ -442,3 +439,21 @@ int httpGzipCompress(HttpContext *pContext, char *srcData, int32_t nSrcData, cha
|
||||||
*nDestData = (int32_t) (pContext->gzipStream.total_out);
|
*nDestData = (int32_t) (pContext->gzipStream.total_out);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool httpUrlMatch(HttpContext* pContext, int32_t pos, char* cmp) {
|
||||||
|
HttpParser* pParser = pContext->parser;
|
||||||
|
|
||||||
|
if (pos < 0 || pos >= HTTP_MAX_URL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pParser->path[pos].pos <= 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(pParser->path[pos].str, cmp) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -1951,36 +1951,36 @@ static void changeExecuteScanOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bo
|
||||||
|
|
||||||
// todo handle the case the the order irrelevant query type mixed up with order critical query type
|
// todo handle the case the the order irrelevant query type mixed up with order critical query type
|
||||||
// descending order query for last_row query
|
// descending order query for last_row query
|
||||||
if (isFirstLastRowQuery(pQuery) && !QUERY_IS_ASC_QUERY(pQuery)) {
|
if (isFirstLastRowQuery(pQuery)) {
|
||||||
qDebug("QInfo:%p scan order changed for last_row query, old:%d, new:%d", GET_QINFO_ADDR(pQuery),
|
qDebug("QInfo:%p scan order changed for last_row query, old:%d, new:%d", GET_QINFO_ADDR(pQuery),
|
||||||
pQuery->order.order, TSDB_ORDER_ASC);
|
pQuery->order.order, TSDB_ORDER_ASC);
|
||||||
|
|
||||||
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
|
||||||
pQuery->order.order = TSDB_ORDER_ASC;
|
pQuery->order.order = TSDB_ORDER_ASC;
|
||||||
assert (pQuery->window.skey <= pQuery->window.ekey);
|
if (pQuery->window.skey > pQuery->window.ekey) {
|
||||||
|
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isGroupbyNormalCol(pQuery->pGroupbyExpr) && pQuery->order.order == TSDB_ORDER_DESC) {
|
||||||
|
pQuery->order.order = TSDB_ORDER_ASC;
|
||||||
|
if (pQuery->window.skey > pQuery->window.ekey) {
|
||||||
|
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
||||||
|
}
|
||||||
|
|
||||||
doExchangeTimeWindow(pQInfo, &pQuery->window);
|
doExchangeTimeWindow(pQInfo, &pQuery->window);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isGroupbyNormalCol(pQuery->pGroupbyExpr) && !QUERY_IS_ASC_QUERY(pQuery)) {
|
if (isPointInterpoQuery(pQuery) && pQuery->intervalTime == 0) {
|
||||||
pQuery->order.order = TSDB_ORDER_ASC;
|
if (!QUERY_IS_ASC_QUERY(pQuery)) {
|
||||||
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
qDebug(msg, GET_QINFO_ADDR(pQuery), "interp", pQuery->order.order, TSDB_ORDER_ASC, pQuery->window.skey,
|
||||||
assert (pQuery->window.skey <= pQuery->window.ekey);
|
pQuery->window.ekey, pQuery->window.ekey, pQuery->window.skey);
|
||||||
|
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
||||||
doExchangeTimeWindow(pQInfo, &pQuery->window);
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isPointInterpoQuery(pQuery) && (pQuery->intervalTime == 0) && !QUERY_IS_ASC_QUERY(pQuery)) {
|
|
||||||
qDebug(msg, GET_QINFO_ADDR(pQuery), "interp", pQuery->order.order, TSDB_ORDER_ASC, pQuery->window.skey,
|
|
||||||
pQuery->window.ekey, pQuery->window.ekey, pQuery->window.skey);
|
|
||||||
SWAP(pQuery->window.skey, pQuery->window.ekey, TSKEY);
|
|
||||||
|
|
||||||
pQuery->order.order = TSDB_ORDER_ASC;
|
pQuery->order.order = TSDB_ORDER_ASC;
|
||||||
|
|
||||||
assert (pQuery->window.skey <= pQuery->window.ekey);
|
|
||||||
doExchangeTimeWindow(pQInfo, &pQuery->window);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2365,16 +2365,16 @@ static void ensureOutputBuffer(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pB
|
||||||
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (size_t)((newSize - pRec->rows) * bytes));
|
memset(tmp + sizeof(tFilePage) + bytes * pRec->rows, 0, (size_t)((newSize - pRec->rows) * bytes));
|
||||||
pQuery->sdata[i] = (tFilePage *)tmp;
|
pQuery->sdata[i] = (tFilePage *)tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the pCtx output buffer position
|
// set the pCtx output buffer position
|
||||||
pRuntimeEnv->pCtx[i].aOutputBuf = pQuery->sdata[i]->data + pRec->rows * bytes;
|
pRuntimeEnv->pCtx[i].aOutputBuf = pQuery->sdata[i]->data + pRec->rows * bytes;
|
||||||
|
|
||||||
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
||||||
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
|
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
|
||||||
pRuntimeEnv->pCtx[i].ptsOutputBuf = pRuntimeEnv->pCtx[0].aOutputBuf;
|
pRuntimeEnv->pCtx[i].ptsOutputBuf = pRuntimeEnv->pCtx[0].aOutputBuf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%p realloc output buffer, new size: %d rows, old:%" PRId64 ", remain:%" PRId64, GET_QINFO_ADDR(pRuntimeEnv),
|
qDebug("QInfo:%p realloc output buffer, new size: %d rows, old:%" PRId64 ", remain:%" PRId64, GET_QINFO_ADDR(pRuntimeEnv),
|
||||||
newSize, pRec->capacity, newSize - pRec->rows);
|
newSize, pRec->capacity, newSize - pRec->rows);
|
||||||
|
|
||||||
|
@ -2920,11 +2920,11 @@ int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *pGroup) {
|
||||||
STableQueryInfo *item = taosArrayGetP(pGroup, i);
|
STableQueryInfo *item = taosArrayGetP(pGroup, i);
|
||||||
|
|
||||||
SIDList list = getDataBufPagesIdList(pRuntimeEnv->pResultBuf, TSDB_TABLEID(item->pTable)->tid);
|
SIDList list = getDataBufPagesIdList(pRuntimeEnv->pResultBuf, TSDB_TABLEID(item->pTable)->tid);
|
||||||
|
pageList = list;
|
||||||
|
tid = TSDB_TABLEID(item->pTable)->tid;
|
||||||
|
|
||||||
if (taosArrayGetSize(list) > 0 && item->windowResInfo.size > 0) {
|
if (taosArrayGetSize(list) > 0 && item->windowResInfo.size > 0) {
|
||||||
pTableList[numOfTables++] = item;
|
pTableList[numOfTables++] = item;
|
||||||
tid = TSDB_TABLEID(item->pTable)->tid;
|
|
||||||
pageList = list;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3357,7 +3357,7 @@ void skipResults(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
||||||
int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes;
|
int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes;
|
||||||
|
|
||||||
memmove(pQuery->sdata[i]->data, (char*)pQuery->sdata[i]->data + bytes * numOfSkip, (size_t)(pQuery->rec.rows * bytes));
|
memmove(pQuery->sdata[i]->data, (char*)pQuery->sdata[i]->data + bytes * numOfSkip, (size_t)(pQuery->rec.rows * bytes));
|
||||||
pRuntimeEnv->pCtx[i].aOutputBuf = ((char*) pQuery->sdata[i]->data) + pQuery->rec.rows * bytes;
|
pRuntimeEnv->pCtx[i].aOutputBuf = ((char*) pQuery->sdata[i]->data) + pQuery->rec.rows * bytes;
|
||||||
|
|
||||||
|
@ -4354,32 +4354,6 @@ static bool skipTimeInterval(SQueryRuntimeEnv *pRuntimeEnv, TSKEY* start) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeTableQueryInfo(STableGroupInfo* pTableGroupInfo) {
|
|
||||||
if (pTableGroupInfo->pGroupList == NULL) {
|
|
||||||
assert(pTableGroupInfo->numOfTables == 0);
|
|
||||||
} else {
|
|
||||||
size_t numOfGroups = taosArrayGetSize(pTableGroupInfo->pGroupList);
|
|
||||||
for (int32_t i = 0; i < numOfGroups; ++i) {
|
|
||||||
SArray *p = taosArrayGetP(pTableGroupInfo->pGroupList, i);
|
|
||||||
|
|
||||||
size_t num = taosArrayGetSize(p);
|
|
||||||
for(int32_t j = 0; j < num; ++j) {
|
|
||||||
STableQueryInfo* item = taosArrayGetP(p, j);
|
|
||||||
destroyTableQueryInfo(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(pTableGroupInfo->pGroupList);
|
|
||||||
pTableGroupInfo->pGroupList = NULL;
|
|
||||||
pTableGroupInfo->numOfTables = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
taosHashCleanup(pTableGroupInfo->map);
|
|
||||||
pTableGroupInfo->map = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery) {
|
static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery) {
|
||||||
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
|
@ -4415,22 +4389,20 @@ static int32_t setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery)
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
if (isFirstLastRowQuery(pQuery)) {
|
if (isFirstLastRowQuery(pQuery)) {
|
||||||
pRuntimeEnv->pQueryHandle = tsdbQueryLastRow(tsdb, &cond, &pQInfo->tableGroupInfo, pQInfo);
|
pRuntimeEnv->pQueryHandle = tsdbQueryLastRow(tsdb, &cond, &pQInfo->tableGroupInfo, pQInfo);
|
||||||
if (pRuntimeEnv->pQueryHandle == NULL) { // no data in current stable, clear all
|
|
||||||
freeTableQueryInfo(&pQInfo->tableqinfoGroupInfo);
|
|
||||||
} else { // update the query time window
|
|
||||||
pQuery->window = cond.twindow;
|
|
||||||
|
|
||||||
size_t numOfGroups = GET_NUM_OF_TABLEGROUP(pQInfo);
|
// update the query time window
|
||||||
for (int32_t i = 0; i < numOfGroups; ++i) {
|
pQuery->window = cond.twindow;
|
||||||
SArray *group = GET_TABLEGROUP(pQInfo, i);
|
|
||||||
|
|
||||||
size_t t = taosArrayGetSize(group);
|
size_t numOfGroups = GET_NUM_OF_TABLEGROUP(pQInfo);
|
||||||
for (int32_t j = 0; j < t; ++j) {
|
for(int32_t i = 0; i < numOfGroups; ++i) {
|
||||||
STableQueryInfo *pCheckInfo = taosArrayGetP(group, j);
|
SArray *group = GET_TABLEGROUP(pQInfo, i);
|
||||||
|
|
||||||
pCheckInfo->win = pQuery->window;
|
size_t t = taosArrayGetSize(group);
|
||||||
pCheckInfo->lastKey = pCheckInfo->win.skey;
|
for (int32_t j = 0; j < t; ++j) {
|
||||||
}
|
STableQueryInfo *pCheckInfo = taosArrayGetP(group, j);
|
||||||
|
|
||||||
|
pCheckInfo->win = pQuery->window;
|
||||||
|
pCheckInfo->lastKey = pCheckInfo->win.skey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (isPointInterpoQuery(pQuery)) {
|
} else if (isPointInterpoQuery(pQuery)) {
|
||||||
|
@ -4484,12 +4456,6 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
|
||||||
qDebug("QInfo:%p no table qualified for tag filter, abort query", pQInfo);
|
|
||||||
setQueryStatus(pQuery, QUERY_COMPLETED);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
pQInfo->tsdb = tsdb;
|
pQInfo->tsdb = tsdb;
|
||||||
pQInfo->vgId = vgId;
|
pQInfo->vgId = vgId;
|
||||||
|
|
||||||
|
@ -4612,7 +4578,7 @@ static int64_t scanMultiTableDataBlocks(SQInfo *pQInfo) {
|
||||||
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
||||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||||
SQueryCostInfo* summary = &pRuntimeEnv->summary;
|
SQueryCostInfo* summary = &pRuntimeEnv->summary;
|
||||||
|
|
||||||
int64_t st = taosGetTimestampMs();
|
int64_t st = taosGetTimestampMs();
|
||||||
|
|
||||||
TsdbQueryHandleT pQueryHandle = IS_MASTER_SCAN(pRuntimeEnv)? pRuntimeEnv->pQueryHandle : pRuntimeEnv->pSecQueryHandle;
|
TsdbQueryHandleT pQueryHandle = IS_MASTER_SCAN(pRuntimeEnv)? pRuntimeEnv->pQueryHandle : pRuntimeEnv->pSecQueryHandle;
|
||||||
|
@ -4622,7 +4588,7 @@ static int64_t scanMultiTableDataBlocks(SQInfo *pQInfo) {
|
||||||
|
|
||||||
while (tsdbNextDataBlock(pQueryHandle)) {
|
while (tsdbNextDataBlock(pQueryHandle)) {
|
||||||
summary->totalBlocks += 1;
|
summary->totalBlocks += 1;
|
||||||
|
|
||||||
if (IS_QUERY_KILLED(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
@ -4659,7 +4625,7 @@ static int64_t scanMultiTableDataBlocks(SQInfo *pQInfo) {
|
||||||
|
|
||||||
summary->totalRows += blockInfo.rows;
|
summary->totalRows += blockInfo.rows;
|
||||||
stableApplyFunctionsOnBlock(pRuntimeEnv, &blockInfo, pStatis, pDataBlock, binarySearchForKey);
|
stableApplyFunctionsOnBlock(pRuntimeEnv, &blockInfo, pStatis, pDataBlock, binarySearchForKey);
|
||||||
|
|
||||||
qDebug("QInfo:%p check data block completed, uid:%"PRId64", tid:%d, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, "
|
qDebug("QInfo:%p check data block completed, uid:%"PRId64", tid:%d, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, "
|
||||||
"lastKey:%" PRId64,
|
"lastKey:%" PRId64,
|
||||||
pQInfo, blockInfo.uid, blockInfo.tid, blockInfo.window.skey, blockInfo.window.ekey, blockInfo.rows,
|
pQInfo, blockInfo.uid, blockInfo.tid, blockInfo.window.skey, blockInfo.window.ekey, blockInfo.rows,
|
||||||
|
@ -6384,10 +6350,25 @@ static void freeQInfo(SQInfo *pQInfo) {
|
||||||
taosTFree(pQuery);
|
taosTFree(pQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
freeTableQueryInfo(&pQInfo->tableqinfoGroupInfo);
|
// todo refactor, extract method to destroytableDataInfo
|
||||||
|
if (pQInfo->tableqinfoGroupInfo.pGroupList != NULL) {
|
||||||
|
int32_t numOfGroups = (int32_t)(GET_NUM_OF_TABLEGROUP(pQInfo));
|
||||||
|
for (int32_t i = 0; i < numOfGroups; ++i) {
|
||||||
|
SArray *p = GET_TABLEGROUP(pQInfo, i);
|
||||||
|
|
||||||
|
size_t num = taosArrayGetSize(p);
|
||||||
|
for(int32_t j = 0; j < num; ++j) {
|
||||||
|
STableQueryInfo* item = taosArrayGetP(p, j);
|
||||||
|
destroyTableQueryInfo(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
taosTFree(pQInfo->pBuf);
|
taosTFree(pQInfo->pBuf);
|
||||||
|
taosArrayDestroy(pQInfo->tableqinfoGroupInfo.pGroupList);
|
||||||
|
taosHashCleanup(pQInfo->tableqinfoGroupInfo.map);
|
||||||
tsdbDestroyTableGroup(&pQInfo->tableGroupInfo);
|
tsdbDestroyTableGroup(&pQInfo->tableGroupInfo);
|
||||||
taosArrayDestroy(pQInfo->arrTableIdInfo);
|
taosArrayDestroy(pQInfo->arrTableIdInfo);
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ class TDTestCase:
|
||||||
tdDnodes.start(1)
|
tdDnodes.start(1)
|
||||||
tdSql.execute('reset query cache')
|
tdSql.execute('reset query cache')
|
||||||
tdSql.execute('drop database if exists db')
|
tdSql.execute('drop database if exists db')
|
||||||
tdSql.execute('create database db cache 128 maxtables 10')
|
tdSql.execute('create database db cache 128')
|
||||||
tdSql.execute('use db')
|
tdSql.execute('use db')
|
||||||
|
|
||||||
tdLog.info("================= step1")
|
tdLog.info("================= step1")
|
||||||
|
|
|
@ -38,7 +38,7 @@ class TDTestCase:
|
||||||
tdLog.info("drop database db if exits")
|
tdLog.info("drop database db if exits")
|
||||||
tdSql.execute('drop database if exists db')
|
tdSql.execute('drop database if exists db')
|
||||||
tdLog.info("================= step1")
|
tdLog.info("================= step1")
|
||||||
tdSql.execute('create database db maxtables 4')
|
tdSql.execute('create database db')
|
||||||
tdLog.sleep(5)
|
tdLog.sleep(5)
|
||||||
tdSql.execute('use db')
|
tdSql.execute('use db')
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ class TDTestCase:
|
||||||
tdLog.info("drop database db if exits")
|
tdLog.info("drop database db if exits")
|
||||||
tdSql.execute('drop database if exists db')
|
tdSql.execute('drop database if exists db')
|
||||||
tdLog.info("================= step1")
|
tdLog.info("================= step1")
|
||||||
tdSql.execute('create database db maxtables 4')
|
tdSql.execute('create database db')
|
||||||
tdLog.sleep(5)
|
tdLog.sleep(5)
|
||||||
tdSql.execute('use db')
|
tdSql.execute('use db')
|
||||||
|
|
||||||
|
|
|
@ -123,8 +123,12 @@ class TDSql:
|
||||||
|
|
||||||
def checkData(self, row, col, data):
|
def checkData(self, row, col, data):
|
||||||
self.checkRowCol(row, col)
|
self.checkRowCol(row, col)
|
||||||
if str(self.queryResult[row][col]) != str(data):
|
if self.queryResult[row][col] != data:
|
||||||
if isinstance(data, float) and abs(self.queryResult[row][col] - data) <= 0.000001:
|
if str(self.queryResult[row][col]) != str(data):
|
||||||
|
tdLog.info("sql:%s, row:%d col:%d data:%s == expect:%s" %
|
||||||
|
(self.sql, row, col, self.queryResult[row][col], data))
|
||||||
|
return
|
||||||
|
elif isinstance(data, float) and abs(self.queryResult[row][col] - data) <= 0.000001:
|
||||||
tdLog.info("sql:%s, row:%d col:%d data:%f == expect:%f" %
|
tdLog.info("sql:%s, row:%d col:%d data:%f == expect:%f" %
|
||||||
(self.sql, row, col, self.queryResult[row][col], data))
|
(self.sql, row, col, self.queryResult[row][col], data))
|
||||||
return
|
return
|
||||||
|
|
|
@ -130,7 +130,6 @@ run general/parser/join.sim
|
||||||
run general/parser/join_multivnode.sim
|
run general/parser/join_multivnode.sim
|
||||||
run general/parser/select_with_tags.sim
|
run general/parser/select_with_tags.sim
|
||||||
run general/parser/groupby.sim
|
run general/parser/groupby.sim
|
||||||
run general/parser/bug.sim
|
|
||||||
run general/parser/tags_dynamically_specifiy.sim
|
run general/parser/tags_dynamically_specifiy.sim
|
||||||
run general/parser/set_tag_vals.sim
|
run general/parser/set_tag_vals.sim
|
||||||
#unsupport run general/parser/repeatAlter.sim
|
#unsupport run general/parser/repeatAlter.sim
|
||||||
|
|
|
@ -24,5 +24,10 @@ print curl 127.0.0.1:7111/rest/sql -----> $system_content
|
||||||
# return -1
|
# return -1
|
||||||
#endi
|
#endi
|
||||||
|
|
||||||
|
sql select * from db.win_cpu_windows_1_processor
|
||||||
|
print rows: $rows
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
#system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
#system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -0,0 +1,37 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
sleep 3000
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c wallevel -v 0
|
||||||
|
system sh/cfg.sh -n dnode1 -c http -v 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c maxSQLLength -v 7340032
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
|
sleep 3000
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
print ============================ dnode1 start
|
||||||
|
|
||||||
|
print =============== step1 - prepare data
|
||||||
|
sql create database d1
|
||||||
|
sql use d1
|
||||||
|
|
||||||
|
sql create table table_rest (ts timestamp, i int)
|
||||||
|
print sql length is 270KB
|
||||||
|
restful d1 table_rest 1591072800 10000
|
||||||
|
restful d1 table_rest 1591172800 10000
|
||||||
|
restful d1 table_rest 1591272800 10000
|
||||||
|
restful d1 table_rest 1591372800 10000
|
||||||
|
restful d1 table_rest 1591472800 10000
|
||||||
|
restful d1 table_rest 1591572800 10000
|
||||||
|
restful d1 table_rest 1591672800 10000
|
||||||
|
restful d1 table_rest 1591772800 10000
|
||||||
|
restful d1 table_rest 1591872800 10000
|
||||||
|
restful d1 table_rest 1591972800 10000
|
||||||
|
|
||||||
|
sql select * from table_rest;
|
||||||
|
print rows: $rows
|
||||||
|
if $rows != 100000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -54,13 +54,13 @@ print =============== step2 - login
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/grafana/
|
system_content curl 127.0.0.1:7111/grafana/
|
||||||
print 1-> $system_content
|
print 1-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/grafana/xx
|
system_content curl 127.0.0.1:7111/grafana/xx
|
||||||
print 2-> $system_content
|
print 2-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/grafana/root/1/123/1/1/3
|
system_content curl 127.0.0.1:7111/grafana/root/1/123/1/1/3
|
||||||
print 4-> $system_content
|
print 4-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -84,13 +84,13 @@ endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/grafana/root/1/login
|
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/grafana/root/1/login
|
||||||
print 6-> $system_content
|
print 6-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5010,"desc":"invalid type of Authorization"}@ then
|
if $system_content != @{"status":"error","code":4386,"desc":"invalid type of Authorization"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/grafana/root/1/login
|
system_content curl -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/grafana/root/1/login
|
||||||
print 7-> $system_content
|
print 7-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5010,"desc":"invalid type of Authorization"}@ then
|
if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
sleep 3000
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c wallevel -v 0
|
||||||
|
system sh/cfg.sh -n dnode1 -c http -v 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c maxSQLLength -v 7340032
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
|
sleep 3000
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
print ============================ dnode1 start
|
||||||
|
|
||||||
|
print =============== step1 - prepare data
|
||||||
|
sql create database d1
|
||||||
|
sql use d1
|
||||||
|
|
||||||
|
sql create table table_rest (ts timestamp, i int)
|
||||||
|
print sql length is 270KB
|
||||||
|
restful d1 table_rest 1591072800 10000 gzip
|
||||||
|
sql select * from table_rest;
|
||||||
|
print rows: $rows
|
||||||
|
if $rows != 10000 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
|
@ -14,26 +14,26 @@ print =============== step1 - login
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/rest/
|
system_content curl 127.0.0.1:7111/rest/
|
||||||
print 1-> $system_content
|
print 1-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/rest/xx
|
system_content curl 127.0.0.1:7111/rest/xx
|
||||||
print 2-> $system_content
|
print 2-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/rest/login
|
system_content curl 127.0.0.1:7111/rest/login
|
||||||
print 3-> $system_content
|
print 3-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
#4
|
#4
|
||||||
system_content curl 127.0.0.1:7111/rest/login/root
|
system_content curl 127.0.0.1:7111/rest/login/root
|
||||||
print 4-> $system_content
|
print 4-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -58,13 +58,13 @@ endi
|
||||||
#8
|
#8
|
||||||
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
|
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
|
||||||
print 8-> $system_content
|
print 8-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5010,"desc":"invalid type of Authorization"}@ then
|
if $system_content != @{"status":"error","code":4386,"desc":"invalid type of Authorization"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
|
system_content curl -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' -d 'show databases' 127.0.0.1:7111/rest/login/root/1
|
||||||
print 9-> $system_content
|
print 9-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5010,"desc":"invalid type of Authorization"}@ then
|
if $system_content != @{"status":"error","code":4387,"desc":"invalid format of Authorization"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ endi
|
||||||
#14
|
#14
|
||||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d '' 127.0.0.1:7111/rest/sql
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d '' 127.0.0.1:7111/rest/sql
|
||||||
print 14-> $system_content
|
print 14-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5012,"desc":"no sql input"}@ then
|
if $system_content != @{"status":"error","code":4359,"desc":"no sql input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
|
@ -16,224 +16,224 @@ print =============== step1 - parse
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5022,"desc":"database name can not be null"}@ then
|
if $system_content != @{"status":"error","code":4448,"desc":"database name can not be null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from d1.table_admin' -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from d1.table_admin' -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5022,"desc":"database name can not be null"}@ then
|
if $system_content != @{"status":"error","code":4448,"desc":"database name can not be null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from d1.table_admin' -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/d123456789012345678901234567890123456
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'select * from d1.table_admin' -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/d123456789012345678901234567890123456
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5023,"desc":"database name too long"}@ then
|
if $system_content != @{"status":"error","code":4449,"desc":"database name too long"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[]' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '[]' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5027,"desc":"metric name not find"}@ then
|
if $system_content != @{"status":"error","code":4453,"desc":"metric name not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5027,"desc":"metric name not find"}@ then
|
if $system_content != @{"status":"error","code":4453,"desc":"metric name not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{}]' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '[{}]' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5027,"desc":"metric name not find"}@ then
|
if $system_content != @{"status":"error","code":4453,"desc":"metric name not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"metrics": []}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"metrics": []}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5025,"desc":"metrics size is 0"}@ then
|
if $system_content != @{"status":"error","code":4451,"desc":"metrics size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"metrics": [{}]}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"metrics": [{}]}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5027,"desc":"metric name not find"}@ then
|
if $system_content != @{"status":"error","code":4453,"desc":"metric name not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"metrics": 12}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"metrics": 12}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5025,"desc":"metrics size is 0"}@ then
|
if $system_content != @{"status":"error","code":4451,"desc":"metrics size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
#system_content curl -u root:taosdata -d '{"metrics": [{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
#system_content curl -u root:taosdata -d '{"metrics": [{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
#print $system_content
|
#print $system_content
|
||||||
|
|
||||||
#if $system_content != @{"status":"error","code":5026,"desc":"metrics size can not more than 50"}@ then
|
#if $system_content != @{"status":"error","code":4452,"desc":"metrics size can not more than 50"}@ then
|
||||||
# return -1
|
# return -1
|
||||||
#endi
|
#endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5027,"desc":"metric name not find"}@ then
|
if $system_content != @{"status":"error","code":4453,"desc":"metric name not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":111,"tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":111,"tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5028,"desc":"metric name type should be string"}@ then
|
if $system_content != @{"status":"error","code":4454,"desc":"metric name type should be string"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5029,"desc":"metric name length is 0"}@ then
|
if $system_content != @{"status":"error","code":4455,"desc":"metric name length is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234a1234567890123456789012345678901234","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5030,"desc":"metric name length too long"}@ then
|
if $system_content != @{"status":"error","code":4456,"desc":"metric name length too long"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"}}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"}}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5031,"desc":"timestamp not find"}@ then
|
if $system_content != @{"status":"error","code":4457,"desc":"timestamp not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":""}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":""}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5032,"desc":"timestamp type should be integer"}@ then
|
if $system_content != @{"status":"error","code":4458,"desc":"timestamp type should be integer"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":-1}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":-1}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5033,"desc":"timestamp value smaller than 0"}@ then
|
if $system_content != @{"status":"error","code":4459,"desc":"timestamp value smaller than 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5034,"desc":"tags not find"}@ then
|
if $system_content != @{"status":"error","code":4460,"desc":"tags not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5035,"desc":"tags size is 0"}@ then
|
if $system_content != @{"status":"error","code":4461,"desc":"tags size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":"","timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":"","timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5035,"desc":"tags size is 0"}@ then
|
if $system_content != @{"status":"error","code":4461,"desc":"tags size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
#system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor","host":"windows","instance":"1","objectname":"Processor","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata
|
#system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor","host":"windows","instance":"1","objectname":"Processor","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata
|
||||||
#print $system_content
|
#print $system_content
|
||||||
|
|
||||||
#if $system_content != @{"status":"error","code":5036,"desc":"tags size too long"}@ then
|
#if $system_content != @{"status":"error","code":4461,"desc":"tags size too long"}@ then
|
||||||
# return -1
|
# return -1
|
||||||
#endi
|
#endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5035,"desc":"tags size is 0"}@ then
|
if $system_content != @{"status":"error","code":4461,"desc":"tags size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"":"windows"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"":"windows"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5038,"desc":"tag name is null"}@ then
|
if $system_content != @{"status":"error","code":4464,"desc":"tag name is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
#system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host111111111111222222222222222222222":""},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
#system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host111111111111222222222222222222222":""},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
#print $system_content
|
#print $system_content
|
||||||
|
|
||||||
#if $system_content != @{"status":"error","code":5039,"desc":"tag name length too long"}@ then
|
#if $system_content != @{"status":"error","code":4465,"desc":"tag name length too long"}@ then
|
||||||
# return -1
|
# return -1
|
||||||
#endi
|
#endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":true},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":true},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5040,"desc":"tag value type should be number or string"}@ then
|
if $system_content != @{"status":"error","code":4466,"desc":"tag value type should be number or string"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":""},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":""},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5041,"desc":"tag value is null"}@ then
|
if $system_content != @{"status":"error","code":4467,"desc":"tag value is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"5022":"111"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"5022":"111"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5042,"desc":"table is null"}@ then
|
if $system_content != @{"status":"error","code":4468,"desc":"table is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222host111111111111222222222222222222222"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5043,"desc":"table name length too long"}@ then
|
if $system_content != @{"status":"error","code":4469,"desc":"table name length too long"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5045,"desc":"fields size is 0"}@ then
|
if $system_content != @{"status":"error","code":4471,"desc":"fields size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"":0,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5048,"desc":"field name is null"}@ then
|
if $system_content != @{"status":"error","code":4474,"desc":"field name is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":"","Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":"","Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5051,"desc":"field value is null"}@ then
|
if $system_content != @{"status":"error","code":4477,"desc":"field value is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":true,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
system_content curl -u root:taosdata -d '{"fields":{"Percent_DPC_Time":true,"Percent_Idle_Time":95.59830474853516,"Percent_Interrupt_Time":0,"Percent_Privileged_Time":0,"Percent_Processor_Time":0,"Percent_User_Time":0},"name":"win_cpu","tags":{"host":"windows","instance":"1","objectname":"Processor"},"timestamp":1535784122}' 127.0.0.1:7111/telegraf/db/root/taosdata1
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5050,"desc":"field value type should be number or string"}@ then
|
if $system_content != @{"status":"error","code":4476,"desc":"field value type should be number or string"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
run general/http/autocreate.sim
|
||||||
|
run general/http/chunked.sim
|
||||||
run general/http/restful.sim
|
run general/http/restful.sim
|
||||||
run general/http/restful_insert.sim
|
run general/http/restful_insert.sim
|
||||||
run general/http/restful_limit.sim
|
run general/http/restful_limit.sim
|
||||||
|
|
|
@ -77,6 +77,8 @@ cd ../../../debug; make
|
||||||
./test.sh -f general/field/smallint.sim
|
./test.sh -f general/field/smallint.sim
|
||||||
./test.sh -f general/field/tinyint.sim
|
./test.sh -f general/field/tinyint.sim
|
||||||
|
|
||||||
|
./test.sh -f general/http/autocreate.sim
|
||||||
|
./test.sh -f general/http/chunked.sim
|
||||||
./test.sh -f general/http/restful.sim
|
./test.sh -f general/http/restful.sim
|
||||||
./test.sh -f general/http/restful_insert.sim
|
./test.sh -f general/http/restful_insert.sim
|
||||||
./test.sh -f general/http/restful_limit.sim
|
./test.sh -f general/http/restful_limit.sim
|
||||||
|
|
|
@ -33,25 +33,25 @@ print =============== step1 - login
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/admin/
|
system_content curl 127.0.0.1:7111/admin/
|
||||||
print 1-> $system_content
|
print 1-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/admin/xx
|
system_content curl 127.0.0.1:7111/admin/xx
|
||||||
print 2-> $system_content
|
print 2-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/admin/login
|
system_content curl 127.0.0.1:7111/admin/login
|
||||||
print 3-> $system_content
|
print 3-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl 127.0.0.1:7111/admin/login/root
|
system_content curl 127.0.0.1:7111/admin/login/root
|
||||||
print 4-> $system_content
|
print 4-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -69,13 +69,13 @@ endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.' -d 'show databases' 127.0.0.1:7111/admin/login/root/1
|
system_content curl -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.' -d 'show databases' 127.0.0.1:7111/admin/login/root/1
|
||||||
print 7-> $system_content
|
print 7-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5010,"desc":"invalid type of Authorization"}@ then
|
if $system_content != @{"status":"error","code":4386,"desc":"invalid type of Authorization"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Taosd eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' 127.0.0.1:7111/admin/login/root/1
|
system_content curl -H 'Authorization: Taosd eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3d3cudGFvc2RhdGEuY29tIiwicGFzcyI6InRhb3NkYXRhIiwic3ViIjoicm9vdCJ9.xPv3b5odlR7YF8G_QWASjIRbMtA5v4ItToJ35fFgi' 127.0.0.1:7111/admin/login/root/1
|
||||||
print 8-> $system_content
|
print 8-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5053,"desc":"parse http auth token error"}@ then
|
if $system_content != @{"status":"error","code":4389,"desc":"invalid taosd Authorization"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ endi
|
||||||
system_content curl 127.0.0.1:7111/admin/logout
|
system_content curl 127.0.0.1:7111/admin/logout
|
||||||
print 11 -----> $system_content
|
print 11 -----> $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5011,"desc":"no auth info input"}@ then
|
if $system_content != @{"status":"error","code":4357,"desc":"no auth info input"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ print =============== step7 - use dbs
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'use d1;' 127.0.0.1:7111/admin/all
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d 'use d1;' 127.0.0.1:7111/admin/all
|
||||||
print 23-> $system_content
|
print 23-> $system_content
|
||||||
if $system_content != @{"status":"error","code":5017,"desc":"no need to execute use db cmd"}@ then
|
if $system_content != @{"status":"error","code":4360,"desc":"no need to execute use db cmd"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
|
@ -13,62 +13,62 @@ print ============================ dnode1 start
|
||||||
print =============== step1 - parse
|
print =============== step1 - parse
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5057,"desc":"database name can not be null"}@ then
|
if $system_content != @{"status":"error","code":4496,"desc":"database name can not be null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db123456789012345678901234567890db
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db123456789012345678901234567890db
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5058,"desc":"database name too long"}@ then
|
if $system_content != @{"status":"error","code":4497,"desc":"database name too long"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5057,"desc":"database name can not be null"}@ then
|
if $system_content != @{"status":"error","code":4496,"desc":"database name can not be null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put2
|
system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put2
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5009,"desc":"http url parse error"}@ then
|
if $system_content != @{"status":"error","code":4354,"desc":"invalid url format"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5060,"desc":"metrics size is 0"}@ then
|
if $system_content != @{"status":"error","code":4499,"desc":"metrics size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5059,"desc":"invalid opentsdb json fromat"}@ then
|
if $system_content != @{"status":"error","code":4498,"desc":"invalid opentsdb json fromat"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '{}' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '{}' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5060,"desc":"metrics size is 0"}@ then
|
if $system_content != @{"status":"error","code":4499,"desc":"metrics size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
|
|
||||||
if $system_content != @{"status":"error","code":5062,"desc":"metric name not find"}@ then
|
if $system_content != @{"status":"error","code":4501,"desc":"metric name not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": 1,"timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": 1,"timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5063,"desc":"metric name type should be string"}@ then
|
if $system_content != @{"status":"error","code":4502,"desc":"metric name type should be string"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "","timestamp": 1346846400,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5064,"desc":"metric name length is 0"}@ then
|
if $system_content != @{"status":"error","code":4503,"desc":"metric name length is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -80,25 +80,25 @@ endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5066,"desc":"timestamp not find"}@ then
|
if $system_content != @{"status":"error","code":4505,"desc":"timestamp not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": "2","value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": "2","value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5067,"desc":"timestamp type should be integer"}@ then
|
if $system_content != @{"status":"error","code":4506,"desc":"timestamp type should be integer"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": -1,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": -1,"value": 18,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5068,"desc":"timestamp value smaller than 0"}@ then
|
if $system_content != @{"status":"error","code":4507,"desc":"timestamp value smaller than 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"tags": {"host": "web01","group1": "1","dc": "lga"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5078,"desc":"value not find"}@ then
|
if $system_content != @{"status":"error","code":4517,"desc":"value not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -106,19 +106,19 @@ endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5069,"desc":"tags not find"}@ then
|
if $system_content != @{"status":"error","code":4508,"desc":"tags not find"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5070,"desc":"tags size is 0"}@ then
|
if $system_content != @{"status":"error","code":4509,"desc":"tags size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": 0}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": 0}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5070,"desc":"tags size is 0"}@ then
|
if $system_content != @{"status":"error","code":4509,"desc":"tags size is 0"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
@ -130,25 +130,25 @@ endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"": "web01"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"": "web01"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5073,"desc":"tag name is null"}@ then
|
if $system_content != @{"status":"error","code":4512,"desc":"tag name is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host01123456789001123456789001123456789001123456789001123456789001123456789": "01"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host01123456789001123456789001123456789001123456789001123456789001123456789": "01"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5074,"desc":"tag name length too long"}@ then
|
if $system_content != @{"status":"error","code":4513,"desc":"tag name length too long"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web011234567890011234567890011234567890011234567890011234567890011234567890011234567890011234567890"}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": "web011234567890011234567890011234567890011234567890011234567890011234567890011234567890011234567890"}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5077,"desc":"tag value can not more than 64"}@ then
|
if $system_content != @{"status":"error","code":4516,"desc":"tag value can not more than 64"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": ""}}]' 127.0.0.1:7111/opentsdb/db/put
|
system_content curl -u root:taosdata -d '[{"metric": "sys_cpu","timestamp": 1346846400,"value": 18,"tags": {"host": ""}}]' 127.0.0.1:7111/opentsdb/db/put
|
||||||
print $system_content
|
print $system_content
|
||||||
if $system_content != @{"status":"error","code":5076,"desc":"tag value is null"}@ then
|
if $system_content != @{"status":"error","code":4515,"desc":"tag value is null"}@ then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,12 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/mnode/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/tsdb/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/plugins/http/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
|
||||||
|
|
||||||
IF (TD_LINUX)
|
IF (TD_LINUX)
|
||||||
#add_executable(insertPerTable insertPerTable.c)
|
#add_executable(insertPerTable insertPerTable.c)
|
||||||
|
@ -28,6 +34,13 @@ IF (TD_LINUX)
|
||||||
#add_executable(createNormalTable createNormalTable.c)
|
#add_executable(createNormalTable createNormalTable.c)
|
||||||
#target_link_libraries(createNormalTable taos_static tutil common pthread)
|
#target_link_libraries(createNormalTable taos_static tutil common pthread)
|
||||||
|
|
||||||
add_executable(queryPerformance queryPerformance.c)
|
#add_executable(queryPerformance queryPerformance.c)
|
||||||
target_link_libraries(queryPerformance taos_static tutil common pthread)
|
#target_link_libraries(queryPerformance taos_static tutil common pthread)
|
||||||
|
|
||||||
|
add_executable(httpTest httpTest.c)
|
||||||
|
target_link_libraries(httpTest taos_static tutil common pthread mnode monitor http tsdb twal vnode cJson lz4)
|
||||||
|
|
||||||
|
add_executable(cacheTest cacheTest.c)
|
||||||
|
target_link_libraries(cacheTest taos_static tutil common pthread mnode monitor http tsdb twal vnode cJson lz4)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include <malloc.h>
|
||||||
|
#include "os.h"
|
||||||
|
#include "taos.h"
|
||||||
|
#include "tcache.h"
|
||||||
|
#include "tulog.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
|
#define MAX_REFRESH_TIME_SEC 2
|
||||||
|
#define MAX_RANDOM_POINTS 20000
|
||||||
|
#define GREEN "\033[1;32m"
|
||||||
|
#define NC "\033[0m"
|
||||||
|
|
||||||
|
int32_t tsKeepTimeInSec = 3;
|
||||||
|
int32_t tsNumOfRows = 1000000;
|
||||||
|
int32_t tsSizeOfRow = 64 * 1024;
|
||||||
|
void * tsCacheObj = NULL;
|
||||||
|
int32_t destroyTimes = 0;
|
||||||
|
|
||||||
|
typedef int64_t CacheTestKey;
|
||||||
|
typedef struct CacheTestRow {
|
||||||
|
int32_t index;
|
||||||
|
void ** ppRow;
|
||||||
|
void * data;
|
||||||
|
} CacheTestRow;
|
||||||
|
|
||||||
|
CacheTestRow *initRow(int32_t index) {
|
||||||
|
CacheTestRow *row = calloc(sizeof(CacheTestRow), 1);
|
||||||
|
row->index = index;
|
||||||
|
row->data = malloc(tsSizeOfRow * sizeof(int8_t));
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
|
||||||
|
void detroyRow(void *data) {
|
||||||
|
CacheTestRow *row = *(CacheTestRow **)data;
|
||||||
|
free(row->data);
|
||||||
|
free(row);
|
||||||
|
destroyTimes++;
|
||||||
|
if (destroyTimes % 50000 == 0) {
|
||||||
|
pPrint("%s ===> destroyTimes:%d %s", GREEN, destroyTimes, NC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void initCache() {
|
||||||
|
tsCacheObj = taosCacheInit(TSDB_DATA_TYPE_BIGINT, MAX_REFRESH_TIME_SEC, true, detroyRow, "cachetest");
|
||||||
|
}
|
||||||
|
|
||||||
|
void putRowInCache() {
|
||||||
|
for (int index = 0; index < tsNumOfRows; ++index) {
|
||||||
|
CacheTestRow *row = initRow(index);
|
||||||
|
uint64_t key = (uint64_t)row;
|
||||||
|
void **ppRow = taosCachePut(tsCacheObj, &key, sizeof(int64_t), &row, sizeof(int64_t), tsKeepTimeInSec * 1000);
|
||||||
|
row->ppRow = ppRow;
|
||||||
|
taosCacheRelease(tsCacheObj, (void **)&ppRow, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanupCache() {
|
||||||
|
taosCacheCleanup(tsCacheObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void initGetMemory() {
|
||||||
|
osInit();
|
||||||
|
taos_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
float getProcMemory() {
|
||||||
|
float procMemoryUsedMB = 0;
|
||||||
|
taosGetProcMemory(&procMemoryUsedMB);
|
||||||
|
return procMemoryUsedMB;
|
||||||
|
}
|
||||||
|
|
||||||
|
void doTest() {
|
||||||
|
initCache();
|
||||||
|
pPrint("%s initialize procMemory %f MB %s", GREEN, getProcMemory(), NC);
|
||||||
|
|
||||||
|
putRowInCache();
|
||||||
|
pPrint("%s insert %d rows, procMemory %f MB %s", GREEN, tsNumOfRows, getProcMemory(), NC);
|
||||||
|
|
||||||
|
int32_t sleepMs = (MAX_REFRESH_TIME_SEC * 3) * 1000 + tsKeepTimeInSec * 1000;
|
||||||
|
taosMsleep(sleepMs);
|
||||||
|
pPrint("%s after sleep %d ms, procMemory %f MB %s", GREEN, sleepMs, getProcMemory(), NC);
|
||||||
|
|
||||||
|
cleanupCache();
|
||||||
|
taosMsleep(sleepMs);
|
||||||
|
pPrint("%s after cleanup cache, procMemory %f MB %s", GREEN, getProcMemory(), NC);
|
||||||
|
|
||||||
|
malloc_trim(0);
|
||||||
|
taosMsleep(sleepMs);
|
||||||
|
pPrint("%s after malloc_trim, procMemory %f MB %s", GREEN, getProcMemory(), NC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void printHelp() {
|
||||||
|
char indent[10] = " ";
|
||||||
|
printf("Used to test the performance of cache\n");
|
||||||
|
|
||||||
|
printf("%s%s\n", indent, "-k");
|
||||||
|
printf("%s%s%s%d\n", indent, indent, "KeepTimeInSec, default is ", tsKeepTimeInSec);
|
||||||
|
printf("%s%s\n", indent, "-n");
|
||||||
|
printf("%s%s%s%d\n", indent, indent, "NumOfRows, default is ", tsNumOfRows);
|
||||||
|
printf("%s%s\n", indent, "-s");
|
||||||
|
printf("%s%s%s%d\n", indent, indent, "SizeOfData, default is ", tsSizeOfRow);
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseArgument(int argc, char *argv[]) {
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
|
||||||
|
printHelp();
|
||||||
|
exit(0);
|
||||||
|
} else if (strcmp(argv[i], "-k") == 0) {
|
||||||
|
tsKeepTimeInSec = atoi(argv[++i]);
|
||||||
|
} else if (strcmp(argv[i], "-n") == 0) {
|
||||||
|
tsNumOfRows = atoi(argv[++i]);
|
||||||
|
} else if (strcmp(argv[i], "-s") == 0) {
|
||||||
|
tsSizeOfRow = atoi(argv[++i]);
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pPrint("%s KeepTimeInSec:%d %s", GREEN, tsKeepTimeInSec, NC);
|
||||||
|
pPrint("%s NumOfRows:%d %s", GREEN, tsNumOfRows, NC);
|
||||||
|
pPrint("%s SizeOfData:%d %s", GREEN, tsSizeOfRow, NC);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
initGetMemory();
|
||||||
|
parseArgument(argc, argv);
|
||||||
|
doTest();
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
#include "os.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "taoserror.h"
|
||||||
|
#include "httpSystem.h"
|
||||||
|
|
||||||
|
void signal_handler(int signum) {
|
||||||
|
httpStopSystem();
|
||||||
|
httpCleanUpSystem();
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
struct sigaction act;
|
||||||
|
act.sa_handler = signal_handler;
|
||||||
|
sigaction(SIGTERM, &act, NULL);
|
||||||
|
sigaction(SIGHUP, &act, NULL);
|
||||||
|
sigaction(SIGINT, &act, NULL);
|
||||||
|
sigaction(SIGABRT, &act, NULL);
|
||||||
|
|
||||||
|
// Initialize the system
|
||||||
|
if (httpInitSystem() < 0) {
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (httpStartSystem() < 0) {
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
sleep(1000);
|
||||||
|
}
|
||||||
|
}
|
|
@ -84,6 +84,7 @@ enum {
|
||||||
SIM_CMD_SQL,
|
SIM_CMD_SQL,
|
||||||
SIM_CMD_SQL_ERROR,
|
SIM_CMD_SQL_ERROR,
|
||||||
SIM_CMD_SQL_SLOW,
|
SIM_CMD_SQL_SLOW,
|
||||||
|
SIM_CMD_RESTFUL,
|
||||||
SIM_CMD_TEST,
|
SIM_CMD_TEST,
|
||||||
SIM_CMD_RETURN,
|
SIM_CMD_RETURN,
|
||||||
SIM_CMD_END
|
SIM_CMD_END
|
||||||
|
@ -172,6 +173,7 @@ bool simExecuteReturnCmd(SScript *script, char *option);
|
||||||
bool simExecuteSqlCmd(SScript *script, char *option);
|
bool simExecuteSqlCmd(SScript *script, char *option);
|
||||||
bool simExecuteSqlErrorCmd(SScript *script, char *rest);
|
bool simExecuteSqlErrorCmd(SScript *script, char *rest);
|
||||||
bool simExecuteSqlSlowCmd(SScript *script, char *option);
|
bool simExecuteSqlSlowCmd(SScript *script, char *option);
|
||||||
|
bool simExecuteRestfulCmd(SScript *script, char *rest);
|
||||||
void simVisuallizeOption(SScript *script, char *src, char *dst);
|
void simVisuallizeOption(SScript *script, char *src, char *dst);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -915,6 +915,47 @@ bool simExecuteSqlSlowCmd(SScript *script, char *rest) {
|
||||||
return simExecuteSqlImpCmd(script, rest, isSlow);
|
return simExecuteSqlImpCmd(script, rest, isSlow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool simExecuteRestfulCmd(SScript *script, char *rest) {
|
||||||
|
FILE *fp = NULL;
|
||||||
|
char filename[256];
|
||||||
|
sprintf(filename, "%s/tmp.sql", tsScriptDir);
|
||||||
|
fp = fopen(filename, "w");
|
||||||
|
if (fp == NULL) {
|
||||||
|
fprintf(stderr, "ERROR: failed to open file: %s\n", filename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char db[64] = {0};
|
||||||
|
char tb[64] = {0};
|
||||||
|
char gzip[32] = {0};
|
||||||
|
int32_t ts;
|
||||||
|
int32_t times;
|
||||||
|
sscanf(rest, "%s %s %d %d %s", db, tb, &ts, ×, gzip);
|
||||||
|
|
||||||
|
fprintf(fp, "insert into %s.%s values ", db, tb);
|
||||||
|
for (int i = 0; i < times; ++i) {
|
||||||
|
fprintf(fp, "(%d000, %d)", ts + i, ts);
|
||||||
|
}
|
||||||
|
fprintf(fp, " \n");
|
||||||
|
fflush(fp);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
char cmd[1024] = {0};
|
||||||
|
if (strcmp(gzip, "gzip") == 0) {
|
||||||
|
sprintf(cmd,
|
||||||
|
"curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' --header "
|
||||||
|
"--compressed --data-ascii @%s 127.0.0.1:7111/rest/sql",
|
||||||
|
filename);
|
||||||
|
} else {
|
||||||
|
sprintf(cmd,
|
||||||
|
"curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' --header "
|
||||||
|
"'Transfer-Encoding: chunked' --data-ascii @%s 127.0.0.1:7111/rest/sql",
|
||||||
|
filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return simExecuteSystemCmd(script, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
|
bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
|
||||||
char buf[3000];
|
char buf[3000];
|
||||||
SCmdLine *line = &script->lines[script->linePos];
|
SCmdLine *line = &script->lines[script->linePos];
|
||||||
|
|
|
@ -721,6 +721,12 @@ bool simParseSqlSlowCmd(char *rest, SCommand *pCmd, int lineNum) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool simParseRestfulCmd(char *rest, SCommand *pCmd, int lineNum) {
|
||||||
|
simParseSqlCmd(rest, pCmd, lineNum);
|
||||||
|
cmdLine[numOfLines - 1].cmdno = SIM_CMD_RESTFUL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool simParseSystemCmd(char *rest, SCommand *pCmd, int lineNum) {
|
bool simParseSystemCmd(char *rest, SCommand *pCmd, int lineNum) {
|
||||||
int expLen;
|
int expLen;
|
||||||
|
|
||||||
|
@ -1020,6 +1026,14 @@ void simInitsimCmdList() {
|
||||||
simCmdList[cmdno].executeCmd = simExecuteSqlSlowCmd;
|
simCmdList[cmdno].executeCmd = simExecuteSqlSlowCmd;
|
||||||
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
||||||
|
|
||||||
|
cmdno = SIM_CMD_RESTFUL;
|
||||||
|
simCmdList[cmdno].cmdno = cmdno;
|
||||||
|
strcpy(simCmdList[cmdno].name, "restful");
|
||||||
|
simCmdList[cmdno].nlen = (int16_t)strlen(simCmdList[cmdno].name);
|
||||||
|
simCmdList[cmdno].parseCmd = simParseRestfulCmd;
|
||||||
|
simCmdList[cmdno].executeCmd = simExecuteRestfulCmd;
|
||||||
|
simAddCmdIntoHash(&(simCmdList[cmdno]));
|
||||||
|
|
||||||
/* test is only an internal command */
|
/* test is only an internal command */
|
||||||
cmdno = SIM_CMD_TEST;
|
cmdno = SIM_CMD_TEST;
|
||||||
simCmdList[cmdno].cmdno = cmdno;
|
simCmdList[cmdno].cmdno = cmdno;
|
||||||
|
|
Loading…
Reference in New Issue