diff --git a/Jenkinsfile b/Jenkinsfile
index f076a046686fd62a07695cfe3911e1baacf5c5d5..8e8cec764e5b2d22f9c5c46278d8ec76c65c3b4b 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -240,6 +240,16 @@ pipeline {
node nanosecondTest.js
'''
+
+ sh '''
+ cd ${WKC}/src/connector/node-rest/
+ npm install
+ npm run build
+ npm run build:test
+ npm run test
+
+ '''
+
sh '''
cd ${WKC}/tests/examples/C#/taosdemo
mcs -out:taosdemo *.cs > /dev/null 2>&1
diff --git a/README-CN.md b/README-CN.md
index d7192c939780a272acdebc94baf474aeaf0d7a38..f851a906b88a0676abdc39150a2a93ae7fbe7f56 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -7,6 +7,7 @@
[](https://www.taosdata.com)
简体中文 | [English](./README.md)
+很多职位正在热招中,请看[这里](https://www.taosdata.com/cn/careers/)
# TDengine 简介
diff --git a/README.md b/README.md
index ab9e0348c8547c43bdbcb4df44a88c53429971e3..d5b6f1fa85b962253fe504fadff78e953d4da598 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
[](https://www.taosdata.com)
English | [简体中文](./README-CN.md)
+We are hiring, check [here](https://www.taosdata.com/en/careers/)
# What is TDengine?
diff --git a/documentation20/cn/05.insert/docs.md b/documentation20/cn/05.insert/docs.md
index 556d51759cb126f3b49b032b6efeb7e9924f864c..bd6698251ac96b4fff300461d7e12a9e350bdfb7 100644
--- a/documentation20/cn/05.insert/docs.md
+++ b/documentation20/cn/05.insert/docs.md
@@ -4,7 +4,7 @@ TDengine支持多种接口写入数据,包括SQL, Prometheus, Telegraf, EMQ MQ
## SQL 写入
-应用通过C/C++、JDBC、GO、C#或Python Connector 执行SQL insert语句来插入数据,用户还可以通过TAOS Shell,手动输入SQL insert语句插入数据。比如下面这条insert 就将一条记录写入到表d1001中:
+应用通过C/C++, Java, Go, C#, Python, Node.js 连接器执行SQL insert语句来插入数据,用户还可以通过TAOS Shell,手动输入SQL insert语句插入数据。比如下面这条insert 就将一条记录写入到表d1001中:
```mysql
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
```
diff --git a/documentation20/cn/11.administrator/docs.md b/documentation20/cn/11.administrator/docs.md
index d26cd3c845527084612d1a876076838f5d0f9f1a..2269e183c7c72624a802725712c59f959aface0f 100644
--- a/documentation20/cn/11.administrator/docs.md
+++ b/documentation20/cn/11.administrator/docs.md
@@ -365,9 +365,9 @@ taos -C 或 taos --dump-config
- timezone
- 默认值:从系统中动态获取当前的时区设置
-
- 客户端运行系统所在的时区。为应对多时区的数据写入和查询问题,TDengine 采用 Unix 时间戳(Unix Timestamp)来记录和存储时间戳。Unix 时间戳的特点决定了任一时刻不论在任何时区,产生的时间戳均一致。需要注意的是,Unix时间戳是在客户端完成转换和记录。为了确保客户端其他形式的时间转换为正确的 Unix 时间戳,需要设置正确的时区。
+ 默认值:从系统中动态获取当前客户端运行系统所在的时区。
+
+ 为应对多时区的数据写入和查询问题,TDengine 采用 Unix 时间戳(Unix Timestamp)来记录和存储时间戳。Unix 时间戳的特点决定了任一时刻不论在任何时区,产生的时间戳均一致。需要注意的是,Unix时间戳是在客户端完成转换和记录。为了确保客户端其他形式的时间转换为正确的 Unix 时间戳,需要设置正确的时区。
在Linux系统中,客户端会自动读取系统设置的时区信息。用户也可以采用多种方式在配置文件设置时区。例如:
```
@@ -835,7 +835,7 @@ taos -n sync -P 6042 -h
-h:所要连接的服务端的 FQDN 或 ip 地址。如果不设置这一项,会使用本机 taos.cfg 文件中 FQDN 参数的设置作为默认值。
-P:所连接服务端的网络端口。默认值为 6030。
-N:诊断过程中使用的网络包总数。最小值是 1、最大值是 10000,默认值为 100。
--l:单个网络包的大小(单位:字节)。最小值是 1024、最大值是 1024*1024*1024,默认值为 1000。
+-l:单个网络包的大小(单位:字节)。最小值是 1024、最大值是 1024 * 1024 * 1024,默认值为 1000。
-S:网络封包的类型。可以是 TCP 或 UDP,默认值为 TCP。
#### FQDN 解析速度诊断
diff --git a/documentation20/en/05.insert/docs.md b/documentation20/en/05.insert/docs.md
index 7e99cf09dbae6a09429c83810f07db6ef4dafbe7..2e104b980a91c9ee72d93e41fbf0d4276694d1ef 100644
--- a/documentation20/en/05.insert/docs.md
+++ b/documentation20/en/05.insert/docs.md
@@ -4,7 +4,7 @@ TDengine supports multiple ways to write data, including SQL, Prometheus, Telegr
## Data Writing via SQL
-Applications insert data by executing SQL insert statements through C/C++, JDBC, GO, C#, or Python Connector, and users can manually enter SQL insert statements to insert data through TAOS Shell. For example, the following insert writes a record to table d1001:
+Applications insert data by executing SQL insert statements through C/C++, Java, Go, C#, Python, Node.js Connectors, and users can manually enter SQL insert statements to insert data through TAOS Shell. For example, the following insert writes a record to table d1001:
```mysql
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
diff --git a/documentation20/en/08.connector/docs.md b/documentation20/en/08.connector/docs.md
index b4d2ee3a05850aa9b1a3c886ec26e4661b7f997b..57efd27dcc1b90775c7f2bfc6fbcbca57dc503ff 100644
--- a/documentation20/en/08.connector/docs.md
+++ b/documentation20/en/08.connector/docs.md
@@ -407,7 +407,7 @@ See [video tutorials](https://www.taosdata.com/blog/2020/11/11/1963.html) for th
- python 2.7 or >= 3.4 installed
- pip or pip3 installed
-### Python client installation
+### Python connector installation
#### Linux
@@ -540,7 +540,7 @@ Refer to help (taos.TDengineCursor) in python. This class corresponds to the wri
Used to generate an instance of taos.TDengineConnection.
-### Python client code sample
+### Python connector code sample
In tests/examples/python, we provide a sample Python program read_example. py to guide you to design your own write and query program. After installing the corresponding client, introduce the taos class through `import taos`. The steps are as follows:
@@ -610,11 +610,11 @@ The return value is in JSON format, as follows:
```json
{
"status": "succ",
- "head": ["ts","current", …],
- "column_meta": [["ts",9,8],["current",6,4], …],
+ "head": ["ts","current",...],
+ "column_meta": [["ts",9,8],["current",6,4], ...],
"data": [
- ["2018-10-03 14:38:05.000", 10.3, …],
- ["2018-10-03 14:38:15.000", 12.6, …]
+ ["2018-10-03 14:38:05.000", 10.3, ...],
+ ["2018-10-03 14:38:15.000", 12.6, ...]
],
"rows": 2
}
diff --git a/documentation20/en/12.taos-sql/docs.md b/documentation20/en/12.taos-sql/docs.md
index 7aaeb6c32b25cef8f0d1bf2f67ef94c3a2a007ee..7f9754e80fcf97962177d2690c233cae23f8d491 100644
--- a/documentation20/en/12.taos-sql/docs.md
+++ b/documentation20/en/12.taos-sql/docs.md
@@ -75,7 +75,7 @@ Note:
2. UPDATE marks the database support updating the same timestamp data;
3. Maximum length of the database name is 33;
4. Maximum length of a SQL statement is 65480 characters;
-5. Database has more storage-related configuration parameters, see System Management.
+5. Database has more storage-related configuration parameters, see [Server-side Configuration](https://www.taosdata.com/en/documentation/administrator#config) .
- **Show current system parameters**
@@ -88,7 +88,7 @@ Note:
```mysql
USE db_name;
```
- Use/switch database
+ Use/switch database (Invalid when accessing through RESTful connection)
- **Drop a database**
```mysql
diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh
index d400d0b91a2d02e9b3e0232d67e2ed6b00cdf541..106545dc9143ffb110112e51bd86da350e234929 100755
--- a/packaging/tools/make_install.sh
+++ b/packaging/tools/make_install.sh
@@ -245,8 +245,8 @@ function install_lib() {
else
${csudo} cp -Rf ${binary_dir}/build/lib/libtaos.${verNumber}.dylib ${install_main_dir}/driver && ${csudo} chmod 777 ${install_main_dir}/driver/*
- ${csudo} ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.1.dylib
- ${csudo} ln -sf ${lib_link_dir}/libtaos.1.dylib ${lib_link_dir}/libtaos.dylib
+ ${csudo} ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.1.dylib || :
+ ${csudo} ln -sf ${lib_link_dir}/libtaos.1.dylib ${lib_link_dir}/libtaos.dylib || :
fi
install_jemalloc
diff --git a/packaging/tools/makepkg_pro.sh b/packaging/tools/makepkg_pro.sh
index ffe4566b42017a7bffa6166ae28e18ca29bd03cd..8a351f28224f3c86b8995b878efd8f7ab772d64f 100755
--- a/packaging/tools/makepkg_pro.sh
+++ b/packaging/tools/makepkg_pro.sh
@@ -72,9 +72,19 @@ if [ "$verMode" == "cluster" ]; then
sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove_pro.sh >> remove_prodb_temp.sh
mv remove_prodb_temp.sh ${install_dir}/bin/remove_pro.sh
+
mkdir -p ${install_dir}/nginxd && cp -r ${nginx_dir}/* ${install_dir}/nginxd
cp ${nginx_dir}/png/taos.png ${install_dir}/nginxd/admin/images/taos.png
rm -rf ${install_dir}/nginxd/png
+
+ # replace the OEM name, add by yangzy@2021-09-22
+ sed -i -e 's/www.taosdata.com/www.hanatech.com.cn/g' $(grep -r 'www.taosdata.com' ${install_dir}/nginxd | sed -r "s/(.*\.html):\s*(.*)/\1/g")
+ sed -i -e 's/TAOS Data/Hanatech/g' $(grep -r 'TAOS Data' ${install_dir}/nginxd | sed -r "s/(.*\.html):\s*(.*)/\1/g")
+ sed -i -e 's/taosd/prodbs/g' `grep -r 'taosd' ${install_dir}/nginxd | grep -E '*\.js\s*.*' | sed -r -e 's/(.*\.js):\s*(.*)/\1/g' | sort | uniq`
+
+ sed -i -e 's/taosd<\/th>/ | prodbs<\/th>/g' ${install_dir}/nginxd/admin/monitor.html
+ sed -i -e "s/data:\['taosd', 'system'\],/data:\['prodbs', 'system'\],/g" ${install_dir}/nginxd/admin/monitor.html
+ sed -i -e "s/name: 'taosd',/name: 'prodbs',/g" ${install_dir}/nginxd/admin/monitor.html
sed -i "s/TDengine/ProDB/g" ${install_dir}/nginxd/admin/*.html
sed -i "s/TDengine/ProDB/g" ${install_dir}/nginxd/admin/js/*.js
diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c
index cb1e65368cdaa99e6c2b370a3f5dcbc1b44736e2..7ba8ea628200b29a142ec9c21a980755b3161c01 100644
--- a/src/client/src/tscSQLParser.c
+++ b/src/client/src/tscSQLParser.c
@@ -2410,7 +2410,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
const char* msg10 = "derivative duration should be greater than 1 Second";
const char* msg11 = "third parameter in derivative should be 0 or 1";
const char* msg12 = "parameter is out of range [1, 100]";
- const char* msg13 = "third parameter should be 0 or 1";
+ const char* msg13 = "third parameter algorithm must be 'default' or 't-digest'";
switch (functionId) {
case TSDB_FUNC_COUNT: {
@@ -2807,6 +2807,9 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
SExprInfo* pExpr = NULL;
if (functionId == TSDB_FUNC_PERCT || functionId == TSDB_FUNC_APERCT) {
// param1 double
+ if(pVariant->nType != TSDB_DATA_TYPE_DOUBLE && pVariant->nType != TSDB_DATA_TYPE_BIGINT){
+ return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg5);
+ }
tVariantDump(pVariant, val, TSDB_DATA_TYPE_DOUBLE, true);
double dp = GET_DOUBLE_VAL(val);
if (dp < 0 || dp > TOP_BOTTOM_QUERY_LIMIT) {
@@ -2828,12 +2831,22 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
if (taosArrayGetSize(pItem->pNode->Expr.paramList) == 3) {
if (pParamElem[2].pNode != NULL) {
pVariant = &pParamElem[2].pNode->value;
- tVariantDump(pVariant, val, TSDB_DATA_TYPE_INT, true);
- int32_t algo = GET_INT32_VAL(val);
- if(algo < 0 || algo >1 ) {
+ // check type must string
+ if(pVariant->nType != TSDB_DATA_TYPE_BINARY || pVariant->pz == NULL){
+ return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg13);
+ }
+ char* pzAlgo = pVariant->pz;
+ int32_t algo = 0;
+
+ if(strcasecmp(pzAlgo, "t-digest") == 0) {
+ algo = 1;
+ } else if(strcasecmp(pzAlgo, "default") == 0){
+ algo = 0;
+ } else {
return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg13);
}
- tscExprAddParams(&pExpr->base, val, TSDB_DATA_TYPE_INT, sizeof(int32_t));
+ // append algo int32_t
+ tscExprAddParams(&pExpr->base, (char*)&algo, TSDB_DATA_TYPE_INT, sizeof(int32_t));
}
}
diff --git a/src/connector/grafanaplugin b/src/connector/grafanaplugin
index 4a4d79099b076b8ff12d5b4fdbcba54049a6866d..016d8e82a24d72779be0ab0090580a372b4fffca 160000
--- a/src/connector/grafanaplugin
+++ b/src/connector/grafanaplugin
@@ -1 +1 @@
-Subproject commit 4a4d79099b076b8ff12d5b4fdbcba54049a6866d
+Subproject commit 016d8e82a24d72779be0ab0090580a372b4fffca
diff --git a/src/connector/node-rest/.gitignore b/src/connector/node-rest/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..6768d98a52ecd40637abf9c402fe9ed6f5bd5936
--- /dev/null
+++ b/src/connector/node-rest/.gitignore
@@ -0,0 +1,128 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/node
+# Edit at https://www.toptal.com/developers/gitignore?templates=node
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+.env.production
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+# End of https://www.toptal.com/developers/gitignore/api/node
+
+lib/
+yarn.lock
diff --git a/src/connector/node-rest/.nvmrc b/src/connector/node-rest/.nvmrc
new file mode 100644
index 0000000000000000000000000000000000000000..8351c19397f4fcd5238d10034fa7fa384f14d580
--- /dev/null
+++ b/src/connector/node-rest/.nvmrc
@@ -0,0 +1 @@
+14
diff --git a/src/connector/node-rest/TDengineRest.js b/src/connector/node-rest/TDengineRest.js
new file mode 100644
index 0000000000000000000000000000000000000000..68ac76019d0c14d31128e9f596b5f18fce59f568
--- /dev/null
+++ b/src/connector/node-rest/TDengineRest.js
@@ -0,0 +1,5 @@
+import {TDengineRestConnection} from './src/restConnect'
+
+export function TDRestConnection(connection = {}) {
+ return new TDengineRestConnection(connection)
+}
diff --git a/src/connector/node-rest/examples/show-database.js b/src/connector/node-rest/examples/show-database.js
new file mode 100644
index 0000000000000000000000000000000000000000..bf51b8a675e1e0b86f0761b6f47d72f73c80c0ff
--- /dev/null
+++ b/src/connector/node-rest/examples/show-database.js
@@ -0,0 +1,13 @@
+import {TDengineRestConnection} from "../src/restConnect";
+
+let conn = new TDengineRestConnection({host: '127.0.0.1', user: 'root', pass: 'taosdata', port: 6041})
+let cursor = conn.cursor();
+console.log(conn)
+let data = {};
+(async () => {
+ data = await cursor.query("show databases");
+ data.toString()
+})()
+
+
+
diff --git a/src/connector/node-rest/package-lock.json b/src/connector/node-rest/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..035b317fe72d030293fd2c56d3ee9999b7c59264
--- /dev/null
+++ b/src/connector/node-rest/package-lock.json
@@ -0,0 +1,1389 @@
+{
+ "name": "td-rest-connector",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz",
+ "integrity": "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8=",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.9",
+ "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha1-ZlTRcbICT22O4VG/JQlpmRkTHUg=",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz",
+ "integrity": "sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk=",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627647108647&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
+ "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677264890&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ }
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.nlark.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.3.tgz",
+ "integrity": "sha1-nkKYHvA1vrPdSa3ResuW6P9vOUw=",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.nlark.com/@humanwhocodes/config-array/download/@humanwhocodes/config-array-0.5.0.tgz",
+ "integrity": "sha1-FAeWfUxu7Nc4j4Os8er00Mbljvk=",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.nlark.com/@humanwhocodes/object-schema/download/@humanwhocodes/object-schema-1.2.0.tgz",
+ "integrity": "sha1-h956+cIxgm/daKxyWPd8Qp4OX88=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz",
+ "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.nlark.com/acorn-jsx/download/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz",
+ "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-4.1.1.tgz",
+ "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz",
+ "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.nlark.com/argparse/download/argparse-1.0.10.tgz",
+ "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "assert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/assert/download/assert-2.0.0.tgz",
+ "integrity": "sha1-lfwcYW1IcTUQaA8ury0Q3SLgLTI=",
+ "dev": true,
+ "requires": {
+ "es6-object-assign": "^1.1.0",
+ "is-nan": "^1.2.1",
+ "object-is": "^1.0.1",
+ "util": "^0.12.0"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz",
+ "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=",
+ "dev": true
+ },
+ "available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.nlark.com/available-typed-arrays/download/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha1-kvlWFlAQadB9EO2y/DfT4cZRI7c=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.nlark.com/balanced-match/download/balanced-match-1.0.2.tgz",
+ "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010713935&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz",
+ "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.nlark.com/call-bind/download/call-bind-1.0.2.tgz",
+ "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.nlark.com/callsites/download/callsites-3.1.0.tgz",
+ "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627647108647&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz",
+ "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
+ "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.nlark.com/color-convert/download/color-convert-2.0.1.tgz",
+ "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.4.tgz",
+ "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1626716143790&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz",
+ "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz",
+ "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.nlark.com/color-convert/download/color-convert-1.9.3.tgz",
+ "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.nlark.com/cross-spawn/download/cross-spawn-7.0.3.tgz",
+ "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.nlark.com/debug/download/debug-4.3.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz",
+ "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.nlark.com/deep-is/download/deep-is-0.1.4.tgz?cache=0&sync_timestamp=1630774723365&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdeep-is%2Fdownload%2Fdeep-is-0.1.4.tgz",
+ "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.nlark.com/define-properties/download/define-properties-1.1.3.tgz",
+ "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz",
+ "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.nlark.com/emoji-regex/download/emoji-regex-8.0.0.tgz",
+ "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=",
+ "dev": true
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz",
+ "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.6",
+ "resolved": "https://registry.nlark.com/es-abstract/download/es-abstract-1.18.6.tgz?cache=0&sync_timestamp=1631076806734&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fes-abstract%2Fdownload%2Fes-abstract-1.18.6.tgz",
+ "integrity": "sha1-LETj6npiVQORZNJlWXd6bZeMtFY=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
+ "get-symbol-description": "^1.0.0",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.2",
+ "internal-slot": "^1.0.3",
+ "is-callable": "^1.2.4",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.4",
+ "is-string": "^1.0.7",
+ "object-inspect": "^1.11.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.nlark.com/es-to-primitive/download/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es6-object-assign": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/es6-object-assign/download/es6-object-assign-1.1.0.tgz",
+ "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=",
+ "dev": true
+ },
+ "esbuild": {
+ "version": "0.12.25",
+ "resolved": "https://registry.nlark.com/esbuild/download/esbuild-0.12.25.tgz",
+ "integrity": "sha1-whMc7wIs+f6UqqXgARCyf8l2Iho=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz?cache=0&sync_timestamp=1618677264890&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-4.0.0.tgz",
+ "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.nlark.com/eslint/download/eslint-7.32.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint%2Fdownload%2Feslint-7.32.0.tgz",
+ "integrity": "sha1-xtMooUvj+wjI0dIeEsAv23oqgS0=",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.nlark.com/eslint-scope/download/eslint-scope-5.1.1.tgz?cache=0&sync_timestamp=1627061650854&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-scope%2Fdownload%2Feslint-scope-5.1.1.tgz",
+ "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz",
+ "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1624559014210&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz?cache=0&sync_timestamp=1624559014210&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.nlark.com/espree/download/espree-7.3.1.tgz?cache=0&sync_timestamp=1625021119997&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fespree%2Fdownload%2Fespree-7.3.1.tgz",
+ "integrity": "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y=",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz?cache=0&sync_timestamp=1624559014210&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz",
+ "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.nlark.com/esquery/download/esquery-1.4.0.tgz",
+ "integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz",
+ "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz",
+ "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz",
+ "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz",
+ "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz",
+ "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz?cache=0&sync_timestamp=1613794546707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffile-entry-cache%2Fdownload%2Ffile-entry-cache-6.0.1.tgz",
+ "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-3.0.4.tgz",
+ "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.2",
+ "resolved": "https://registry.nlark.com/flatted/download/flatted-3.2.2.tgz?cache=0&sync_timestamp=1627541315228&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fflatted%2Fdownload%2Fflatted-3.2.2.tgz",
+ "integrity": "sha1-ZL/tXLaP48p4s+shStl7Y77c5WE=",
+ "dev": true
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npm.taobao.org/foreach/download/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.nlark.com/fs.realpath/download/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
+ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.nlark.com/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz?cache=0&sync_timestamp=1618847182644&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffunctional-red-black-tree%2Fdownload%2Ffunctional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.nlark.com/get-intrinsic/download/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.nlark.com/get-symbol-description/download/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha1-f9uByQAQH71WTdXxowr1qtweWNY=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.nlark.com/glob/download/glob-7.1.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob%2Fdownload%2Fglob-7.1.7.tgz",
+ "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.nlark.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1626760235241&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz",
+ "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "13.11.0",
+ "resolved": "https://registry.nlark.com/globals/download/globals-13.11.0.tgz",
+ "integrity": "sha1-QO9njaEX/nvS4o8fqySVG9AlW+c=",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
+ "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npm.taobao.org/has-bigints/download/has-bigints-1.0.1.tgz",
+ "integrity": "sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1626716143790&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz?cache=0&sync_timestamp=1614443577352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.2.tgz",
+ "integrity": "sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=",
+ "dev": true
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.nlark.com/has-tostringtag/download/has-tostringtag-1.0.0.tgz?cache=0&sync_timestamp=1628197490246&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-tostringtag%2Fdownload%2Fhas-tostringtag-1.0.0.tgz",
+ "integrity": "sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.nlark.com/ignore/download/ignore-4.0.6.tgz",
+ "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz?cache=0&sync_timestamp=1608469520031&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.3.0.tgz",
+ "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.nlark.com/imurmurhash/download/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz",
+ "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=",
+ "dev": true
+ },
+ "internal-slot": {
+ "version": "1.0.3",
+ "resolved": "https://registry.nlark.com/internal-slot/download/internal-slot-1.0.3.tgz",
+ "integrity": "sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.nlark.com/is-arguments/download/is-arguments-1.1.1.tgz?cache=0&sync_timestamp=1628202102318&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-arguments%2Fdownload%2Fis-arguments-1.1.1.tgz",
+ "integrity": "sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.nlark.com/is-bigint/download/is-bigint-1.0.4.tgz?cache=0&sync_timestamp=1628747504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-bigint%2Fdownload%2Fis-bigint-1.0.4.tgz",
+ "integrity": "sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=",
+ "dev": true,
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.nlark.com/is-boolean-object/download/is-boolean-object-1.1.2.tgz?cache=0&sync_timestamp=1628207133571&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-boolean-object%2Fdownload%2Fis-boolean-object-1.1.2.tgz",
+ "integrity": "sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.4",
+ "resolved": "https://registry.nlark.com/is-callable/download/is-callable-1.2.4.tgz?cache=0&sync_timestamp=1628259683451&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-callable%2Fdownload%2Fis-callable-1.2.4.tgz",
+ "integrity": "sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=",
+ "dev": true
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.nlark.com/is-date-object/download/is-date-object-1.0.5.tgz",
+ "integrity": "sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.nlark.com/is-extglob/download/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=",
+ "dev": true
+ },
+ "is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.nlark.com/is-generator-function/download/is-generator-function-1.0.10.tgz?cache=0&sync_timestamp=1628227835267&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-generator-function%2Fdownload%2Fis-generator-function-1.0.10.tgz",
+ "integrity": "sha1-8VWLrxrBfg3up8BBXEODUf8rPHI=",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.nlark.com/is-glob/download/is-glob-4.0.1.tgz",
+ "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npm.taobao.org/is-nan/download/is-nan-1.3.2.tgz",
+ "integrity": "sha1-BDpUreoxdItVts1OCara+mm9nh0=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.1.tgz?cache=0&sync_timestamp=1607123314998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-negative-zero%2Fdownload%2Fis-negative-zero-2.0.1.tgz",
+ "integrity": "sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ=",
+ "dev": true
+ },
+ "is-number-object": {
+ "version": "1.0.6",
+ "resolved": "https://registry.nlark.com/is-number-object/download/is-number-object-1.0.6.tgz",
+ "integrity": "sha1-anqvg4x/BoalC0VT9+VKlklOifA=",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz",
+ "integrity": "sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.nlark.com/is-string/download/is-string-1.0.7.tgz",
+ "integrity": "sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.nlark.com/is-symbol/download/is-symbol-1.0.4.tgz?cache=0&sync_timestamp=1620501308896&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.4.tgz",
+ "integrity": "sha1-ptrJO2NbBjymhyI23oiRClevE5w=",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.8",
+ "resolved": "https://registry.nlark.com/is-typed-array/download/is-typed-array-1.1.8.tgz",
+ "integrity": "sha1-y6plhdx9tDMYvFuJUj6jhKb2Xnk=",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-abstract": "^1.18.5",
+ "foreach": "^2.0.5",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz",
+ "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.nlark.com/js-yaml/download/js-yaml-3.14.1.tgz?cache=0&sync_timestamp=1618847247867&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.1.tgz",
+ "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.nlark.com/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.nlark.com/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.nlark.com/levn/download/levn-0.4.1.tgz",
+ "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.nlark.com/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.nlark.com/lodash.merge/download/lodash.merge-4.6.2.tgz",
+ "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=",
+ "dev": true
+ },
+ "lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.nlark.com/lodash.truncate/download/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.nlark.com/lru-cache/download/lru-cache-6.0.0.tgz",
+ "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.nlark.com/minimatch/download/minimatch-3.0.4.tgz",
+ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.nlark.com/ms/download/ms-2.1.2.tgz",
+ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node-fetch": {
+ "version": "2.6.2",
+ "resolved": "https://registry.nlark.com/node-fetch/download/node-fetch-2.6.2.tgz?cache=0&sync_timestamp=1630935314150&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.2.tgz",
+ "integrity": "sha1-mGmWgYtzeF5HsZZcw06wk6HUZNA="
+ },
+ "object-inspect": {
+ "version": "1.11.0",
+ "resolved": "https://registry.nlark.com/object-inspect/download/object-inspect-1.11.0.tgz",
+ "integrity": "sha1-nc6xRs7dQUig2eUauI00z1CZIrE=",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.5.tgz?cache=0&sync_timestamp=1613858420069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.5.tgz",
+ "integrity": "sha1-ud7qpfx/GEag+uzc7sE45XePU6w=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz",
+ "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.2.tgz?cache=0&sync_timestamp=1604115183005&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.assign%2Fdownload%2Fobject.assign-4.1.2.tgz",
+ "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.nlark.com/once/download/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.nlark.com/optionator/download/optionator-0.9.1.tgz",
+ "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.nlark.com/parent-module/download/parent-module-1.0.1.tgz",
+ "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.nlark.com/path-is-absolute/download/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.nlark.com/path-key/download/path-key-3.1.1.tgz",
+ "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz",
+ "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.nlark.com/progress/download/progress-2.0.3.tgz",
+ "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+ "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=",
+ "dev": true
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz?cache=0&sync_timestamp=1623669109412&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpp%2Fdownload%2Fregexpp-3.2.0.tgz",
+ "integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz",
+ "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz",
+ "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz",
+ "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz",
+ "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.nlark.com/semver/download/semver-7.3.5.tgz",
+ "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.nlark.com/shebang-command/download/shebang-command-2.0.0.tgz",
+ "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.nlark.com/shebang-regex/download/shebang-regex-3.0.0.tgz",
+ "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/side-channel/download/side-channel-1.0.4.tgz",
+ "integrity": "sha1-785cj9wQTudRslxY1CkAEfpeos8=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.nlark.com/slice-ansi/download/slice-ansi-4.0.0.tgz",
+ "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
+ "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.nlark.com/color-convert/download/color-convert-2.0.1.tgz",
+ "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.nlark.com/color-name/download/color-name-1.1.4.tgz",
+ "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+ "dev": true
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.nlark.com/string-width/download/string-width-4.2.2.tgz",
+ "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz?cache=0&sync_timestamp=1614127318238&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.nlark.com/strip-ansi/download/strip-ansi-6.0.0.tgz",
+ "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz",
+ "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "table": {
+ "version": "6.7.1",
+ "resolved": "https://registry.nlark.com/table/download/table-6.7.1.tgz?cache=0&sync_timestamp=1620957375998&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftable%2Fdownload%2Ftable-6.7.1.tgz",
+ "integrity": "sha1-7gVZK3FDgxqMlPPO5qrkwczvM+I=",
+ "dev": true,
+ "requires": {
+ "ajv": "^8.0.1",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.6.2",
+ "resolved": "https://registry.nlark.com/ajv/download/ajv-8.6.2.tgz",
+ "integrity": "sha1-L7ReDl/LwIEzJsHD2lNdGIG7BXE=",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.nlark.com/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=",
+ "dev": true
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.nlark.com/type-check/download/type-check-0.4.0.tgz",
+ "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.20.2.tgz",
+ "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=",
+ "dev": true
+ },
+ "unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.nlark.com/unbox-primitive/download/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha1-CF4hViXsMWJXTciFmr7nilmxRHE=",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610240086113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz",
+ "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util": {
+ "version": "0.12.4",
+ "resolved": "https://registry.nlark.com/util/download/util-0.12.4.tgz?cache=0&sync_timestamp=1622213272480&other_urls=https%3A%2F%2Fregistry.nlark.com%2Futil%2Fdownload%2Futil-0.12.4.tgz",
+ "integrity": "sha1-ZhIaMUIN+PAcoMRkvhXfodGFAlM=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "safe-buffer": "^5.1.2",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz",
+ "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.7",
+ "resolved": "https://registry.nlark.com/which-typed-array/download/which-typed-array-1.1.7.tgz?cache=0&sync_timestamp=1630377722719&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwhich-typed-array%2Fdownload%2Fwhich-typed-array-1.1.7.tgz",
+ "integrity": "sha1-J2F5m5oi1LhmCzwbQKuqdzlpF5M=",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-abstract": "^1.18.5",
+ "foreach": "^2.0.5",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.7"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.nlark.com/word-wrap/download/word-wrap-1.2.3.tgz",
+ "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz",
+ "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=",
+ "dev": true
+ }
+ }
+}
diff --git a/src/connector/node-rest/package.json b/src/connector/node-rest/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..3eab6fc289bf4e8a189fd117f2dfe7bc67321466
--- /dev/null
+++ b/src/connector/node-rest/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "td-rest-connector",
+ "version": "1.0.0",
+ "description": "A Node.js connector for TDengine restful",
+ "module": "src/TDengineRest.js",
+ "main": "lib/TDengineclearRest.js",
+ "license": "MIT",
+ "scripts": {
+ "prepare": "npm run build",
+ "build": "esbuild --bundle --platform=node --outfile=lib/TDengineRest.js ./TDengineRest.js",
+ "build:dev": "esbuild --bundle --platform=node --outfile=dist/examples/show-database.js examples/show-database.js ",
+ "build:test": "esbuild test/testRestConn.js --bundle --platform=node --outfile=dist/tests/testRestConn.js ",
+ "test": "node dist/tests/testRestConn.js"
+ },
+ "devDependencies": {
+ "esbuild": "^0.12.25",
+ "eslint": "^7.32.0",
+ "assert": "^2.0.0"
+ },
+ "dependencies": {
+ "node-fetch": "^2.x"
+ }
+}
diff --git a/src/connector/node-rest/readme.md b/src/connector/node-rest/readme.md
new file mode 100644
index 0000000000000000000000000000000000000000..db8d57c2ee0bc506921510f73c534fe4f607b537
--- /dev/null
+++ b/src/connector/node-rest/readme.md
@@ -0,0 +1,40 @@
+# TDengine Nodejs Restful
+
+This is the Node.js library that lets you connect to [TDengine](https://www.github.com/taosdata/tdengine) though
+restful. This restful can help you access the TDengine from different platform.
+
+## Install
+To get started, just type in the following to install the connector through [npm](https://www.npmjs.com/)
+
+```cmd
+npm install td-rest-connector
+```
+
+## Usage
+
+### Connection
+
+```javascript
+import taoRest from 'TDengineRest'
+var connRest = taoRest({host:'127.0.0.1',user:'root',pass:'taosdata',port:6041})
+```
+
+query
+```javascript
+(async()=>{
+ data = await connRest.query("show databases");
+ data.toString();
+ }
+)()
+```
+
+## Example
+An example of using the NodeJS Restful connector to create a table with weather data and create and execute queries can be found [here](https://github.com/taosdata/TDengine/tree/master/tests/examples/node-rest/show-database.js)
+
+## Contributing to TDengine
+
+Please follow the [contribution guidelines](https://github.com/taosdata/TDengine/blob/master/CONTRIBUTING.md) to contribute to the project.
+
+## License
+
+[GNU AGPL v3.0](http://www.gnu.org/licenses/agpl-3.0.html)
diff --git a/src/connector/node-rest/src/restConnect.js b/src/connector/node-rest/src/restConnect.js
new file mode 100644
index 0000000000000000000000000000000000000000..ca6acc3e47c48c1e0020b2e5c07693159ad25670
--- /dev/null
+++ b/src/connector/node-rest/src/restConnect.js
@@ -0,0 +1,59 @@
+import {TDengineRestCursor} from '../src/restCursor'
+
+/**
+ *this class collect basic information that can be used to build
+ * a restful connection.
+ */
+export class TDengineRestConnection {
+ /**
+ * constructor,give variables some default values
+ * @param options
+ * @returns {TDengineRestConnection}
+ */
+ constructor(options) {
+ this.host = 'localhost'
+ this.port = '6041'
+ this.user = 'root'
+ this.pass = 'taosdata'
+ this.path = '/rest/sqlt/'
+ this._initConnection(options)
+ return this
+ }
+
+ /**
+ * used to init the connection info using the input options
+ * @param options
+ * @private
+ */
+ _initConnection(options) {
+ if (options['host']) {
+ this.host = options['host']
+ }
+ if (options['port']) {
+ this.port = options['port']
+ }
+ if (options['user']) {
+ this.user = options['user']
+ }
+ if (options['pass']) {
+ this.pass = options['pass']
+ }
+ if (options['path']) {
+ this.path = options['path']
+ }
+ }
+
+ /**
+ * cursor will return an object of TDengineRestCursor, which can send restful(http) request and get
+ * the response from server.
+ * @returns {TDengineRestCursor}
+ */
+ cursor() {
+ return new TDengineRestCursor(this)
+ }
+}
+
+
+
+
+
diff --git a/src/connector/node-rest/src/restConstant.js b/src/connector/node-rest/src/restConstant.js
new file mode 100644
index 0000000000000000000000000000000000000000..9bab9313b3d376a1384f69b4fd7cb0dba6b1ab87
--- /dev/null
+++ b/src/connector/node-rest/src/restConstant.js
@@ -0,0 +1,26 @@
+/**
+ * indicate the every type's type code
+ * @type {{"0": string, "1": string, "2": string, "3": string, "4": string, "5": string, "6": string, "7": string, "8": string, "9": string, "10": string}}
+ */
+export const typeCodesToName = {
+ 0: 'Null',
+ 1: 'Boolean',
+ 2: 'Tiny Int',
+ 3: 'Small Int',
+ 4: 'Int',
+ 5: 'Big Int',
+ 6: 'Float',
+ 7: 'Double',
+ 8: 'Binary',
+ 9: 'Timestamp',
+ 10: 'Nchar',
+}
+
+/**
+ * get the type of input typecode, in fact the response of restful will send every column's typecode
+ * @param typecode
+ * @returns {*}
+ */
+export function getTaoType(typecode) {
+ return typeCodesToName[typecode];
+}
\ No newline at end of file
diff --git a/src/connector/node-rest/src/restCursor.js b/src/connector/node-rest/src/restCursor.js
new file mode 100644
index 0000000000000000000000000000000000000000..beb712f1775ab424456a267723b564bd338bebd2
--- /dev/null
+++ b/src/connector/node-rest/src/restCursor.js
@@ -0,0 +1,66 @@
+import fetch from 'node-fetch'
+import {TDengineRestResultSet} from '../src/restResult'
+
+/**
+ * this class is core of restful js connector
+ * this class resends http request to the TDengine server
+ * and receive the response.
+ */
+export class TDengineRestCursor {
+ /**
+ * constructor,used to get the connection info
+ * @param connection
+ */
+ constructor(connection) {
+ this._connection = null;
+ this.data = [];
+ this.http = false
+ if (connection != null) {
+ this._connection = connection
+ } else {
+ throw new Error("A TDengineRestConnection object is required to be passed to the TDengineRestCursor")
+ }
+ }
+
+ /**
+ * used to build an url,like http://localhost:6041/rest/sql
+ * @returns {string}
+ * @private
+ */
+ _apiUpl() {
+ return (this.http ? "https" : "http") + "://" + this._connection.host + ":" + this._connection.port + this._connection.path
+ }
+
+ /**
+ * used to make an authorization token
+ * @returns {string}
+ * @private
+ */
+ _token() {
+ return 'Basic ' + Buffer.from(this._connection.user + ":" + this._connection.pass).toString('base64')
+ }
+
+ /**
+ * Used fetch to send http request, and return the response as an object of TDengineRestResultSet
+ * @param sql
+ * @returns {Promise}
+ */
+ async query(sql) {
+ try {
+ let response = await fetch(this._apiUpl(), {
+ method: 'POST',
+ body: sql,
+ headers: {'Authorization': this._token()}
+ })
+ // if (response.status == 'succ') {
+ return await new TDengineRestResultSet(await response.json())
+ // } else {
+ // throw new Error(response.desc)
+ // }
+ } catch (e) {
+ console.log("Request Failed " + e)
+ }
+
+ }
+}
+
diff --git a/src/connector/node-rest/src/restResult.js b/src/connector/node-rest/src/restResult.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba469eb4ec5d7e75bb8682a4d7cbf1d709bb9e87
--- /dev/null
+++ b/src/connector/node-rest/src/restResult.js
@@ -0,0 +1,159 @@
+import {getTaoType} from '../src/restConstant'
+
+
+export class TDengineRestResultSet {
+ constructor(result) {
+ this.status = '' //succ
+ this.column_name = {} //head
+ this.column_type = {} //column_meta
+ this.data = {}
+ this.affectRows = null //rows
+ this.code = null
+ this.desc = null
+ this._init(result)
+ }
+
+ //initial the resultSet with a jason parameter
+ /**
+ *
+ * @param jason
+ */
+ _init(result) {
+ if (result.status) {
+ this.status = result.status
+ }
+ if (result.head) {
+ this.column_name = result.head
+ }
+ if (result.column_meta) {
+ this.column_type = result.column_meta
+ }
+ if (result.data) {
+ this.data = result.data
+ }
+ if (result.rows) {
+ this.affectRows = result.rows
+ }
+ if (result.code) {
+ this.code = result.code
+ }
+ if (result.desc) {
+ this.desc = result.desc
+ }
+ }
+
+ getStatus() {
+ return this.status
+ }
+
+ getColumn_name() {
+ return this.column_name
+ }
+
+ getColumn_type() {
+ let column_data = []
+ this.column_type.forEach(function (column) {
+ column[1] = getTaoType(column[1])
+ column_data.push(column)
+ })
+ return column_data
+ }
+
+ getData() {
+ return this.data
+ }
+
+ getAffectRow() {
+ return this.affectRows
+ }
+
+ getCode() {
+ return this.code
+ }
+
+ getDesc() {
+ return this.desc
+ }
+
+
+ toString() {
+ if(this.status === 'succ'){
+ let fields = this.column_type
+ let rows = this.data
+ this._prettyStr(fields, rows)
+ }else{
+ console.log(this.status+":"+this.desc)
+ }
+ }
+
+ _prettyStr(fields, data) {
+ let colName = []
+ let colType = []
+ let colSize = []
+ let colStr = ""
+
+
+ for (let i = 0; i < fields.length; i++) {
+ colName.push(fields[i][0])
+ colType.push(fields[i][1])
+
+ if ((fields[i][1]) == 8 || (fields[i][1]) == 10) {
+ colSize.push(Math.max(fields[i][0].length, fields[i][2])); //max(column_name.length,column_type_precision)
+ } else {
+ colSize.push(Math.max(fields[i][0].length, suggestedMinWidths[fields[i][1]]));// max(column_name.length,suggest_column_with_suggestion)
+ }
+ // console.log(colSize)
+ }
+ colName.forEach((name, i) => {
+ colStr += this._fillEmpty(Math.floor(colSize[i] / 2 - name.length / 2)) + name.toString() + this._fillEmpty(Math.ceil(colSize[i] / 2 - name.length / 2)) + " | "
+ })
+
+ let strSperator = ""
+ let sizeSum = colSize.reduce((a, b) => a += b, (0)) + colSize.length * 3
+ strSperator = this._printN("=", sizeSum)
+
+ console.log("\n" + colStr)
+ console.log(strSperator)
+
+ data.forEach((row) => {
+ let rowStr = ""
+ row.forEach((cell, index) => {
+ rowStr += cell == null ? 'null' : cell.toString();
+ rowStr += this._fillEmpty(colSize[index] - cell.toString().length) + " | "
+ })
+ console.log(rowStr)
+ })
+
+ return colStr
+ }
+
+ _fillEmpty(n) {
+ let str = "";
+ for (let i = 0; i < n; i++) {
+ str += " ";
+ }
+ return str;
+ }
+
+ _printN(s, n) {
+ let f = "";
+ for (let i = 0; i < n; i++) {
+ f += s;
+ }
+ return f;
+ }
+}
+
+const suggestedMinWidths = {
+ 0: 4,
+ 1: 4,
+ 2: 4,
+ 3: 6,
+ 4: 11,
+ 5: 12,
+ 6: 24,
+ 7: 24,
+ 8: 10,
+ 9: 25,
+ 10: 10,
+}
diff --git a/src/connector/node-rest/test/testRestConn.js b/src/connector/node-rest/test/testRestConn.js
new file mode 100644
index 0000000000000000000000000000000000000000..011a4b66e4a5fae09468610575a581ae185f9bbb
--- /dev/null
+++ b/src/connector/node-rest/test/testRestConn.js
@@ -0,0 +1,39 @@
+import {TDRestConnection} from "../TDengineRest";
+import assert from "assert"
+
+let conn = new TDRestConnection({host: '127.0.0.1', user: 'root', pass: 'taosdata', port: 6041});
+let cursor = conn.cursor();
+
+const createDB = "create database if not exists node_rest";
+const dropDB = "drop database if exists node_rest";
+const createTBL = "CREATE STABLE if not exists node_rest.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int)";
+const dropTBL = "drop table if exists node_rest.meters ";
+const insert = "INSERT INTO node_rest.d1001 USING node_rest.meters TAGS (\"Beijng.Chaoyang\", 2) VALUES (now, 10.2, 219, 0.32) ";
+const select = "select * from node_rest.d1001 ";
+const selectStbl = "select * from node_rest.meters";
+
+async function execute(sql) {
+ console.log("SQL:" + sql);
+ let result = await cursor.query(sql);
+ try {
+ assert.strictEqual(result.getStatus(), 'succ', new Error("response error"))
+ result.toString()
+ } catch (e) {
+ console.log(e)
+ }
+
+}
+
+(async () => {
+ await execute(createDB);
+ await execute(createTBL);
+ await execute(insert);
+ await execute(select);
+ await execute(selectStbl);
+ await execute(dropDB);
+})()
+
+// (async () => {
+// result = await cursor.query("drop database if exists node_rest").catch(e=>console.log(e))
+// result.toString()
+// })()
diff --git a/src/kit/taosdemo/taosdemo.c b/src/kit/taosdemo/taosdemo.c
index 1c346307eea7310ea6d5f469f36acc63f7d8ccbb..b8201f04b78234b554532d2b3a3427bc888e89c1 100644
--- a/src/kit/taosdemo/taosdemo.c
+++ b/src/kit/taosdemo/taosdemo.c
@@ -586,6 +586,7 @@ static int64_t getTSRandTail(int64_t timeStampStep, int32_t seq,
int disorderRatio, int disorderRange);
static bool getInfoFromJsonFile(char* file);
static void init_rand_data();
+static int regexMatch(const char *s, const char *reg, int cflags);
/* ************ Global variables ************ */
@@ -803,7 +804,7 @@ static void printHelp() {
printf("%s%s%s%s\n", indent, "-q, --query-mode=MODE", "\t\t",
"Query mode -- 0: SYNC, 1: ASYNC. By default use SYNC.");
printf("%s%s%s%s\n", indent, "-b, --data-type=DATATYPE", "\t",
- "The data_type of columns, By default use: FLOAT, INT, FLOAT.");
+ "The data_type of columns, By default use: FLOAT,INT,FLOAT. NCHAR and BINARY can also use custom length. Eg: NCHAR(16),BINARY(8)");
printf("%s%s%s%s%d\n", indent, "-w, --binwidth=WIDTH", "\t\t",
"The width of data_type 'BINARY' or 'NCHAR'. By default use ",
g_args.binwidth);
@@ -1579,9 +1580,8 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
&& strcasecmp(dataType, "SMALLINT")
&& strcasecmp(dataType, "BIGINT")
&& strcasecmp(dataType, "DOUBLE")
- && strcasecmp(dataType, "BINARY")
&& strcasecmp(dataType, "TIMESTAMP")
- && strcasecmp(dataType, "NCHAR")
+ && !regexMatch(dataType, "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))?$", REG_ICASE | REG_EXTENDED)
&& strcasecmp(dataType, "UTINYINT")
&& strcasecmp(dataType, "USMALLINT")
&& strcasecmp(dataType, "UINT")
@@ -1603,9 +1603,11 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
arguments->data_type[0] = TSDB_DATA_TYPE_FLOAT;
} else if (0 == strcasecmp(dataType, "DOUBLE")) {
arguments->data_type[0] = TSDB_DATA_TYPE_DOUBLE;
- } else if (0 == strcasecmp(dataType, "BINARY")) {
+ } else if (1 == regexMatch(dataType, "^BINARY(\\([1-9][0-9]*\\))?$", REG_ICASE |
+ REG_EXTENDED)) {
arguments->data_type[0] = TSDB_DATA_TYPE_BINARY;
- } else if (0 == strcasecmp(dataType, "NCHAR")) {
+ } else if (1 == regexMatch(dataType, "^NCHAR(\\([1-9][0-9]*\\))?$", REG_ICASE |
+ REG_EXTENDED)) {
arguments->data_type[0] = TSDB_DATA_TYPE_NCHAR;
} else if (0 == strcasecmp(dataType, "BOOL")) {
arguments->data_type[0] = TSDB_DATA_TYPE_BOOL;
@@ -1638,9 +1640,8 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
&& strcasecmp(token, "SMALLINT")
&& strcasecmp(token, "BIGINT")
&& strcasecmp(token, "DOUBLE")
- && strcasecmp(token, "BINARY")
&& strcasecmp(token, "TIMESTAMP")
- && strcasecmp(token, "NCHAR")
+ && !regexMatch(token, "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))?$", REG_ICASE | REG_EXTENDED)
&& strcasecmp(token, "UTINYINT")
&& strcasecmp(token, "USMALLINT")
&& strcasecmp(token, "UINT")
@@ -1663,9 +1664,11 @@ static void parse_args(int argc, char *argv[], SArguments *arguments) {
arguments->data_type[index] = TSDB_DATA_TYPE_DOUBLE;
} else if (0 == strcasecmp(token, "TINYINT")) {
arguments->data_type[index] = TSDB_DATA_TYPE_TINYINT;
- } else if (0 == strcasecmp(token, "BINARY")) {
+ } else if (1 == regexMatch(token, "^BINARY(\\([1-9][0-9]*\\))?$", REG_ICASE |
+ REG_EXTENDED)) {
arguments->data_type[index] = TSDB_DATA_TYPE_BINARY;
- } else if (0 == strcasecmp(token, "NCHAR")) {
+ } else if (1 == regexMatch(token, "^NCHAR(\\([1-9][0-9]*\\))?$", REG_ICASE |
+ REG_EXTENDED)) {
arguments->data_type[index] = TSDB_DATA_TYPE_NCHAR;
} else if (0 == strcasecmp(token, "BOOL")) {
arguments->data_type[index] = TSDB_DATA_TYPE_BOOL;
@@ -2735,7 +2738,7 @@ static int printfInsertMeta() {
g_Dbs.db[i].superTbls[j].sampleFile);
printf(" tagsFile: \033[33m%s\033[0m\n",
g_Dbs.db[i].superTbls[j].tagsFile);
- printf(" columnCount: \033[33m%d\033[0m\n",
+ printf(" columnCount: \033[33m%d\033[0m\n ",
g_Dbs.db[i].superTbls[j].columnCount);
for (int k = 0; k < g_Dbs.db[i].superTbls[j].columnCount; k++) {
//printf("dataType:%s, dataLen:%d\t", g_Dbs.db[i].superTbls[j].columns[k].dataType, g_Dbs.db[i].superTbls[j].columns[k].dataLen);
@@ -2743,7 +2746,7 @@ static int printfInsertMeta() {
"binary", 6))
|| (0 == strncasecmp(g_Dbs.db[i].superTbls[j].columns[k].dataType,
"nchar", 5))) {
- printf("column[\033[33m%d\033[0m]:\033[33m%s(%d)\033[0m ", k,
+ printf("column[%d]:\033[33m%s(%d)\033[0m ", k,
g_Dbs.db[i].superTbls[j].columns[k].dataType,
g_Dbs.db[i].superTbls[j].columns[k].dataLen);
} else {
@@ -4271,6 +4274,10 @@ static int createSuperTable(
len += snprintf(tags + len, TSDB_MAX_TAGS_LEN - len,
"T%d %s,", tagIndex, "BIGINT UNSIGNED");
lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + BIGINT_BUFF_LEN;
+ } else if (strcasecmp(dataType, "TIMESTAMP") == 0) {
+ len += snprintf(tags + len, TSDB_MAX_TAGS_LEN - len,
+ "T%d %s,", tagIndex, "TIMESTAMP");
+ lenOfTagOfOneRow += superTbl->tags[tagIndex].dataLen + TIMESTAMP_BUFF_LEN;
} else {
taos_close(taos);
free(command);
@@ -6717,7 +6724,7 @@ static int generateSampleFromRand(
case TSDB_DATA_TYPE_NCHAR:
dataLen = (columns)?columns[c].dataLen:g_args.binwidth;
- rand_string(data, dataLen);
+ rand_string(data, dataLen - 1);
pos += sprintf(buff + pos, "%s,", data);
break;
@@ -8153,7 +8160,7 @@ UNUSED_FUNC static int32_t prepareStbStmtRand(
}
#if STMT_BIND_PARAM_BATCH == 1
-static int execBindParamBatch(
+static int execStbBindParamBatch(
threadInfo *pThreadInfo,
char *tableName,
int64_t tableSeq,
@@ -8167,7 +8174,9 @@ static int execBindParamBatch(
TAOS_STMT *stmt = pThreadInfo->stmt;
SSuperTable *stbInfo = pThreadInfo->stbInfo;
- uint32_t columnCount = (stbInfo)?pThreadInfo->stbInfo->columnCount:g_args.columnCount;
+ assert(stbInfo);
+
+ uint32_t columnCount = pThreadInfo->stbInfo->columnCount;
uint32_t thisBatch = MAX_SAMPLES - (*pSamplePos);
@@ -8192,108 +8201,101 @@ static int execBindParamBatch(
param->buffer = pThreadInfo->bind_ts_array;
} else {
- data_type = (stbInfo)?stbInfo->columns[c-1].data_type:g_args.data_type[c-1];
+ data_type = stbInfo->columns[c-1].data_type;
char *tmpP;
switch(data_type) {
case TSDB_DATA_TYPE_BINARY:
+ param->buffer_length =
+ stbInfo->columns[c-1].dataLen;
+
+ tmpP =
+ (char *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray
+ +sizeof(char*)*(c-1)));
+
+ verbosePrint("%s() LN%d, tmpP=%p pos=%"PRId64" width=%"PRIxPTR" position=%"PRId64"\n",
+ __func__, __LINE__, tmpP, *pSamplePos, param->buffer_length,
+ (*pSamplePos) * param->buffer_length);
+
+ param->buffer = (void *)(tmpP + *pSamplePos * param->buffer_length);
+ break;
+
case TSDB_DATA_TYPE_NCHAR:
param->buffer_length =
- ((stbInfo)?stbInfo->columns[c-1].dataLen:g_args.binwidth);
+ stbInfo->columns[c-1].dataLen;
tmpP =
(char *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray
+sizeof(char*)*(c-1)));
- verbosePrint("%s() LN%d, tmpP=%p pos=%"PRId64" width=%d position=%"PRId64"\n",
- __func__, __LINE__, tmpP, *pSamplePos,
- (((stbInfo)?stbInfo->columns[c-1].dataLen:g_args.binwidth)),
- (*pSamplePos) *
- (((stbInfo)?stbInfo->columns[c-1].dataLen:g_args.binwidth)));
+ verbosePrint("%s() LN%d, tmpP=%p pos=%"PRId64" width=%"PRIxPTR" position=%"PRId64"\n",
+ __func__, __LINE__, tmpP, *pSamplePos, param->buffer_length,
+ (*pSamplePos) * param->buffer_length);
- param->buffer = (void *)(tmpP + *pSamplePos *
- (((stbInfo)?stbInfo->columns[c-1].dataLen:g_args.binwidth))
- );
+ param->buffer = (void *)(tmpP + *pSamplePos * param->buffer_length);
break;
case TSDB_DATA_TYPE_INT:
case TSDB_DATA_TYPE_UINT:
param->buffer_length = sizeof(int32_t);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(int32_t)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
case TSDB_DATA_TYPE_TINYINT:
case TSDB_DATA_TYPE_UTINYINT:
param->buffer_length = sizeof(int8_t);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(
stbInfo->sampleBindBatchArray
+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen*(*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(
- g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(int8_t)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen*(*pSamplePos));
break;
case TSDB_DATA_TYPE_SMALLINT:
case TSDB_DATA_TYPE_USMALLINT:
param->buffer_length = sizeof(int16_t);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(int16_t)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
case TSDB_DATA_TYPE_BIGINT:
case TSDB_DATA_TYPE_UBIGINT:
param->buffer_length = sizeof(int64_t);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(int64_t)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
case TSDB_DATA_TYPE_BOOL:
param->buffer_length = sizeof(int8_t);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(int8_t)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
case TSDB_DATA_TYPE_FLOAT:
param->buffer_length = sizeof(float);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(float)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
case TSDB_DATA_TYPE_DOUBLE:
param->buffer_length = sizeof(double);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(double)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
case TSDB_DATA_TYPE_TIMESTAMP:
param->buffer_length = sizeof(int64_t);
- param->buffer = (stbInfo)?
+ param->buffer =
(void *)((uintptr_t)*(uintptr_t*)(stbInfo->sampleBindBatchArray+sizeof(char*)*(c-1))
- + stbInfo->columns[c-1].dataLen * (*pSamplePos)):
- (void *)((uintptr_t)*(uintptr_t*)(g_sampleBindBatchArray+sizeof(char*)*(c-1))
- + sizeof(int64_t)*(*pSamplePos));
+ + stbInfo->columns[c-1].dataLen * (*pSamplePos));
break;
default:
@@ -8314,7 +8316,7 @@ static int execBindParamBatch(
if (param->buffer_type == TSDB_DATA_TYPE_NCHAR) {
param->length[b] = strlen(
(char *)param->buffer + b *
- ((stbInfo)?stbInfo->columns[c].dataLen:g_args.binwidth)
+ stbInfo->columns[c].dataLen
);
} else {
param->length[b] = param->buffer_length;
@@ -8869,7 +8871,7 @@ static int32_t prepareStbStmt(
}
#if STMT_BIND_PARAM_BATCH == 1
- return execBindParamBatch(
+ return execStbBindParamBatch(
pThreadInfo,
tableName,
tableSeq,
@@ -10557,15 +10559,18 @@ static void startMultiThreadInsertData(int threads, char* db_name,
}
}
- fprintf(stderr, "insert delay, avg: %10.2fms, max: %10.2fms, min: %10.2fms\n\n",
- (double)avgDelay/1000.0,
- (double)maxDelay/1000.0,
- (double)minDelay/1000.0);
- if (g_fpOfInsertResult) {
- fprintf(g_fpOfInsertResult, "insert delay, avg:%10.2fms, max: %10.2fms, min: %10.2fms\n\n",
- (double)avgDelay/1000.0,
- (double)maxDelay/1000.0,
- (double)minDelay/1000.0);
+ if (minDelay != UINT64_MAX) {
+ fprintf(stderr, "insert delay, avg: %10.2fms, max: %10.2fms, min: %10.2fms\n\n",
+ (double)avgDelay/1000.0,
+ (double)maxDelay/1000.0,
+ (double)minDelay/1000.0);
+
+ if (g_fpOfInsertResult) {
+ fprintf(g_fpOfInsertResult, "insert delay, avg:%10.2fms, max: %10.2fms, min: %10.2fms\n\n",
+ (double)avgDelay/1000.0,
+ (double)maxDelay/1000.0,
+ (double)minDelay/1000.0);
+ }
}
//taos_close(taos);
@@ -11736,6 +11741,8 @@ static void initOfQueryMeta() {
}
static void setParaFromArg() {
+ char type[20];
+ char length[20];
if (g_args.host) {
tstrncpy(g_Dbs.host, g_args.host, MAX_HOSTNAME_SIZE);
} else {
@@ -11817,7 +11824,17 @@ static void setParaFromArg() {
g_Dbs.db[0].superTbls[0].columns[i].data_type = data_type[i];
tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType,
dataType[i], min(DATATYPE_BUFF_LEN, strlen(dataType[i]) + 1));
- g_Dbs.db[0].superTbls[0].columns[i].dataLen = g_args.binwidth;
+ if (1 == regexMatch(dataType[i], "^(NCHAR|BINARY)(\\([1-9][0-9]*\\))$", REG_ICASE |
+ REG_EXTENDED)) {
+ sscanf(dataType[i], "%[^(](%[^)]", type, length);
+ g_Dbs.db[0].superTbls[0].columns[i].dataLen = atoi(length);
+ tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType,
+ type, min(DATATYPE_BUFF_LEN, strlen(type) + 1));
+ } else {
+ g_Dbs.db[0].superTbls[0].columns[i].dataLen = g_args.binwidth;
+ tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType,
+ dataType[i], min(DATATYPE_BUFF_LEN, strlen(dataType[i]) + 1));
+ }
g_Dbs.db[0].superTbls[0].columnCount++;
}
@@ -12065,4 +12082,3 @@ int main(int argc, char *argv[]) {
return 0;
}
-
diff --git a/src/kit/taosdump/CMakeLists.txt b/src/kit/taosdump/CMakeLists.txt
index c3c914e96fc096f59aa701d3496455c754356aa8..75ce520c2e6bd4fd24e25b6297c7f99cc7fdfe75 100644
--- a/src/kit/taosdump/CMakeLists.txt
+++ b/src/kit/taosdump/CMakeLists.txt
@@ -6,6 +6,61 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(. SRC)
+FIND_PACKAGE(Git)
+IF(GIT_FOUND)
+ EXECUTE_PROCESS(
+ COMMAND ${GIT_EXECUTABLE} log --pretty=oneline -n 1 ${CMAKE_CURRENT_LIST_DIR}/taosdump.c
+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE TAOSDUMP_COMMIT_SHA1
+ )
+ IF ("${TAOSDUMP_COMMIT_SHA1}" STREQUAL "")
+ SET(TAOSDUMP_COMMIT_SHA1 "unknown")
+ ELSE ()
+ STRING(SUBSTRING "${TAOSDUMP_COMMIT_SHA1}" 0 7 TAOSDUMP_COMMIT_SHA1)
+ STRING(STRIP "${TAOSDUMP_COMMIT_SHA1}" TAOSDUMP_COMMIT_SHA1)
+ ENDIF ()
+ EXECUTE_PROCESS(
+ COMMAND ${GIT_EXECUTABLE} status -z -s ${CMAKE_CURRENT_LIST_DIR}/taosdump.c
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE TAOSDUMP_STATUS
+ )
+ IF (TD_LINUX)
+ EXECUTE_PROCESS(
+ COMMAND bash "-c" "echo '${TAOSDUMP_STATUS}' | awk '{print $1}'"
+ RESULT_VARIABLE RESULT
+ OUTPUT_VARIABLE TAOSDUMP_STATUS
+ )
+ ENDIF (TD_LINUX)
+ELSE()
+ MESSAGE("Git not found")
+ SET(TAOSDUMP_COMMIT_SHA1 "unknown")
+ SET(TAOSDUMP_STATUS "unknown")
+ENDIF (GIT_FOUND)
+
+MESSAGE("taosdump's latest commit in short is:" ${TAOSDUMP_COMMIT_SHA1})
+STRING(STRIP "${TAOSDUMP_STATUS}" TAOSDUMP_STATUS)
+
+IF (TAOSDUMP_STATUS MATCHES "M")
+ SET(TAOSDUMP_STATUS "modified")
+ELSE()
+ SET(TAOSDUMP_STATUS "")
+ENDIF ()
+
+MESSAGE("taosdump's status is:" ${TAOSDUMP_STATUS})
+
+ADD_DEFINITIONS(-DTAOSDUMP_COMMIT_SHA1="${TAOSDUMP_COMMIT_SHA1}")
+ADD_DEFINITIONS(-DTAOSDUMP_STATUS="${TAOSDUMP_STATUS}")
+
+MESSAGE("VERNUMBER is:" ${VERNUMBER})
+IF ("${VERNUMBER}" STREQUAL "")
+ SET(TD_VERSION_NUMBER "TDengine-version-unknown")
+ELSE()
+ SET(TD_VERSION_NUMBER ${VERNUMBER})
+ENDIF ()
+MESSAGE("TD_VERSION_NUMBER is:" ${TD_VERSION_NUMBER})
+ADD_DEFINITIONS(-DTD_VERNUMBER="${TD_VERSION_NUMBER}")
+
IF (TD_LINUX)
ADD_EXECUTABLE(taosdump ${SRC})
IF (TD_SOMODE_STATIC)
diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c
index 2f5bf8f6d52bb9e4cc8fabdcbaa727b014f88e64..3bb62af6f63cf4c896b3bb2ffb375a15f74f85b6 100644
--- a/src/kit/taosdump/taosdump.c
+++ b/src/kit/taosdump/taosdump.c
@@ -25,7 +25,6 @@
#include "tsclient.h"
#include "tsdb.h"
#include "tutil.h"
-#include
#define TSDB_SUPPORT_NANOSECOND 1
@@ -120,7 +119,7 @@ enum _show_tables_index {
TSDB_MAX_SHOW_TABLES
};
-// ---------------------------------- DESCRIBE METRIC CONFIGURE ------------------------------
+// ---------------------------------- DESCRIBE STABLE CONFIGURE ------------------------------
enum _describe_table_index {
TSDB_DESCRIBE_METRIC_FIELD_INDEX,
TSDB_DESCRIBE_METRIC_TYPE_INDEX,
@@ -148,10 +147,28 @@ extern char version[];
#define DB_PRECISION_LEN 8
#define DB_STATUS_LEN 16
+typedef struct {
+ char name[TSDB_TABLE_NAME_LEN];
+ bool belongStb;
+ char stable[TSDB_TABLE_NAME_LEN];
+} TableInfo;
+
+typedef struct {
+ char name[TSDB_TABLE_NAME_LEN];
+ char stable[TSDB_TABLE_NAME_LEN];
+} TableRecord;
+
+typedef struct {
+ bool isStable;
+ int64_t dumpNtbCount;
+ TableRecord **dumpNtbInfos;
+ TableRecord tableRecord;
+} TableRecordInfo;
+
typedef struct {
char name[TSDB_DB_NAME_LEN];
char create_time[32];
- int32_t ntables;
+ int64_t ntables;
int32_t vgroups;
int16_t replica;
int16_t quorum;
@@ -171,28 +188,22 @@ typedef struct {
char precision[DB_PRECISION_LEN]; // time resolution
int8_t update;
char status[DB_STATUS_LEN];
+ int64_t dumpTbCount;
+ TableRecordInfo **dumpTbInfos;
} SDbInfo;
-typedef struct {
- char name[TSDB_TABLE_NAME_LEN];
- char metric[TSDB_TABLE_NAME_LEN];
-} STableRecord;
-
-typedef struct {
- bool isMetric;
- STableRecord tableRecord;
-} STableRecordInfo;
-
typedef struct {
pthread_t threadID;
int32_t threadIndex;
int32_t totalThreads;
char dbName[TSDB_DB_NAME_LEN];
- int precision;
- void *taosCon;
+ char stbName[TSDB_TABLE_NAME_LEN];
+ int precision;
+ TAOS *taos;
int64_t rowsOfDumpOut;
int64_t tablesOfDumpOut;
-} SThreadParaObj;
+ int64_t tableFrom;
+} threadInfo;
typedef struct {
int64_t totalRowsOfDumpOut;
@@ -204,6 +215,7 @@ typedef struct {
static int64_t g_totalDumpOutRows = 0;
SDbInfo **g_dbInfos = NULL;
+TableInfo *g_tablesList = NULL;
const char *argp_program_version = version;
const char *argp_program_bug_address = "";
@@ -262,6 +274,8 @@ static struct argp_option options[] = {
{0}
};
+#define HUMAN_TIME_LEN 28
+
/* Used by main to communicate with parse_opt. */
typedef struct arguments {
// connection option
@@ -285,9 +299,9 @@ typedef struct arguments {
bool with_property;
bool avro;
int64_t start_time;
- char humanStartTime[28];
+ char humanStartTime[HUMAN_TIME_LEN];
int64_t end_time;
- char humanEndTime[28];
+ char humanEndTime[HUMAN_TIME_LEN];
char precision[8];
int32_t data_batch;
@@ -298,13 +312,13 @@ typedef struct arguments {
int32_t thread_num;
int abort;
char **arg_list;
- int arg_list_len;
- bool isDumpIn;
- bool debug_print;
- bool verbose_print;
- bool performance_print;
+ int arg_list_len;
+ bool isDumpIn;
+ bool debug_print;
+ bool verbose_print;
+ bool performance_print;
- int dbCount;
+ int dumpDbCount;
} SArguments;
/* Our argp parser. */
@@ -319,25 +333,20 @@ static int taosDumpOut();
static int taosDumpIn();
static void taosDumpCreateDbClause(SDbInfo *dbInfo, bool isDumpProperty,
FILE *fp);
-static int taosDumpDb(SDbInfo *dbInfo, FILE *fp, TAOS *taosCon);
-static int32_t taosDumpStable(char *table, FILE *fp, TAOS* taosCon,
- char* dbName);
-static void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols,
+//static int taosDumpDb(SDbInfo *dbInfo, FILE *fp, TAOS *taos);
+static int dumpStable(char *table, FILE *fp, SDbInfo *dbInfo);
+static int dumpCreateTableClause(STableDef *tableDes, int numOfCols,
FILE *fp, char* dbName);
-static void taosDumpCreateMTableClause(STableDef *tableDes, char *metric,
+static void taosDumpCreateMTableClause(STableDef *tableDes, char *stable,
int numOfCols, FILE *fp, char* dbName);
-static int32_t taosDumpTable(char *tbName, char *metric,
- FILE *fp, TAOS* taosCon, char* dbName, int precision);
-static int taosDumpTableData(FILE *fp, char *tbName,
- TAOS* taosCon, char* dbName,
+static int64_t taosDumpTable(char *tbName, char *stable,
+ FILE *fp, char* dbName, int precision);
+static int64_t dumpTableData(FILE *fp, char *tbName,
+ char* dbName,
int precision,
char *jsonAvroSchema);
-static int taosCheckParam(struct arguments *arguments);
+static int checkParam();
static void taosFreeDbInfos();
-static void taosStartDumpOutWorkThreads(
- int32_t numOfThread,
- char *dbName,
- int precision);
struct arguments g_args = {
// connection option
@@ -381,9 +390,36 @@ struct arguments g_args = {
false, // debug_print
false, // verbose_print
false, // performance_print
- 0, // dbCount
+ 0, // dumpDbCount
};
+// get taosdump commit number version
+#ifndef TAOSDUMP_COMMIT_SHA1
+#define TAOSDUMP_COMMIT_SHA1 "unknown"
+#endif
+
+#ifndef TD_VERNUMBER
+#define TD_VERNUMBER "unknown"
+#endif
+
+#ifndef TAOSDUMP_STATUS
+#define TAOSDUMP_STATUS "unknown"
+#endif
+
+static void printVersion() {
+ char tdengine_ver[] = TD_VERNUMBER;
+ char taosdump_ver[] = TAOSDUMP_COMMIT_SHA1;
+ char taosdump_status[] = TAOSDUMP_STATUS;
+
+ if (strlen(taosdump_status) == 0) {
+ printf("taosdump version %s-%s\n",
+ tdengine_ver, taosdump_ver);
+ } else {
+ printf("taosdump version %s-%s, status:%s\n",
+ tdengine_ver, taosdump_ver, taosdump_status);
+ }
+}
+
UNUSED_FUNC void errorWrongValue(char *program, char *wrong_arg, char *wrong_value)
{
fprintf(stderr, "%s %s: %s is an invalid value\n", program, wrong_arg, wrong_value);
@@ -457,23 +493,38 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
errorPrint("Invalid path %s\n", arg);
return -1;
}
- tstrncpy(g_args.outpath, full_path.we_wordv[0],
- MAX_FILE_NAME_LEN);
- wordfree(&full_path);
+
+ if (full_path.we_wordv[0]) {
+ tstrncpy(g_args.outpath, full_path.we_wordv[0],
+ MAX_FILE_NAME_LEN);
+ wordfree(&full_path);
+ } else {
+ errorPrintReqArg3("taosdump", "-o or --outpath");
+ exit(EXIT_FAILURE);
+ }
break;
+
case 'g':
g_args.debug_print = true;
break;
+
case 'i':
g_args.isDumpIn = true;
if (wordexp(arg, &full_path, 0) != 0) {
errorPrint("Invalid path %s\n", arg);
return -1;
}
- tstrncpy(g_args.inpath, full_path.we_wordv[0],
- MAX_FILE_NAME_LEN);
- wordfree(&full_path);
+
+ if (full_path.we_wordv[0]) {
+ tstrncpy(g_args.inpath, full_path.we_wordv[0],
+ MAX_FILE_NAME_LEN);
+ wordfree(&full_path);
+ } else {
+ errorPrintReqArg3("taosdump", "-i or --inpath");
+ exit(EXIT_FAILURE);
+ }
break;
+
case 'r':
g_args.resultFile = arg;
break;
@@ -556,66 +607,29 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
}
static int queryDbImpl(TAOS *taos, char *command) {
- int i;
TAOS_RES *res = NULL;
int32_t code = -1;
- for (i = 0; i < 5; i++) {
- if (NULL != res) {
- taos_free_result(res);
- res = NULL;
- }
-
- res = taos_query(taos, command);
- code = taos_errno(res);
- if (0 == code) {
- break;
- }
+ if (NULL != res) {
+ taos_free_result(res);
+ res = NULL;
}
+ res = taos_query(taos, command);
+ code = taos_errno(res);
+
if (code != 0) {
- errorPrint("Failed to run <%s>, reason: %s\n", command, taos_errstr(res));
+ errorPrint("Failed to run <%s>, reason: %s\n",
+ command, taos_errstr(res));
taos_free_result(res);
//taos_close(taos);
- return -1;
+ return code;
}
taos_free_result(res);
return 0;
}
-UNUSED_FUNC static void parse_precision_first(
- int argc, char *argv[], SArguments *arguments) {
- for (int i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-C") == 0) {
- if (NULL == argv[i+1]) {
- errorPrint("%s need a valid value following!\n", argv[i]);
- exit(-1);
- }
- char *tmp = strdup(argv[i+1]);
- if (tmp == NULL) {
- errorPrint("%s() LN%d, strdup() cannot allocate memory\n",
- __func__, __LINE__);
- exit(-1);
- }
- if ((0 != strncasecmp(tmp, "ms", strlen("ms")))
- && (0 != strncasecmp(tmp, "us", strlen("us")))
-#if TSDB_SUPPORT_NANOSECOND == 1
- && (0 != strncasecmp(tmp, "ns", strlen("ns")))
-#endif
- ) {
- //
- errorPrint("input precision: %s is invalid value\n", tmp);
- free(tmp);
- exit(-1);
- }
- tstrncpy(g_args.precision, tmp,
- min(DB_PRECISION_LEN, strlen(tmp) + 1));
- free(tmp);
- }
- }
-}
-
static void parse_args(
int argc, char *argv[], SArguments *arguments) {
@@ -671,6 +685,10 @@ static void parse_args(
exit(EXIT_FAILURE);
}
g_args.databases = true;
+ } else if (0 == strncmp(argv[i], "--version", strlen("--version")) ||
+ 0 == strncmp(argv[i], "-V", strlen("-V"))) {
+ printVersion();
+ exit(EXIT_SUCCESS);
} else {
continue;
}
@@ -681,9 +699,9 @@ static void parse_args(
static void copyHumanTimeToArg(char *timeStr, bool isStartTime)
{
if (isStartTime)
- strcpy(g_args.humanStartTime, timeStr);
+ tstrncpy(g_args.humanStartTime, timeStr, HUMAN_TIME_LEN);
else
- strcpy(g_args.humanEndTime, timeStr);
+ tstrncpy(g_args.humanEndTime, timeStr, HUMAN_TIME_LEN);
}
static void copyTimestampToArg(char *timeStr, bool isStartTime)
@@ -719,6 +737,8 @@ static void parse_timestamp(
} else {
copyTimestampToArg(tmp, isStartTime);
}
+
+ free(tmp);
}
}
}
@@ -744,245 +764,49 @@ static int getPrecisionByString(char *precision)
return -1;
}
-/*
-static void parse_timestamp(
- int argc, char *argv[], SArguments *arguments) {
- for (int i = 1; i < argc; i++) {
- if ((strcmp(argv[i], "-S") == 0)
- || (strcmp(argv[i], "-E") == 0)) {
- if (NULL == argv[i+1]) {
- errorPrint("%s need a valid value following!\n", argv[i]);
- exit(-1);
- }
- char *tmp = strdup(argv[i+1]);
- if (NULL == tmp) {
- errorPrint("%s() LN%d, strdup() cannot allocate memory\n",
- __func__, __LINE__);
- exit(-1);
- }
-
- int64_t tmpEpoch;
- if (strchr(tmp, ':') && strchr(tmp, '-')) {
- strcpy(g_args.humanStartTime, tmp)
- int32_t timePrec;
- if (0 == strncasecmp(arguments->precision,
- "ms", strlen("ms"))) {
- timePrec = TSDB_TIME_PRECISION_MILLI;
- } else if (0 == strncasecmp(arguments->precision,
- "us", strlen("us"))) {
- timePrec = TSDB_TIME_PRECISION_MICRO;
-#if TSDB_SUPPORT_NANOSECOND == 1
- } else if (0 == strncasecmp(arguments->precision,
- "ns", strlen("ns"))) {
- timePrec = TSDB_TIME_PRECISION_NANO;
-#endif
- } else {
- errorPrint("Invalid time precision: %s",
- arguments->precision);
- free(tmp);
- return;
- }
-
- if (TSDB_CODE_SUCCESS != taosParseTime(
- tmp, &tmpEpoch, strlen(tmp),
- timePrec, 0)) {
- errorPrint("Input %s, end time error!\n", tmp);
- free(tmp);
- return;
- }
- } else {
- tstrncpy(arguments->precision, "n/a", strlen("n/a") + 1);
- tmpEpoch = atoll(tmp);
- }
-
- sprintf(argv[i+1], "%"PRId64"", tmpEpoch);
- debugPrint("%s() LN%d, tmp is: %s, argv[%d]: %s\n",
- __func__, __LINE__, tmp, i, argv[i]);
- free(tmp);
- }
- }
-}
-*/
-
-int main(int argc, char *argv[]) {
- static char verType[32] = {0};
- sprintf(verType, "version: %s\n", version);
- argp_program_version = verType;
-
- int ret = 0;
- /* Parse our arguments; every option seen by parse_opt will be
- reflected in arguments. */
- if (argc > 1) {
-// parse_precision_first(argc, argv, &g_args);
- parse_timestamp(argc, argv, &g_args);
- parse_args(argc, argv, &g_args);
- }
-
- argp_parse(&argp, argc, argv, 0, 0, &g_args);
-
- if (g_args.abort) {
-#ifndef _ALPINE
- error(10, 0, "ABORTED");
-#else
- abort();
-#endif
- }
-
- printf("====== arguments config ======\n");
- {
- printf("host: %s\n", g_args.host);
- printf("user: %s\n", g_args.user);
- printf("password: %s\n", g_args.password);
- printf("port: %u\n", g_args.port);
- printf("mysqlFlag: %d\n", g_args.mysqlFlag);
- printf("outpath: %s\n", g_args.outpath);
- printf("inpath: %s\n", g_args.inpath);
- printf("resultFile: %s\n", g_args.resultFile);
- printf("encode: %s\n", g_args.encode);
- printf("all_databases: %s\n", g_args.all_databases?"true":"false");
- printf("databases: %d\n", g_args.databases);
- printf("databasesSeq: %s\n", g_args.databasesSeq);
- printf("schemaonly: %s\n", g_args.schemaonly?"true":"false");
- printf("with_property: %s\n", g_args.with_property?"true":"false");
- printf("avro format: %s\n", g_args.avro?"true":"false");
- printf("start_time: %" PRId64 "\n", g_args.start_time);
- printf("human readable start time: %s \n", g_args.humanStartTime);
- printf("end_time: %" PRId64 "\n", g_args.end_time);
- printf("human readable end time: %s \n", g_args.humanEndTime);
- printf("precision: %s\n", g_args.precision);
- printf("data_batch: %d\n", g_args.data_batch);
- printf("max_sql_len: %d\n", g_args.max_sql_len);
- printf("table_batch: %d\n", g_args.table_batch);
- printf("thread_num: %d\n", g_args.thread_num);
- printf("allow_sys: %d\n", g_args.allow_sys);
- printf("abort: %d\n", g_args.abort);
- printf("isDumpIn: %d\n", g_args.isDumpIn);
- printf("arg_list_len: %d\n", g_args.arg_list_len);
- printf("debug_print: %d\n", g_args.debug_print);
-
- for (int32_t i = 0; i < g_args.arg_list_len; i++) {
- printf("arg_list[%d]: %s\n", i, g_args.arg_list[i]);
- }
- }
- printf("==============================\n");
- if (taosCheckParam(&g_args) < 0) {
- exit(EXIT_FAILURE);
- }
-
- g_fpOfResult = fopen(g_args.resultFile, "a");
- if (NULL == g_fpOfResult) {
- errorPrint("Failed to open %s for save result\n", g_args.resultFile);
- exit(-1);
- };
-
- fprintf(g_fpOfResult, "#############################################################################\n");
- fprintf(g_fpOfResult, "============================== arguments config =============================\n");
- {
- fprintf(g_fpOfResult, "host: %s\n", g_args.host);
- fprintf(g_fpOfResult, "user: %s\n", g_args.user);
- fprintf(g_fpOfResult, "password: %s\n", g_args.password);
- fprintf(g_fpOfResult, "port: %u\n", g_args.port);
- fprintf(g_fpOfResult, "mysqlFlag: %d\n", g_args.mysqlFlag);
- fprintf(g_fpOfResult, "outpath: %s\n", g_args.outpath);
- fprintf(g_fpOfResult, "inpath: %s\n", g_args.inpath);
- fprintf(g_fpOfResult, "resultFile: %s\n", g_args.resultFile);
- fprintf(g_fpOfResult, "encode: %s\n", g_args.encode);
- fprintf(g_fpOfResult, "all_databases: %s\n", g_args.all_databases?"true":"false");
- fprintf(g_fpOfResult, "databases: %d\n", g_args.databases);
- fprintf(g_fpOfResult, "databasesSeq: %s\n", g_args.databasesSeq);
- fprintf(g_fpOfResult, "schemaonly: %s\n", g_args.schemaonly?"true":"false");
- fprintf(g_fpOfResult, "with_property: %s\n", g_args.with_property?"true":"false");
- fprintf(g_fpOfResult, "avro format: %s\n", g_args.avro?"true":"false");
- fprintf(g_fpOfResult, "start_time: %" PRId64 "\n", g_args.start_time);
- fprintf(g_fpOfResult, "human readable start time: %s \n", g_args.humanStartTime);
- fprintf(g_fpOfResult, "end_time: %" PRId64 "\n", g_args.end_time);
- fprintf(g_fpOfResult, "human readable end time: %s \n", g_args.humanEndTime);
- fprintf(g_fpOfResult, "precision: %s\n", g_args.precision);
- fprintf(g_fpOfResult, "data_batch: %d\n", g_args.data_batch);
- fprintf(g_fpOfResult, "max_sql_len: %d\n", g_args.max_sql_len);
- fprintf(g_fpOfResult, "table_batch: %d\n", g_args.table_batch);
- fprintf(g_fpOfResult, "thread_num: %d\n", g_args.thread_num);
- fprintf(g_fpOfResult, "allow_sys: %d\n", g_args.allow_sys);
- fprintf(g_fpOfResult, "abort: %d\n", g_args.abort);
- fprintf(g_fpOfResult, "isDumpIn: %d\n", g_args.isDumpIn);
- fprintf(g_fpOfResult, "arg_list_len: %d\n", g_args.arg_list_len);
-
- for (int32_t i = 0; i < g_args.arg_list_len; i++) {
- fprintf(g_fpOfResult, "arg_list[%d]: %s\n", i, g_args.arg_list[i]);
- }
- }
-
- g_numOfCores = (int32_t)sysconf(_SC_NPROCESSORS_ONLN);
-
- time_t tTime = time(NULL);
- struct tm tm = *localtime(&tTime);
-
- if (g_args.isDumpIn) {
- fprintf(g_fpOfResult, "============================== DUMP IN ============================== \n");
- fprintf(g_fpOfResult, "# DumpIn start time: %d-%02d-%02d %02d:%02d:%02d\n",
- tm.tm_year + 1900, tm.tm_mon + 1,
- tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
- if (taosDumpIn() < 0) {
- ret = -1;
- }
- } else {
- fprintf(g_fpOfResult, "============================== DUMP OUT ============================== \n");
- fprintf(g_fpOfResult, "# DumpOut start time: %d-%02d-%02d %02d:%02d:%02d\n",
- tm.tm_year + 1900, tm.tm_mon + 1,
- tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
- if (taosDumpOut() < 0) {
- ret = -1;
- } else {
- fprintf(g_fpOfResult, "\n============================== TOTAL STATISTICS ============================== \n");
- fprintf(g_fpOfResult, "# total database count: %d\n",
- g_resultStatistics.totalDatabasesOfDumpOut);
- fprintf(g_fpOfResult, "# total super table count: %d\n",
- g_resultStatistics.totalSuperTblsOfDumpOut);
- fprintf(g_fpOfResult, "# total child table count: %"PRId64"\n",
- g_resultStatistics.totalChildTblsOfDumpOut);
- fprintf(g_fpOfResult, "# total row count: %"PRId64"\n",
- g_resultStatistics.totalRowsOfDumpOut);
- }
- }
-
- fprintf(g_fpOfResult, "\n");
- fclose(g_fpOfResult);
-
- return ret;
-}
-
static void taosFreeDbInfos() {
if (g_dbInfos == NULL) return;
- for (int i = 0; i < g_args.dbCount; i++)
+ for (int i = 0; i < g_args.dumpDbCount; i++)
tfree(g_dbInfos[i]);
tfree(g_dbInfos);
}
// check table is normal table or super table
-static int taosGetTableRecordInfo(
- char *table, STableRecordInfo *pTableRecordInfo, TAOS *taosCon) {
+static int getTableRecordInfo(
+ char *dbName,
+ char *table, TableRecordInfo *pTableRecordInfo) {
+ TAOS *taos = taos_connect(g_args.host, g_args.user, g_args.password,
+ dbName, g_args.port);
+ if (taos == NULL) {
+ errorPrint("Failed to connect to TDengine server %s\n", g_args.host);
+ return -1;
+ }
+
TAOS_ROW row = NULL;
bool isSet = false;
TAOS_RES *result = NULL;
- memset(pTableRecordInfo, 0, sizeof(STableRecordInfo));
+ memset(pTableRecordInfo, 0, sizeof(TableRecordInfo));
- char* tempCommand = (char *)malloc(COMMAND_SIZE);
- if (tempCommand == NULL) {
- errorPrint("%s() LN%d, failed to allocate memory\n",
- __func__, __LINE__);
- return -1;
+ char command[COMMAND_SIZE];
+
+ sprintf(command, "USE %s", dbName);
+ result = taos_query(taos, command);
+ int32_t code = taos_errno(result);
+ if (code != 0) {
+ errorPrint("invalid database %s, reason: %s\n",
+ dbName, taos_errstr(result));
+ return 0;
}
- sprintf(tempCommand, "show tables like %s", table);
+ sprintf(command, "SHOW TABLES LIKE \'%s\'", table);
- result = taos_query(taosCon, tempCommand);
- int32_t code = taos_errno(result);
+ result = taos_query(taos, command);
+ code = taos_errno(result);
if (code != 0) {
- errorPrint("%s() LN%d, failed to run command %s\n",
- __func__, __LINE__, tempCommand);
- free(tempCommand);
+ errorPrint("%s() LN%d, failed to run command <%s>. reason: %s\n",
+ __func__, __LINE__, command, taos_errstr(result));
taos_free_result(result);
return -1;
}
@@ -991,12 +815,12 @@ static int taosGetTableRecordInfo(
while ((row = taos_fetch_row(result)) != NULL) {
isSet = true;
- pTableRecordInfo->isMetric = false;
+ pTableRecordInfo->isStable = false;
tstrncpy(pTableRecordInfo->tableRecord.name,
(char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
min(TSDB_TABLE_NAME_LEN,
fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes + 1));
- tstrncpy(pTableRecordInfo->tableRecord.metric,
+ tstrncpy(pTableRecordInfo->tableRecord.stable,
(char *)row[TSDB_SHOW_TABLES_METRIC_INDEX],
min(TSDB_TABLE_NAME_LEN,
fields[TSDB_SHOW_TABLES_METRIC_INDEX].bytes + 1));
@@ -1007,27 +831,25 @@ static int taosGetTableRecordInfo(
result = NULL;
if (isSet) {
- free(tempCommand);
return 0;
}
- sprintf(tempCommand, "show stables like %s", table);
+ sprintf(command, "SHOW STABLES LIKE \'%s\'", table);
- result = taos_query(taosCon, tempCommand);
+ result = taos_query(taos, command);
code = taos_errno(result);
if (code != 0) {
- errorPrint("%s() LN%d, failed to run command %s\n",
- __func__, __LINE__, tempCommand);
- free(tempCommand);
+ errorPrint("%s() LN%d, failed to run command <%s>. reason: %s\n",
+ __func__, __LINE__, command, taos_errstr(result));
taos_free_result(result);
return -1;
}
while ((row = taos_fetch_row(result)) != NULL) {
isSet = true;
- pTableRecordInfo->isMetric = true;
- tstrncpy(pTableRecordInfo->tableRecord.metric, table,
+ pTableRecordInfo->isStable = true;
+ tstrncpy(pTableRecordInfo->tableRecord.stable, table,
TSDB_TABLE_NAME_LEN);
break;
}
@@ -1036,154 +858,13 @@ static int taosGetTableRecordInfo(
result = NULL;
if (isSet) {
- free(tempCommand);
return 0;
}
- errorPrint("%s() LN%d, invalid table/metric %s\n",
+ errorPrint("%s() LN%d, invalid table/stable %s\n",
__func__, __LINE__, table);
- free(tempCommand);
return -1;
}
-
-static int32_t taosSaveAllNormalTableToTempFile(TAOS *taosCon, char*meter,
- char* metric, int* fd) {
- STableRecord tableRecord;
-
- if (-1 == *fd) {
- *fd = open(".tables.tmp.0",
- O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (*fd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: .tables.tmp.0\n",
- __func__, __LINE__);
- return -1;
- }
- }
-
- memset(&tableRecord, 0, sizeof(STableRecord));
- tstrncpy(tableRecord.name, meter, TSDB_TABLE_NAME_LEN);
- tstrncpy(tableRecord.metric, metric, TSDB_TABLE_NAME_LEN);
-
- taosWrite(*fd, &tableRecord, sizeof(STableRecord));
- return 0;
-}
-
-static int32_t taosSaveTableOfMetricToTempFile(
- TAOS *taosCon, char* metric,
- int32_t* totalNumOfThread) {
- TAOS_ROW row;
- int fd = -1;
- STableRecord tableRecord;
-
- char* tmpCommand = (char *)malloc(COMMAND_SIZE);
- if (tmpCommand == NULL) {
- errorPrint("%s() LN%d, failed to allocate memory\n", __func__, __LINE__);
- return -1;
- }
-
- sprintf(tmpCommand, "select tbname from %s", metric);
-
- TAOS_RES *res = taos_query(taosCon, tmpCommand);
- int32_t code = taos_errno(res);
- if (code != 0) {
- errorPrint("%s() LN%d, failed to run command %s\n",
- __func__, __LINE__, tmpCommand);
- free(tmpCommand);
- taos_free_result(res);
- return -1;
- }
- free(tmpCommand);
-
- char tmpBuf[MAX_FILE_NAME_LEN];
- memset(tmpBuf, 0, MAX_FILE_NAME_LEN);
- sprintf(tmpBuf, ".select-tbname.tmp");
- fd = open(tmpBuf, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (fd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: %s\n",
- __func__, __LINE__, tmpBuf);
- taos_free_result(res);
- return -1;
- }
-
- TAOS_FIELD *fields = taos_fetch_fields(res);
-
- int32_t numOfTable = 0;
- while ((row = taos_fetch_row(res)) != NULL) {
-
- memset(&tableRecord, 0, sizeof(STableRecord));
- tstrncpy(tableRecord.name, (char *)row[0], fields[0].bytes);
- tstrncpy(tableRecord.metric, metric, TSDB_TABLE_NAME_LEN);
-
- taosWrite(fd, &tableRecord, sizeof(STableRecord));
- numOfTable++;
- }
- taos_free_result(res);
- lseek(fd, 0, SEEK_SET);
-
- int maxThreads = g_args.thread_num;
- int tableOfPerFile ;
- if (numOfTable <= g_args.thread_num) {
- tableOfPerFile = 1;
- maxThreads = numOfTable;
- } else {
- tableOfPerFile = numOfTable / g_args.thread_num;
- if (0 != numOfTable % g_args.thread_num) {
- tableOfPerFile += 1;
- }
- }
-
- char* tblBuf = (char*)calloc(1, tableOfPerFile * sizeof(STableRecord));
- if (NULL == tblBuf){
- errorPrint("%s() LN%d, failed to calloc %" PRIzu "\n",
- __func__, __LINE__, tableOfPerFile * sizeof(STableRecord));
- close(fd);
- return -1;
- }
-
- int32_t numOfThread = *totalNumOfThread;
- int subFd = -1;
- for (; numOfThread <= maxThreads; numOfThread++) {
- memset(tmpBuf, 0, MAX_FILE_NAME_LEN);
- sprintf(tmpBuf, ".tables.tmp.%d", numOfThread);
- subFd = open(tmpBuf, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (subFd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: %s\n",
- __func__, __LINE__, tmpBuf);
- for (int32_t loopCnt = 0; loopCnt < numOfThread; loopCnt++) {
- sprintf(tmpBuf, ".tables.tmp.%d", loopCnt);
- (void)remove(tmpBuf);
- }
- sprintf(tmpBuf, ".select-tbname.tmp");
- (void)remove(tmpBuf);
- free(tblBuf);
- close(fd);
- return -1;
- }
-
- // read tableOfPerFile for fd, write to subFd
- ssize_t readLen = read(fd, tblBuf, tableOfPerFile * sizeof(STableRecord));
- if (readLen <= 0) {
- close(subFd);
- break;
- }
- taosWrite(subFd, tblBuf, readLen);
- close(subFd);
- }
-
- sprintf(tmpBuf, ".select-tbname.tmp");
- (void)remove(tmpBuf);
-
- if (fd >= 0) {
- close(fd);
- fd = -1;
- }
-
- *totalNumOfThread = numOfThread;
-
- free(tblBuf);
- return 0;
-}
-
static int inDatabasesSeq(
char *name,
int len)
@@ -1210,7 +891,7 @@ static int inDatabasesSeq(
return -1;
}
-static int getDbCount()
+static int getDumpDbCount()
{
int count = 0;
@@ -1231,8 +912,9 @@ static int getDbCount()
int32_t code = taos_errno(result);
if (0 != code) {
- errorPrint("%s() LN%d, failed to run command: %s, reason: %s\n",
+ errorPrint("%s() LN%d, failed to run command <%s>, reason: %s\n",
__func__, __LINE__, command, taos_errstr(result));
+ taos_close(taos);
return 0;
}
@@ -1265,18 +947,460 @@ static int getDbCount()
errorPrint("%d databases valid to dump\n", count);
}
+ taos_close(taos);
return count;
}
+static int64_t dumpNormalTableWithoutStb(SDbInfo *dbInfo, char *ntbName)
+{
+ int64_t count = 0;
+
+ char tmpBuf[4096] = {0};
+ FILE *fp = NULL;
+
+ if (g_args.outpath[0] != 0) {
+ sprintf(tmpBuf, "%s/%s.%s.sql",
+ g_args.outpath, dbInfo->name, ntbName);
+ } else {
+ sprintf(tmpBuf, "%s.%s.sql",
+ dbInfo->name, ntbName);
+ }
+
+ fp = fopen(tmpBuf, "w");
+ if (fp == NULL) {
+ errorPrint("%s() LN%d, failed to open file %s\n",
+ __func__, __LINE__, tmpBuf);
+ return -1;
+ }
+
+ count = taosDumpTable(ntbName, NULL,
+ fp, dbInfo->name, getPrecisionByString(dbInfo->precision));
+
+ fclose(fp);
+ return count;
+}
+
+static int64_t dumpNormalTable(FILE *fp, TAOS *taos, char *dbName, char *tbName,
+ char *stbName,
+ int precision)
+{
+ int64_t count = 0;
+ count = taosDumpTable(tbName, stbName,
+ fp, dbName, precision);
+
+ return count;
+}
+
+static void *dumpNtbOfDb(void *arg) {
+ threadInfo *pThreadInfo = (threadInfo *)arg;
+
+ debugPrint("dump table from = \t%"PRId64"\n", pThreadInfo->tableFrom);
+ debugPrint("dump table count = \t%"PRId64"\n",
+ pThreadInfo->tablesOfDumpOut);
+
+ FILE *fp = NULL;
+ char tmpBuf[4096] = {0};
+
+ if (g_args.outpath[0] != 0) {
+ sprintf(tmpBuf, "%s/%s.%d.sql",
+ g_args.outpath, pThreadInfo->dbName, pThreadInfo->threadIndex);
+ } else {
+ sprintf(tmpBuf, "%s.%d.sql",
+ pThreadInfo->dbName, pThreadInfo->threadIndex);
+ }
+
+ fp = fopen(tmpBuf, "w");
+
+ if (fp == NULL) {
+ errorPrint("%s() LN%d, failed to open file %s\n",
+ __func__, __LINE__, tmpBuf);
+ return NULL;
+ }
+
+ for (int64_t i = 0; i < pThreadInfo->tablesOfDumpOut; i++) {
+ debugPrint("[%d] No.\t%"PRId64" table name: %s\n",
+ pThreadInfo->threadIndex, i,
+ ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name);
+ dumpNormalTable(fp,
+ pThreadInfo->taos,
+ pThreadInfo->dbName,
+ ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->name,
+ ((TableInfo *)(g_tablesList + pThreadInfo->tableFrom+i))->stable,
+ pThreadInfo->precision);
+ }
+
+ fclose(fp);
+
+ return NULL;
+}
+
+static void *dumpNormalTablesOfStb(void *arg) {
+ threadInfo *pThreadInfo = (threadInfo *)arg;
+
+ debugPrint("dump table from = \t%"PRId64"\n", pThreadInfo->tableFrom);
+ debugPrint("dump table count = \t%"PRId64"\n", pThreadInfo->tablesOfDumpOut);
+
+ char command[COMMAND_SIZE];
+
+ sprintf(command, "SELECT TBNAME FROM %s.%s LIMIT %"PRId64" OFFSET %"PRId64"",
+ pThreadInfo->dbName, pThreadInfo->stbName,
+ pThreadInfo->tablesOfDumpOut, pThreadInfo->tableFrom);
+
+ TAOS_RES *res = taos_query(pThreadInfo->taos, command);
+ int32_t code = taos_errno(res);
+ if (code) {
+ errorPrint("%s() LN%d, failed to run command <%s>. reason: %s\n",
+ __func__, __LINE__, command, taos_errstr(res));
+ taos_free_result(res);
+ return NULL;
+ }
+
+ FILE *fp = NULL;
+ char tmpBuf[4096] = {0};
+
+ if (g_args.outpath[0] != 0) {
+ sprintf(tmpBuf, "%s/%s.%d.sql",
+ g_args.outpath, pThreadInfo->dbName, pThreadInfo->threadIndex);
+ } else {
+ sprintf(tmpBuf, "%s.%d.sql",
+ pThreadInfo->dbName, pThreadInfo->threadIndex);
+ }
+
+ fp = fopen(tmpBuf, "w");
+
+ if (fp == NULL) {
+ errorPrint("%s() LN%d, failed to open file %s\n",
+ __func__, __LINE__, tmpBuf);
+ return NULL;
+ }
+
+ TAOS_ROW row = NULL;
+ int64_t i = 0;
+ while((row = taos_fetch_row(res)) != NULL) {
+ debugPrint("[%d] sub table %"PRId64": name: %s\n",
+ pThreadInfo->threadIndex, i++, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+
+ dumpNormalTable(fp,
+ pThreadInfo->taos,
+ pThreadInfo->dbName,
+ (char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
+ pThreadInfo->stbName,
+ pThreadInfo->precision);
+ }
+
+ fclose(fp);
+ return NULL;
+}
+
+static int64_t dumpNtbOfDbByThreads(
+ SDbInfo *dbInfo,
+ int64_t ntbCount)
+{
+ if (ntbCount <= 0) {
+ return 0;
+ }
+
+ int threads = g_args.thread_num;
+
+ int64_t a = ntbCount / threads;
+ if (a < 1) {
+ threads = ntbCount;
+ a = 1;
+ }
+
+ assert(threads);
+ int64_t b = ntbCount % threads;
+
+ threadInfo *infos = calloc(1, threads * sizeof(threadInfo));
+ pthread_t *pids = calloc(1, threads * sizeof(pthread_t));
+ assert(pids);
+ assert(infos);
+
+ for (int64_t i = 0; i < threads; i++) {
+ threadInfo *pThreadInfo = infos + i;
+ pThreadInfo->taos = taos_connect(
+ g_args.host,
+ g_args.user,
+ g_args.password,
+ dbInfo->name,
+ g_args.port
+ );
+ if (NULL == pThreadInfo->taos) {
+ errorPrint("%s() LN%d, Failed to connect to TDengine, reason: %s\n",
+ __func__,
+ __LINE__,
+ taos_errstr(NULL));
+ free(pids);
+ free(infos);
+
+ return -1;
+ }
+
+ pThreadInfo->threadIndex = i;
+ pThreadInfo->tablesOfDumpOut = (itableFrom = (i==0)?0:
+ ((threadInfo *)(infos + i - 1))->tableFrom +
+ ((threadInfo *)(infos + i - 1))->tablesOfDumpOut;
+ strcpy(pThreadInfo->dbName, dbInfo->name);
+ pThreadInfo->precision = getPrecisionByString(dbInfo->precision);
+
+ pthread_create(pids + i, NULL, dumpNtbOfDb, pThreadInfo);
+ }
+
+ for (int64_t i = 0; i < threads; i++) {
+ pthread_join(pids[i], NULL);
+ }
+
+ for (int64_t i = 0; i < threads; i++) {
+ threadInfo *pThreadInfo = infos + i;
+ taos_close(pThreadInfo->taos);
+ }
+
+ free(pids);
+ free(infos);
+
+ return 0;
+}
+
+static int64_t getNtbCountOfStb(char *dbName, char *stbName)
+{
+ TAOS *taos = taos_connect(g_args.host, g_args.user, g_args.password,
+ dbName, g_args.port);
+ if (taos == NULL) {
+ errorPrint("Failed to connect to TDengine server %s\n", g_args.host);
+ return -1;
+ }
+
+ int64_t count = 0;
+
+ char command[COMMAND_SIZE];
+
+ sprintf(command, "SELECT COUNT(TBNAME) FROM %s.%s", dbName, stbName);
+
+ TAOS_RES *res = taos_query(taos, command);
+ int32_t code = taos_errno(res);
+ if (code != 0) {
+ errorPrint("%s() LN%d, failed to run command <%s>. reason: %s\n",
+ __func__, __LINE__, command, taos_errstr(res));
+ taos_free_result(res);
+ taos_close(taos);
+ return -1;
+ }
+
+ TAOS_ROW row = NULL;
+
+ if ((row = taos_fetch_row(res)) != NULL) {
+ count = *(int64_t*)row[TSDB_SHOW_TABLES_NAME_INDEX];
+ }
+
+ taos_close(taos);
+ return count;
+}
+
+static int64_t dumpNtbOfStbByThreads(
+ SDbInfo *dbInfo, char *stbName)
+{
+ int64_t ntbCount = getNtbCountOfStb(dbInfo->name, stbName);
+
+ if (ntbCount <= 0) {
+ return 0;
+ }
+
+ int threads = g_args.thread_num;
+
+ int64_t a = ntbCount / threads;
+ if (a < 1) {
+ threads = ntbCount;
+ a = 1;
+ }
+
+ assert(threads);
+ int64_t b = ntbCount % threads;
+
+ pthread_t *pids = calloc(1, threads * sizeof(pthread_t));
+ threadInfo *infos = calloc(1, threads * sizeof(threadInfo));
+ assert(pids);
+ assert(infos);
+
+ for (int64_t i = 0; i < threads; i++) {
+ threadInfo *pThreadInfo = infos + i;
+ pThreadInfo->taos = taos_connect(
+ g_args.host,
+ g_args.user,
+ g_args.password,
+ dbInfo->name,
+ g_args.port
+ );
+ if (NULL == pThreadInfo->taos) {
+ errorPrint("%s() LN%d, Failed to connect to TDengine, reason: %s\n",
+ __func__,
+ __LINE__,
+ taos_errstr(NULL));
+ free(pids);
+ free(infos);
+
+ return -1;
+ }
+
+ pThreadInfo->threadIndex = i;
+ pThreadInfo->tablesOfDumpOut = (itableFrom = (i==0)?0:
+ ((threadInfo *)(infos + i - 1))->tableFrom +
+ ((threadInfo *)(infos + i - 1))->tablesOfDumpOut;
+ strcpy(pThreadInfo->dbName, dbInfo->name);
+ pThreadInfo->precision = getPrecisionByString(dbInfo->precision);
+
+ strcpy(pThreadInfo->stbName, stbName);
+ pthread_create(pids + i, NULL, dumpNormalTablesOfStb, pThreadInfo);
+ }
+
+ for (int64_t i = 0; i < threads; i++) {
+ pthread_join(pids[i], NULL);
+ }
+
+ int64_t records = 0;
+ for (int64_t i = 0; i < threads; i++) {
+ threadInfo *pThreadInfo = infos + i;
+ records += pThreadInfo->rowsOfDumpOut;
+ taos_close(pThreadInfo->taos);
+ }
+
+ free(pids);
+ free(infos);
+
+ return records;
+}
+
+static int64_t dumpCreateSTableClauseOfDb(
+ SDbInfo *dbInfo, FILE *fp)
+{
+ TAOS *taos = taos_connect(g_args.host,
+ g_args.user, g_args.password, dbInfo->name, g_args.port);
+ if (NULL == taos) {
+ errorPrint(
+ "Failed to connect to TDengine server %s by specified database %s\n",
+ g_args.host, dbInfo->name);
+ return 0;
+ }
+
+ TAOS_ROW row;
+ char command[COMMAND_SIZE] = {0};
+
+ sprintf(command, "SHOW %s.STABLES", dbInfo->name);
+
+ TAOS_RES* res = taos_query(taos, command);
+ int32_t code = taos_errno(res);
+ if (code != 0) {
+ errorPrint("%s() LN%d, failed to run command <%s>, reason: %s\n",
+ __func__, __LINE__, command, taos_errstr(res));
+ taos_free_result(res);
+ taos_close(taos);
+ exit(-1);
+ }
+
+ int64_t superTblCnt = 0;
+ while ((row = taos_fetch_row(res)) != NULL) {
+ if (0 == dumpStable(row[TSDB_SHOW_TABLES_NAME_INDEX], fp, dbInfo)) {
+ superTblCnt ++;
+ }
+ }
+
+ taos_free_result(res);
+
+ fprintf(g_fpOfResult,
+ "# super table counter: %"PRId64"\n",
+ superTblCnt);
+ g_resultStatistics.totalSuperTblsOfDumpOut += superTblCnt;
+
+ taos_close(taos);
+
+ return superTblCnt;
+}
+
+static int64_t dumpNTablesOfDb(SDbInfo *dbInfo)
+{
+ TAOS *taos = taos_connect(g_args.host,
+ g_args.user, g_args.password, dbInfo->name, g_args.port);
+ if (NULL == taos) {
+ errorPrint(
+ "Failed to connect to TDengine server %s by specified database %s\n",
+ g_args.host, dbInfo->name);
+ return 0;
+ }
+
+ char command[COMMAND_SIZE];
+ TAOS_RES *result;
+ int32_t code;
+
+ sprintf(command, "USE %s", dbInfo->name);
+ result = taos_query(taos, command);
+ code = taos_errno(result);
+ if (code != 0) {
+ errorPrint("invalid database %s, reason: %s\n",
+ dbInfo->name, taos_errstr(result));
+ taos_close(taos);
+ return 0;
+ }
+
+ sprintf(command, "SHOW TABLES");
+ result = taos_query(taos, command);
+ code = taos_errno(result);
+ if (code != 0) {
+ errorPrint("Failed to show %s\'s tables, reason: %s\n",
+ dbInfo->name, taos_errstr(result));
+ taos_close(taos);
+ return 0;
+ }
+
+ g_tablesList = calloc(1, dbInfo->ntables * sizeof(TableInfo));
+
+ TAOS_ROW row;
+ int64_t count = 0;
+ while(NULL != (row = taos_fetch_row(result))) {
+ debugPrint("%s() LN%d, No.\t%"PRId64" table name: %s\n",
+ __func__, __LINE__,
+ count, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+ tstrncpy(((TableInfo *)(g_tablesList + count))->name,
+ (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], TSDB_TABLE_NAME_LEN);
+ char *stbName = (char *) row[TSDB_SHOW_TABLES_METRIC_INDEX];
+ if (stbName) {
+ tstrncpy(((TableInfo *)(g_tablesList + count))->stable,
+ (char *)row[TSDB_SHOW_TABLES_METRIC_INDEX], TSDB_TABLE_NAME_LEN);
+ ((TableInfo *)(g_tablesList + count))->belongStb = true;
+ }
+ count ++;
+ }
+ taos_close(taos);
+
+ int64_t records = dumpNtbOfDbByThreads(dbInfo, count);
+
+ free(g_tablesList);
+ g_tablesList = NULL;
+
+ return records;
+}
+
+static int64_t dumpWholeDatabase(SDbInfo *dbInfo, FILE *fp)
+{
+ taosDumpCreateDbClause(dbInfo, g_args.with_property, fp);
+
+ fprintf(g_fpOfResult, "\n#### database: %s\n",
+ dbInfo->name);
+ g_resultStatistics.totalDatabasesOfDumpOut++;
+
+ dumpCreateSTableClauseOfDb(dbInfo, fp);
+
+ return dumpNTablesOfDb(dbInfo);
+}
+
static int taosDumpOut() {
TAOS *taos = NULL;
TAOS_RES *result = NULL;
- char *command = NULL;
TAOS_ROW row;
FILE *fp = NULL;
int32_t count = 0;
- STableRecordInfo tableRecordInfo;
+ TableRecordInfo tableRecordInfo;
char tmpBuf[4096] = {0};
if (g_args.outpath[0] != 0) {
@@ -1292,25 +1416,24 @@ static int taosDumpOut() {
return -1;
}
- g_args.dbCount = getDbCount();
+ g_args.dumpDbCount = getDumpDbCount();
+ debugPrint("%s() LN%d, dump db count: %d\n",
+ __func__, __LINE__, g_args.dumpDbCount);
- if (0 == g_args.dbCount) {
- errorPrint("%d databases valid to dump\n", g_args.dbCount);
+ if (0 == g_args.dumpDbCount) {
+ errorPrint("%d databases valid to dump\n", g_args.dumpDbCount);
+ fclose(fp);
return -1;
}
- g_dbInfos = (SDbInfo **)calloc(g_args.dbCount, sizeof(SDbInfo *));
+ g_dbInfos = (SDbInfo **)calloc(g_args.dumpDbCount, sizeof(SDbInfo *));
if (g_dbInfos == NULL) {
errorPrint("%s() LN%d, failed to allocate memory\n",
__func__, __LINE__);
goto _exit_failure;
}
- command = (char *)malloc(COMMAND_SIZE);
- if (command == NULL) {
- errorPrint("%s() LN%d, failed to allocate memory\n", __func__, __LINE__);
- goto _exit_failure;
- }
+ char command[COMMAND_SIZE];
/* Connect to server */
taos = taos_connect(g_args.host, g_args.user, g_args.password,
@@ -1330,7 +1453,7 @@ static int taosDumpOut() {
int32_t code = taos_errno(result);
if (code != 0) {
- errorPrint("%s() LN%d, failed to run command: %s, reason: %s\n",
+ errorPrint("%s() LN%d, failed to run command <%s>, reason: %s\n",
__func__, __LINE__, command, taos_errstr(result));
goto _exit_failure;
}
@@ -1413,10 +1536,11 @@ static int taosDumpOut() {
count++;
if (g_args.databases) {
- if (count > g_args.dbCount) break;
-
+ if (count > g_args.dumpDbCount)
+ break;
} else if (!g_args.all_databases) {
- if (count >= 1) break;
+ if (count >= 1)
+ break;
}
}
@@ -1425,103 +1549,61 @@ static int taosDumpOut() {
goto _exit_failure;
}
- if (g_args.databases || g_args.all_databases) { // case: taosdump --databases dbx dby ... OR taosdump --all-databases
+ taos_close(taos);
+
+ if (g_args.databases || g_args.all_databases) { // case: taosdump --databases dbx,dby ... OR taosdump --all-databases
for (int i = 0; i < count; i++) {
- taosDumpDb(g_dbInfos[i], fp, taos);
+ int64_t records = 0;
+ records = dumpWholeDatabase(g_dbInfos[i], fp);
+ if (records >= 0) {
+ okPrint("Database %s dumped\n", g_dbInfos[i]->name);
+ g_totalDumpOutRows += records;
+ }
}
} else {
- if (g_args.dbCount == 1) { // case: taosdump
- taosDumpDb(g_dbInfos[0], fp, taos);
- } else { // case: taosdump tablex tabley ...
+ if (1 == g_args.arg_list_len) {
+ int64_t records = dumpWholeDatabase(g_dbInfos[0], fp);
+ if (records >= 0) {
+ okPrint("Database %s dumped\n", g_dbInfos[0]->name);
+ g_totalDumpOutRows += records;
+ }
+ } else {
taosDumpCreateDbClause(g_dbInfos[0], g_args.with_property, fp);
- fprintf(g_fpOfResult, "\n#### database: %s\n",
- g_dbInfos[0]->name);
- g_resultStatistics.totalDatabasesOfDumpOut++;
-
- sprintf(command, "use %s", g_dbInfos[0]->name);
+ }
- result = taos_query(taos, command);
- code = taos_errno(result);
- if (code != 0) {
- errorPrint("invalid database %s\n", g_dbInfos[0]->name);
- goto _exit_failure;
+ int superTblCnt = 0 ;
+ for (int i = 1; g_args.arg_list[i]; i++) {
+ if (getTableRecordInfo(g_dbInfos[0]->name,
+ g_args.arg_list[i],
+ &tableRecordInfo) < 0) {
+ errorPrint("input the invalid table %s\n",
+ g_args.arg_list[i]);
+ continue;
}
- fprintf(fp, "USE %s;\n\n", g_dbInfos[0]->name);
-
- int32_t totalNumOfThread = 1; // 0: all normal table into .tables.tmp.0
- int normalTblFd = -1;
- int32_t retCode;
- int superTblCnt = 0 ;
- for (int i = 1; g_args.arg_list[i]; i++) {
- if (taosGetTableRecordInfo(g_args.arg_list[i],
- &tableRecordInfo, taos) < 0) {
- errorPrint("input the invalid table %s\n",
- g_args.arg_list[i]);
- continue;
- }
-
- if (tableRecordInfo.isMetric) { // dump all table of this metric
- int ret = taosDumpStable(
- tableRecordInfo.tableRecord.metric,
- fp, taos, g_dbInfos[0]->name);
- if (0 == ret) {
- superTblCnt++;
- }
- retCode = taosSaveTableOfMetricToTempFile(
- taos, tableRecordInfo.tableRecord.metric,
- &totalNumOfThread);
- } else {
- if (tableRecordInfo.tableRecord.metric[0] != '\0') { // dump this sub table and it's metric
- int ret = taosDumpStable(
- tableRecordInfo.tableRecord.metric,
- fp, taos, g_dbInfos[0]->name);
- if (0 == ret) {
- superTblCnt++;
- }
- }
- retCode = taosSaveAllNormalTableToTempFile(
- taos, tableRecordInfo.tableRecord.name,
- tableRecordInfo.tableRecord.metric, &normalTblFd);
- }
-
- if (retCode < 0) {
- if (-1 != normalTblFd){
- taosClose(normalTblFd);
- }
- goto _clean_tmp_file;
+ int64_t records = 0;
+ if (tableRecordInfo.isStable) { // dump all table of this stable
+ int ret = dumpStable(
+ tableRecordInfo.tableRecord.stable,
+ fp, g_dbInfos[0]);
+ if (ret >= 0) {
+ superTblCnt++;
+ records = dumpNtbOfStbByThreads(g_dbInfos[0], g_args.arg_list[i]);
}
+ } else {
+ records = dumpNormalTableWithoutStb(g_dbInfos[0], g_args.arg_list[i]);
}
- // TODO: save dump super table into result_output.txt
- fprintf(g_fpOfResult, "# super table counter: %d\n",
- superTblCnt);
- g_resultStatistics.totalSuperTblsOfDumpOut += superTblCnt;
-
- if (-1 != normalTblFd){
- taosClose(normalTblFd);
- }
-
- // start multi threads to dumpout
-
- taosStartDumpOutWorkThreads(totalNumOfThread,
- g_dbInfos[0]->name,
- getPrecisionByString(g_dbInfos[0]->precision));
-
- char tmpFileName[MAX_FILE_NAME_LEN];
-_clean_tmp_file:
- for (int loopCnt = 0; loopCnt < totalNumOfThread; loopCnt++) {
- sprintf(tmpFileName, ".tables.tmp.%d", loopCnt);
- remove(tmpFileName);
+ if (records >= 0) {
+ okPrint("table: %s dumped\n", g_args.arg_list[i]);
+ g_totalDumpOutRows += records;
}
}
}
/* Close the handle and return */
fclose(fp);
- taos_close(taos);
taos_free_result(result);
- tfree(command);
taosFreeDbInfos();
fprintf(stderr, "dump out rows: %" PRId64 "\n", g_totalDumpOutRows);
return 0;
@@ -1530,28 +1612,37 @@ _exit_failure:
fclose(fp);
taos_close(taos);
taos_free_result(result);
- tfree(command);
taosFreeDbInfos();
errorPrint("dump out rows: %" PRId64 "\n", g_totalDumpOutRows);
return -1;
}
-static int taosGetTableDes(
+static int getTableDes(
char* dbName, char *table,
- STableDef *stableDes, TAOS* taosCon, bool isSuperTable) {
+ STableDef *stableDes, bool isSuperTable) {
TAOS_ROW row = NULL;
TAOS_RES* res = NULL;
- int count = 0;
+ int colCount = 0;
+
+ TAOS *taos = taos_connect(g_args.host,
+ g_args.user, g_args.password, dbName, g_args.port);
+ if (NULL == taos) {
+ errorPrint(
+ "Failed to connect to TDengine server %s by specified database %s\n",
+ g_args.host, dbName);
+ return -1;
+ }
char sqlstr[COMMAND_SIZE];
sprintf(sqlstr, "describe %s.%s;", dbName, table);
- res = taos_query(taosCon, sqlstr);
+ res = taos_query(taos, sqlstr);
int32_t code = taos_errno(res);
if (code != 0) {
- errorPrint("%s() LN%d, failed to run command <%s>, reason:%s\n",
+ errorPrint("%s() LN%d, failed to run command <%s>, reason: %s\n",
__func__, __LINE__, sqlstr, taos_errstr(res));
taos_free_result(res);
+ taos_close(taos);
return -1;
}
@@ -1559,43 +1650,44 @@ static int taosGetTableDes(
tstrncpy(stableDes->name, table, TSDB_TABLE_NAME_LEN);
while ((row = taos_fetch_row(res)) != NULL) {
- tstrncpy(stableDes->cols[count].field,
+ tstrncpy(stableDes->cols[colCount].field,
(char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX],
min(TSDB_COL_NAME_LEN + 1,
fields[TSDB_DESCRIBE_METRIC_FIELD_INDEX].bytes + 1));
- tstrncpy(stableDes->cols[count].type,
+ tstrncpy(stableDes->cols[colCount].type,
(char *)row[TSDB_DESCRIBE_METRIC_TYPE_INDEX],
min(16, fields[TSDB_DESCRIBE_METRIC_TYPE_INDEX].bytes + 1));
- stableDes->cols[count].length =
+ stableDes->cols[colCount].length =
*((int *)row[TSDB_DESCRIBE_METRIC_LENGTH_INDEX]);
- tstrncpy(stableDes->cols[count].note,
+ tstrncpy(stableDes->cols[colCount].note,
(char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX],
min(COL_NOTE_LEN,
fields[TSDB_DESCRIBE_METRIC_NOTE_INDEX].bytes + 1));
- count++;
+ colCount++;
}
taos_free_result(res);
res = NULL;
if (isSuperTable) {
- return count;
+ return colCount;
}
// if child-table have tag, using select tagName from table to get tagValue
- for (int i = 0 ; i < count; i++) {
+ for (int i = 0 ; i < colCount; i++) {
if (strcmp(stableDes->cols[i].note, "TAG") != 0) continue;
sprintf(sqlstr, "select %s from %s.%s",
stableDes->cols[i].field, dbName, table);
- res = taos_query(taosCon, sqlstr);
+ res = taos_query(taos, sqlstr);
code = taos_errno(res);
if (code != 0) {
- errorPrint("%s() LN%d, failed to run command <%s>, reason:%s\n",
+ errorPrint("%s() LN%d, failed to run command <%s>, reason: %s\n",
__func__, __LINE__, sqlstr, taos_errstr(res));
taos_free_result(res);
+ taos_close(taos);
return -1;
}
@@ -1606,13 +1698,15 @@ static int taosGetTableDes(
errorPrint("%s() LN%d, fetch failed to run command <%s>, reason:%s\n",
__func__, __LINE__, sqlstr, taos_errstr(res));
taos_free_result(res);
+ taos_close(taos);
return -1;
}
- if (row[0] == NULL) {
+ if (row[TSDB_SHOW_TABLES_NAME_INDEX] == NULL) {
sprintf(stableDes->cols[i].note, "%s", "NULL");
taos_free_result(res);
res = NULL;
+ taos_close(taos);
continue;
}
@@ -1622,32 +1716,33 @@ static int taosGetTableDes(
switch (fields[0].type) {
case TSDB_DATA_TYPE_BOOL:
sprintf(stableDes->cols[i].note, "%d",
- ((((int32_t)(*((char *)row[0]))) == 1) ? 1 : 0));
+ ((((int32_t)(*((char *)row[TSDB_SHOW_TABLES_NAME_INDEX]))) == 1) ? 1 : 0));
break;
case TSDB_DATA_TYPE_TINYINT:
- sprintf(stableDes->cols[i].note, "%d", *((int8_t *)row[0]));
+ sprintf(stableDes->cols[i].note, "%d",
+ *((int8_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_SMALLINT:
- sprintf(stableDes->cols[i].note, "%d", *((int16_t *)row[0]));
+ sprintf(stableDes->cols[i].note, "%d", *((int16_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_INT:
- sprintf(stableDes->cols[i].note, "%d", *((int32_t *)row[0]));
+ sprintf(stableDes->cols[i].note, "%d", *((int32_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_BIGINT:
- sprintf(stableDes->cols[i].note, "%" PRId64 "", *((int64_t *)row[0]));
+ sprintf(stableDes->cols[i].note, "%" PRId64 "", *((int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_FLOAT:
- sprintf(stableDes->cols[i].note, "%f", GET_FLOAT_VAL(row[0]));
+ sprintf(stableDes->cols[i].note, "%f", GET_FLOAT_VAL(row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_DOUBLE:
- sprintf(stableDes->cols[i].note, "%f", GET_DOUBLE_VAL(row[0]));
+ sprintf(stableDes->cols[i].note, "%f", GET_DOUBLE_VAL(row[TSDB_SHOW_TABLES_NAME_INDEX]));
break;
case TSDB_DATA_TYPE_BINARY:
{
memset(stableDes->cols[i].note, 0, sizeof(stableDes->cols[i].note));
stableDes->cols[i].note[0] = '\'';
char tbuf[COL_NOTE_LEN];
- converStringToReadable((char *)row[0], length[0], tbuf, COL_NOTE_LEN);
+ converStringToReadable((char *)row[TSDB_SHOW_TABLES_NAME_INDEX], length[0], tbuf, COL_NOTE_LEN);
char* pstr = stpcpy(&(stableDes->cols[i].note[1]), tbuf);
*(pstr++) = '\'';
break;
@@ -1656,518 +1751,154 @@ static int taosGetTableDes(
{
memset(stableDes->cols[i].note, 0, sizeof(stableDes->cols[i].note));
char tbuf[COL_NOTE_LEN-2]; // need reserve 2 bytes for ' '
- convertNCharToReadable((char *)row[0], length[0], tbuf, COL_NOTE_LEN);
+ convertNCharToReadable((char *)row[TSDB_SHOW_TABLES_NAME_INDEX], length[0], tbuf, COL_NOTE_LEN);
sprintf(stableDes->cols[i].note, "\'%s\'", tbuf);
break;
- }
- case TSDB_DATA_TYPE_TIMESTAMP:
- sprintf(stableDes->cols[i].note, "%" PRId64 "", *(int64_t *)row[0]);
-#if 0
- if (!g_args.mysqlFlag) {
- sprintf(tableDes->cols[i].note, "%" PRId64 "", *(int64_t *)row[0]);
- } else {
- char buf[64] = "\0";
- int64_t ts = *((int64_t *)row[0]);
- time_t tt = (time_t)(ts / 1000);
- struct tm *ptm = localtime(&tt);
- strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
- sprintf(tableDes->cols[i].note, "\'%s.%03d\'", buf, (int)(ts % 1000));
- }
-#endif
- break;
- default:
- break;
- }
-
- taos_free_result(res);
- res = NULL;
- }
-
- return count;
-}
-
-static int convertSchemaToAvroSchema(STableDef *stableDes, char **avroSchema)
-{
- errorPrint("%s() LN%d TODO: covert table schema to avro schema\n",
- __func__, __LINE__);
- return 0;
-}
-
-static int32_t taosDumpTable(
- char *tbName, char *metric,
- FILE *fp, TAOS* taosCon, char* dbName, int precision) {
- int count = 0;
-
- STableDef *tableDes = (STableDef *)calloc(1, sizeof(STableDef)
- + sizeof(SColDes) * TSDB_MAX_COLUMNS);
-
- if (metric != NULL && metric[0] != '\0') { // dump table schema which is created by using super table
- /*
- count = taosGetTableDes(metric, tableDes, taosCon);
-
- if (count < 0) {
- free(tableDes);
- return -1;
- }
-
- taosDumpCreateTableClause(tableDes, count, fp);
-
- memset(tableDes, 0, sizeof(STableDef) + sizeof(SColDes) * TSDB_MAX_COLUMNS);
- */
-
- count = taosGetTableDes(dbName, tbName, tableDes, taosCon, false);
-
- if (count < 0) {
- free(tableDes);
- return -1;
- }
-
- // create child-table using super-table
- taosDumpCreateMTableClause(tableDes, metric, count, fp, dbName);
-
- } else { // dump table definition
- count = taosGetTableDes(dbName, tbName, tableDes, taosCon, false);
-
- if (count < 0) {
- free(tableDes);
- return -1;
- }
-
- // create normal-table or super-table
- taosDumpCreateTableClause(tableDes, count, fp, dbName);
- }
-
- char *jsonAvroSchema = NULL;
- if (g_args.avro) {
- convertSchemaToAvroSchema(tableDes, &jsonAvroSchema);
- }
-
- free(tableDes);
-
- int32_t ret = 0;
- if (!g_args.schemaonly) {
- ret = taosDumpTableData(fp, tbName, taosCon, dbName, precision,
- jsonAvroSchema);
- }
-
- return ret;
-}
-
-static void taosDumpCreateDbClause(
- SDbInfo *dbInfo, bool isDumpProperty, FILE *fp) {
- char sqlstr[TSDB_MAX_SQL_LEN] = {0};
-
- char *pstr = sqlstr;
- pstr += sprintf(pstr, "CREATE DATABASE IF NOT EXISTS %s ", dbInfo->name);
- if (isDumpProperty) {
- pstr += sprintf(pstr,
- "REPLICA %d QUORUM %d DAYS %d KEEP %s CACHE %d BLOCKS %d MINROWS %d MAXROWS %d FSYNC %d CACHELAST %d COMP %d PRECISION '%s' UPDATE %d",
- dbInfo->replica, dbInfo->quorum, dbInfo->days,
- dbInfo->keeplist,
- dbInfo->cache,
- dbInfo->blocks, dbInfo->minrows, dbInfo->maxrows,
- dbInfo->fsync,
- dbInfo->cachelast,
- dbInfo->comp, dbInfo->precision, dbInfo->update);
- }
-
- pstr += sprintf(pstr, ";");
- fprintf(fp, "%s\n\n", sqlstr);
-}
-
-static void* taosDumpOutWorkThreadFp(void *arg)
-{
- SThreadParaObj *pThread = (SThreadParaObj*)arg;
- STableRecord tableRecord;
- int fd;
-
- setThreadName("dumpOutWorkThrd");
-
- char tmpBuf[4096] = {0};
- sprintf(tmpBuf, ".tables.tmp.%d", pThread->threadIndex);
- fd = open(tmpBuf, O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (fd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: %s\n",
- __func__, __LINE__, tmpBuf);
- return NULL;
- }
-
- FILE *fp = NULL;
- memset(tmpBuf, 0, 4096);
-
- if (g_args.outpath[0] != 0) {
- sprintf(tmpBuf, "%s/%s.tables.%d.sql",
- g_args.outpath, pThread->dbName, pThread->threadIndex);
- } else {
- sprintf(tmpBuf, "%s.tables.%d.sql",
- pThread->dbName, pThread->threadIndex);
- }
-
- fp = fopen(tmpBuf, "w");
- if (fp == NULL) {
- errorPrint("%s() LN%d, failed to open file %s\n",
- __func__, __LINE__, tmpBuf);
- close(fd);
- return NULL;
- }
-
- memset(tmpBuf, 0, 4096);
- sprintf(tmpBuf, "use %s", pThread->dbName);
-
- TAOS_RES* tmpResult = taos_query(pThread->taosCon, tmpBuf);
- int32_t code = taos_errno(tmpResult);
- if (code != 0) {
- errorPrint("%s() LN%d, invalid database %s. reason: %s\n",
- __func__, __LINE__, pThread->dbName, taos_errstr(tmpResult));
- taos_free_result(tmpResult);
- fclose(fp);
- close(fd);
- return NULL;
- }
-
-#if 0
- int fileNameIndex = 1;
- int tablesInOneFile = 0;
-#endif
- int64_t lastRowsPrint = 5000000;
- fprintf(fp, "USE %s;\n\n", pThread->dbName);
- while (1) {
- ssize_t readLen = read(fd, &tableRecord, sizeof(STableRecord));
- if (readLen <= 0) break;
-
- int ret = taosDumpTable(
- tableRecord.name, tableRecord.metric,
- fp, pThread->taosCon, pThread->dbName,
- pThread->precision);
- if (ret >= 0) {
- // TODO: sum table count and table rows by self
- pThread->tablesOfDumpOut++;
- pThread->rowsOfDumpOut += ret;
-
- if (pThread->rowsOfDumpOut >= lastRowsPrint) {
- printf(" %"PRId64 " rows already be dumpout from database %s\n",
- pThread->rowsOfDumpOut, pThread->dbName);
- lastRowsPrint += 5000000;
- }
-
-#if 0
- tablesInOneFile++;
- if (tablesInOneFile >= g_args.table_batch) {
- fclose(fp);
- tablesInOneFile = 0;
-
- memset(tmpBuf, 0, 4096);
- if (g_args.outpath[0] != 0) {
- sprintf(tmpBuf, "%s/%s.tables.%d-%d.sql",
- g_args.outpath, pThread->dbName,
- pThread->threadIndex, fileNameIndex);
- } else {
- sprintf(tmpBuf, "%s.tables.%d-%d.sql",
- pThread->dbName, pThread->threadIndex, fileNameIndex);
- }
- fileNameIndex++;
-
- fp = fopen(tmpBuf, "w");
- if (fp == NULL) {
- errorPrint("%s() LN%d, failed to open file %s\n",
- __func__, __LINE__, tmpBuf);
- close(fd);
- taos_free_result(tmpResult);
- return NULL;
- }
- }
-#endif
- }
- }
-
- taos_free_result(tmpResult);
- close(fd);
- fclose(fp);
-
- return NULL;
-}
-
-static void taosStartDumpOutWorkThreads(int32_t numOfThread, char *dbName, int precision)
-{
- pthread_attr_t thattr;
- SThreadParaObj *threadObj =
- (SThreadParaObj *)calloc(numOfThread, sizeof(SThreadParaObj));
-
- if (threadObj == NULL) {
- errorPrint("%s() LN%d, memory allocation failed!\n",
- __func__, __LINE__);
- return;
- }
-
- for (int t = 0; t < numOfThread; ++t) {
- SThreadParaObj *pThread = threadObj + t;
- pThread->rowsOfDumpOut = 0;
- pThread->tablesOfDumpOut = 0;
- pThread->threadIndex = t;
- pThread->totalThreads = numOfThread;
- tstrncpy(pThread->dbName, dbName, TSDB_DB_NAME_LEN);
- pThread->precision = precision;
- pThread->taosCon = taos_connect(g_args.host, g_args.user, g_args.password,
- NULL, g_args.port);
- if (pThread->taosCon == NULL) {
- errorPrint("Failed to connect to TDengine server %s\n", g_args.host);
- free(threadObj);
- return;
- }
- pthread_attr_init(&thattr);
- pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE);
-
- if (pthread_create(&(pThread->threadID), &thattr,
- taosDumpOutWorkThreadFp,
- (void*)pThread) != 0) {
- errorPrint("%s() LN%d, thread:%d failed to start\n",
- __func__, __LINE__, pThread->threadIndex);
- exit(-1);
+ }
+ case TSDB_DATA_TYPE_TIMESTAMP:
+ sprintf(stableDes->cols[i].note, "%" PRId64 "", *(int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+#if 0
+ if (!g_args.mysqlFlag) {
+ sprintf(tableDes->cols[i].note, "%" PRId64 "", *(int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+ } else {
+ char buf[64] = "\0";
+ int64_t ts = *((int64_t *)row[TSDB_SHOW_TABLES_NAME_INDEX]);
+ time_t tt = (time_t)(ts / 1000);
+ struct tm *ptm = localtime(&tt);
+ strftime(buf, 64, "%y-%m-%d %H:%M:%S", ptm);
+ sprintf(tableDes->cols[i].note, "\'%s.%03d\'", buf, (int)(ts % 1000));
+ }
+#endif
+ break;
+ default:
+ break;
}
- }
- for (int32_t t = 0; t < numOfThread; ++t) {
- pthread_join(threadObj[t].threadID, NULL);
- }
-
- // TODO: sum all thread dump table count and rows of per table, then save into result_output.txt
- int64_t totalRowsOfDumpOut = 0;
- int64_t totalChildTblsOfDumpOut = 0;
- for (int32_t t = 0; t < numOfThread; ++t) {
- totalChildTblsOfDumpOut += threadObj[t].tablesOfDumpOut;
- totalRowsOfDumpOut += threadObj[t].rowsOfDumpOut;
+ taos_free_result(res);
}
- fprintf(g_fpOfResult, "# child table counter: %"PRId64"\n",
- totalChildTblsOfDumpOut);
- fprintf(g_fpOfResult, "# row counter: %"PRId64"\n",
- totalRowsOfDumpOut);
- g_resultStatistics.totalChildTblsOfDumpOut += totalChildTblsOfDumpOut;
- g_resultStatistics.totalRowsOfDumpOut += totalRowsOfDumpOut;
- free(threadObj);
+ taos_close(taos);
+ return colCount;
}
-static int32_t taosDumpStable(char *table, FILE *fp,
- TAOS* taosCon, char* dbName) {
-
- uint64_t sizeOfTableDes =
- (uint64_t)(sizeof(STableDef) + sizeof(SColDes) * TSDB_MAX_COLUMNS);
- STableDef *stableDes = (STableDef *)calloc(1, sizeOfTableDes);
- if (NULL == stableDes) {
- errorPrint("%s() LN%d, failed to allocate %"PRIu64" memory\n",
- __func__, __LINE__, sizeOfTableDes);
- exit(-1);
- }
-
- int count = taosGetTableDes(dbName, table, stableDes, taosCon, true);
-
- if (count < 0) {
- free(stableDes);
- errorPrint("%s() LN%d, failed to get stable[%s] schema\n",
- __func__, __LINE__, table);
- exit(-1);
- }
-
- taosDumpCreateTableClause(stableDes, count, fp, dbName);
-
- free(stableDes);
+static int convertSchemaToAvroSchema(STableDef *stableDes, char **avroSchema)
+{
+ errorPrint("%s() LN%d TODO: covert table schema to avro schema\n",
+ __func__, __LINE__);
return 0;
}
-static int32_t taosDumpCreateSuperTableClause(TAOS* taosCon, char* dbName, FILE *fp)
-{
- TAOS_ROW row;
- int fd = -1;
- STableRecord tableRecord;
- char sqlstr[TSDB_MAX_SQL_LEN] = {0};
-
- sprintf(sqlstr, "show %s.stables", dbName);
+static int64_t taosDumpTable(
+ char *tbName, char *stable,
+ FILE *fp, char* dbName, int precision) {
+ int colCount = 0;
- TAOS_RES* res = taos_query(taosCon, sqlstr);
- int32_t code = taos_errno(res);
- if (code != 0) {
- errorPrint("%s() LN%d, failed to run command <%s>, reason: %s\n",
- __func__, __LINE__, sqlstr, taos_errstr(res));
- taos_free_result(res);
- exit(-1);
- }
+ STableDef *tableDes = (STableDef *)calloc(1, sizeof(STableDef)
+ + sizeof(SColDes) * TSDB_MAX_COLUMNS);
- TAOS_FIELD *fields = taos_fetch_fields(res);
+ if (stable != NULL && stable[0] != '\0') { // dump table schema which is created by using super table
+ /*
+ colCount = getTableDes(stable, tableDes, taos);
- char tmpFileName[MAX_FILE_NAME_LEN];
- memset(tmpFileName, 0, MAX_FILE_NAME_LEN);
- sprintf(tmpFileName, ".stables.tmp");
- fd = open(tmpFileName, O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (fd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: %s\n",
- __func__, __LINE__, tmpFileName);
- taos_free_result(res);
- (void)remove(".stables.tmp");
- exit(-1);
- }
+ if (count < 0) {
+ free(tableDes);
+ return -1;
+ }
- while ((row = taos_fetch_row(res)) != NULL) {
- memset(&tableRecord, 0, sizeof(STableRecord));
- tstrncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
- min(TSDB_TABLE_NAME_LEN,
- fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes + 1));
- taosWrite(fd, &tableRecord, sizeof(STableRecord));
- }
+ dumpCreateTableClause(tableDes, count, fp);
- taos_free_result(res);
- (void)lseek(fd, 0, SEEK_SET);
+ memset(tableDes, 0, sizeof(STableDef) + sizeof(SColDes) * TSDB_MAX_COLUMNS);
+ */
- int superTblCnt = 0;
- while (1) {
- ssize_t readLen = read(fd, &tableRecord, sizeof(STableRecord));
- if (readLen <= 0) break;
+ colCount = getTableDes(dbName, tbName, tableDes, false);
- int ret = taosDumpStable(tableRecord.name, fp, taosCon, dbName);
- if (0 == ret) {
- superTblCnt++;
+ if (colCount < 0) {
+ free(tableDes);
+ return -1;
}
- }
-
- // TODO: save dump super table into result_output.txt
- fprintf(g_fpOfResult, "# super table counter: %d\n", superTblCnt);
- g_resultStatistics.totalSuperTblsOfDumpOut += superTblCnt;
-
- close(fd);
- (void)remove(".stables.tmp");
-
- return 0;
-}
-
-
-static int taosDumpDb(SDbInfo *dbInfo, FILE *fp, TAOS *taosCon) {
- TAOS_ROW row;
- int fd = -1;
- STableRecord tableRecord;
-
- taosDumpCreateDbClause(dbInfo, g_args.with_property, fp);
-
- fprintf(g_fpOfResult, "\n#### database: %s\n",
- dbInfo->name);
- g_resultStatistics.totalDatabasesOfDumpOut++;
-
- char sqlstr[TSDB_MAX_SQL_LEN] = {0};
- fprintf(fp, "USE %s;\n\n", dbInfo->name);
+ // create child-table using super-table
+ taosDumpCreateMTableClause(tableDes, stable, colCount, fp, dbName);
- (void)taosDumpCreateSuperTableClause(taosCon, dbInfo->name, fp);
+ } else { // dump table definition
+ colCount = getTableDes(dbName, tbName, tableDes, false);
- sprintf(sqlstr, "show %s.tables", dbInfo->name);
+ if (colCount < 0) {
+ free(tableDes);
+ return -1;
+ }
- TAOS_RES* res = taos_query(taosCon, sqlstr);
- int code = taos_errno(res);
- if (code != 0) {
- errorPrint("%s() LN%d, failed to run command <%s>, reason:%s\n",
- __func__, __LINE__, sqlstr, taos_errstr(res));
- taos_free_result(res);
- return -1;
+ // create normal-table or super-table
+ dumpCreateTableClause(tableDes, colCount, fp, dbName);
}
- char tmpBuf[MAX_FILE_NAME_LEN];
- memset(tmpBuf, 0, MAX_FILE_NAME_LEN);
- sprintf(tmpBuf, ".show-tables.tmp");
- fd = open(tmpBuf, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (fd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: %s\n",
- __func__, __LINE__, tmpBuf);
- taos_free_result(res);
- return -1;
+ char *jsonAvroSchema = NULL;
+ if (g_args.avro) {
+ convertSchemaToAvroSchema(tableDes, &jsonAvroSchema);
}
- TAOS_FIELD *fields = taos_fetch_fields(res);
+ free(tableDes);
- int32_t numOfTable = 0;
- while ((row = taos_fetch_row(res)) != NULL) {
- memset(&tableRecord, 0, sizeof(STableRecord));
- tstrncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX],
- min(TSDB_TABLE_NAME_LEN,
- fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes + 1));
- tstrncpy(tableRecord.metric, (char *)row[TSDB_SHOW_TABLES_METRIC_INDEX],
- min(TSDB_TABLE_NAME_LEN,
- fields[TSDB_SHOW_TABLES_METRIC_INDEX].bytes + 1));
+ int64_t ret = 0;
+ if (!g_args.schemaonly) {
+ ret = dumpTableData(fp, tbName, dbName, precision,
+ jsonAvroSchema);
+ }
- taosWrite(fd, &tableRecord, sizeof(STableRecord));
+ return ret;
+}
- numOfTable++;
- }
- taos_free_result(res);
- lseek(fd, 0, SEEK_SET);
+static void taosDumpCreateDbClause(
+ SDbInfo *dbInfo, bool isDumpProperty, FILE *fp) {
+ char sqlstr[TSDB_MAX_SQL_LEN] = {0};
- int maxThreads = g_args.thread_num;
- int tableOfPerFile ;
- if (numOfTable <= g_args.thread_num) {
- tableOfPerFile = 1;
- maxThreads = numOfTable;
- } else {
- tableOfPerFile = numOfTable / g_args.thread_num;
- if (0 != numOfTable % g_args.thread_num) {
- tableOfPerFile += 1;
- }
+ char *pstr = sqlstr;
+ pstr += sprintf(pstr, "CREATE DATABASE IF NOT EXISTS %s ", dbInfo->name);
+ if (isDumpProperty) {
+ pstr += sprintf(pstr,
+ "REPLICA %d QUORUM %d DAYS %d KEEP %s CACHE %d BLOCKS %d MINROWS %d MAXROWS %d FSYNC %d CACHELAST %d COMP %d PRECISION '%s' UPDATE %d",
+ dbInfo->replica, dbInfo->quorum, dbInfo->days,
+ dbInfo->keeplist,
+ dbInfo->cache,
+ dbInfo->blocks, dbInfo->minrows, dbInfo->maxrows,
+ dbInfo->fsync,
+ dbInfo->cachelast,
+ dbInfo->comp, dbInfo->precision, dbInfo->update);
}
- char* tblBuf = (char*)calloc(1, tableOfPerFile * sizeof(STableRecord));
- if (NULL == tblBuf){
- errorPrint("failed to calloc %" PRIzu "\n",
- tableOfPerFile * sizeof(STableRecord));
- close(fd);
- return -1;
- }
+ pstr += sprintf(pstr, ";");
+ fprintf(fp, "%s\n\n", sqlstr);
+}
- int32_t numOfThread = 0;
- int subFd = -1;
- for (numOfThread = 0; numOfThread < maxThreads; numOfThread++) {
- memset(tmpBuf, 0, MAX_FILE_NAME_LEN);
- sprintf(tmpBuf, ".tables.tmp.%d", numOfThread);
- subFd = open(tmpBuf, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
- if (subFd == -1) {
- errorPrint("%s() LN%d, failed to open temp file: %s\n",
- __func__, __LINE__, tmpBuf);
- for (int32_t loopCnt = 0; loopCnt < numOfThread; loopCnt++) {
- sprintf(tmpBuf, ".tables.tmp.%d", loopCnt);
- (void)remove(tmpBuf);
- }
- sprintf(tmpBuf, ".show-tables.tmp");
- (void)remove(tmpBuf);
- free(tblBuf);
- close(fd);
- return -1;
- }
+static int dumpStable(char *stbName, FILE *fp, SDbInfo *dbInfo)
+{
+ uint64_t sizeOfTableDes =
+ (uint64_t)(sizeof(STableDef) + sizeof(SColDes) * TSDB_MAX_COLUMNS);
- // read tableOfPerFile for fd, write to subFd
- ssize_t readLen = read(fd, tblBuf, tableOfPerFile * sizeof(STableRecord));
- if (readLen <= 0) {
- close(subFd);
- break;
- }
- taosWrite(subFd, tblBuf, readLen);
- close(subFd);
+ STableDef *stableDes = (STableDef *)calloc(1, sizeOfTableDes);
+ if (NULL == stableDes) {
+ errorPrint("%s() LN%d, failed to allocate %"PRIu64" memory\n",
+ __func__, __LINE__, sizeOfTableDes);
+ exit(-1);
}
- sprintf(tmpBuf, ".show-tables.tmp");
- (void)remove(tmpBuf);
+ int colCount = getTableDes(dbInfo->name,
+ stbName, stableDes, true);
- if (fd >= 0) {
- close(fd);
- fd = -1;
+ if (colCount < 0) {
+ free(stableDes);
+ errorPrint("%s() LN%d, failed to get stable[%s] schema\n",
+ __func__, __LINE__, stbName);
+ exit(-1);
}
- // start multi threads to dumpout
- taosStartDumpOutWorkThreads(numOfThread, dbInfo->name,
- getPrecisionByString(dbInfo->precision));
- for (int loopCnt = 0; loopCnt < numOfThread; loopCnt++) {
- sprintf(tmpBuf, ".tables.tmp.%d", loopCnt);
- (void)remove(tmpBuf);
- }
+ dumpCreateTableClause(stableDes, colCount, fp, dbInfo->name);
+ free(stableDes);
- free(tblBuf);
return 0;
}
-static void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols,
+static int dumpCreateTableClause(STableDef *tableDes, int numOfCols,
FILE *fp, char* dbName) {
int counter = 0;
int count_temp = 0;
@@ -2214,10 +1945,11 @@ static void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols,
pstr += sprintf(pstr, ");");
- fprintf(fp, "%s\n\n", sqlstr);
+ debugPrint("%s() LN%d, write string: %s\n", __func__, __LINE__, sqlstr);
+ return fprintf(fp, "%s\n\n", sqlstr);
}
-static void taosDumpCreateMTableClause(STableDef *tableDes, char *metric,
+static void taosDumpCreateMTableClause(STableDef *tableDes, char *stable,
int numOfCols, FILE *fp, char* dbName) {
int counter = 0;
int count_temp = 0;
@@ -2234,7 +1966,7 @@ static void taosDumpCreateMTableClause(STableDef *tableDes, char *metric,
pstr += sprintf(tmpBuf,
"CREATE TABLE IF NOT EXISTS %s.%s USING %s.%s TAGS (",
- dbName, tableDes->name, dbName, metric);
+ dbName, tableDes->name, dbName, stable);
for (; counter < numOfCols; counter++) {
if (tableDes->cols[counter].note[0] != '\0') break;
@@ -2434,8 +2166,8 @@ static int64_t writeResultToSql(TAOS_RES *res, FILE *fp, char *dbName, char *tbN
return 0;
}
-static int taosDumpTableData(FILE *fp, char *tbName,
- TAOS* taosCon, char* dbName, int precision,
+static int64_t dumpTableData(FILE *fp, char *tbName,
+ char* dbName, int precision,
char *jsonAvroSchema) {
int64_t totalRows = 0;
@@ -2468,12 +2200,22 @@ static int taosDumpTableData(FILE *fp, char *tbName,
"select * from %s.%s where _c0 >= %" PRId64 " and _c0 <= %" PRId64 " order by _c0 asc;",
dbName, tbName, start_time, end_time);
- TAOS_RES* res = taos_query(taosCon, sqlstr);
+ TAOS *taos = taos_connect(g_args.host,
+ g_args.user, g_args.password, dbName, g_args.port);
+ if (NULL == taos) {
+ errorPrint(
+ "Failed to connect to TDengine server %s by specified database %s\n",
+ g_args.host, dbName);
+ return -1;
+ }
+
+ TAOS_RES* res = taos_query(taos, sqlstr);
int32_t code = taos_errno(res);
if (code != 0) {
errorPrint("failed to run command %s, reason: %s\n",
sqlstr, taos_errstr(res));
taos_free_result(res);
+ taos_close(taos);
return -1;
}
@@ -2485,20 +2227,27 @@ static int taosDumpTableData(FILE *fp, char *tbName,
}
taos_free_result(res);
+ taos_close(taos);
return totalRows;
}
-static int taosCheckParam(struct arguments *arguments) {
+static int checkParam() {
if (g_args.all_databases && g_args.databases) {
- fprintf(stderr, "conflict option --all-databases and --databases\n");
+ errorPrint("%s", "conflict option --all-databases and --databases\n");
return -1;
}
if (g_args.start_time > g_args.end_time) {
- fprintf(stderr, "start time is larger than end time\n");
+ errorPrint("%s", "start time is larger than end time\n");
return -1;
}
+ if (g_args.arg_list_len == 0) {
+ if ((!g_args.all_databases) && (!g_args.databases) && (!g_args.isDumpIn)) {
+ errorPrint("%s", "taosdump requires parameters\n");
+ return -1;
+ }
+ }
/*
if (g_args.isDumpIn && (strcmp(g_args.outpath, DEFAULT_DUMP_FILE) != 0)) {
fprintf(stderr, "duplicate parameter input and output file path\n");
@@ -2904,7 +2653,7 @@ static int taosDumpInOneFile(TAOS* taos, FILE* fp, char* fcharset,
static void* taosDumpInWorkThreadFp(void *arg)
{
- SThreadParaObj *pThread = (SThreadParaObj*)arg;
+ threadInfo *pThread = (threadInfo*)arg;
setThreadName("dumpInWorkThrd");
for (int32_t f = 0; f < g_tsSqlFileNum; ++f) {
@@ -2916,7 +2665,7 @@ static void* taosDumpInWorkThreadFp(void *arg)
}
fprintf(stderr, ", Success Open input file: %s\n",
SQLFileName);
- taosDumpInOneFile(pThread->taosCon, fp, g_tsCharset, g_args.encode, SQLFileName);
+ taosDumpInOneFile(pThread->taos, fp, g_tsCharset, g_args.encode, SQLFileName);
}
}
@@ -2926,15 +2675,15 @@ static void* taosDumpInWorkThreadFp(void *arg)
static void taosStartDumpInWorkThreads()
{
pthread_attr_t thattr;
- SThreadParaObj *pThread;
+ threadInfo *pThread;
int32_t totalThreads = g_args.thread_num;
if (totalThreads > g_tsSqlFileNum) {
totalThreads = g_tsSqlFileNum;
}
- SThreadParaObj *threadObj = (SThreadParaObj *)calloc(
- totalThreads, sizeof(SThreadParaObj));
+ threadInfo *threadObj = (threadInfo *)calloc(
+ totalThreads, sizeof(threadInfo));
if (NULL == threadObj) {
errorPrint("%s() LN%d, memory allocation failed\n", __func__, __LINE__);
@@ -2944,9 +2693,9 @@ static void taosStartDumpInWorkThreads()
pThread = threadObj + t;
pThread->threadIndex = t;
pThread->totalThreads = totalThreads;
- pThread->taosCon = taos_connect(g_args.host, g_args.user, g_args.password,
+ pThread->taos = taos_connect(g_args.host, g_args.user, g_args.password,
NULL, g_args.port);
- if (pThread->taosCon == NULL) {
+ if (pThread->taos == NULL) {
errorPrint("Failed to connect to TDengine server %s\n", g_args.host);
free(threadObj);
return;
@@ -2967,7 +2716,7 @@ static void taosStartDumpInWorkThreads()
}
for (int t = 0; t < totalThreads; ++t) {
- taos_close(threadObj[t].taosCon);
+ taos_close(threadObj[t].taos);
}
free(threadObj);
}
@@ -3017,3 +2766,153 @@ static int taosDumpIn() {
return 0;
}
+int main(int argc, char *argv[]) {
+ static char verType[32] = {0};
+ sprintf(verType, "version: %s\n", version);
+ argp_program_version = verType;
+
+ int ret = 0;
+ /* Parse our arguments; every option seen by parse_opt will be
+ reflected in arguments. */
+ if (argc > 1) {
+// parse_precision_first(argc, argv, &g_args);
+ parse_timestamp(argc, argv, &g_args);
+ parse_args(argc, argv, &g_args);
+ }
+
+ argp_parse(&argp, argc, argv, 0, 0, &g_args);
+
+ if (g_args.abort) {
+#ifndef _ALPINE
+ error(10, 0, "ABORTED");
+#else
+ abort();
+#endif
+ }
+
+ printf("====== arguments config ======\n");
+
+ printf("host: %s\n", g_args.host);
+ printf("user: %s\n", g_args.user);
+ printf("password: %s\n", g_args.password);
+ printf("port: %u\n", g_args.port);
+ printf("mysqlFlag: %d\n", g_args.mysqlFlag);
+ printf("outpath: %s\n", g_args.outpath);
+ printf("inpath: %s\n", g_args.inpath);
+ printf("resultFile: %s\n", g_args.resultFile);
+ printf("encode: %s\n", g_args.encode);
+ printf("all_databases: %s\n", g_args.all_databases?"true":"false");
+ printf("databases: %d\n", g_args.databases);
+ printf("databasesSeq: %s\n", g_args.databasesSeq);
+ printf("schemaonly: %s\n", g_args.schemaonly?"true":"false");
+ printf("with_property: %s\n", g_args.with_property?"true":"false");
+ printf("avro format: %s\n", g_args.avro?"true":"false");
+ printf("start_time: %" PRId64 "\n", g_args.start_time);
+ printf("human readable start time: %s \n", g_args.humanStartTime);
+ printf("end_time: %" PRId64 "\n", g_args.end_time);
+ printf("human readable end time: %s \n", g_args.humanEndTime);
+ printf("precision: %s\n", g_args.precision);
+ printf("data_batch: %d\n", g_args.data_batch);
+ printf("max_sql_len: %d\n", g_args.max_sql_len);
+ printf("table_batch: %d\n", g_args.table_batch);
+ printf("thread_num: %d\n", g_args.thread_num);
+ printf("allow_sys: %d\n", g_args.allow_sys);
+ printf("abort: %d\n", g_args.abort);
+ printf("isDumpIn: %d\n", g_args.isDumpIn);
+ printf("arg_list_len: %d\n", g_args.arg_list_len);
+ printf("debug_print: %d\n", g_args.debug_print);
+
+ for (int32_t i = 0; i < g_args.arg_list_len; i++) {
+ printf("arg_list[%d]: %s\n", i, g_args.arg_list[i]);
+ }
+
+ printf("==============================\n");
+ if (checkParam(&g_args) < 0) {
+ exit(EXIT_FAILURE);
+ }
+
+ g_fpOfResult = fopen(g_args.resultFile, "a");
+ if (NULL == g_fpOfResult) {
+ errorPrint("Failed to open %s for save result\n", g_args.resultFile);
+ exit(-1);
+ };
+
+ fprintf(g_fpOfResult, "#############################################################################\n");
+ fprintf(g_fpOfResult, "============================== arguments config =============================\n");
+
+ fprintf(g_fpOfResult, "host: %s\n", g_args.host);
+ fprintf(g_fpOfResult, "user: %s\n", g_args.user);
+ fprintf(g_fpOfResult, "password: %s\n", g_args.password);
+ fprintf(g_fpOfResult, "port: %u\n", g_args.port);
+ fprintf(g_fpOfResult, "mysqlFlag: %d\n", g_args.mysqlFlag);
+ fprintf(g_fpOfResult, "outpath: %s\n", g_args.outpath);
+ fprintf(g_fpOfResult, "inpath: %s\n", g_args.inpath);
+ fprintf(g_fpOfResult, "resultFile: %s\n", g_args.resultFile);
+ fprintf(g_fpOfResult, "encode: %s\n", g_args.encode);
+ fprintf(g_fpOfResult, "all_databases: %s\n", g_args.all_databases?"true":"false");
+ fprintf(g_fpOfResult, "databases: %d\n", g_args.databases);
+ fprintf(g_fpOfResult, "databasesSeq: %s\n", g_args.databasesSeq);
+ fprintf(g_fpOfResult, "schemaonly: %s\n", g_args.schemaonly?"true":"false");
+ fprintf(g_fpOfResult, "with_property: %s\n", g_args.with_property?"true":"false");
+ fprintf(g_fpOfResult, "avro format: %s\n", g_args.avro?"true":"false");
+ fprintf(g_fpOfResult, "start_time: %" PRId64 "\n", g_args.start_time);
+ fprintf(g_fpOfResult, "human readable start time: %s \n", g_args.humanStartTime);
+ fprintf(g_fpOfResult, "end_time: %" PRId64 "\n", g_args.end_time);
+ fprintf(g_fpOfResult, "human readable end time: %s \n", g_args.humanEndTime);
+ fprintf(g_fpOfResult, "precision: %s\n", g_args.precision);
+ fprintf(g_fpOfResult, "data_batch: %d\n", g_args.data_batch);
+ fprintf(g_fpOfResult, "max_sql_len: %d\n", g_args.max_sql_len);
+ fprintf(g_fpOfResult, "table_batch: %d\n", g_args.table_batch);
+ fprintf(g_fpOfResult, "thread_num: %d\n", g_args.thread_num);
+ fprintf(g_fpOfResult, "allow_sys: %d\n", g_args.allow_sys);
+ fprintf(g_fpOfResult, "abort: %d\n", g_args.abort);
+ fprintf(g_fpOfResult, "isDumpIn: %d\n", g_args.isDumpIn);
+ fprintf(g_fpOfResult, "arg_list_len: %d\n", g_args.arg_list_len);
+
+ for (int32_t i = 0; i < g_args.arg_list_len; i++) {
+ fprintf(g_fpOfResult, "arg_list[%d]: %s\n", i, g_args.arg_list[i]);
+ }
+
+ g_numOfCores = (int32_t)sysconf(_SC_NPROCESSORS_ONLN);
+
+ time_t tTime = time(NULL);
+ struct tm tm = *localtime(&tTime);
+
+ if (g_args.isDumpIn) {
+ fprintf(g_fpOfResult, "============================== DUMP IN ============================== \n");
+ fprintf(g_fpOfResult, "# DumpIn start time: %d-%02d-%02d %02d:%02d:%02d\n",
+ tm.tm_year + 1900, tm.tm_mon + 1,
+ tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+ if (taosDumpIn() < 0) {
+ ret = -1;
+ }
+ } else {
+ fprintf(g_fpOfResult, "============================== DUMP OUT ============================== \n");
+ fprintf(g_fpOfResult, "# DumpOut start time: %d-%02d-%02d %02d:%02d:%02d\n",
+ tm.tm_year + 1900, tm.tm_mon + 1,
+ tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+ if (taosDumpOut() < 0) {
+ ret = -1;
+ } else {
+ fprintf(g_fpOfResult, "\n============================== TOTAL STATISTICS ============================== \n");
+ fprintf(g_fpOfResult, "# total database count: %d\n",
+ g_resultStatistics.totalDatabasesOfDumpOut);
+ fprintf(g_fpOfResult, "# total super table count: %d\n",
+ g_resultStatistics.totalSuperTblsOfDumpOut);
+ fprintf(g_fpOfResult, "# total child table count: %"PRId64"\n",
+ g_resultStatistics.totalChildTblsOfDumpOut);
+ fprintf(g_fpOfResult, "# total row count: %"PRId64"\n",
+ g_resultStatistics.totalRowsOfDumpOut);
+ }
+ }
+
+ fprintf(g_fpOfResult, "\n");
+ fclose(g_fpOfResult);
+
+ if (g_tablesList) {
+ free(g_tablesList);
+ }
+
+ return ret;
+}
+
diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c
index 6f29f96df7cc46aaf5e482d1f24858306cfc08db..dd5ed1ea337030e8b15ef1efe756d9a468158041 100644
--- a/src/query/src/qAggMain.c
+++ b/src/query/src/qAggMain.c
@@ -2502,18 +2502,17 @@ static void tdigest_merge(SQLFunctionCtx *pCtx) {
SAPercentileInfo *pInput = (SAPercentileInfo *)GET_INPUT_DATA_LIST(pCtx);
assert(pInput->pTDigest);
pInput->pTDigest = (TDigest*)((char*)pInput + sizeof(SAPercentileInfo));
- pInput->pTDigest->centroids = (SCentroid*)((char*)pInput + sizeof(SAPercentileInfo) + sizeof(TDigest));
+ tdigestAutoFill(pInput->pTDigest, COMPRESSION);
// input merge no elements , no need merge
- if(pInput->pTDigest->num_centroids == 0) {
+ if(pInput->pTDigest->num_centroids == 0 && pInput->pTDigest->num_buffered_pts == 0) {
return ;
}
SAPercentileInfo *pOutput = getAPerctInfo(pCtx);
- TDigest* pTDigest = pOutput->pTDigest;
- if(pTDigest->num_centroids == 0) {
- memcpy(pTDigest, pInput->pTDigest, (size_t)TDIGEST_SIZE(COMPRESSION));
- tdigestAutoFill(pTDigest, COMPRESSION);
+ if(pOutput->pTDigest->num_centroids == 0) {
+ memcpy(pOutput->pTDigest, pInput->pTDigest, (size_t)TDIGEST_SIZE(COMPRESSION));
+ tdigestAutoFill(pOutput->pTDigest, COMPRESSION);
} else {
tdigestMerge(pOutput->pTDigest, pInput->pTDigest);
}
diff --git a/src/query/src/tdigest.c b/src/query/src/tdigest.c
index 67f8b7d27dff3e5018716b36c9213dcf4d12d9c8..29ff707bef5c32bc7652340427c375eeaa6577af 100644
--- a/src/query/src/tdigest.c
+++ b/src/query/src/tdigest.c
@@ -77,7 +77,7 @@ static void mergeCentroid(SMergeArgs *args, SCentroid *merge) {
args->weight_so_far += merge->weight;
k2 = INTEGRATED_LOCATION(args->t->size,
- args->weight_so_far / (args->t->total_weight + merge->weight));
+ args->weight_so_far / args->t->total_weight);
//idx++
if(k2 - args->k1 > 1 && c->weight > 0) {
if(args->idx + 1 < args->t->size
diff --git a/src/rpc/src/rpcMain.c b/src/rpc/src/rpcMain.c
index 9ea5fd539244820f111a3fbb3c60aee088e727c5..7ccaa17f0f1113312b56498bb6d21992b4a9f653 100644
--- a/src/rpc/src/rpcMain.c
+++ b/src/rpc/src/rpcMain.c
@@ -1005,7 +1005,7 @@ static SRpcConn *rpcProcessMsgHead(SRpcInfo *pRpc, SRecvInfo *pRecv, SRpcReqCont
// client shall send the request within tsRpcTime again for UDP, double it
if (pConn->connType != RPC_CONN_TCPS)
- pConn->pIdleTimer = taosTmrStart(rpcProcessIdleTimer, tsRpcTimer*2, pConn, pRpc->tmrCtrl);
+ pConn->pIdleTimer = taosTmrStart(rpcProcessIdleTimer, tsRpcTimer*20, pConn, pRpc->tmrCtrl);
} else {
terrno = rpcProcessRspHead(pConn, pHead);
*ppContext = pConn->pContext;
diff --git a/src/util/src/tconfig.c b/src/util/src/tconfig.c
index 9ce6876fd6d2c555acf5450a9128f787ccd300c8..69b0d8d7bb9ad5ab37321a5460c3f083e3a71dba 100644
--- a/src/util/src/tconfig.c
+++ b/src/util/src/tconfig.c
@@ -606,4 +606,4 @@ void taosDumpGlobalCfg() {
taosDumpCfg(cfg);
}
-}
\ No newline at end of file
+}
diff --git a/tests/examples/c/-g b/tests/examples/c/-g
deleted file mode 100755
index 3909909e8fe531a7b6d35ca315b8277e7270bb02..0000000000000000000000000000000000000000
Binary files a/tests/examples/c/-g and /dev/null differ
diff --git a/tests/examples/c/apitest.c b/tests/examples/c/apitest.c
index c886c6d2fe332380e9f519bfc1133d3d5b4106fa..18569196993de2c424f8449db3461b6ff0471d0d 100644
--- a/tests/examples/c/apitest.c
+++ b/tests/examples/c/apitest.c
@@ -2,7 +2,6 @@
// to compile: gcc -o apitest apitest.c -ltaos
#include "taoserror.h"
-#include "cJSON.h"
#include
#include
@@ -1018,920 +1017,6 @@ int32_t verify_schema_less(TAOS* taos) {
return (code);
}
-void verify_telnet_insert(TAOS* taos) {
- TAOS_RES *result;
-
- result = taos_query(taos, "drop database if exists db;");
- taos_free_result(result);
- usleep(100000);
- result = taos_query(taos, "create database db precision 'ms';");
- taos_free_result(result);
- usleep(100000);
-
- (void)taos_select_db(taos, "db");
- int32_t code = 0;
-
- /* metric */
- char* lines0[] = {
- "stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
- "stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
- "stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
- };
- code = taos_insert_telnet_lines(taos, lines0, 3);
- if (code) {
- printf("lines0 code: %d, %s.\n", code, tstrerror(code));
- }
-
- /* timestamp */
- char* lines1[] = {
- "stb1 1626006833s 1i8 host=\"host0\"",
- "stb1 1626006833639000000ns 2i8 host=\"host0\"",
- "stb1 1626006833640000us 3i8 host=\"host0\"",
- "stb1 1626006833641123 4i8 host=\"host0\"",
- "stb1 1626006833651ms 5i8 host=\"host0\"",
- "stb1 0 6i8 host=\"host0\"",
- };
- code = taos_insert_telnet_lines(taos, lines1, 6);
- if (code) {
- printf("lines1 code: %d, %s.\n", code, tstrerror(code));
- }
-
- /* metric value */
- //tinyint
- char* lines2_0[] = {
- "stb2_0 1626006833651ms -127i8 host=\"host0\"",
- "stb2_0 1626006833652ms 127i8 host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_0, 2);
- if (code) {
- printf("lines2_0 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //smallint
- char* lines2_1[] = {
- "stb2_1 1626006833651ms -32767i16 host=\"host0\"",
- "stb2_1 1626006833652ms 32767i16 host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_1, 2);
- if (code) {
- printf("lines2_1 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //int
- char* lines2_2[] = {
- "stb2_2 1626006833651ms -2147483647i32 host=\"host0\"",
- "stb2_2 1626006833652ms 2147483647i32 host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_2, 2);
- if (code) {
- printf("lines2_2 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //bigint
- char* lines2_3[] = {
- "stb2_3 1626006833651ms -9223372036854775807i64 host=\"host0\"",
- "stb2_3 1626006833652ms 9223372036854775807i64 host=\"host0\"",
- "stb2_3 1626006833662ms 9223372036854775807 host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_3, 3);
- if (code) {
- printf("lines2_3 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //float
- char* lines2_4[] = {
- "stb2_4 1626006833610ms 3f32 host=\"host0\"",
- "stb2_4 1626006833620ms -3f32 host=\"host0\"",
- "stb2_4 1626006833630ms 3.4f32 host=\"host0\"",
- "stb2_4 1626006833640ms -3.4f32 host=\"host0\"",
- "stb2_4 1626006833650ms 3.4E10f32 host=\"host0\"",
- "stb2_4 1626006833660ms -3.4e10f32 host=\"host0\"",
- "stb2_4 1626006833670ms 3.4E+2f32 host=\"host0\"",
- "stb2_4 1626006833680ms -3.4e-2f32 host=\"host0\"",
- "stb2_4 1626006833700ms 3.4E38f32 host=\"host0\"",
- "stb2_4 1626006833710ms -3.4E38f32 host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_4, 10);
- if (code) {
- printf("lines2_4 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //double
- char* lines2_5[] = {
- "stb2_5 1626006833610ms 3f64 host=\"host0\"",
- "stb2_5 1626006833620ms -3f64 host=\"host0\"",
- "stb2_5 1626006833630ms 3.4f64 host=\"host0\"",
- "stb2_5 1626006833640ms -3.4f64 host=\"host0\"",
- "stb2_5 1626006833650ms 3.4E10f64 host=\"host0\"",
- "stb2_5 1626006833660ms -3.4e10f64 host=\"host0\"",
- "stb2_5 1626006833670ms 3.4E+2f64 host=\"host0\"",
- "stb2_5 1626006833680ms -3.4e-2f64 host=\"host0\"",
- "stb2_5 1626006833690ms 1.7E308f64 host=\"host0\"",
- "stb2_5 1626006833700ms -1.7E308f64 host=\"host0\"",
- "stb2_5 1626006833710ms 3.15 host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_5, 11);
- if (code) {
- printf("lines2_5 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //bool
- char* lines2_6[] = {
- "stb2_6 1626006833610ms t host=\"host0\"",
- "stb2_6 1626006833620ms T host=\"host0\"",
- "stb2_6 1626006833630ms true host=\"host0\"",
- "stb2_6 1626006833640ms True host=\"host0\"",
- "stb2_6 1626006833650ms TRUE host=\"host0\"",
- "stb2_6 1626006833660ms f host=\"host0\"",
- "stb2_6 1626006833670ms F host=\"host0\"",
- "stb2_6 1626006833680ms false host=\"host0\"",
- "stb2_6 1626006833690ms False host=\"host0\"",
- "stb2_6 1626006833700ms FALSE host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_6, 10);
- if (code) {
- printf("lines2_6 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //binary
- char* lines2_7[] = {
- "stb2_7 1626006833610ms \"binary_val.!@#$%^&*\" host=\"host0\"",
- "stb2_7 1626006833620ms \"binary_val.:;,./?|+-=\" host=\"host0\"",
- "stb2_7 1626006833630ms \"binary_val.()[]{}<>\" host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_7, 3);
- if (code) {
- printf("lines2_7 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //nchar
- char* lines2_8[] = {
- "stb2_8 1626006833610ms L\"nchar_val数值一\" host=\"host0\"",
- "stb2_8 1626006833620ms L\"nchar_val数值二\" host=\"host0\""
- };
- code = taos_insert_telnet_lines(taos, lines2_8, 2);
- if (code) {
- printf("lines2_8 code: %d, %s.\n", code, tstrerror(code));
- }
-
- /* tags */
- //tag value types
- char* lines3_0[] = {
- "stb3_0 1626006833610ms 1 t1=127i8 t2=32767i16 t3=2147483647i32 t4=9223372036854775807i64 t5=3.4E38f32 t6=1.7E308f64 t7=true t8=\"binary_val_1\" t9=L\"标签值1\"",
- "stb3_0 1626006833610ms 2 t1=-127i8 t2=-32767i16 t3=-2147483647i32 t4=-9223372036854775807i64 t5=-3.4E38f32 t6=-1.7E308f64 t7=false t8=\"binary_val_2\" t9=L\"标签值2\""
- };
- code = taos_insert_telnet_lines(taos, lines3_0, 2);
- if (code) {
- printf("lines3_0 code: %d, %s.\n", code, tstrerror(code));
- }
-
- //tag ID as child table name
- char* lines3_1[] = {
- "stb3_1 1626006833610ms 1 id=\"child_table1\" host=\"host1\"",
- "stb3_1 1626006833610ms 2 host=\"host2\" iD=\"child_table2\"",
- "stb3_1 1626006833610ms 3 ID=\"child_table3\" host=\"host3\""
- };
- code = taos_insert_telnet_lines(taos, lines3_1, 3);
- if (code) {
- printf("lines3_1 code: %d, %s.\n", code, tstrerror(code));
- }
-
- return;
-}
-
-void verify_json_insert(TAOS* taos) {
- TAOS_RES *result;
-
- result = taos_query(taos, "drop database if exists db;");
- taos_free_result(result);
- usleep(100000);
- result = taos_query(taos, "create database db precision 'ms';");
- taos_free_result(result);
- usleep(100000);
-
- (void)taos_select_db(taos, "db");
- int32_t code = 0;
-
- char *message =
- "{ \
- \"metric\":\"cpu_load_0\", \
- \"timestamp\": 1626006833610123, \
- \"value\": 55.5, \
- \"tags\": \
- { \
- \"host\": \"ubuntu\", \
- \"interface1\": \"eth0\", \
- \"Id\": \"tb0\" \
- } \
- }";
-
- code = taos_insert_json_payload(taos, message);
- if (code) {
- printf("payload_0 code: %d, %s.\n", code, tstrerror(code));
- }
-
- char *message1 =
- "[ \
- { \
- \"metric\":\"cpu_load_1\", \
- \"timestamp\": 1626006833610123, \
- \"value\": 55.5, \
- \"tags\": \
- { \
- \"host\": \"ubuntu\", \
- \"interface\": \"eth1\", \
- \"Id\": \"tb1\" \
- } \
- }, \
- { \
- \"metric\":\"cpu_load_2\", \
- \"timestamp\": 1626006833610123, \
- \"value\": 55.5, \
- \"tags\": \
- { \
- \"host\": \"ubuntu\", \
- \"interface\": \"eth2\", \
- \"Id\": \"tb2\" \
- } \
- } \
- ]";
-
- code = taos_insert_json_payload(taos, message1);
- if (code) {
- printf("payload_1 code: %d, %s.\n", code, tstrerror(code));
- }
-
- char *message2 =
- "[ \
- { \
- \"metric\":\"cpu_load_3\", \
- \"timestamp\": \
- { \
- \"value\": 1626006833610123, \
- \"type\": \"us\" \
- }, \
- \"value\": \
- { \
- \"value\": 55, \
- \"type\": \"int\" \
- }, \
- \"tags\": \
- { \
- \"host\": \
- { \
- \"value\": \"ubuntu\", \
- \"type\": \"binary\" \
- }, \
- \"interface\": \
- { \
- \"value\": \"eth3\", \
- \"type\": \"nchar\" \
- }, \
- \"ID\": \"tb3\", \
- \"port\": \
- { \
- \"value\": 4040, \
- \"type\": \"int\" \
- } \
- } \
- }, \
- { \
- \"metric\":\"cpu_load_4\", \
- \"timestamp\": 1626006833610123, \
- \"value\": 66.6, \
- \"tags\": \
- { \
- \"host\": \"ubuntu\", \
- \"interface\": \"eth4\", \
- \"Id\": \"tb4\" \
- } \
- } \
- ]";
- code = taos_insert_json_payload(taos, message2);
- if (code) {
- printf("payload_2 code: %d, %s.\n", code, tstrerror(code));
- }
-
-
- cJSON *payload, *tags;
- char *payload_str;
-
- /* Default format */
- //number
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb0_0");
- cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
- cJSON_AddNumberToObject(payload, "value", 10);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload0_0 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //true
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb0_1");
- cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
- cJSON_AddTrueToObject(payload, "value");
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload0_1 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //false
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb0_2");
- cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
- cJSON_AddFalseToObject(payload, "value");
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload0_2 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //string
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb0_3");
- cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
- cJSON_AddStringToObject(payload, "value", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload0_3 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //timestamp 0 -> current time
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb0_4");
- cJSON_AddNumberToObject(payload, "timestamp", 0);
- cJSON_AddNumberToObject(payload, "value", 123);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload0_4 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //ID
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb0_5");
- cJSON_AddNumberToObject(payload, "timestamp", 0);
- cJSON_AddNumberToObject(payload, "value", 123);
- tags = cJSON_CreateObject();
- cJSON_AddStringToObject(tags, "ID", "tb0_5");
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddStringToObject(tags, "iD", "tb000");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddStringToObject(tags, "id", "tb555");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload0_5 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- /* Nested format */
- //timestamp
- cJSON *timestamp;
- //seconds
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb1_0");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- cJSON_AddNumberToObject(payload, "value", 10);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload1_0 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //milleseconds
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb1_1");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833610);
- cJSON_AddStringToObject(timestamp, "type", "ms");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- cJSON_AddNumberToObject(payload, "value", 10);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload1_1 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //microseconds
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb1_2");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833610123);
- cJSON_AddStringToObject(timestamp, "type", "us");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- cJSON_AddNumberToObject(payload, "value", 10);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload1_2 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //nanoseconds
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb1_3");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833610123321);
- cJSON_AddStringToObject(timestamp, "type", "ns");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- cJSON_AddNumberToObject(payload, "value", 10);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload1_3 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //now
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb1_4");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 0);
- cJSON_AddStringToObject(timestamp, "type", "ns");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- cJSON_AddNumberToObject(payload, "value", 10);
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload1_4 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //metric value
- cJSON *metric_val;
- //bool
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_0");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddTrueToObject(metric_val, "value");
- cJSON_AddStringToObject(metric_val, "type", "bool");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_0 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //tinyint
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_1");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddNumberToObject(metric_val, "value", 127);
- cJSON_AddStringToObject(metric_val, "type", "tinyint");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_1 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //smallint
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_2");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddNumberToObject(metric_val, "value", 32767);
- cJSON_AddStringToObject(metric_val, "type", "smallint");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_2 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //int
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_3");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddNumberToObject(metric_val, "value", 2147483647);
- cJSON_AddStringToObject(metric_val, "type", "int");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_3 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //bigint
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_4");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddNumberToObject(metric_val, "value", 9223372036854775807);
- cJSON_AddStringToObject(metric_val, "type", "bigint");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_4 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //float
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_5");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddNumberToObject(metric_val, "value", 11.12345);
- cJSON_AddStringToObject(metric_val, "type", "float");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_5 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //double
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_6");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddNumberToObject(metric_val, "value", 22.123456789);
- cJSON_AddStringToObject(metric_val, "type", "double");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_6 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //binary
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_7");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddStringToObject(metric_val, "value", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddStringToObject(metric_val, "type", "binary");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_7 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //nchar
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb2_8");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddStringToObject(metric_val, "value", "你好");
- cJSON_AddStringToObject(metric_val, "type", "nchar");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
- cJSON_AddTrueToObject(tags, "t1");
- cJSON_AddFalseToObject(tags, "t2");
- cJSON_AddNumberToObject(tags, "t3", 10);
- cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
- cJSON_AddItemToObject(payload, "tags", tags);
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload2_8 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-
- //tag value
- cJSON *tag;
-
- payload = cJSON_CreateObject();
- cJSON_AddStringToObject(payload, "metric", "stb3_0");
-
- timestamp = cJSON_CreateObject();
- cJSON_AddNumberToObject(timestamp, "value", 1626006833);
- cJSON_AddStringToObject(timestamp, "type", "s");
- cJSON_AddItemToObject(payload, "timestamp", timestamp);
-
- metric_val = cJSON_CreateObject();
- cJSON_AddStringToObject(metric_val, "value", "hello");
- cJSON_AddStringToObject(metric_val, "type", "nchar");
- cJSON_AddItemToObject(payload, "value", metric_val);
-
- tags = cJSON_CreateObject();
-
- tag = cJSON_CreateObject();
- cJSON_AddTrueToObject(tag, "value");
- cJSON_AddStringToObject(tag, "type", "bool");
- cJSON_AddItemToObject(tags, "t1", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddFalseToObject(tag, "value");
- cJSON_AddStringToObject(tag, "type", "bool");
- cJSON_AddItemToObject(tags, "t2", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddNumberToObject(tag, "value", 127);
- cJSON_AddStringToObject(tag, "type", "tinyint");
- cJSON_AddItemToObject(tags, "t3", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddNumberToObject(tag, "value", 32767);
- cJSON_AddStringToObject(tag, "type", "smallint");
- cJSON_AddItemToObject(tags, "t4", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddNumberToObject(tag, "value", 2147483647);
- cJSON_AddStringToObject(tag, "type", "int");
- cJSON_AddItemToObject(tags, "t5", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddNumberToObject(tag, "value", 9223372036854775807);
- cJSON_AddStringToObject(tag, "type", "bigint");
- cJSON_AddItemToObject(tags, "t6", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddNumberToObject(tag, "value", 11.12345);
- cJSON_AddStringToObject(tag, "type", "float");
- cJSON_AddItemToObject(tags, "t7", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddNumberToObject(tag, "value", 22.1234567890);
- cJSON_AddStringToObject(tag, "type", "double");
- cJSON_AddItemToObject(tags, "t8", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddStringToObject(tag, "value", "binary_val");
- cJSON_AddStringToObject(tag, "type", "binary");
- cJSON_AddItemToObject(tags, "t9", tag);
-
- tag = cJSON_CreateObject();
- cJSON_AddStringToObject(tag, "value", "你好");
- cJSON_AddStringToObject(tag, "type", "nchar");
- cJSON_AddItemToObject(tags, "t10", tag);
-
- cJSON_AddItemToObject(payload, "tags", tags);
-
- payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
-
- code = taos_insert_json_payload(taos, payload_str);
- if (code) {
- printf("payload3_0 code: %d, %s.\n", code, tstrerror(code));
- }
- free(payload_str);
- cJSON_Delete(payload);
-}
-
int main(int argc, char *argv[]) {
const char* host = "127.0.0.1";
const char* user = "root";
@@ -1952,12 +1037,6 @@ int main(int argc, char *argv[]) {
printf("************ verify schema-less *************\n");
verify_schema_less(taos);
- printf("************ verify telnet-insert *************\n");
- verify_telnet_insert(taos);
-
- printf("************ verify json-insert *************\n");
- verify_json_insert(taos);
-
printf("************ verify query *************\n");
verify_query(taos);
diff --git a/tests/examples/c/makefile b/tests/examples/c/makefile
index f364eb76fc34ab0975c00dcae2b8348e58b38517..73f4ff43c175bf61ea19a8eacc6d70a06b302cb7 100644
--- a/tests/examples/c/makefile
+++ b/tests/examples/c/makefile
@@ -17,12 +17,6 @@ exe:
gcc $(CFLAGS) ./stream.c -o $(ROOT)stream $(LFLAGS)
gcc $(CFLAGS) ./subscribe.c -o $(ROOT)subscribe $(LFLAGS)
gcc $(CFLAGS) ./apitest.c -o $(ROOT)apitest $(LFLAGS)
- gcc $(CFLAGS) ./clientcfgtest.c -o $(ROOT)clientcfgtest $(LFLAGS)
- gcc $(CFLAGS) ./clientcfgtest-wrongtype.c -o $(ROOT)clientcfgtest-wrongtype $(LFLAGS)
- gcc $(CFLAGS) ./clientcfgtest-wrongjson.c -o $(ROOT)clientcfgtest-wrongjson $(LFLAGS)
- gcc $(CFLAGS) ./clientcfgtest-wrongvalue.c -o $(ROOT)clientcfgtest-wrongvalue $(LFLAGS)
- gcc $(CFLAGS) ./clientcfgtest-taosd.c -o $(ROOT)clientcfgtest-taosd $(LFLAGS)
-
clean:
rm $(ROOT)asyncdemo
@@ -32,9 +26,7 @@ clean:
rm $(ROOT)stream
rm $(ROOT)subscribe
rm $(ROOT)apitest
- rm $(ROOT)clientcfgtest
- rm $(ROOT)clientcfgtest-wrongtype
- rm $(ROOT)clientcfgtest-wrongjson
- rm $(ROOT)clientcfgtest-wrongvalue
- rm $(ROOT)clientcfgtest-taosd
+
+
+
diff --git a/tests/pytest/crash_gen/valgrind_taos.supp b/tests/pytest/crash_gen/valgrind_taos.supp
index 8c35778018b9c34789f862f6a728e487694357f4..6b3a04353d30b1109f40db2053d56122bd9df290 100644
--- a/tests/pytest/crash_gen/valgrind_taos.supp
+++ b/tests/pytest/crash_gen/valgrind_taos.supp
@@ -18213,4 +18213,21 @@
obj:/usr/bin/python3.8
fun:PyVectorcall_Call
fun:_PyEval_EvalFrameDefault
+}
+{
+
+ Memcheck:Leak
+ match-leak-kinds: definite
+ fun:malloc
+ fun:_buffer_get_info
+ fun:array_getbuffer
+ fun:__Pyx__GetBufferAndValidate.constprop.64
+ fun:__pyx_f_5numpy_6random_13bit_generator_12SeedSequence_mix_entropy
+ fun:__pyx_pw_5numpy_6random_13bit_generator_12SeedSequence_1__init__
+ obj:/usr/bin/python3.8
+ fun:__Pyx__PyObject_CallOneArg
+ fun:__Pyx_PyObject_CallOneArg
+ fun:__pyx_pw_5numpy_6random_13bit_generator_12BitGenerator_1__init__
+ obj:/usr/bin/python3.8
+ obj:/usr/bin/python3.8
}
\ No newline at end of file
diff --git a/tests/pytest/fulltest.sh b/tests/pytest/fulltest.sh
index b8bb94b26d5117cb9e99468dfa94155ca70c4193..a7c375489aec74517f9bb92938b4179b6f9e5dc0 100755
--- a/tests/pytest/fulltest.sh
+++ b/tests/pytest/fulltest.sh
@@ -398,6 +398,7 @@ python3 ./test.py -f query/queryWildcardLength.py
python3 ./test.py -f query/queryTbnameUpperLower.py
python3 ./test.py -f query/query.py
python3 ./test.py -f query/queryDiffColsOr.py
+python3 ./test.py -f query/queryRegex.py
#======================p4-end===============
diff --git a/tests/pytest/query/queryGroupbyWithInterval.py b/tests/pytest/query/queryGroupbyWithInterval.py
index 14f6999021f23764bef95afdaa33cbcb695f2f55..d5474d069ab1af7a496515e23a46713d45f6262f 100644
--- a/tests/pytest/query/queryGroupbyWithInterval.py
+++ b/tests/pytest/query/queryGroupbyWithInterval.py
@@ -41,6 +41,14 @@ class TDTestCase:
tdSql.execute(
"insert into test22 using stest tags('test21','ccc') values ('2020-09-04 16:54:54.003',210,3)")
+ #2021-09-17 For jira: https://jira.taosdata.com:18080/browse/TD-6085
+ tdSql.query("select last(size),appname from stest where tbname in ('test1','test2','test11')")
+ tdSql.checkRows(1)
+
+ #2021-09-17 For jira: https://jira.taosdata.com:18080/browse/TD-6314
+ tdSql.query("select _block_dist() from stest")
+ tdSql.checkRows(1)
+
tdSql.query("select sum(size) from stest interval(1d) group by appname")
tdSql.checkRows(3)
diff --git a/tests/pytest/query/queryRegex.py b/tests/pytest/query/queryRegex.py
new file mode 100644
index 0000000000000000000000000000000000000000..25afa6395f62faeeac51bab73ed742626e4fba90
--- /dev/null
+++ b/tests/pytest/query/queryRegex.py
@@ -0,0 +1,74 @@
+###################################################################
+# Copyright (c) 2016 by TAOS Technologies, Inc.
+# All rights reserved.
+#
+# This file is proprietary and confidential to TAOS Technologies.
+# No part of this file may be reproduced, stored, transmitted,
+# disclosed or used in any form or by any means other than as
+# expressly provided by the written permission from Jianhui Tao
+#
+###################################################################
+
+# -*- coding: utf-8 -*-
+
+import sys
+import taos
+from util.log import tdLog
+from util.cases import tdCases
+from util.sql import tdSql
+from util.dnodes import tdDnodes
+
+
+class TDTestCase:
+ def init(self, conn, logSql):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), logSql)
+
+ def run(self):
+ tdSql.prepare()
+ print("==============step1")
+ ##2021-09-17 For jira: https://jira.taosdata.com:18080/browse/TD-6585
+ tdSql.execute(
+ "create stable if not exists stb_test(ts timestamp,c0 binary(32)) tags(t0 binary(32))"
+ )
+ tdSql.execute(
+ 'create table if not exists stb_1 using stb_test tags("abcdefgasdfg12346")'
+ )
+ tdLog.info('insert into stb_1 values("2021-09-13 10:00:00.001","abcefdasdqwerxasdazx12345"')
+ tdSql.execute('insert into stb_1 values("2021-09-13 10:00:00.001","abcefdasdqwerxasdazx12345")')
+
+
+ tdSql.query('select * from stb_test where tbname match "asd"')
+ tdSql.checkRows(0)
+
+ tdSql.query('select * from stb_test where tbname nmatch "asd"')
+ tdSql.checkRows(1)
+
+ tdSql.query('select * from stb_test where c0 match "abc"')
+ tdSql.checkRows(1)
+ tdSql.checkData(0,1,"abcefdasdqwerxasdazx12345")
+
+ tdSql.query('select * from stb_test where c0 nmatch "abc"')
+ tdSql.checkRows(0)
+
+ tdSql.error('select * from stb_test where c0 match abc')
+
+ tdSql.error('select * from stb_test where c0 nmatch abc')
+
+
+ tdSql.execute('insert into stb_1 values("2020-10-13 10:00:00.001","abcd\\\efgh")')
+ tdSql.query("select * from stb_1 where c0 match '\\\\'")
+ tdSql.checkRows(1)
+
+
+
+
+
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/script/api/clientcfgtest.c b/tests/script/api/clientcfgtest.c
new file mode 100644
index 0000000000000000000000000000000000000000..bfed93498ef51700cee3f56ca035868dcaaf90f2
--- /dev/null
+++ b/tests/script/api/clientcfgtest.c
@@ -0,0 +1,62 @@
+// The test case to verfy TS-293
+#include
+#include
+#include
+#include
+#include
+#include "os.h"
+#include "taosdef.h"
+#include "taoserror.h"
+#include "tconfig.h"
+#include "tglobal.h"
+#include "tulog.h"
+#include "tsocket.h"
+#include "tutil.h"
+extern SGlobalCfg *taosGetConfigOption(const char *option) ;
+int main( int argc, char *argv[]){
+
+ printf("start to test\n");
+
+ //case1:
+ //Test config firstEp success
+ const char config1[128] = "{\"firstEp\":\"BCC-2:6030\",\"debugFlag\":\"135\"}";//input the parameter which want to be configured
+ taos_set_config(config1); //configure the parameter
+
+ SGlobalCfg *cfg ;
+
+ cfg = taosGetConfigOption("firstEp");//check the option result
+ if(cfg->cfgStatus != 3){ //If cfgStatus is 3,it means configure is success
+ printf("config firstEp 'BCC-2:6030'failures!\n");
+ exit(1);
+ }
+
+
+ cfg = taosGetConfigOption("debugFlag");//check the option result
+ if(cfg->cfgStatus != 3){
+ printf("config debugFlag '135' failures!\n");
+ exit(1);
+ }
+
+ //case2:
+ //Test config only useful at the first time
+ //The result is failure
+ const char config2[128] = "{\"fqdn\":\"BCC-3\"}";
+ taos_set_config(config2); //configure the parameter
+
+
+ cfg = taosGetConfigOption("fqdn");//check the option result
+ if(cfg->cfgStatus == 3){
+ printf("config firstEp to 'BCC-3' failures!\n");
+ exit(1);
+ }
+ else{
+ printf("test case success!\n");
+ exit(0);
+ }
+
+
+ return 0 ;
+
+
+
+}
diff --git a/tests/script/api/makefile b/tests/script/api/makefile
index 92d0a89b0fe0f4b31a43e8981a763922c03d5343..2e599947f70787189f1bfee587b8d9171b8d6f2b 100644
--- a/tests/script/api/makefile
+++ b/tests/script/api/makefile
@@ -7,7 +7,10 @@ LFLAGS = '-Wl,-rpath,/usr/local/taos/driver/' -ltaos -lpthread -lm -lrt
CFLAGS = -O0 -g -Wall -Wno-deprecated -fPIC -Wno-unused-result -Wconversion \
-Wno-char-subscripts -D_REENTRANT -Wno-format -D_REENTRANT -DLINUX \
-Wno-unused-function -D_M_X64 -I/usr/local/taos/include -std=gnu99 \
- -fsanitize=address
+ -I../../../deps/cJson/inc\
+ -I../../../src/os/inc/ -I../../../src/inc -I../../../src/util/inc \
+ -I../../../src/common/inc -I../../../deps/cJson/inc
+
all: $(TARGET)
@@ -17,8 +20,18 @@ exe:
gcc $(CFLAGS) ./stmtTest.c -o $(ROOT)stmtTest $(LFLAGS)
gcc $(CFLAGS) ./stmt_function.c -o $(ROOT)stmt_function $(LFLAGS)
+ gcc $(CFLAGS) ./clientcfgtest.c -o $(ROOT)clientcfgtest $(LFLAGS)
+
+ gcc $(CFLAGS) ./openTSDBTest.c -o $(ROOT)openTSDBTest $(LFLAGS)
+
+
clean:
rm $(ROOT)batchprepare
rm $(ROOT)stmtBatchTest
rm $(ROOT)stmtTest
rm $(ROOT)stmt_function
+
+ rm $(ROOT)clientcfgtest
+
+ rm $(ROOT)openTSDBTest
+
diff --git a/tests/script/api/openTSDBTest.c b/tests/script/api/openTSDBTest.c
new file mode 100644
index 0000000000000000000000000000000000000000..e4f892fa408e8c024daa4e338d3af7a706e5d0f9
--- /dev/null
+++ b/tests/script/api/openTSDBTest.c
@@ -0,0 +1,950 @@
+#include "taoserror.h"
+#include "cJSON.h"
+
+#include
+#include
+#include
+#include
+#include
+
+void verify_telnet_insert(TAOS* taos) {
+ TAOS_RES *result;
+
+ result = taos_query(taos, "drop database if exists db;");
+ taos_free_result(result);
+ usleep(100000);
+ result = taos_query(taos, "create database db precision 'ms';");
+ taos_free_result(result);
+ usleep(100000);
+
+ (void)taos_select_db(taos, "db");
+ int32_t code = 0;
+
+ /* metric */
+ char* lines0[] = {
+ "stb0_0 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
+ "stb0_1 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
+ "stb0_2 1626006833639000000ns 4i8 host=\"host0\" interface=\"eth0\"",
+ };
+ code = taos_insert_telnet_lines(taos, lines0, 3);
+ if (code) {
+ printf("lines0 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ /* timestamp */
+ char* lines1[] = {
+ "stb1 1626006833s 1i8 host=\"host0\"",
+ "stb1 1626006833639000000ns 2i8 host=\"host0\"",
+ "stb1 1626006833640000us 3i8 host=\"host0\"",
+ "stb1 1626006833641123 4i8 host=\"host0\"",
+ "stb1 1626006833651ms 5i8 host=\"host0\"",
+ "stb1 0 6i8 host=\"host0\"",
+ };
+ code = taos_insert_telnet_lines(taos, lines1, 6);
+ if (code) {
+ printf("lines1 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ /* metric value */
+ //tinyint
+ char* lines2_0[] = {
+ "stb2_0 1626006833651ms -127i8 host=\"host0\"",
+ "stb2_0 1626006833652ms 127i8 host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_0, 2);
+ if (code) {
+ printf("lines2_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //smallint
+ char* lines2_1[] = {
+ "stb2_1 1626006833651ms -32767i16 host=\"host0\"",
+ "stb2_1 1626006833652ms 32767i16 host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_1, 2);
+ if (code) {
+ printf("lines2_1 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //int
+ char* lines2_2[] = {
+ "stb2_2 1626006833651ms -2147483647i32 host=\"host0\"",
+ "stb2_2 1626006833652ms 2147483647i32 host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_2, 2);
+ if (code) {
+ printf("lines2_2 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //bigint
+ char* lines2_3[] = {
+ "stb2_3 1626006833651ms -9223372036854775807i64 host=\"host0\"",
+ "stb2_3 1626006833652ms 9223372036854775807i64 host=\"host0\"",
+ "stb2_3 1626006833662ms 9223372036854775807 host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_3, 3);
+ if (code) {
+ printf("lines2_3 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //float
+ char* lines2_4[] = {
+ "stb2_4 1626006833610ms 3f32 host=\"host0\"",
+ "stb2_4 1626006833620ms -3f32 host=\"host0\"",
+ "stb2_4 1626006833630ms 3.4f32 host=\"host0\"",
+ "stb2_4 1626006833640ms -3.4f32 host=\"host0\"",
+ "stb2_4 1626006833650ms 3.4E10f32 host=\"host0\"",
+ "stb2_4 1626006833660ms -3.4e10f32 host=\"host0\"",
+ "stb2_4 1626006833670ms 3.4E+2f32 host=\"host0\"",
+ "stb2_4 1626006833680ms -3.4e-2f32 host=\"host0\"",
+ "stb2_4 1626006833700ms 3.4E38f32 host=\"host0\"",
+ "stb2_4 1626006833710ms -3.4E38f32 host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_4, 10);
+ if (code) {
+ printf("lines2_4 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //double
+ char* lines2_5[] = {
+ "stb2_5 1626006833610ms 3f64 host=\"host0\"",
+ "stb2_5 1626006833620ms -3f64 host=\"host0\"",
+ "stb2_5 1626006833630ms 3.4f64 host=\"host0\"",
+ "stb2_5 1626006833640ms -3.4f64 host=\"host0\"",
+ "stb2_5 1626006833650ms 3.4E10f64 host=\"host0\"",
+ "stb2_5 1626006833660ms -3.4e10f64 host=\"host0\"",
+ "stb2_5 1626006833670ms 3.4E+2f64 host=\"host0\"",
+ "stb2_5 1626006833680ms -3.4e-2f64 host=\"host0\"",
+ "stb2_5 1626006833690ms 1.7E308f64 host=\"host0\"",
+ "stb2_5 1626006833700ms -1.7E308f64 host=\"host0\"",
+ "stb2_5 1626006833710ms 3.15 host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_5, 11);
+ if (code) {
+ printf("lines2_5 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //bool
+ char* lines2_6[] = {
+ "stb2_6 1626006833610ms t host=\"host0\"",
+ "stb2_6 1626006833620ms T host=\"host0\"",
+ "stb2_6 1626006833630ms true host=\"host0\"",
+ "stb2_6 1626006833640ms True host=\"host0\"",
+ "stb2_6 1626006833650ms TRUE host=\"host0\"",
+ "stb2_6 1626006833660ms f host=\"host0\"",
+ "stb2_6 1626006833670ms F host=\"host0\"",
+ "stb2_6 1626006833680ms false host=\"host0\"",
+ "stb2_6 1626006833690ms False host=\"host0\"",
+ "stb2_6 1626006833700ms FALSE host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_6, 10);
+ if (code) {
+ printf("lines2_6 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //binary
+ char* lines2_7[] = {
+ "stb2_7 1626006833610ms \"binary_val.!@#$%^&*\" host=\"host0\"",
+ "stb2_7 1626006833620ms \"binary_val.:;,./?|+-=\" host=\"host0\"",
+ "stb2_7 1626006833630ms \"binary_val.()[]{}<>\" host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_7, 3);
+ if (code) {
+ printf("lines2_7 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //nchar
+ char* lines2_8[] = {
+ "stb2_8 1626006833610ms L\"nchar_val数值一\" host=\"host0\"",
+ "stb2_8 1626006833620ms L\"nchar_val数值二\" host=\"host0\""
+ };
+ code = taos_insert_telnet_lines(taos, lines2_8, 2);
+ if (code) {
+ printf("lines2_8 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ /* tags */
+ //tag value types
+ char* lines3_0[] = {
+ "stb3_0 1626006833610ms 1 t1=127i8 t2=32767i16 t3=2147483647i32 t4=9223372036854775807i64 t5=3.4E38f32 t6=1.7E308f64 t7=true t8=\"binary_val_1\" t9=L\"标签值1\"",
+ "stb3_0 1626006833610ms 2 t1=-127i8 t2=-32767i16 t3=-2147483647i32 t4=-9223372036854775807i64 t5=-3.4E38f32 t6=-1.7E308f64 t7=false t8=\"binary_val_2\" t9=L\"标签值2\""
+ };
+ code = taos_insert_telnet_lines(taos, lines3_0, 2);
+ if (code) {
+ printf("lines3_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ //tag ID as child table name
+ char* lines3_1[] = {
+ "stb3_1 1626006833610ms 1 id=\"child_table1\" host=\"host1\"",
+ "stb3_1 1626006833610ms 2 host=\"host2\" iD=\"child_table2\"",
+ "stb3_1 1626006833610ms 3 ID=\"child_table3\" host=\"host3\""
+ };
+ code = taos_insert_telnet_lines(taos, lines3_1, 3);
+ if (code) {
+ printf("lines3_1 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ return;
+}
+
+void verify_json_insert(TAOS* taos) {
+ TAOS_RES *result;
+
+ result = taos_query(taos, "drop database if exists db;");
+ taos_free_result(result);
+ usleep(100000);
+ result = taos_query(taos, "create database db precision 'ms';");
+ taos_free_result(result);
+ usleep(100000);
+
+ (void)taos_select_db(taos, "db");
+ int32_t code = 0;
+
+ char *message =
+ "{ \
+ \"metric\":\"cpu_load_0\", \
+ \"timestamp\": 1626006833610123, \
+ \"value\": 55.5, \
+ \"tags\": \
+ { \
+ \"host\": \"ubuntu\", \
+ \"interface1\": \"eth0\", \
+ \"Id\": \"tb0\" \
+ } \
+ }";
+
+ code = taos_insert_json_payload(taos, message);
+ if (code) {
+ printf("payload_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ char *message1 =
+ "[ \
+ { \
+ \"metric\":\"cpu_load_1\", \
+ \"timestamp\": 1626006833610123, \
+ \"value\": 55.5, \
+ \"tags\": \
+ { \
+ \"host\": \"ubuntu\", \
+ \"interface\": \"eth1\", \
+ \"Id\": \"tb1\" \
+ } \
+ }, \
+ { \
+ \"metric\":\"cpu_load_2\", \
+ \"timestamp\": 1626006833610123, \
+ \"value\": 55.5, \
+ \"tags\": \
+ { \
+ \"host\": \"ubuntu\", \
+ \"interface\": \"eth2\", \
+ \"Id\": \"tb2\" \
+ } \
+ } \
+ ]";
+
+ code = taos_insert_json_payload(taos, message1);
+ if (code) {
+ printf("payload_1 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+ char *message2 =
+ "[ \
+ { \
+ \"metric\":\"cpu_load_3\", \
+ \"timestamp\": \
+ { \
+ \"value\": 1626006833610123, \
+ \"type\": \"us\" \
+ }, \
+ \"value\": \
+ { \
+ \"value\": 55, \
+ \"type\": \"int\" \
+ }, \
+ \"tags\": \
+ { \
+ \"host\": \
+ { \
+ \"value\": \"ubuntu\", \
+ \"type\": \"binary\" \
+ }, \
+ \"interface\": \
+ { \
+ \"value\": \"eth3\", \
+ \"type\": \"nchar\" \
+ }, \
+ \"ID\": \"tb3\", \
+ \"port\": \
+ { \
+ \"value\": 4040, \
+ \"type\": \"int\" \
+ } \
+ } \
+ }, \
+ { \
+ \"metric\":\"cpu_load_4\", \
+ \"timestamp\": 1626006833610123, \
+ \"value\": 66.6, \
+ \"tags\": \
+ { \
+ \"host\": \"ubuntu\", \
+ \"interface\": \"eth4\", \
+ \"Id\": \"tb4\" \
+ } \
+ } \
+ ]";
+ code = taos_insert_json_payload(taos, message2);
+ if (code) {
+ printf("payload_2 code: %d, %s.\n", code, tstrerror(code));
+ }
+
+
+ cJSON *payload, *tags;
+ char *payload_str;
+
+ /* Default format */
+ //number
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb0_0");
+ cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
+ cJSON_AddNumberToObject(payload, "value", 10);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload0_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //true
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb0_1");
+ cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
+ cJSON_AddTrueToObject(payload, "value");
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload0_1 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //false
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb0_2");
+ cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
+ cJSON_AddFalseToObject(payload, "value");
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload0_2 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //string
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb0_3");
+ cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
+ cJSON_AddStringToObject(payload, "value", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload0_3 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //timestamp 0 -> current time
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb0_4");
+ cJSON_AddNumberToObject(payload, "timestamp", 0);
+ cJSON_AddNumberToObject(payload, "value", 123);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload0_4 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //ID
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb0_5");
+ cJSON_AddNumberToObject(payload, "timestamp", 0);
+ cJSON_AddNumberToObject(payload, "value", 123);
+ tags = cJSON_CreateObject();
+ cJSON_AddStringToObject(tags, "ID", "tb0_5");
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddStringToObject(tags, "iD", "tb000");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddStringToObject(tags, "id", "tb555");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload0_5 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ /* Nested format */
+ //timestamp
+ cJSON *timestamp;
+ //seconds
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb1_0");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ cJSON_AddNumberToObject(payload, "value", 10);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload1_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //milleseconds
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb1_1");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833610);
+ cJSON_AddStringToObject(timestamp, "type", "ms");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ cJSON_AddNumberToObject(payload, "value", 10);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload1_1 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //microseconds
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb1_2");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833610123);
+ cJSON_AddStringToObject(timestamp, "type", "us");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ cJSON_AddNumberToObject(payload, "value", 10);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload1_2 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //nanoseconds
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb1_3");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", (double)1626006833610123321);
+ cJSON_AddStringToObject(timestamp, "type", "ns");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ cJSON_AddNumberToObject(payload, "value", 10);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload1_3 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //now
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb1_4");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 0);
+ cJSON_AddStringToObject(timestamp, "type", "ns");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ cJSON_AddNumberToObject(payload, "value", 10);
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload1_4 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //metric value
+ cJSON *metric_val;
+ //bool
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_0");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddTrueToObject(metric_val, "value");
+ cJSON_AddStringToObject(metric_val, "type", "bool");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //tinyint
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_1");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddNumberToObject(metric_val, "value", 127);
+ cJSON_AddStringToObject(metric_val, "type", "tinyint");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_1 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //smallint
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_2");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddNumberToObject(metric_val, "value", 32767);
+ cJSON_AddStringToObject(metric_val, "type", "smallint");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_2 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //int
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_3");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddNumberToObject(metric_val, "value", 2147483647);
+ cJSON_AddStringToObject(metric_val, "type", "int");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_3 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //bigint
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_4");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddNumberToObject(metric_val, "value", (double)9223372036854775807);
+ cJSON_AddStringToObject(metric_val, "type", "bigint");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_4 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //float
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_5");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddNumberToObject(metric_val, "value", 11.12345);
+ cJSON_AddStringToObject(metric_val, "type", "float");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_5 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //double
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_6");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddNumberToObject(metric_val, "value", 22.123456789);
+ cJSON_AddStringToObject(metric_val, "type", "double");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_6 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //binary
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_7");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddStringToObject(metric_val, "value", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddStringToObject(metric_val, "type", "binary");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_7 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //nchar
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb2_8");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddStringToObject(metric_val, "value", "你好");
+ cJSON_AddStringToObject(metric_val, "type", "nchar");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tags, "t1");
+ cJSON_AddFalseToObject(tags, "t2");
+ cJSON_AddNumberToObject(tags, "t3", 10);
+ cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
+ cJSON_AddItemToObject(payload, "tags", tags);
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload2_8 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+
+ //tag value
+ cJSON *tag;
+
+ payload = cJSON_CreateObject();
+ cJSON_AddStringToObject(payload, "metric", "stb3_0");
+
+ timestamp = cJSON_CreateObject();
+ cJSON_AddNumberToObject(timestamp, "value", 1626006833);
+ cJSON_AddStringToObject(timestamp, "type", "s");
+ cJSON_AddItemToObject(payload, "timestamp", timestamp);
+
+ metric_val = cJSON_CreateObject();
+ cJSON_AddStringToObject(metric_val, "value", "hello");
+ cJSON_AddStringToObject(metric_val, "type", "nchar");
+ cJSON_AddItemToObject(payload, "value", metric_val);
+
+ tags = cJSON_CreateObject();
+
+ tag = cJSON_CreateObject();
+ cJSON_AddTrueToObject(tag, "value");
+ cJSON_AddStringToObject(tag, "type", "bool");
+ cJSON_AddItemToObject(tags, "t1", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddFalseToObject(tag, "value");
+ cJSON_AddStringToObject(tag, "type", "bool");
+ cJSON_AddItemToObject(tags, "t2", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddNumberToObject(tag, "value", 127);
+ cJSON_AddStringToObject(tag, "type", "tinyint");
+ cJSON_AddItemToObject(tags, "t3", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddNumberToObject(tag, "value", 32767);
+ cJSON_AddStringToObject(tag, "type", "smallint");
+ cJSON_AddItemToObject(tags, "t4", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddNumberToObject(tag, "value", 2147483647);
+ cJSON_AddStringToObject(tag, "type", "int");
+ cJSON_AddItemToObject(tags, "t5", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddNumberToObject(tag, "value", (double)9223372036854775807);
+ cJSON_AddStringToObject(tag, "type", "bigint");
+ cJSON_AddItemToObject(tags, "t6", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddNumberToObject(tag, "value", 11.12345);
+ cJSON_AddStringToObject(tag, "type", "float");
+ cJSON_AddItemToObject(tags, "t7", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddNumberToObject(tag, "value", 22.1234567890);
+ cJSON_AddStringToObject(tag, "type", "double");
+ cJSON_AddItemToObject(tags, "t8", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddStringToObject(tag, "value", "binary_val");
+ cJSON_AddStringToObject(tag, "type", "binary");
+ cJSON_AddItemToObject(tags, "t9", tag);
+
+ tag = cJSON_CreateObject();
+ cJSON_AddStringToObject(tag, "value", "你好");
+ cJSON_AddStringToObject(tag, "type", "nchar");
+ cJSON_AddItemToObject(tags, "t10", tag);
+
+ cJSON_AddItemToObject(payload, "tags", tags);
+
+ payload_str = cJSON_Print(payload);
+ //printf("%s\n", payload_str);
+
+ code = taos_insert_json_payload(taos, payload_str);
+ if (code) {
+ printf("payload3_0 code: %d, %s.\n", code, tstrerror(code));
+ }
+ free(payload_str);
+ cJSON_Delete(payload);
+}
+
+int main(int argc, char *argv[]) {
+ const char* host = "127.0.0.1";
+ const char* user = "root";
+ const char* passwd = "taosdata";
+
+ taos_options(TSDB_OPTION_TIMEZONE, "GMT-8");
+ TAOS* taos = taos_connect(host, user, passwd, "", 0);
+ if (taos == NULL) {
+ printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
+ exit(1);
+ }
+
+ char* info = taos_get_server_info(taos);
+ printf("server info: %s\n", info);
+ info = taos_get_client_info(taos);
+ printf("client info: %s\n", info);
+
+ printf("************ verify telnet-insert *************\n");
+ verify_telnet_insert(taos);
+
+ printf("************ verify json-insert *************\n");
+ verify_json_insert(taos);
+
+ printf("done\n");
+ taos_close(taos);
+ taos_cleanup();
+}
diff --git a/tests/test-all.sh b/tests/test-all.sh
index eea623b27e482d67e0d3e94a27c7f4376449d556..5eab3a9ed7469603a79c0df8bacaeec624c38a83 100755
--- a/tests/test-all.sh
+++ b/tests/test-all.sh
@@ -11,15 +11,15 @@ tests_dir=`pwd`
IN_TDINTERNAL="community"
function stopTaosd {
- echo "Stop taosd"
+ echo "Stop taosd"
sudo systemctl stop taosd || echo 'no sudo or systemctl or stop fail'
PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
- while [ -n "$PID" ]
- do
+ while [ -n "$PID" ]
+ do
pkill -TERM -x taosd
sleep 1
- PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
- done
+ PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
+ done
}
function dohavecore(){
@@ -233,6 +233,7 @@ totalPyFailed=0
totalJDBCFailed=0
totalUnitFailed=0
totalExampleFailed=0
+totalApiFailed=0
if [ "${OS}" == "Linux" ]; then
corepath=`grep -oP '.*(?=core_)' /proc/sys/kernel/core_pattern||grep -oP '.*(?=core-)' /proc/sys/kernel/core_pattern`
@@ -532,7 +533,28 @@ if [ "$2" != "sim" ] && [ "$2" != "python" ] && [ "$2" != "jdbc" ] && [ "$2" !=
echo "demo pass"
totalExamplePass=`expr $totalExamplePass + 1`
fi
+ echo "### run setconfig tests ###"
+
+ stopTaosd
+
+ cd $tests_dir
+ echo "current dir: "
+ pwd
+
+ cd script/api
+ echo "building setcfgtest"
+ make > /dev/null
+ ./clientcfgtest
+ if [ $? != "0" ]; then
+ echo "clientcfgtest failed"
+ totalExampleFailed=`expr $totalExampleFailed + 1`
+ else
+ echo "clientcfgtest pass"
+ totalExamplePass=`expr $totalExamplePass + 1`
+ fi
+
+
if [ "$totalExamplePass" -gt "0" ]; then
echo -e "\n${GREEN} ### Total $totalExamplePass examples succeed! ### ${NC}"
fi
@@ -544,7 +566,13 @@ if [ "$2" != "sim" ] && [ "$2" != "python" ] && [ "$2" != "jdbc" ] && [ "$2" !=
if [ "${OS}" == "Linux" ]; then
dohavecore 1
fi
+
+
+
+
+
fi
+
exit $(($totalFailed + $totalPyFailed + $totalJDBCFailed + $totalUnitFailed + $totalExampleFailed))
|