Merge branch 'develop' into feature/fangdoc
This commit is contained in:
commit
9f0f832141
|
@ -146,7 +146,7 @@ IF (NOT DEFINED TD_CLUSTER)
|
|||
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -malign-double -g -Wno-char-subscripts -malign-stringops -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||
ENDIF ()
|
||||
ELSE ()
|
||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -g -Wno-char-subscripts -fsigned-char -munaligned-access -fpack-struct=8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -g -Wno-char-subscripts -fsigned-char -fpack-struct=8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||
ENDIF ()
|
||||
ADD_DEFINITIONS(-DLINUX)
|
||||
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
||||
|
@ -156,7 +156,7 @@ IF (NOT DEFINED TD_CLUSTER)
|
|||
ENDIF ()
|
||||
SET(DEBUG_FLAGS "-O0 -DDEBUG")
|
||||
SET(RELEASE_FLAGS "-O0")
|
||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -g -Wno-char-subscripts -fsigned-char -munaligned-access -fpack-struct=8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -fPIC -g -Wno-char-subscripts -fsigned-char -munaligned-access -fpack-struct=8 -latomic -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||
ADD_DEFINITIONS(-DLINUX)
|
||||
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
||||
ADD_DEFINITIONS(-DUSE_LIBICONV)
|
||||
|
|
|
@ -18,6 +18,7 @@ TDengine提供类似SQL语法,用户可以在TDengine Shell中使用SQL语句
|
|||
- 插入记录时,如果时间戳为0,插入数据时使用服务器当前时间
|
||||
- Epoch Time: 时间戳也可以是一个长整数,表示从1970-01-01 08:00:00.000开始的毫秒数
|
||||
- 时间可以加减,比如 now-2h,表明查询时刻向前推2个小时(最近2小时)。数字后面的时间单位:a(毫秒), s(秒), m(分), h(小时), d(天),w(周), n(月), y(年)。比如select * from t1 where ts > now-2w and ts <= now-1w, 表示查询两周前整整一周的数据
|
||||
- TDengine暂不支持时间窗口按照自然年和自然月切分。Where条件中的时间窗口单位的换算关系如下:interval(1y) 等效于 interval(365d), interval(1n) 等效于 interval(30d), interval(1w) 等效于 interval(7d)
|
||||
|
||||
TDengine缺省的时间戳是毫秒精度,但通过修改配置参数enableMicrosecond就可支持微秒。
|
||||
|
||||
|
|
|
@ -377,21 +377,34 @@ conn.close()
|
|||
|
||||
### HTTP请求格式
|
||||
|
||||
`http://<ip>:<PORT>/rest/sql`
|
||||
```
|
||||
http://<ip>:<PORT>/rest/sql
|
||||
```
|
||||
|
||||
参数说明:
|
||||
参数说明:
|
||||
|
||||
IP: 集群中的任一台主机
|
||||
- IP: 集群中的任一台主机
|
||||
- PORT: 配置文件中httpPort配置项,缺省为6020
|
||||
|
||||
PORT: 配置文件中httpPort配置项,缺省为6020
|
||||
例如:http://192.168.0.1:6020/rest/sql 是指向IP地址为192.168.0.1的URL.
|
||||
|
||||
如:http://192.168.0.1:6020/rest/sql 是指向IP地址为192.168.0.1的URL.
|
||||
HTTP请求的Header里需带有身份认证信息,TDengine支持Basic认证与自定义认证两种机制,后续版本将提供标准安全的数字签名机制来做身份验证。
|
||||
|
||||
HTTP请求的Header里需带有身份认证信息,TDengine单机版仅支持Basic认证机制。
|
||||
- 自定义身份认证信息如下所示(<token>稍后介绍)
|
||||
|
||||
```
|
||||
Authorization: Taosd <TOKEN>
|
||||
```
|
||||
|
||||
- Basic身份认证信息如下所示
|
||||
|
||||
```
|
||||
Authorization: Basic <TOKEN>
|
||||
```
|
||||
|
||||
HTTP请求的BODY里就是一个完整的SQL语句,SQL语句中的数据表应提供数据库前缀,例如\<db-name>.\<tb-name>。如果表名不带数据库前缀,系统会返回错误。因为HTTP模块只是一个简单的转发,没有当前DB的概念。
|
||||
|
||||
使用curl来发起一个HTTP Request, 语法如下:
|
||||
使用curl通过自定义身份认证方式来发起一个HTTP Request, 语法如下:
|
||||
|
||||
```
|
||||
curl -H 'Authorization: Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql
|
||||
|
@ -403,11 +416,12 @@ curl -H 'Authorization: Basic <TOKEN>' -d '<SQL>' <ip>:<PORT>/rest/sql
|
|||
curl -u username:password -d '<SQL>' <ip>:<PORT>/rest/sql
|
||||
```
|
||||
|
||||
其中,`TOKEN`为`{username}:{password}`经过Base64编码之后的字符串,例如`root:taosdata`编码后为`cm9vdDp0YW9zZGF0YQ==`
|
||||
其中,`TOKEN`为`{username}:{password}`经过Base64编码之后的字符串, 例如`root:taosdata`编码后为`cm9vdDp0YW9zZGF0YQ==`
|
||||
|
||||
### HTTP返回格式
|
||||
|
||||
返回值为JSON格式,如下:
|
||||
返回值为JSON格式,如下:
|
||||
|
||||
```
|
||||
{
|
||||
"status": "succ",
|
||||
|
@ -422,26 +436,60 @@ curl -u username:password -d '<SQL>' <ip>:<PORT>/rest/sql
|
|||
|
||||
说明:
|
||||
|
||||
- 第一行”status”告知操作结果是成功还是失败;
|
||||
- 第二行”head”是表的定义,如果不返回结果集,仅有一列“affected_rows”;
|
||||
- 第三行是具体返回的数据,一排一排的呈现。如果不返回结果集,仅[[affected_rows]]
|
||||
- 第四行”rows”表明总共多少行数据
|
||||
- status: 告知操作结果是成功还是失败
|
||||
- head: 表的定义,如果不返回结果集,仅有一列“affected_rows”
|
||||
- data: 具体返回的数据,一排一排的呈现,如果不返回结果集,仅[[affected_rows]]
|
||||
- rows: 表明总共多少行数据
|
||||
|
||||
### 自定义授权码
|
||||
|
||||
HTTP请求中需要带有授权码`<TOKEN>`, 用于身份识别。授权码通常由管理员提供, 可简单的通过发送`HTTP GET`请求来获取授权码, 操作如下:
|
||||
|
||||
```
|
||||
curl http://<ip>:6020/rest/login/<username>/<password>
|
||||
```
|
||||
|
||||
其中, `ip`是TDengine数据库的IP地址, `username`为数据库用户名, `password`为数据库密码, 返回值为`JSON`格式, 各字段含义如下:
|
||||
|
||||
- status:请求结果的标志位
|
||||
|
||||
- code:返回值代码
|
||||
|
||||
- desc: 授权码
|
||||
|
||||
获取授权码示例:
|
||||
|
||||
```
|
||||
curl http://192.168.0.1:6020/rest/login/root/taosdata
|
||||
```
|
||||
|
||||
返回值:
|
||||
|
||||
```
|
||||
{
|
||||
"status": "succ",
|
||||
"code": 0,
|
||||
"desc":
|
||||
"/KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04"
|
||||
}
|
||||
```
|
||||
|
||||
### 使用示例
|
||||
|
||||
- 在demo库里查询表t1的所有记录, curl如下:
|
||||
- 在demo库里查询表t1的所有记录:
|
||||
|
||||
`curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'select * from demo.t1' 192.168.0.1:6020/rest/sql`
|
||||
|
||||
返回值:
|
||||
```
|
||||
curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'select * from demo.t1' 192.168.0.1:6020/rest/sql`
|
||||
```
|
||||
返回值:
|
||||
|
||||
```
|
||||
{
|
||||
"status": "succ",
|
||||
"head": ["column1","column2","column3"],
|
||||
"data": [
|
||||
["2017-12-12 23:44:25.730", 1, 2.3],
|
||||
["2017-12-12 22:44:25.728", 4, 5.6]
|
||||
["2017-12-12 22:44:25.728",4,5.60000],
|
||||
["2017-12-12 23:44:25.730",1,2.30000]
|
||||
],
|
||||
"rows": 2
|
||||
}
|
||||
|
@ -449,9 +497,11 @@ curl -u username:password -d '<SQL>' <ip>:<PORT>/rest/sql
|
|||
|
||||
- 创建库demo:
|
||||
|
||||
`curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'create database demo' 192.168.0.1:6020/rest/sql`
|
||||
```
|
||||
curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'create database demo' 192.168.0.1:6020/rest/sql`
|
||||
```
|
||||
|
||||
返回值:
|
||||
返回值:
|
||||
```
|
||||
{
|
||||
"status": "succ",
|
||||
|
@ -461,11 +511,69 @@ curl -u username:password -d '<SQL>' <ip>:<PORT>/rest/sql
|
|||
}
|
||||
```
|
||||
|
||||
### 其他用法
|
||||
|
||||
#### 结果集采用Unix时间戳
|
||||
|
||||
HTTP请求URL采用`sqlt`时,返回结果集的时间戳将采用Unix时间戳格式表示,例如
|
||||
|
||||
```
|
||||
curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'select * from demo.t1' 192.168.0.1:6020/rest/sqlt
|
||||
```
|
||||
|
||||
返回值:
|
||||
|
||||
```
|
||||
{
|
||||
"status": "succ",
|
||||
"head": ["column1","column2","column3"],
|
||||
"data": [
|
||||
[1513089865728,4,5.60000],
|
||||
[1513093465730,1,2.30000]
|
||||
],
|
||||
"rows": 2
|
||||
}
|
||||
```
|
||||
|
||||
#### 结果集采用UTC时间字符串
|
||||
|
||||
HTTP请求URL采用`sqlutc`时,返回结果集的时间戳将采用UTC时间字符串表示,例如
|
||||
```
|
||||
curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'select * from demo.t1' 192.168.0.1:6020/rest/sqlutc
|
||||
```
|
||||
|
||||
返回值:
|
||||
|
||||
```
|
||||
{
|
||||
"status": "succ",
|
||||
"head": ["column1","column2","column3"],
|
||||
"data": [
|
||||
["2017-12-12T22:44:25.728+0800",4,5.60000],
|
||||
["2017-12-12T23:44:25.730+0800",1,2.30000]
|
||||
],
|
||||
"rows": 2
|
||||
}
|
||||
```
|
||||
|
||||
### 重要配置项
|
||||
|
||||
下面仅列出一些与RESTFul接口有关的配置参数,其他系统参数请看配置文件里的说明。注意:配置修改后,需要重启taosd服务才能生效
|
||||
|
||||
- httpIp: 对外提供RESTFul服务的IP地址,默认绑定到0.0.0.0
|
||||
- httpPort: 对外提供RESTFul服务的端口号,默认绑定到6020
|
||||
- httpMaxThreads: 启动的线程数量,默认为2
|
||||
- httpCacheSessions: 缓存连接的数量,并发请求数目需小于此数值的10倍,默认值为100
|
||||
- restfulRowLimit: 返回结果集(JSON格式)的最大条数,默认值为10240
|
||||
- httpEnableCompress: 是否支持压缩,默认不支持,目前TDengine仅支持gzip压缩格式
|
||||
- httpDebugFlag: 日志开关,131:仅错误和报警信息,135:所有,默认131
|
||||
|
||||
|
||||
## Go Connector
|
||||
|
||||
#### 安装TDengine
|
||||
|
||||
Go的链接器使用了到了 libtaos.so 和taos.h,因此,在使用Go连接器之前,需要在程序运行的机器上安装TDengine以获得相关的驱动文件。
|
||||
Go的连接器使用到了 libtaos.so 和taos.h,因此,在使用Go连接器之前,需要在程序运行的机器上安装TDengine以获得相关的驱动文件。
|
||||
|
||||
#### Go语言引入package
|
||||
TDengine提供了GO驱动程序“taosSql”包。taosSql驱动包是基于GO的“database/sql/driver”接口的实现。用户可以通过`go get`命令来获取驱动包。
|
||||
|
@ -659,4 +767,115 @@ promise2.then(function(result) {
|
|||
### 示例
|
||||
[这里](https://github.com/taosdata/TDengine/tree/master/tests/examples/nodejs/node-example.js)提供了一个使用NodeJS 连接器建表,插入天气数据并查询插入的数据的代码示例
|
||||
|
||||
[这里](https://github.com/taosdata/TDengine/tree/master/tests/examples/nodejs/node-example-raw.js)同样是一个使用NodeJS 连接器建表,插入天气数据并查询插入的数据的代码示例,但和上面不同的是,该示例只使用`cursor`.
|
||||
[这里](https://github.com/taosdata/TDengine/tree/master/tests/examples/nodejs/node-example-raw.js)同样是一个使用NodeJS 连接器建表,插入天气数据并查询插入的数据的代码示例,但和上面不同的是,该示例只使用`cursor`.
|
||||
|
||||
## CSharp Connector
|
||||
|
||||
在Windows系统上,C#应用程序可以使用TDengine的原生C接口来执行所有数据库操作,后续版本将提供ORM(dapper)框架驱动。
|
||||
|
||||
#### 安装TDengine客户端
|
||||
|
||||
C#连接器需要使用`libtaos.so`和`taos.h`。因此,在使用C#连接器之前,需在程序运行的Windows环境安装TDengine的Windows客户端,以便获得相关驱动文件。
|
||||
|
||||
安装完成后,在文件夹`C:/TDengine/examples/C#`中,将会看到两个文件
|
||||
|
||||
- TDengineDriver.cs 调用taos.dll文件的Native C方法
|
||||
- TDengineTest.cs 参考程序示例
|
||||
|
||||
在文件夹`C:\Windows\System32`,将会看到`taos.dll`文件
|
||||
|
||||
#### 使用方法
|
||||
|
||||
- 将C#接口文件TDengineDriver.cs加入到应用程序所在.NET项目中
|
||||
- 参考TDengineTest.cs来定义数据库连接参数,及执行数据插入、查询等操作的方法
|
||||
- 因为C#接口需要用到`taos.dll`文件,用户可以将`taos.dll`文件加入.NET解决方案中
|
||||
|
||||
#### 注意事项
|
||||
|
||||
- `taos.dll`文件使用x64平台编译,所以.NET项目在生成.exe文件时,“解决方案”/“项目”的“平台”请均选择“x64”。
|
||||
- 此.NET接口目前已经在Visual Studio 2013/2015/2017中验证过,其它VS版本尚待验证。
|
||||
|
||||
#### 第三方驱动
|
||||
|
||||
Maikebing.Data.Taos是一个基于TDengine的RESTful Connector构建的ADO.Net提供器,该开发包由热心贡献者`麦壳饼@@maikebing`提供,具体请参考
|
||||
|
||||
```
|
||||
https://gitee.com/maikebing/Maikebing.EntityFrameworkCore.Taos
|
||||
```
|
||||
|
||||
## Windows客户端及程序接口
|
||||
|
||||
### 客户端安装
|
||||
|
||||
在Windows操作系统下,TDengine提供64位的Windows客户端,客户端安装程序为.exe文件,运行该文件即可安装,安装路径为C:\TDengine。Windows的客户端可运行在主流的64位Windows平台之上,客户端目录结构如下:
|
||||
|
||||
```
|
||||
├── cfg
|
||||
│ └── taos.cfg
|
||||
├── connector
|
||||
│ ├── go
|
||||
│ ├── grafana
|
||||
│ ├── jdbc
|
||||
│ └── python
|
||||
├── driver
|
||||
│ ├── taos.dll
|
||||
│ ├── taos.exp
|
||||
│ └── taos.lib
|
||||
├── examples
|
||||
│ ├── bash
|
||||
│ ├── c
|
||||
│ ├── C#
|
||||
│ ├── go
|
||||
│ ├── JDBC
|
||||
│ ├── lua
|
||||
│ ├── matlab
|
||||
│ ├── nodejs
|
||||
│ ├── python
|
||||
│ ├── R
|
||||
│ └── rust
|
||||
├── include
|
||||
│ └── taos.h
|
||||
└── taos.exe
|
||||
```
|
||||
|
||||
其中,最常用的文件列出如下:
|
||||
|
||||
+ Client可执行文件: C:/TDengine/taos.exe
|
||||
+ 配置文件: C:/TDengine/cfg/taos.cfg
|
||||
+ C驱动程序目录: C:/TDengine/driver
|
||||
+ C驱动程序头文件: C:/TDengine/include
|
||||
+ JDBC驱动程序目录: C:/TDengine/connector/jdbc
|
||||
+ GO驱动程序目录:C:/TDengine/connector/go
|
||||
+ Python驱动程序目录:C:/TDengine/connector/python
|
||||
+ C#驱动程序及示例代码: C:/TDengine/examples/C#
|
||||
+ 日志目录(第一次运行程序时生成):C:/TDengine/log
|
||||
|
||||
### 注意事项
|
||||
|
||||
#### Shell工具注意事项
|
||||
|
||||
在开始菜单中搜索cmd程序,通过命令行方式执行taos.exe即可打开TDengine的Client程序,如下所示,其中ServerIP为TDengine所在Linux服务器的IP地址
|
||||
|
||||
```
|
||||
taos -h <ServerIP>
|
||||
```
|
||||
|
||||
在cmd中对taos的使用与Linux平台没有差别,但需要注意以下几点:
|
||||
|
||||
+ 确保Windows防火墙或者其他杀毒软件处于关闭状态,TDengine的服务端与客户端通信的端口请参考`服务端配置`章节
|
||||
+ 确认客户端连接时指定了正确的服务器IP地址
|
||||
+ ping服务器IP,如果没有反应,请检查你的网络
|
||||
|
||||
#### C++接口注意事项
|
||||
|
||||
TDengine在Window系统上提供的API与Linux系统是相同的, 应用程序使用时,需要包含TDengine头文件taos.h,连接时需要链接TDengine库taos.lib,运行时将taos.dll放到可执行文件目录下。
|
||||
|
||||
#### JDBC接口注意事项
|
||||
|
||||
在Windows系统上,应用程序可以使用JDBC接口来操纵数据库,使用JDBC接口的注意事项如下:
|
||||
|
||||
+ 将JDBC驱动程序(JDBCDriver-1.0.0-dist.jar)放置到当前的CLASS_PATH中;
|
||||
|
||||
+ 将Windows开发包(taos.dll)放置到system32目录下。
|
||||
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
compile_dir=$1
|
||||
output_dir=$2
|
||||
tdengine_ver=$3
|
||||
armver=$4
|
||||
|
||||
script_dir="$(dirname $(readlink -f $0))"
|
||||
top_dir="$(readlink -m ${script_dir}/../..)"
|
||||
|
@ -63,7 +64,16 @@ debver="Version: "$tdengine_ver
|
|||
sed -i "2c$debver" ${pkg_dir}/DEBIAN/control
|
||||
|
||||
#get taos version, then set deb name
|
||||
debname="tdengine-"${tdengine_ver}".deb"
|
||||
if [ -z "$armver" ]; then
|
||||
debname="TDengine-"${tdengine_ver}".deb"
|
||||
elif [ "$armver" == "arm64" ]; then
|
||||
debname="TDengine-"${tdengine_ver}"-arm64.deb"
|
||||
elif [ "$armver" == "arm32" ]; then
|
||||
debname="TDengine-"${tdengine_ver}"-arm32.deb"
|
||||
else
|
||||
echo "input parameter error!!!"
|
||||
return
|
||||
fi
|
||||
|
||||
# make deb package
|
||||
dpkg -b ${pkg_dir} $debname
|
||||
|
|
|
@ -149,7 +149,7 @@ if [ -d ${output_dir} ]; then
|
|||
fi
|
||||
${csudo} mkdir -p ${output_dir}
|
||||
cd ${script_dir}/deb
|
||||
${csudo} ./makedeb.sh ${compile_dir} ${output_dir} ${version}
|
||||
${csudo} ./makedeb.sh ${compile_dir} ${output_dir} ${version} ${armver}
|
||||
|
||||
echo "do rpm package for the centos system"
|
||||
output_dir="${top_dir}/rpms"
|
||||
|
@ -158,7 +158,7 @@ if [ -d ${output_dir} ]; then
|
|||
fi
|
||||
${csudo} mkdir -p ${output_dir}
|
||||
cd ${script_dir}/rpm
|
||||
${csudo} ./makerpm.sh ${compile_dir} ${output_dir} ${version}
|
||||
${csudo} ./makerpm.sh ${compile_dir} ${output_dir} ${version} ${armver}
|
||||
|
||||
echo "do tar.gz package for all systems"
|
||||
cd ${script_dir}/tools
|
||||
|
|
|
@ -2,10 +2,14 @@
|
|||
#
|
||||
# Generate rpm package for centos
|
||||
|
||||
#set -e
|
||||
#set -x
|
||||
|
||||
#curr_dir=$(pwd)
|
||||
compile_dir=$1
|
||||
output_dir=$2
|
||||
tdengine_ver=$3
|
||||
armver=$4
|
||||
|
||||
script_dir="$(dirname $(readlink -f $0))"
|
||||
top_dir="$(readlink -m ${script_dir}/../..)"
|
||||
|
@ -24,8 +28,25 @@ if command -v sudo > /dev/null; then
|
|||
csudo="sudo"
|
||||
fi
|
||||
|
||||
function cp_rpm_package() {
|
||||
local cur_dir
|
||||
cd $1
|
||||
cur_dir=$(pwd)
|
||||
|
||||
for dirlist in $(ls ${cur_dir}); do
|
||||
if test -d ${dirlist}; then
|
||||
cd ${dirlist}
|
||||
cp_rpm_package ${cur_dir}/${dirlist}
|
||||
cd ..
|
||||
fi
|
||||
if test -e ${dirlist}; then
|
||||
cp ${cur_dir}/${dirlist} ${output_dir}/TDengine-${tdengine_ver}.rpm
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
if [ -d ${pkg_dir} ]; then
|
||||
${csudo} rm -rf ${pkg_dir}
|
||||
${csudo} rm -rf ${pkg_dir}
|
||||
fi
|
||||
${csudo} mkdir -p ${pkg_dir}
|
||||
cd ${pkg_dir}
|
||||
|
@ -35,7 +56,14 @@ ${csudo} mkdir -p BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
|
|||
${csudo} rpmbuild --define="_version ${tdengine_ver}" --define="_topdir ${pkg_dir}" --define="_compiledir ${compile_dir}" -bb ${spec_file}
|
||||
|
||||
# copy rpm package to output_dir, then clean temp dir
|
||||
#echo "rmpbuild end, cur_dir: $(pwd) "
|
||||
${csudo} cp -rf RPMS/* ${output_dir}
|
||||
#${csudo} cp -rf RPMS/* ${output_dir}
|
||||
cp_rpm_package ${pkg_dir}/RPMS
|
||||
|
||||
if [ "$armver" == "arm64" ]; then
|
||||
mv ${output_dir}/TDengine-${tdengine_ver}.rpm ${output_dir}/TDengine-${tdengine_ver}-arm64.rpm
|
||||
elif [ "$armver" == "arm32" ]; then
|
||||
mv ${output_dir}/TDengine-${tdengine_ver}.rpm ${output_dir}/TDengine-${tdengine_ver}-arm32.rpm
|
||||
fi
|
||||
|
||||
cd ..
|
||||
${csudo} rm -rf ${pkg_dir}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
%define cfg_install_dir /etc/taos
|
||||
%define __strip /bin/true
|
||||
|
||||
Name: tdengine
|
||||
Name: TDengine
|
||||
Version: %{_version}
|
||||
Release: 3%{?dist}
|
||||
Summary: tdengine from taosdata
|
||||
|
|
|
@ -19,8 +19,8 @@ code_dir="${top_dir}/src"
|
|||
release_dir="${top_dir}/release"
|
||||
community_dir="${script_dir}/../../../community/src"
|
||||
|
||||
package_name='linux'
|
||||
install_dir="${release_dir}/taos-client-${version}-${package_name}-$(echo ${build_time}| tr ': ' -)"
|
||||
#package_name='linux'
|
||||
install_dir="${release_dir}/TDengine-client-${version}"
|
||||
|
||||
# Directories and files.
|
||||
bin_files="${build_dir}/bin/taos ${build_dir}/bin/taosdump ${script_dir}/remove_client.sh"
|
||||
|
|
|
@ -16,8 +16,8 @@ build_dir="${compile_dir}/build"
|
|||
code_dir="${top_dir}/src"
|
||||
release_dir="${top_dir}/release"
|
||||
|
||||
package_name='linux'
|
||||
install_dir="${release_dir}/taos-${version}-${package_name}-$(echo ${build_time}| tr ': ' -)"
|
||||
#package_name='linux'
|
||||
install_dir="${release_dir}/TDengine-${version}"
|
||||
|
||||
# Directories and files.
|
||||
bin_files="${build_dir}/bin/taosd ${build_dir}/bin/taos ${build_dir}/bin/taosdemo ${build_dir}/bin/taosdump ${script_dir}/remove.sh"
|
||||
|
|
|
@ -29,9 +29,19 @@
|
|||
#elif defined(DARWIN)
|
||||
char CLIENT_VERSION[] = "Welcome to the TDengine shell from mac, client version:%s ";
|
||||
#else
|
||||
char CLIENT_VERSION[] = "Welcome to the TDengine shell from linux, client version:%s ";
|
||||
#ifdef CLUSTER
|
||||
char CLIENT_VERSION[] = "Welcome to the TDengine shell from linux, enterprise client version:%s ";
|
||||
#else
|
||||
char CLIENT_VERSION[] = "Welcome to the TDengine shell from linux, community client version:%s ";
|
||||
#endif
|
||||
#endif
|
||||
char SERVER_VERSION[] = "server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n";
|
||||
|
||||
#ifdef CLUSTER
|
||||
char SERVER_VERSION[] = "enterprise server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n";
|
||||
#else
|
||||
char SERVER_VERSION[] = "community server version:%s\nCopyright (c) 2017 by TAOS Data, Inc. All rights reserved.\n\n";
|
||||
#endif
|
||||
|
||||
char PROMPT_HEADER[] = "taos> ";
|
||||
char CONTINUE_PROMPT[] = " -> ";
|
||||
int prompt_size = 6;
|
||||
|
|
|
@ -105,6 +105,15 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
|||
static struct argp argp = {options, parse_opt, args_doc, doc};
|
||||
|
||||
void shellParseArgument(int argc, char *argv[], struct arguments *arguments) {
|
||||
char verType[32] = {0};
|
||||
#ifdef CLUSTER
|
||||
sprintf(verType, "enterprise version: %s\n", version);
|
||||
#else
|
||||
sprintf(verType, "community version: %s\n", version);
|
||||
#endif
|
||||
|
||||
argp_program_version = verType;
|
||||
|
||||
argp_parse(&argp, argc, argv, 0, 0, arguments);
|
||||
if (arguments->abort) {
|
||||
error(10, 0, "ABORTED");
|
||||
|
|
|
@ -293,19 +293,14 @@ bool httpReadChunkedBody(HttpContext* pContext, HttpParser* pParser) {
|
|||
int httpReadUnChunkedBody(HttpContext* pContext, HttpParser* pParser) {
|
||||
int dataReadLen = pParser->bufsize - (int)(pParser->data.pos - pParser->buffer);
|
||||
if (dataReadLen > pParser->data.len) {
|
||||
httpError("context:%p, fd:%d, ip:%s, un-chunked body length invalid, dataReadLen:%d > pContext->data.len:%d",
|
||||
pContext, pContext->fd, pContext->ipstr, dataReadLen, pParser->data.len);
|
||||
httpError("context:%p, fd:%d, ip:%s, un-chunked body length invalid, read size:%d dataReadLen:%d > pContext->data.len:%d",
|
||||
pContext, pContext->fd, pContext->ipstr, pContext->parser.bufsize, dataReadLen, pParser->data.len);
|
||||
httpSendErrorResp(pContext, HTTP_PARSE_BODY_ERROR);
|
||||
return HTTP_CHECK_BODY_ERROR;
|
||||
} else if (dataReadLen < pParser->data.len) {
|
||||
httpTrace("context:%p, fd:%d, ip:%s, un-chunked body not finished, dataReadLen:%d < pContext->data.len:%d, continue read",
|
||||
pContext, pContext->fd, pContext->ipstr, dataReadLen, pParser->data.len);
|
||||
if (!httpReadDataImp(pContext)) {
|
||||
httpError("context:%p, fd:%d, ip:%s, read chunked request error", pContext, pContext->fd, pContext->ipstr);
|
||||
return HTTP_CHECK_BODY_ERROR;
|
||||
} else {
|
||||
return HTTP_CHECK_BODY_CONTINUE;
|
||||
}
|
||||
httpTrace("context:%p, fd:%d, ip:%s, un-chunked body not finished, read size:%d dataReadLen:%d < pContext->data.len:%d, continue read",
|
||||
pContext, pContext->fd, pContext->ipstr, pContext->parser.bufsize, dataReadLen, pParser->data.len);
|
||||
return HTTP_CHECK_BODY_CONTINUE;
|
||||
} else {
|
||||
return HTTP_CHECK_BODY_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,12 @@ int main(int argc, char *argv[]) {
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
} else if (strcmp(argv[i], "-V") == 0) {
|
||||
printf("version: %s compatible_version: %s\n", version, compatible_version);
|
||||
#ifdef CLUSTER
|
||||
printf("enterprise version: %s compatible_version: %s\n", version, compatible_version);
|
||||
#else
|
||||
printf("community version: %s compatible_version: %s\n", version, compatible_version);
|
||||
#endif
|
||||
|
||||
printf("gitinfo: %s\n", gitinfo);
|
||||
printf("buildinfo: %s\n", buildinfo);
|
||||
return 0;
|
||||
|
|
|
@ -56,7 +56,7 @@ static int32_t tabObjVGIDComparator(const void* pLeft, const void* pRight) {
|
|||
|
||||
// monotonic inc in memory address
|
||||
static int32_t tabObjPointerComparator(const void* pLeft, const void* pRight) {
|
||||
int64_t ret = (int64_t)pLeft - (int64_t)pRight;
|
||||
int64_t ret = (*(STabObj**)(pLeft))->uid - (*(STabObj**)(pRight))->uid;
|
||||
if (ret == 0) {
|
||||
return 0;
|
||||
} else {
|
||||
|
@ -427,11 +427,11 @@ static tQueryResultset* doNestedLoopIntersect(tQueryResultset* pRes1, tQueryResu
|
|||
}
|
||||
|
||||
static tQueryResultset* doSortIntersect(tQueryResultset* pRes1, tQueryResultset* pRes2) {
|
||||
size_t sizePtr = sizeof(void*);
|
||||
|
||||
size_t sizePtr = sizeof(void *);
|
||||
|
||||
qsort(pRes1->pRes, pRes1->num, sizePtr, tabObjPointerComparator);
|
||||
qsort(pRes2->pRes, pRes2->num, sizePtr, tabObjPointerComparator);
|
||||
|
||||
|
||||
int32_t i = 0;
|
||||
int32_t j = 0;
|
||||
|
||||
|
|
|
@ -466,8 +466,6 @@ static int vnodeLoadNeededBlockData(SMeterObj *pObj, SImportHandle *pHandle, int
|
|||
SCompBlock *pBlock = pHandle->pBlocks + blockId;
|
||||
*code = TSDB_CODE_SUCCESS;
|
||||
|
||||
assert(pBlock->sversion == pObj->sversion);
|
||||
|
||||
SVnodeObj *pVnode = vnodeList + pObj->vnode;
|
||||
|
||||
int dfd = pBlock->last ? pVnode->lfd : pVnode->dfd;
|
||||
|
@ -989,6 +987,13 @@ static int vnodeMergeDataIntoFile(SImportInfo *pImport, const char *payload, int
|
|||
}
|
||||
}
|
||||
|
||||
int aslot = MIN(blockIter.slot, importHandle.compInfo.numOfBlocks - 1);
|
||||
int64_t sversion = importHandle.pBlocks[aslot].sversion;
|
||||
if (sversion != pObj->sversion) {
|
||||
code = TSDB_CODE_OTHERS;
|
||||
goto _error_merge;
|
||||
}
|
||||
|
||||
// Open the new .t file if not opened yet.
|
||||
if (pVnode->nfd <= 0) {
|
||||
if (vnodeOpenTempFilesForImport(&importHandle, pObj, fid) < 0) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
char version[64] = "1.6.4.0";
|
||||
char version[64] = "1.6.4.1";
|
||||
char compatible_version[64] = "1.6.1.0";
|
||||
char gitinfo[128] = "6d27c11e3b23ae69366df366a6517853648c41f7";
|
||||
char buildinfo[512] = "Built by ubuntu at 2019-12-01 12:27";
|
||||
char gitinfo[128] = "893fac9da79ef9b88355fcd18d29057adf909bbd";
|
||||
char buildinfo[512] = "Built by ubuntu at 2019-12-02 22:21";
|
||||
|
|
Loading…
Reference in New Issue