Merge branch 'develop' into feature/TD-1568
This commit is contained in:
commit
24b5da8bf4
|
@ -32,7 +32,7 @@ ELSEIF (TD_WINDOWS)
|
||||||
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
|
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
|
||||||
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
|
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
|
||||||
IF (TD_MVN_INSTALLED)
|
IF (TD_MVN_INSTALLED)
|
||||||
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.19-dist.jar DESTINATION connector/jdbc)
|
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.20-dist.jar DESTINATION connector/jdbc)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
ELSEIF (TD_DARWIN)
|
ELSEIF (TD_DARWIN)
|
||||||
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
|
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
|
||||||
|
|
|
@ -182,7 +182,7 @@ TDengine 分布式架构的逻辑结构图如下:
|
||||||
|
|
||||||
**集群对外连接:** TDengine集群可以容纳单个、多个甚至几千个数据节点。应用只需要向集群中任何一个数据节点发起连接即可,连接需要提供的网络参数是一数据节点的End Point(FQDN加配置的端口号)。通过命令行CLI启动应用taos时,可以通过选项-h来指定数据节点的FQDN, -P来指定其配置的端口号,如果端口不配置,将采用TDengine的系统配置参数serverPort。
|
**集群对外连接:** TDengine集群可以容纳单个、多个甚至几千个数据节点。应用只需要向集群中任何一个数据节点发起连接即可,连接需要提供的网络参数是一数据节点的End Point(FQDN加配置的端口号)。通过命令行CLI启动应用taos时,可以通过选项-h来指定数据节点的FQDN, -P来指定其配置的端口号,如果端口不配置,将采用TDengine的系统配置参数serverPort。
|
||||||
|
|
||||||
**集群内部通讯**: 各个数据节点之间通过TCP/UDP进行连接。一个数据节点启动时,将获取mnode所在的dnode的EP信息,然后与系统中的mnode建立起连接,交换信息。获取mnode的EP信息有三步,1:检查mnodeEpList文件是否存在,如果不存在或不能正常打开获得mnode EP信息,进入第二步;2:检查系统配置文件taos.cfg, 获取mnode EP配置参数first, second,如果不存在或者taos.cfg里没有这两个配置参数,或无效,进入第三步;3:将自己的EP设为mnode EP, 并独立运行起来。获取mnode EP列表后,数据节点发起连接,如果连接成功,则成功加入进工作的集群,如果不成功,则尝试mnode EP列表中的下一个。如果都尝试了,但连接都仍然失败,则休眠几秒后,再进行尝试。
|
**集群内部通讯**: 各个数据节点之间通过TCP/UDP进行连接。一个数据节点启动时,将获取mnode所在的dnode的EP信息,然后与系统中的mnode建立起连接,交换信息。获取mnode的EP信息有三步,1:检查mnodeEpList文件是否存在,如果不存在或不能正常打开获得mnode EP信息,进入第二步;2:检查系统配置文件taos.cfg, 获取节点配置参数first, second,(这两个参数指定的节点可以是不带mnode的普通节点,这样的话,节点被连接时会尝试重定向到mnode节点)如果不存在或者taos.cfg里没有这两个配置参数,或无效,进入第三步;3:将自己的EP设为mnode EP, 并独立运行起来。获取mnode EP列表后,数据节点发起连接,如果连接成功,则成功加入进工作的集群,如果不成功,则尝试mnode EP列表中的下一个。如果都尝试了,但连接都仍然失败,则休眠几秒后,再进行尝试。
|
||||||
|
|
||||||
**MNODE的选择:** TDengine逻辑上有管理节点,但没有单独的执行代码,服务器侧只有一套执行代码taosd。那么哪个数据节点会是管理节点呢?这是系统自动决定的,无需任何人工干预。原则如下:一个数据节点启动时,会检查自己的End Point, 并与获取的mnode EP List进行比对,如果在其中,该数据节点认为自己应该启动mnode模块,成为mnode。如果自己的EP不在mnode EP List里,则不启动mnode模块。在系统的运行过程中,由于负载均衡、宕机等原因,mnode有可能迁移至新的dnode,但一切都是透明的,无需人工干预,配置参数的修改,是mnode自己根据资源做出的决定。
|
**MNODE的选择:** TDengine逻辑上有管理节点,但没有单独的执行代码,服务器侧只有一套执行代码taosd。那么哪个数据节点会是管理节点呢?这是系统自动决定的,无需任何人工干预。原则如下:一个数据节点启动时,会检查自己的End Point, 并与获取的mnode EP List进行比对,如果在其中,该数据节点认为自己应该启动mnode模块,成为mnode。如果自己的EP不在mnode EP List里,则不启动mnode模块。在系统的运行过程中,由于负载均衡、宕机等原因,mnode有可能迁移至新的dnode,但一切都是透明的,无需人工干预,配置参数的修改,是mnode自己根据资源做出的决定。
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,13 @@ USE power;
|
||||||
## <a class="anchor" id="create-stable"></a>创建超级表
|
## <a class="anchor" id="create-stable"></a>创建超级表
|
||||||
|
|
||||||
一个物联网系统,往往存在多种类型的设备,比如对于电网,存在智能电表、变压器、母线、开关等等。为便于多表之间的聚合,使用TDengine, 需要对每个类型的数据采集点创建一超级表。以表一中的智能电表为例,可以使用如下的SQL命令创建超级表:
|
一个物联网系统,往往存在多种类型的设备,比如对于电网,存在智能电表、变压器、母线、开关等等。为便于多表之间的聚合,使用TDengine, 需要对每个类型的数据采集点创建一超级表。以表一中的智能电表为例,可以使用如下的SQL命令创建超级表:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int);
|
CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**注意:**这一指令中的 STABLE 关键字,在 2.0.15 之前的版本中需写作 TABLE 。
|
||||||
|
|
||||||
与创建普通表一样,创建表时,需要提供表名(示例中为meters),表结构Schema,即数据列的定义。第一列必须为时间戳(示例中为ts),其他列为采集的物理量(示例中为current, voltage, phase),数据类型可以为整型、浮点型、字符串等。除此之外,还需要提供标签的schema (示例中为location, groupId),标签的数据类型可以为整型、浮点型、字符串等。采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组ID、管理员ID等等。标签的schema可以事后增加、删除、修改。具体定义以及细节请见 [TAOS SQL 的超级表管理](https://www.taosdata.com/cn/documentation/taos-sql#super-table) 章节。
|
与创建普通表一样,创建表时,需要提供表名(示例中为meters),表结构Schema,即数据列的定义。第一列必须为时间戳(示例中为ts),其他列为采集的物理量(示例中为current, voltage, phase),数据类型可以为整型、浮点型、字符串等。除此之外,还需要提供标签的schema (示例中为location, groupId),标签的数据类型可以为整型、浮点型、字符串等。采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组ID、管理员ID等等。标签的schema可以事后增加、删除、修改。具体定义以及细节请见 [TAOS SQL 的超级表管理](https://www.taosdata.com/cn/documentation/taos-sql#super-table) 章节。
|
||||||
|
|
||||||
每一种类型的数据采集点需要建立一个超级表,因此一个物联网系统,往往会有多个超级表。对于电网,我们就需要对智能电表、变压器、母线、开关等都建立一个超级表。在物联网中,一个设备就可能有多个数据采集点(比如一台风力发电的风机,有的采集点采集电流、电压等电参数,有的采集点采集温度、湿度、风向等环境参数),这个时候,对这一类型的设备,需要建立多张超级表。一张超级表里包含的采集物理量必须是同时采集的(时间戳是一致的)。
|
每一种类型的数据采集点需要建立一个超级表,因此一个物联网系统,往往会有多个超级表。对于电网,我们就需要对智能电表、变压器、母线、开关等都建立一个超级表。在物联网中,一个设备就可能有多个数据采集点(比如一台风力发电的风机,有的采集点采集电流、电压等电参数,有的采集点采集温度、湿度、风向等环境参数),这个时候,对这一类型的设备,需要建立多张超级表。一张超级表里包含的采集物理量必须是同时采集的(时间戳是一致的)。
|
||||||
|
@ -43,9 +47,11 @@ CREATE STABLE meters (ts timestamp, current float, voltage int, phase float) TAG
|
||||||
## <a class="anchor" id="create-table"></a>创建表
|
## <a class="anchor" id="create-table"></a>创建表
|
||||||
|
|
||||||
TDengine对每个数据采集点需要独立建表。与标准的关系型数据一样,一张表有表名,Schema,但除此之外,还可以带有一到多个标签。创建时,需要使用超级表做模板,同时指定标签的具体值。以表一中的智能电表为例,可以使用如下的SQL命令建表:
|
TDengine对每个数据采集点需要独立建表。与标准的关系型数据一样,一张表有表名,Schema,但除此之外,还可以带有一到多个标签。创建时,需要使用超级表做模板,同时指定标签的具体值。以表一中的智能电表为例,可以使用如下的SQL命令建表:
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
|
CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
其中d1001是表名,meters是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 [TAOS SQL 的表管理](https://www.taosdata.com/cn/documentation/taos-sql#table) 章节。
|
其中d1001是表名,meters是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 [TAOS SQL 的表管理](https://www.taosdata.com/cn/documentation/taos-sql#table) 章节。
|
||||||
|
|
||||||
**注意:**目前 TDengine 没有从技术层面限制使用一个 database (dbA)的超级表作为模板建立另一个 database (dbB)的子表,后续会禁止这种用法,不建议使用这种方法建表。
|
**注意:**目前 TDengine 没有从技术层面限制使用一个 database (dbA)的超级表作为模板建立另一个 database (dbB)的子表,后续会禁止这种用法,不建议使用这种方法建表。
|
||||||
|
@ -57,6 +63,7 @@ TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列
|
||||||
```mysql
|
```mysql
|
||||||
INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
|
INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
|
||||||
```
|
```
|
||||||
|
|
||||||
上述SQL语句将记录 (now, 10.2, 219, 0.32) 插入表d1001。如果表d1001还未创建,则使用超级表meters做模板自动创建,同时打上标签值“Beijing.Chaoyang", 2。
|
上述SQL语句将记录 (now, 10.2, 219, 0.32) 插入表d1001。如果表d1001还未创建,则使用超级表meters做模板自动创建,同时打上标签值“Beijing.Chaoyang", 2。
|
||||||
|
|
||||||
关于自动建表的详细语法请参见 [插入记录时自动建表](https://www.taosdata.com/cn/documentation/taos-sql#auto_create_table) 章节。
|
关于自动建表的详细语法请参见 [插入记录时自动建表](https://www.taosdata.com/cn/documentation/taos-sql#auto_create_table) 章节。
|
||||||
|
|
|
@ -266,6 +266,25 @@ while(resultSet.next()){
|
||||||
|
|
||||||
> 查询和操作关系型数据库一致,使用下标获取返回字段内容时从 1 开始,建议使用字段名称获取。
|
> 查询和操作关系型数据库一致,使用下标获取返回字段内容时从 1 开始,建议使用字段名称获取。
|
||||||
|
|
||||||
|
### 处理异常
|
||||||
|
在报错后,通过SQLException可以获取到错误的信息和错误码:
|
||||||
|
```java
|
||||||
|
try (Statement statement = connection.createStatement()) {
|
||||||
|
// executeQuery
|
||||||
|
ResultSet resultSet = statement.executeQuery(sql);
|
||||||
|
// print result
|
||||||
|
printResult(resultSet);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.out.println("ERROR Message: " + e.getMessage());
|
||||||
|
System.out.println("ERROR Code: " + e.getErrorCode());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
JDBC连接器可能报错的错误码包括3种:JDBC driver本身的报错(错误码在0x2301到0x2350之间),JNI方法的报错(错误码在0x2351到0x2400之间),TDengine其他功能模块的报错。
|
||||||
|
具体的错误码请参考:
|
||||||
|
* https://github.com/taosdata/TDengine/blob/develop/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBErrorNumbers.java
|
||||||
|
* https://github.com/taosdata/TDengine/blob/develop/src/inc/taoserror.h
|
||||||
|
|
||||||
### 订阅
|
### 订阅
|
||||||
|
|
||||||
#### 创建
|
#### 创建
|
||||||
|
|
|
@ -13,7 +13,11 @@ TDengine能够与开源数据可视化系统[Grafana](https://www.grafana.com/)
|
||||||
|
|
||||||
TDengine的Grafana插件在安装包的/usr/local/taos/connector/grafanaplugin目录下。
|
TDengine的Grafana插件在安装包的/usr/local/taos/connector/grafanaplugin目录下。
|
||||||
|
|
||||||
以CentOS 7.2操作系统为例,将tdengine目录拷贝到/var/lib/grafana/plugins目录下,重新启动grafana即可。
|
以CentOS 7.2操作系统为例,将grafanaplugin目录拷贝到/var/lib/grafana/plugins目录下,重新启动grafana即可。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo cp -rf /usr/local/taos/connector/grafanaplugin /var/lib/grafana/tdengine
|
||||||
|
```
|
||||||
|
|
||||||
### 使用 Grafana
|
### 使用 Grafana
|
||||||
|
|
||||||
|
|
|
@ -230,7 +230,7 @@ TDengine缺省的时间戳是毫秒精度,但通过修改配置参数enableMic
|
||||||
|
|
||||||
## <a class="anchor" id="super-table"></a>超级表STable管理
|
## <a class="anchor" id="super-table"></a>超级表STable管理
|
||||||
|
|
||||||
注意:在 2.0.15 以前的版本中,并不支持 STABLE 保留字,而是写作 TABLE。也即,在本节后文的指令说明中,CREATE、DROP、ALTER 三个指令在老版本中保留字需写作 TABLE 而不是 STABLE。
|
注意:在 2.0.15.0 及以后的版本中,开始支持 STABLE 保留字。也即,在本节后文的指令说明中,CREATE、DROP、ALTER 三个指令在老版本中保留字需写作 TABLE 而不是 STABLE。
|
||||||
|
|
||||||
- **创建超级表**
|
- **创建超级表**
|
||||||
|
|
||||||
|
|
|
@ -334,7 +334,7 @@ typedef struct SSubqueryState {
|
||||||
|
|
||||||
typedef struct SSqlObj {
|
typedef struct SSqlObj {
|
||||||
void *signature;
|
void *signature;
|
||||||
pthread_t owner; // owner of sql object, by which it is executed
|
int64_t owner; // owner of sql object, by which it is executed
|
||||||
STscObj *pTscObj;
|
STscObj *pTscObj;
|
||||||
int64_t rpcRid;
|
int64_t rpcRid;
|
||||||
__async_cb_func_t fp;
|
__async_cb_func_t fp;
|
||||||
|
@ -449,6 +449,9 @@ void doAsyncQuery(STscObj *pObj, SSqlObj *pSql, __async_cb_func_t fp, void *para
|
||||||
void tscImportDataFromFile(SSqlObj *pSql);
|
void tscImportDataFromFile(SSqlObj *pSql);
|
||||||
void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen);
|
void tscInitResObjForLocalQuery(SSqlObj *pObj, int32_t numOfRes, int32_t rowLen);
|
||||||
bool tscIsUpdateQuery(SSqlObj* pSql);
|
bool tscIsUpdateQuery(SSqlObj* pSql);
|
||||||
|
char* tscGetSqlStr(SSqlObj* pSql);
|
||||||
|
bool tscIsQueryWithLimit(SSqlObj* pSql);
|
||||||
|
|
||||||
bool tscHasReachLimitation(SQueryInfo *pQueryInfo, SSqlRes *pRes);
|
bool tscHasReachLimitation(SQueryInfo *pQueryInfo, SSqlRes *pRes);
|
||||||
|
|
||||||
char *tscGetErrorMsgPayload(SSqlCmd *pCmd);
|
char *tscGetErrorMsgPayload(SSqlCmd *pCmd);
|
||||||
|
|
|
@ -1144,7 +1144,7 @@ bool validateOneTags(SSqlCmd* pCmd, TAOS_FIELD* pTagField) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pTagField->type < TSDB_DATA_TYPE_BOOL) || (pTagField->type > TSDB_DATA_TYPE_NCHAR)) {
|
if ((pTagField->type < TSDB_DATA_TYPE_BOOL) || (pTagField->type > TSDB_DATA_TYPE_UBIGINT)) {
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1208,7 +1208,7 @@ bool validateOneColumn(SSqlCmd* pCmd, TAOS_FIELD* pColField) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pColField->type < TSDB_DATA_TYPE_BOOL || pColField->type > TSDB_DATA_TYPE_NCHAR) {
|
if (pColField->type < TSDB_DATA_TYPE_BOOL || pColField->type > TSDB_DATA_TYPE_UBIGINT) {
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg4);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1885,6 +1885,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
||||||
const char* msg7 = "normal table can not apply this function";
|
const char* msg7 = "normal table can not apply this function";
|
||||||
const char* msg8 = "multi-columns selection does not support alias column name";
|
const char* msg8 = "multi-columns selection does not support alias column name";
|
||||||
const char* msg9 = "invalid function";
|
const char* msg9 = "invalid function";
|
||||||
|
const char* msg10 = "diff can no be applied to unsigned numeric type";
|
||||||
|
|
||||||
switch (optr) {
|
switch (optr) {
|
||||||
case TK_COUNT: {
|
case TK_COUNT: {
|
||||||
|
@ -2023,6 +2024,8 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col
|
||||||
|
|
||||||
if (!IS_NUMERIC_TYPE(colType)) {
|
if (!IS_NUMERIC_TYPE(colType)) {
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(colType) && optr == TK_DIFF) {
|
||||||
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg10);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t resultType = 0;
|
int16_t resultType = 0;
|
||||||
|
|
|
@ -418,6 +418,9 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcEpSet *pEpSet) {
|
||||||
|
|
||||||
bool shouldFree = tscShouldBeFreed(pSql);
|
bool shouldFree = tscShouldBeFreed(pSql);
|
||||||
if (rpcMsg->code != TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
if (rpcMsg->code != TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
||||||
|
if (rpcMsg->code != TSDB_CODE_SUCCESS) {
|
||||||
|
pRes->code = rpcMsg->code;
|
||||||
|
}
|
||||||
rpcMsg->code = (pRes->code == TSDB_CODE_SUCCESS) ? (int32_t)pRes->numOfRows : pRes->code;
|
rpcMsg->code = (pRes->code == TSDB_CODE_SUCCESS) ? (int32_t)pRes->numOfRows : pRes->code;
|
||||||
(*pSql->fp)(pSql->param, pSql, rpcMsg->code);
|
(*pSql->fp)(pSql->param, pSql, rpcMsg->code);
|
||||||
}
|
}
|
||||||
|
@ -1807,7 +1810,7 @@ int tscProcessTableMetaRsp(SSqlObj *pSql) {
|
||||||
pMetaMsg->uid = htobe64(pMetaMsg->uid);
|
pMetaMsg->uid = htobe64(pMetaMsg->uid);
|
||||||
pMetaMsg->contLen = htons(pMetaMsg->contLen);
|
pMetaMsg->contLen = htons(pMetaMsg->contLen);
|
||||||
pMetaMsg->numOfColumns = htons(pMetaMsg->numOfColumns);
|
pMetaMsg->numOfColumns = htons(pMetaMsg->numOfColumns);
|
||||||
|
|
||||||
if ((pMetaMsg->tableType != TSDB_SUPER_TABLE) &&
|
if ((pMetaMsg->tableType != TSDB_SUPER_TABLE) &&
|
||||||
(pMetaMsg->tid <= 0 || pMetaMsg->vgroup.vgId < 2 || pMetaMsg->vgroup.numOfEps <= 0)) {
|
(pMetaMsg->tid <= 0 || pMetaMsg->vgroup.vgId < 2 || pMetaMsg->vgroup.numOfEps <= 0)) {
|
||||||
tscError("invalid value in table numOfEps:%d, vgId:%d tid:%d, name:%s", pMetaMsg->vgroup.numOfEps, pMetaMsg->vgroup.vgId,
|
tscError("invalid value in table numOfEps:%d, vgId:%d tid:%d, name:%s", pMetaMsg->vgroup.numOfEps, pMetaMsg->vgroup.vgId,
|
||||||
|
|
|
@ -683,10 +683,14 @@ void tscBuildVgroupTableInfo(SSqlObj* pSql, STableMetaInfo* pTableMetaInfo, SArr
|
||||||
prev = tt;
|
prev = tt;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableMetaInfo->pVgroupTables = result;
|
|
||||||
pTableMetaInfo->vgroupIndex = 0;
|
pTableMetaInfo->vgroupIndex = 0;
|
||||||
|
|
||||||
|
if (taosArrayGetSize(result) <= 0) {
|
||||||
|
pTableMetaInfo->pVgroupTables = NULL;
|
||||||
|
taosArrayDestroy(result);
|
||||||
|
} else {
|
||||||
|
pTableMetaInfo->pVgroupTables = result;
|
||||||
|
|
||||||
if (taosArrayGetSize(result) > 0) {
|
|
||||||
SVgroupTableInfo* g = taosArrayGet(result, taosArrayGetSize(result) - 1);
|
SVgroupTableInfo* g = taosArrayGet(result, taosArrayGetSize(result) - 1);
|
||||||
tscDebug("%p vgId:%d, tables:%"PRIzu, pSql, g->vgInfo.vgId, taosArrayGetSize(g->itemList));
|
tscDebug("%p vgId:%d, tables:%"PRIzu, pSql, g->vgInfo.vgId, taosArrayGetSize(g->itemList));
|
||||||
}
|
}
|
||||||
|
|
|
@ -2310,6 +2310,35 @@ bool tscIsUpdateQuery(SSqlObj* pSql) {
|
||||||
return ((pCmd->command >= TSDB_SQL_INSERT && pCmd->command <= TSDB_SQL_DROP_DNODE) || TSDB_SQL_USE_DB == pCmd->command);
|
return ((pCmd->command >= TSDB_SQL_INSERT && pCmd->command <= TSDB_SQL_DROP_DNODE) || TSDB_SQL_USE_DB == pCmd->command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* tscGetSqlStr(SSqlObj* pSql) {
|
||||||
|
if (pSql == NULL || pSql->signature != pSql) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pSql->sqlstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool tscIsQueryWithLimit(SSqlObj* pSql) {
|
||||||
|
if (pSql == NULL || pSql->signature != pSql) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSqlCmd* pCmd = &pSql->cmd;
|
||||||
|
for (int32_t i = 0; i < pCmd->numOfClause; ++i) {
|
||||||
|
SQueryInfo* pqi = tscGetQueryInfoDetailSafely(pCmd, i);
|
||||||
|
if (pqi == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pqi->limit.limit > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t tscSQLSyntaxErrMsg(char* msg, const char* additionalInfo, const char* sql) {
|
int32_t tscSQLSyntaxErrMsg(char* msg, const char* additionalInfo, const char* sql) {
|
||||||
const char* msgFormat1 = "syntax error near \'%s\'";
|
const char* msgFormat1 = "syntax error near \'%s\'";
|
||||||
const char* msgFormat2 = "syntax error near \'%s\' (%s)";
|
const char* msgFormat2 = "syntax error near \'%s\' (%s)";
|
||||||
|
@ -2549,11 +2578,7 @@ bool tscSetSqlOwner(SSqlObj* pSql) {
|
||||||
SSqlRes* pRes = &pSql->res;
|
SSqlRes* pRes = &pSql->res;
|
||||||
|
|
||||||
// set the sql object owner
|
// set the sql object owner
|
||||||
#ifdef __APPLE__
|
int64_t threadId = taosGetSelfPthreadId();
|
||||||
pthread_t threadId = (pthread_t)taosGetSelfPthreadId();
|
|
||||||
#else // __APPLE__
|
|
||||||
uint64_t threadId = taosGetSelfPthreadId();
|
|
||||||
#endif // __APPLE__
|
|
||||||
if (atomic_val_compare_exchange_64(&pSql->owner, 0, threadId) != 0) {
|
if (atomic_val_compare_exchange_64(&pSql->owner, 0, threadId) != 0) {
|
||||||
pRes->code = TSDB_CODE_QRY_IN_EXEC;
|
pRes->code = TSDB_CODE_QRY_IN_EXEC;
|
||||||
return false;
|
return false;
|
||||||
|
@ -2563,7 +2588,6 @@ bool tscSetSqlOwner(SSqlObj* pSql) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void tscClearSqlOwner(SSqlObj* pSql) {
|
void tscClearSqlOwner(SSqlObj* pSql) {
|
||||||
assert(taosCheckPthreadValid(pSql->owner));
|
|
||||||
atomic_store_64(&pSql->owner, 0);
|
atomic_store_64(&pSql->owner, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1151,7 +1151,7 @@ static void doInitGlobalConfig(void) {
|
||||||
cfg.ptr = &tsHttpMaxThreads;
|
cfg.ptr = &tsHttpMaxThreads;
|
||||||
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG;
|
||||||
cfg.minValue = 1;
|
cfg.minValue = 2;
|
||||||
cfg.maxValue = 1000000;
|
cfg.maxValue = 1000000;
|
||||||
cfg.ptrLength = 0;
|
cfg.ptrLength = 0;
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
|
@ -1523,6 +1523,13 @@ int32_t taosCheckGlobalCfg() {
|
||||||
tsNumOfCores = 1;
|
tsNumOfCores = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tsHttpMaxThreads == 2) {
|
||||||
|
int32_t halfNumOfCores = tsNumOfCores >> 1;
|
||||||
|
if (halfNumOfCores > 2) {
|
||||||
|
tsHttpMaxThreads = halfNumOfCores;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (tsMaxTablePerVnode < tsMinTablePerVnode) {
|
if (tsMaxTablePerVnode < tsMinTablePerVnode) {
|
||||||
uError("maxTablesPerVnode(%d) < minTablesPerVnode(%d), reset to minTablesPerVnode(%d)",
|
uError("maxTablesPerVnode(%d) < minTablesPerVnode(%d), reset to minTablesPerVnode(%d)",
|
||||||
tsMaxTablePerVnode, tsMinTablePerVnode, tsMinTablePerVnode);
|
tsMaxTablePerVnode, tsMinTablePerVnode, tsMinTablePerVnode);
|
||||||
|
|
|
@ -8,7 +8,7 @@ IF (TD_MVN_INSTALLED)
|
||||||
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.19-dist.jar ${LIBRARY_OUTPUT_PATH}
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.20-dist.jar ${LIBRARY_OUTPUT_PATH}
|
||||||
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||||
COMMENT "build jdbc driver")
|
COMMENT "build jdbc driver")
|
||||||
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.19</version>
|
<version>2.0.20</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.19</version>
|
<version>2.0.20</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
||||||
|
@ -34,23 +34,9 @@
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>
|
||||||
<commons-logging.version>1.1.2</commons-logging.version>
|
|
||||||
<commons-lang3.version>3.5</commons-lang3.version>
|
|
||||||
<maven.test.jvmargs></maven.test.jvmargs>
|
<maven.test.jvmargs></maven.test.jvmargs>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>commons-logging</groupId>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<version>${commons-logging.version}</version>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>*</groupId>
|
|
||||||
<artifactId>*</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
|
@ -64,23 +50,12 @@
|
||||||
<artifactId>httpclient</artifactId>
|
<artifactId>httpclient</artifactId>
|
||||||
<version>4.5.8</version>
|
<version>4.5.8</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
<artifactId>commons-lang3</artifactId>
|
|
||||||
<version>3.9</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>fastjson</artifactId>
|
<artifactId>fastjson</artifactId>
|
||||||
<version>1.2.58</version>
|
<version>1.2.58</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
<artifactId>commons-dbcp2</artifactId>
|
|
||||||
<version>2.7.0</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -126,9 +126,9 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
case Connection.TRANSACTION_READ_COMMITTED:
|
case Connection.TRANSACTION_READ_COMMITTED:
|
||||||
case Connection.TRANSACTION_REPEATABLE_READ:
|
case Connection.TRANSACTION_REPEATABLE_READ:
|
||||||
case Connection.TRANSACTION_SERIALIZABLE:
|
case Connection.TRANSACTION_SERIALIZABLE:
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
default:
|
default:
|
||||||
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
}
|
}
|
||||||
//do nothing
|
//do nothing
|
||||||
}
|
}
|
||||||
|
@ -436,7 +436,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
@Override
|
@Override
|
||||||
public void setClientInfo(String name, String value) throws SQLClientInfoException {
|
public void setClientInfo(String name, String value) throws SQLClientInfoException {
|
||||||
if (isClosed)
|
if (isClosed)
|
||||||
throw TSDBError.createSQLClientInfoException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||||
|
|
||||||
if (clientInfoProps == null)
|
if (clientInfoProps == null)
|
||||||
clientInfoProps = new Properties();
|
clientInfoProps = new Properties();
|
||||||
|
@ -446,7 +446,8 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
@Override
|
@Override
|
||||||
public void setClientInfo(Properties properties) throws SQLClientInfoException {
|
public void setClientInfo(Properties properties) throws SQLClientInfoException {
|
||||||
if (isClosed)
|
if (isClosed)
|
||||||
throw TSDBError.createSQLClientInfoException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
throw (SQLClientInfoException) TSDBError.createSQLException(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||||
|
|
||||||
|
|
||||||
for (Enumeration<Object> enumer = properties.keys(); enumer.hasMoreElements(); ) {
|
for (Enumeration<Object> enumer = properties.keys(); enumer.hasMoreElements(); ) {
|
||||||
String name = (String) enumer.nextElement();
|
String name = (String) enumer.nextElement();
|
||||||
|
@ -457,7 +458,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
@Override
|
@Override
|
||||||
public String getClientInfo(String name) throws SQLException {
|
public String getClientInfo(String name) throws SQLException {
|
||||||
if (isClosed)
|
if (isClosed)
|
||||||
throw TSDBError.createSQLClientInfoException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||||
|
|
||||||
return clientInfoProps.getProperty(name);
|
return clientInfoProps.getProperty(name);
|
||||||
}
|
}
|
||||||
|
@ -465,7 +466,7 @@ public abstract class AbstractConnection extends WrapperImpl implements Connecti
|
||||||
@Override
|
@Override
|
||||||
public Properties getClientInfo() throws SQLException {
|
public Properties getClientInfo() throws SQLException {
|
||||||
if (isClosed)
|
if (isClosed)
|
||||||
throw TSDBError.createSQLClientInfoException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||||
|
|
||||||
return clientInfoProps;
|
return clientInfoProps;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class AbstractStatement extends WrapperImpl implements Statement {
|
public abstract class AbstractStatement extends WrapperImpl implements Statement {
|
||||||
|
|
||||||
private volatile boolean closeOnCompletion;
|
protected List<String> batchedArgs;
|
||||||
private int fetchSize;
|
private int fetchSize;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -45,13 +47,14 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
if (max < 0)
|
if (max < 0)
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
// nothing to do
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setEscapeProcessing(boolean enable) throws SQLException {
|
public void setEscapeProcessing(boolean enable) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,6 +74,9 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancel() throws SQLException {
|
public void cancel() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +98,7 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
public void setCursorName(String name) throws SQLException {
|
public void setCursorName(String name) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,6 +120,15 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
public void setFetchDirection(int direction) throws SQLException {
|
public void setFetchDirection(int direction) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
switch (direction) {
|
||||||
|
case ResultSet.FETCH_FORWARD:
|
||||||
|
case ResultSet.FETCH_REVERSE:
|
||||||
|
case ResultSet.FETCH_UNKNOWN:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
|
}
|
||||||
//nothing to do
|
//nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,13 +171,42 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public abstract void addBatch(String sql) throws SQLException;
|
public void addBatch(String sql) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
if (batchedArgs == null) {
|
||||||
|
batchedArgs = new ArrayList<>();
|
||||||
|
}
|
||||||
|
batchedArgs.add(sql);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public abstract void clearBatch() throws SQLException;
|
public void clearBatch() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
if (batchedArgs != null)
|
||||||
|
batchedArgs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public abstract int[] executeBatch() throws SQLException;
|
public int[] executeBatch() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
if (batchedArgs == null || batchedArgs.isEmpty())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_BATCH_IS_EMPTY);
|
||||||
|
|
||||||
|
int[] res = new int[batchedArgs.size()];
|
||||||
|
for (int i = 0; i < batchedArgs.size(); i++) {
|
||||||
|
boolean isSelect = execute(batchedArgs.get(i));
|
||||||
|
if (isSelect) {
|
||||||
|
res[i] = SUCCESS_NO_INFO;
|
||||||
|
} else {
|
||||||
|
res[i] = getUpdateCount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public abstract Connection getConnection() throws SQLException;
|
public abstract Connection getConnection() throws SQLException;
|
||||||
|
@ -170,42 +215,73 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
public boolean getMoreResults(int current) throws SQLException {
|
public boolean getMoreResults(int current) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
return false;
|
switch (current) {
|
||||||
|
case Statement.CLOSE_CURRENT_RESULT:
|
||||||
|
return false;
|
||||||
|
case Statement.KEEP_CURRENT_RESULT:
|
||||||
|
case Statement.CLOSE_ALL_RESULTS:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultSet getGeneratedKeys() throws SQLException {
|
public ResultSet getGeneratedKeys() throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
|
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int executeUpdate(String sql, int[] columnIndexes) throws SQLException {
|
public int executeUpdate(String sql, int[] columnIndexes) throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int executeUpdate(String sql, String[] columnNames) throws SQLException {
|
public int executeUpdate(String sql, String[] columnNames) throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean execute(String sql, int autoGeneratedKeys) throws SQLException {
|
public boolean execute(String sql, int autoGeneratedKeys) throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean execute(String sql, int[] columnIndexes) throws SQLException {
|
public boolean execute(String sql, int[] columnIndexes) throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean execute(String sql, String[] columnNames) throws SQLException {
|
public boolean execute(String sql, String[] columnNames) throws SQLException {
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -222,7 +298,7 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
public void setPoolable(boolean poolable) throws SQLException {
|
public void setPoolable(boolean poolable) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
//nothing to do
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -236,14 +312,15 @@ public abstract class AbstractStatement extends WrapperImpl implements Statement
|
||||||
public void closeOnCompletion() throws SQLException {
|
public void closeOnCompletion() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
this.closeOnCompletion = true;
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCloseOnCompletion() throws SQLException {
|
public boolean isCloseOnCompletion() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
return this.closeOnCompletion;
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,12 +160,12 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Date getDate(int columnIndex) throws SQLException {
|
public Date getDate(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Time getTime(int columnIndex) throws SQLException {
|
public Time getTime(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -176,17 +176,17 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getAsciiStream(int columnIndex) throws SQLException {
|
public InputStream getAsciiStream(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getUnicodeStream(int columnIndex) throws SQLException {
|
public InputStream getUnicodeStream(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getBinaryStream(int columnIndex) throws SQLException {
|
public InputStream getBinaryStream(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -256,22 +256,22 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getAsciiStream(String columnLabel) throws SQLException {
|
public InputStream getAsciiStream(String columnLabel) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getUnicodeStream(String columnLabel) throws SQLException {
|
public InputStream getUnicodeStream(String columnLabel) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InputStream getBinaryStream(String columnLabel) throws SQLException {
|
public InputStream getBinaryStream(String columnLabel) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SQLWarning getWarnings() throws SQLException {
|
public SQLWarning getWarnings() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -281,7 +281,7 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getCursorName() throws SQLException {
|
public String getCursorName() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -313,12 +313,12 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Reader getCharacterStream(int columnIndex) throws SQLException {
|
public Reader getCharacterStream(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Reader getCharacterStream(String columnLabel) throws SQLException {
|
public Reader getCharacterStream(String columnLabel) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -353,22 +353,22 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeFirst() throws SQLException {
|
public void beforeFirst() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterLast() throws SQLException {
|
public void afterLast() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean first() throws SQLException {
|
public boolean first() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean last() throws SQLException {
|
public boolean last() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -383,17 +383,17 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean absolute(int row) throws SQLException {
|
public boolean absolute(int row) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean relative(int rows) throws SQLException {
|
public boolean relative(int rows) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean previous() throws SQLException {
|
public boolean previous() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -443,227 +443,227 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateNull(int columnIndex) throws SQLException {
|
public void updateNull(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBoolean(int columnIndex, boolean x) throws SQLException {
|
public void updateBoolean(int columnIndex, boolean x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateByte(int columnIndex, byte x) throws SQLException {
|
public void updateByte(int columnIndex, byte x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateShort(int columnIndex, short x) throws SQLException {
|
public void updateShort(int columnIndex, short x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateInt(int columnIndex, int x) throws SQLException {
|
public void updateInt(int columnIndex, int x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateLong(int columnIndex, long x) throws SQLException {
|
public void updateLong(int columnIndex, long x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateFloat(int columnIndex, float x) throws SQLException {
|
public void updateFloat(int columnIndex, float x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateDouble(int columnIndex, double x) throws SQLException {
|
public void updateDouble(int columnIndex, double x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
|
public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateString(int columnIndex, String x) throws SQLException {
|
public void updateString(int columnIndex, String x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBytes(int columnIndex, byte[] x) throws SQLException {
|
public void updateBytes(int columnIndex, byte[] x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateDate(int columnIndex, Date x) throws SQLException {
|
public void updateDate(int columnIndex, Date x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTime(int columnIndex, Time x) throws SQLException {
|
public void updateTime(int columnIndex, Time x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException {
|
public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException {
|
public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException {
|
public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException {
|
public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException {
|
public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateObject(int columnIndex, Object x) throws SQLException {
|
public void updateObject(int columnIndex, Object x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateNull(String columnLabel) throws SQLException {
|
public void updateNull(String columnLabel) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBoolean(String columnLabel, boolean x) throws SQLException {
|
public void updateBoolean(String columnLabel, boolean x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateByte(String columnLabel, byte x) throws SQLException {
|
public void updateByte(String columnLabel, byte x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateShort(String columnLabel, short x) throws SQLException {
|
public void updateShort(String columnLabel, short x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateInt(String columnLabel, int x) throws SQLException {
|
public void updateInt(String columnLabel, int x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateLong(String columnLabel, long x) throws SQLException {
|
public void updateLong(String columnLabel, long x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateFloat(String columnLabel, float x) throws SQLException {
|
public void updateFloat(String columnLabel, float x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateDouble(String columnLabel, double x) throws SQLException {
|
public void updateDouble(String columnLabel, double x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException {
|
public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateString(String columnLabel, String x) throws SQLException {
|
public void updateString(String columnLabel, String x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBytes(String columnLabel, byte[] x) throws SQLException {
|
public void updateBytes(String columnLabel, byte[] x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateDate(String columnLabel, Date x) throws SQLException {
|
public void updateDate(String columnLabel, Date x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTime(String columnLabel, Time x) throws SQLException {
|
public void updateTime(String columnLabel, Time x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException {
|
public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException {
|
public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException {
|
public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException {
|
public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException {
|
public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateObject(String columnLabel, Object x) throws SQLException {
|
public void updateObject(String columnLabel, Object x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void insertRow() throws SQLException {
|
public void insertRow() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateRow() throws SQLException {
|
public void updateRow() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteRow() throws SQLException {
|
public void deleteRow() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void refreshRow() throws SQLException {
|
public void refreshRow() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cancelRowUpdates() throws SQLException {
|
public void cancelRowUpdates() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void moveToInsertRow() throws SQLException {
|
public void moveToInsertRow() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void moveToCurrentRow() throws SQLException {
|
public void moveToCurrentRow() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -673,12 +673,12 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getObject(int columnIndex, Map<String, Class<?>> map) throws SQLException {
|
public Object getObject(int columnIndex, Map<String, Class<?>> map) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Ref getRef(int columnIndex) throws SQLException {
|
public Ref getRef(int columnIndex) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1043,12 +1043,12 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
|
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
|
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,49 +22,47 @@ public class TSDBError {
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE, "Database not specified or available");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE, "Database not specified or available");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE_UPDATE, "not a valid sql for executeUpdate: (?)");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE_UPDATE, "not a valid sql for executeUpdate: (?)");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE, "not a valid sql for execute: (?)");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE, "not a valid sql for execute: (?)");
|
||||||
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_PARAMETER_INDEX_OUT_RANGE, "parameter index out of range");
|
||||||
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED, "connection already closed");
|
||||||
/**************************************************/
|
/**************************************************/
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN, "unknown error");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNKNOWN, "unknown error");
|
||||||
/**************************************************/
|
/**************************************************/
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_SUBSCRIBE_FAILED, "failed to create subscription");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_SUBSCRIBE_FAILED, "failed to create subscription");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING, "Unsupported encoding");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING, "Unsupported encoding");
|
||||||
|
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_TDENGINE_ERROR, "internal error of database!");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_TDENGINE_ERROR, "internal error of database");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL, "JNI connection already closed!");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL, "JNI connection is NULL");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_RESULT_SET_NULL, "invalid JNI result set!");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_RESULT_SET_NULL, "JNI result set is NULL");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_NUM_OF_FIELDS_0, "invalid num of fields!");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_NUM_OF_FIELDS_0, "invalid num of fields");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_SQL_NULL, "empty sql string!");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_SQL_NULL, "empty sql string");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_FETCH_END, "fetch to the end of resultset");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_FETCH_END, "fetch to the end of resultSet");
|
||||||
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_OUT_OF_MEMORY, "JNI alloc memory failed!");
|
TSDBErrorMap.put(TSDBErrorNumbers.ERROR_JNI_OUT_OF_MEMORY, "JNI alloc memory failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String wrapErrMsg(String msg) {
|
public static SQLException createSQLException(int errorCode) {
|
||||||
return "TDengine Error: " + msg;
|
String message;
|
||||||
|
if (TSDBErrorNumbers.contains(errorCode))
|
||||||
|
message = TSDBErrorMap.get(errorCode);
|
||||||
|
else
|
||||||
|
message = TSDBErrorMap.get(TSDBErrorNumbers.ERROR_UNKNOWN);
|
||||||
|
return createSQLException(errorCode, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SQLException createSQLException(int errorNumber) {
|
public static SQLException createSQLException(int errorCode, String message) {
|
||||||
return createSQLException(errorNumber, null);
|
// throw SQLFeatureNotSupportedException
|
||||||
}
|
if (errorCode == TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD)
|
||||||
|
return new SQLFeatureNotSupportedException(message, "", errorCode);
|
||||||
|
// throw SQLClientInfoException
|
||||||
|
if (errorCode == TSDBErrorNumbers.ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED)
|
||||||
|
return new SQLClientInfoException(message, null);
|
||||||
|
|
||||||
public static SQLException createSQLException(int errorNumber, String message) {
|
if (errorCode > 0x2300 && errorCode < 0x2350)
|
||||||
if (message == null || message.isEmpty()) {
|
|
||||||
if (TSDBErrorNumbers.contains(errorNumber))
|
|
||||||
message = TSDBErrorMap.get(errorNumber);
|
|
||||||
else
|
|
||||||
message = TSDBErrorMap.get(TSDBErrorNumbers.ERROR_UNKNOWN);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errorNumber == TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD)
|
|
||||||
return new SQLFeatureNotSupportedException(message);
|
|
||||||
|
|
||||||
if (errorNumber < TSDBErrorNumbers.ERROR_UNKNOWN)
|
|
||||||
// JDBC exception's error number is less than 0x2350
|
// JDBC exception's error number is less than 0x2350
|
||||||
return new SQLException("ERROR (" + Integer.toHexString(errorNumber) + "): " + message);
|
return new SQLException("ERROR (" + Integer.toHexString(errorCode) + "): " + message, "", errorCode);
|
||||||
// JNI exception's error number is large than 0x2350
|
if (errorCode > 0x2350 && errorCode < 0x2400)
|
||||||
return new SQLException("TDengine ERROR (" + Integer.toHexString(errorNumber) + "): " + message);
|
// JNI exception's error number is large than 0x2350
|
||||||
|
return new SQLException("JNI ERROR (" + Integer.toHexString(errorCode) + "): " + message, "", errorCode);
|
||||||
|
return new SQLException("TDengine ERROR (" + Integer.toHexString(errorCode) + "): " + message, "", errorCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SQLClientInfoException createSQLClientInfoException(int errorNumber) {
|
|
||||||
return new SQLClientInfoException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,22 +13,24 @@ public class TSDBErrorNumbers {
|
||||||
public static final int ERROR_INVALID_WITH_EXECUTEQUERY = 0x2307; //Can not issue data manipulation statements with executeQuery()
|
public static final int ERROR_INVALID_WITH_EXECUTEQUERY = 0x2307; //Can not issue data manipulation statements with executeQuery()
|
||||||
public static final int ERROR_INVALID_WITH_EXECUTEUPDATE = 0x2308; //Can not issue SELECT via executeUpdate()
|
public static final int ERROR_INVALID_WITH_EXECUTEUPDATE = 0x2308; //Can not issue SELECT via executeUpdate()
|
||||||
public static final int ERROR_INVALID_FOR_EXECUTE_QUERY = 0x2309; //not a valid sql for executeQuery: (SQL)
|
public static final int ERROR_INVALID_FOR_EXECUTE_QUERY = 0x2309; //not a valid sql for executeQuery: (SQL)
|
||||||
public static final int ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE = 0x2310; //Database not specified or available
|
public static final int ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE = 0x230a; //Database not specified or available
|
||||||
public static final int ERROR_INVALID_FOR_EXECUTE_UPDATE = 0x2311; //not a valid sql for executeUpdate: (SQL)
|
public static final int ERROR_INVALID_FOR_EXECUTE_UPDATE = 0x230b; //not a valid sql for executeUpdate: (SQL)
|
||||||
public static final int ERROR_INVALID_FOR_EXECUTE = 0x2312; //not a valid sql for execute: (SQL)
|
public static final int ERROR_INVALID_FOR_EXECUTE = 0x230c; //not a valid sql for execute: (SQL)
|
||||||
|
public static final int ERROR_PARAMETER_INDEX_OUT_RANGE = 0x230d; // parameter index out of range
|
||||||
|
public static final int ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED = 0x230e; // connection already closed
|
||||||
|
|
||||||
public static final int ERROR_UNKNOWN = 0x2350; //unknown error
|
public static final int ERROR_UNKNOWN = 0x2350; //unknown error
|
||||||
|
|
||||||
public static final int ERROR_SUBSCRIBE_FAILED = 0x2351; //failed to create subscription
|
public static final int ERROR_SUBSCRIBE_FAILED = 0x2351; // failed to create subscription
|
||||||
public static final int ERROR_UNSUPPORTED_ENCODING = 0x2352; //Unsupported encoding
|
public static final int ERROR_UNSUPPORTED_ENCODING = 0x2352; // Unsupported encoding
|
||||||
|
|
||||||
public static final int ERROR_JNI_TDENGINE_ERROR = 0x2353;
|
public static final int ERROR_JNI_TDENGINE_ERROR = 0x2353; // internal error of database
|
||||||
public static final int ERROR_JNI_CONNECTION_NULL = 0x2354; //invalid tdengine connection!
|
public static final int ERROR_JNI_CONNECTION_NULL = 0x2354; // JNI connection is NULL
|
||||||
public static final int ERROR_JNI_RESULT_SET_NULL = 0x2355;
|
public static final int ERROR_JNI_RESULT_SET_NULL = 0x2355; // invalid JNI result set
|
||||||
public static final int ERROR_JNI_NUM_OF_FIELDS_0 = 0x2356;
|
public static final int ERROR_JNI_NUM_OF_FIELDS_0 = 0x2356; // invalid num of fields
|
||||||
public static final int ERROR_JNI_SQL_NULL = 0x2357;
|
public static final int ERROR_JNI_SQL_NULL = 0x2357; // empty sql string
|
||||||
public static final int ERROR_JNI_FETCH_END = 0x2358;
|
public static final int ERROR_JNI_FETCH_END = 0x2358; // fetch to the end of resultSet
|
||||||
public static final int ERROR_JNI_OUT_OF_MEMORY = 0x2359;
|
public static final int ERROR_JNI_OUT_OF_MEMORY = 0x2359; // JNI alloc memory failed
|
||||||
|
|
||||||
private static final HashSet<Integer> errorNumbers;
|
private static final HashSet<Integer> errorNumbers;
|
||||||
|
|
||||||
|
@ -45,6 +47,8 @@ public class TSDBErrorNumbers {
|
||||||
errorNumbers.add(ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE);
|
errorNumbers.add(ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE);
|
||||||
errorNumbers.add(ERROR_INVALID_FOR_EXECUTE_UPDATE);
|
errorNumbers.add(ERROR_INVALID_FOR_EXECUTE_UPDATE);
|
||||||
errorNumbers.add(ERROR_INVALID_FOR_EXECUTE);
|
errorNumbers.add(ERROR_INVALID_FOR_EXECUTE);
|
||||||
|
errorNumbers.add(ERROR_PARAMETER_INDEX_OUT_RANGE);
|
||||||
|
errorNumbers.add(ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||||
|
|
||||||
/*****************************************************/
|
/*****************************************************/
|
||||||
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
||||||
|
|
|
@ -102,7 +102,7 @@ public class TSDBJNIConnector {
|
||||||
|
|
||||||
this.taos = this.connectImp(host, port, dbName, user, password);
|
this.taos = this.connectImp(host, port, dbName, user, password);
|
||||||
if (this.taos == TSDBConstants.JNI_NULL_POINTER) {
|
if (this.taos == TSDBConstants.JNI_NULL_POINTER) {
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(this.getErrMsg(0L)), "", this.getErrCode(0l));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL);
|
||||||
}
|
}
|
||||||
// invoke connectImp only here
|
// invoke connectImp only here
|
||||||
taosInfo.conn_open_increment();
|
taosInfo.conn_open_increment();
|
||||||
|
@ -187,7 +187,6 @@ public class TSDBJNIConnector {
|
||||||
// public long getResultSet() {
|
// public long getResultSet() {
|
||||||
// return taosResultSetPointer;
|
// return taosResultSetPointer;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
private native long getResultSetImp(long connection, long pSql);
|
private native long getResultSetImp(long connection, long pSql);
|
||||||
|
|
||||||
public boolean isUpdateQuery(long pSql) {
|
public boolean isUpdateQuery(long pSql) {
|
||||||
|
@ -206,7 +205,7 @@ public class TSDBJNIConnector {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if (taosResultSetPointer != TSDBConstants.JNI_NULL_POINTER) {
|
// if (taosResultSetPointer != TSDBConstants.JNI_NULL_POINTER) {
|
||||||
res = this.freeResultSetImp(this.taos, pSql);
|
res = this.freeResultSetImp(this.taos, pSql);
|
||||||
// taosResultSetPointer = TSDBConstants.JNI_NULL_POINTER;
|
// taosResultSetPointer = TSDBConstants.JNI_NULL_POINTER;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -227,7 +226,6 @@ public class TSDBJNIConnector {
|
||||||
// }
|
// }
|
||||||
// return resCode;
|
// return resCode;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
private native int freeResultSetImp(long connection, long result);
|
private native int freeResultSetImp(long connection, long result);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -275,7 +273,7 @@ public class TSDBJNIConnector {
|
||||||
public void closeConnection() throws SQLException {
|
public void closeConnection() throws SQLException {
|
||||||
int code = this.closeConnectionImp(this.taos);
|
int code = this.closeConnectionImp(this.taos);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
throw new SQLException(TSDBConstants.FixErrMsg(code), "", this.getErrCode(0l));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL);
|
||||||
} else if (code == 0) {
|
} else if (code == 0) {
|
||||||
this.taos = TSDBConstants.JNI_NULL_POINTER;
|
this.taos = TSDBConstants.JNI_NULL_POINTER;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -32,7 +32,7 @@ import java.util.regex.Pattern;
|
||||||
public class TSDBPreparedStatement extends TSDBStatement implements PreparedStatement {
|
public class TSDBPreparedStatement extends TSDBStatement implements PreparedStatement {
|
||||||
protected String rawSql;
|
protected String rawSql;
|
||||||
protected String sql;
|
protected String sql;
|
||||||
protected ArrayList<Object> parameters = new ArrayList<Object>();
|
protected ArrayList<Object> parameters = new ArrayList<>();
|
||||||
|
|
||||||
//start with insert or import and is case-insensitive
|
//start with insert or import and is case-insensitive
|
||||||
private static Pattern savePattern = Pattern.compile("(?i)^\\s*(insert|import)");
|
private static Pattern savePattern = Pattern.compile("(?i)^\\s*(insert|import)");
|
||||||
|
@ -41,6 +41,7 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
private boolean isSaved;
|
private boolean isSaved;
|
||||||
|
|
||||||
private SavedPreparedStatement savedPreparedStatement;
|
private SavedPreparedStatement savedPreparedStatement;
|
||||||
|
private ParameterMetaData parameterMetaData;
|
||||||
|
|
||||||
TSDBPreparedStatement(TSDBConnection connection, TSDBJNIConnector connecter, String sql) {
|
TSDBPreparedStatement(TSDBConnection connection, TSDBJNIConnector connecter, String sql) {
|
||||||
super(connection, connecter);
|
super(connection, connecter);
|
||||||
|
@ -53,7 +54,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
|
|
||||||
this.isSaved = isSavedSql(this.rawSql);
|
this.isSaved = isSavedSql(this.rawSql);
|
||||||
if (this.isSaved) {
|
if (this.isSaved) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.savedPreparedStatement = new SavedPreparedStatement(this.rawSql, this);
|
this.savedPreparedStatement = new SavedPreparedStatement(this.rawSql, this);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
@ -90,10 +90,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
this.parameters = parameters;
|
this.parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRawSql() {
|
|
||||||
return rawSql;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some of the SQLs sent by other popular frameworks or tools like Spark, contains syntax that cannot be parsed by
|
* Some of the SQLs sent by other popular frameworks or tools like Spark, contains syntax that cannot be parsed by
|
||||||
* the TDengine client. Thus, some simple parsers/filters are intentionally added in this JDBC implementation in
|
* the TDengine client. Thus, some simple parsers/filters are intentionally added in this JDBC implementation in
|
||||||
|
@ -192,99 +188,191 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isSupportedSQLType(int sqlType) {
|
||||||
|
switch (sqlType) {
|
||||||
|
case Types.TIMESTAMP:
|
||||||
|
case Types.INTEGER:
|
||||||
|
case Types.BIGINT:
|
||||||
|
case Types.FLOAT:
|
||||||
|
case Types.DOUBLE:
|
||||||
|
case Types.SMALLINT:
|
||||||
|
case Types.TINYINT:
|
||||||
|
case Types.BOOLEAN:
|
||||||
|
case Types.BINARY:
|
||||||
|
case Types.NCHAR:
|
||||||
|
return true;
|
||||||
|
case Types.ARRAY:
|
||||||
|
case Types.BIT:
|
||||||
|
case Types.BLOB:
|
||||||
|
case Types.CHAR:
|
||||||
|
case Types.CLOB:
|
||||||
|
case Types.DATALINK:
|
||||||
|
case Types.DATE:
|
||||||
|
case Types.DECIMAL:
|
||||||
|
case Types.DISTINCT:
|
||||||
|
case Types.JAVA_OBJECT:
|
||||||
|
case Types.LONGNVARCHAR:
|
||||||
|
case Types.LONGVARBINARY:
|
||||||
|
case Types.LONGVARCHAR:
|
||||||
|
case Types.NCLOB:
|
||||||
|
case Types.NULL:
|
||||||
|
case Types.NUMERIC:
|
||||||
|
case Types.NVARCHAR:
|
||||||
|
case Types.OTHER:
|
||||||
|
case Types.REAL:
|
||||||
|
case Types.REF:
|
||||||
|
case Types.REF_CURSOR:
|
||||||
|
case Types.ROWID:
|
||||||
|
case Types.SQLXML:
|
||||||
|
case Types.STRUCT:
|
||||||
|
case Types.TIME:
|
||||||
|
case Types.TIME_WITH_TIMEZONE:
|
||||||
|
case Types.TIMESTAMP_WITH_TIMEZONE:
|
||||||
|
case Types.VARBINARY:
|
||||||
|
case Types.VARCHAR:
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNull(int parameterIndex, int sqlType) throws SQLException {
|
public void setNull(int parameterIndex, int sqlType) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
if (!isSupportedSQLType(sqlType) || parameterIndex < 0)
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
|
// if (parameterIndex >= parameters.size())
|
||||||
|
// throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_PARAMETER_INDEX_OUT_BOUNDARY);
|
||||||
|
|
||||||
setObject(parameterIndex, "NULL");
|
setObject(parameterIndex, "NULL");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBoolean(int parameterIndex, boolean x) throws SQLException {
|
public void setBoolean(int parameterIndex, boolean x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setByte(int parameterIndex, byte x) throws SQLException {
|
public void setByte(int parameterIndex, byte x) throws SQLException {
|
||||||
setObject(parameterIndex, x);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setShort(int parameterIndex, short x) throws SQLException {
|
public void setShort(int parameterIndex, short x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setInt(int parameterIndex, int x) throws SQLException {
|
public void setInt(int parameterIndex, int x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setLong(int parameterIndex, long x) throws SQLException {
|
public void setLong(int parameterIndex, long x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFloat(int parameterIndex, float x) throws SQLException {
|
public void setFloat(int parameterIndex, float x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDouble(int parameterIndex, double x) throws SQLException {
|
public void setDouble(int parameterIndex, double x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
|
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
|
||||||
setObject(parameterIndex, x);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setString(int parameterIndex, String x) throws SQLException {
|
public void setString(int parameterIndex, String x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBytes(int parameterIndex, byte[] x) throws SQLException {
|
public void setBytes(int parameterIndex, byte[] x) throws SQLException {
|
||||||
setObject(parameterIndex, x);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDate(int parameterIndex, Date x) throws SQLException {
|
public void setDate(int parameterIndex, Date x) throws SQLException {
|
||||||
setObject(parameterIndex, x);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTime(int parameterIndex, Time x) throws SQLException {
|
public void setTime(int parameterIndex, Time x) throws SQLException {
|
||||||
setObject(parameterIndex, x);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException {
|
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
setObject(parameterIndex, x);
|
setObject(parameterIndex, x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearParameters() throws SQLException {
|
public void clearParameters() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
parameters.clear();
|
parameters.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {
|
public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -311,9 +399,8 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
if (isSaved) {
|
if (isSaved) {
|
||||||
this.savedPreparedStatement.addBatch();
|
this.savedPreparedStatement.addBatch();
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (this.batchedArgs == null) {
|
if (this.batchedArgs == null) {
|
||||||
batchedArgs = new ArrayList<String>();
|
batchedArgs = new ArrayList<>();
|
||||||
}
|
}
|
||||||
super.addBatch(getNativeSql());
|
super.addBatch(getNativeSql());
|
||||||
}
|
}
|
||||||
|
@ -321,156 +408,226 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException {
|
public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRef(int parameterIndex, Ref x) throws SQLException {
|
public void setRef(int parameterIndex, Ref x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlob(int parameterIndex, Blob x) throws SQLException {
|
public void setBlob(int parameterIndex, Blob x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setClob(int parameterIndex, Clob x) throws SQLException {
|
public void setClob(int parameterIndex, Clob x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setArray(int parameterIndex, Array x) throws SQLException {
|
public void setArray(int parameterIndex, Array x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultSetMetaData getMetaData() throws SQLException {
|
public ResultSetMetaData getMetaData() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
// return this.getResultSet().getMetaData();
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException {
|
public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException {
|
public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException {
|
public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
// TODO:
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException {
|
public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setURL(int parameterIndex, URL x) throws SQLException {
|
public void setURL(int parameterIndex, URL x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ParameterMetaData getParameterMetaData() throws SQLException {
|
public ParameterMetaData getParameterMetaData() throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
//TODO: parameterMetaData not supported
|
||||||
|
// return null;
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRowId(int parameterIndex, RowId x) throws SQLException {
|
public void setRowId(int parameterIndex, RowId x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNString(int parameterIndex, String value) throws SQLException {
|
public void setNString(int parameterIndex, String value) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException {
|
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNClob(int parameterIndex, NClob value) throws SQLException {
|
public void setNClob(int parameterIndex, NClob value) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setClob(int parameterIndex, Reader reader, long length) throws SQLException {
|
public void setClob(int parameterIndex, Reader reader, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException {
|
public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException {
|
public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
|
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException {
|
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
//TODO:
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException {
|
public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException {
|
public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException {
|
public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException {
|
public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException {
|
public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException {
|
public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
|
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setClob(int parameterIndex, Reader reader) throws SQLException {
|
public void setClob(int parameterIndex, Reader reader) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException {
|
public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setNClob(int parameterIndex, Reader reader) throws SQLException {
|
public void setNClob(int parameterIndex, Reader reader) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,17 +14,13 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.Connection;
|
||||||
import java.util.ArrayList;
|
import java.sql.ResultSet;
|
||||||
import java.util.List;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
public class TSDBStatement extends AbstractStatement {
|
public class TSDBStatement extends AbstractStatement {
|
||||||
|
|
||||||
private TSDBJNIConnector connector;
|
private TSDBJNIConnector connector;
|
||||||
/**
|
|
||||||
* To store batched commands
|
|
||||||
*/
|
|
||||||
protected List<String> batchedArgs;
|
|
||||||
/**
|
/**
|
||||||
* Status of current statement
|
* Status of current statement
|
||||||
*/
|
*/
|
||||||
|
@ -119,41 +115,6 @@ public class TSDBStatement extends AbstractStatement {
|
||||||
return this.affectedRows;
|
return this.affectedRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBatch(String sql) throws SQLException {
|
|
||||||
if (isClosed())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
|
||||||
|
|
||||||
if (batchedArgs == null) {
|
|
||||||
batchedArgs = new ArrayList<>();
|
|
||||||
}
|
|
||||||
batchedArgs.add(sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clearBatch() throws SQLException {
|
|
||||||
if (isClosed())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
|
||||||
if (batchedArgs != null)
|
|
||||||
batchedArgs.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] executeBatch() throws SQLException {
|
|
||||||
if (isClosed())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
|
||||||
if (batchedArgs == null || batchedArgs.isEmpty())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_BATCH_IS_EMPTY);
|
|
||||||
|
|
||||||
int[] res = new int[batchedArgs.size()];
|
|
||||||
for (int i = 0; i < batchedArgs.size(); i++) {
|
|
||||||
boolean isSelect = execute(batchedArgs.get(i));
|
|
||||||
if (isSelect) {
|
|
||||||
res[i] = SUCCESS_NO_INFO;
|
|
||||||
} else {
|
|
||||||
res[i] = getUpdateCount();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Connection getConnection() throws SQLException {
|
public Connection getConnection() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
|
@ -26,7 +26,8 @@ public class RestfulConnection extends AbstractConnection {
|
||||||
@Override
|
@Override
|
||||||
public Statement createStatement() throws SQLException {
|
public Statement createStatement() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);;
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||||
|
;
|
||||||
|
|
||||||
return new RestfulStatement(this, database);
|
return new RestfulStatement(this, database);
|
||||||
}
|
}
|
||||||
|
@ -34,9 +35,8 @@ public class RestfulConnection extends AbstractConnection {
|
||||||
@Override
|
@Override
|
||||||
public PreparedStatement prepareStatement(String sql) throws SQLException {
|
public PreparedStatement prepareStatement(String sql) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);;
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||||
//TODO: prepareStatement
|
return new RestfulPreparedStatement(this, database, sql);
|
||||||
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -55,7 +55,8 @@ public class RestfulConnection extends AbstractConnection {
|
||||||
@Override
|
@Override
|
||||||
public DatabaseMetaData getMetaData() throws SQLException {
|
public DatabaseMetaData getMetaData() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);;
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_CONNECTION_CLOSED);
|
||||||
|
;
|
||||||
|
|
||||||
return this.metadata;
|
return this.metadata;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,10 @@ import com.alibaba.fastjson.JSONObject;
|
||||||
import com.taosdata.jdbc.AbstractDriver;
|
import com.taosdata.jdbc.AbstractDriver;
|
||||||
import com.taosdata.jdbc.TSDBConstants;
|
import com.taosdata.jdbc.TSDBConstants;
|
||||||
import com.taosdata.jdbc.TSDBDriver;
|
import com.taosdata.jdbc.TSDBDriver;
|
||||||
import com.taosdata.jdbc.rs.util.HttpClientPoolUtil;
|
import com.taosdata.jdbc.utils.HttpClientPoolUtil;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
@ -41,6 +43,15 @@ public class RestfulDriver extends AbstractDriver {
|
||||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/"
|
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/"
|
||||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_USER) + "/"
|
+ props.getProperty(TSDBDriver.PROPERTY_KEY_USER) + "/"
|
||||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PASSWORD) + "";
|
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PASSWORD) + "";
|
||||||
|
try {
|
||||||
|
String user = URLEncoder.encode(props.getProperty(TSDBDriver.PROPERTY_KEY_USER), "UTF-8");
|
||||||
|
String password = URLEncoder.encode(props.getProperty(TSDBDriver.PROPERTY_KEY_PASSWORD), "UTF-8");
|
||||||
|
loginUrl = "http://" + props.getProperty(TSDBDriver.PROPERTY_KEY_HOST) + ":"
|
||||||
|
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/" + user + "/" + password + "";
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
String result = HttpClientPoolUtil.execute(loginUrl);
|
String result = HttpClientPoolUtil.execute(loginUrl);
|
||||||
JSONObject jsonResult = JSON.parseObject(result);
|
JSONObject jsonResult = JSON.parseObject(result);
|
||||||
String status = jsonResult.getString("status");
|
String status = jsonResult.getString("status");
|
||||||
|
|
|
@ -0,0 +1,465 @@
|
||||||
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
|
import com.taosdata.jdbc.TSDBError;
|
||||||
|
import com.taosdata.jdbc.TSDBErrorNumbers;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.Calendar;
|
||||||
|
|
||||||
|
public class RestfulPreparedStatement extends RestfulStatement implements PreparedStatement {
|
||||||
|
|
||||||
|
private ParameterMetaData parameterMetaData;
|
||||||
|
private final String rawSql;
|
||||||
|
private Object[] parameters;
|
||||||
|
private boolean isPrepared;
|
||||||
|
|
||||||
|
public RestfulPreparedStatement(RestfulConnection conn, String database, String sql) {
|
||||||
|
super(conn, database);
|
||||||
|
this.rawSql = sql;
|
||||||
|
if (sql.contains("?")) {
|
||||||
|
int parameterCnt = 0;
|
||||||
|
for (int i = 0; i < sql.length(); i++) {
|
||||||
|
if ('?' == sql.charAt(i)) {
|
||||||
|
parameterCnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parameters = new Object[parameterCnt];
|
||||||
|
this.isPrepared = true;
|
||||||
|
}
|
||||||
|
//TODO: build parameterMetaData
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResultSet executeQuery() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
if (!isPrepared)
|
||||||
|
return executeQuery(this.rawSql);
|
||||||
|
|
||||||
|
final String sql = getNativeSql(this.rawSql);
|
||||||
|
return executeQuery(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int executeUpdate() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
if (!isPrepared)
|
||||||
|
return executeUpdate(this.rawSql);
|
||||||
|
|
||||||
|
final String sql = getNativeSql(this.rawSql);
|
||||||
|
return executeUpdate(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getNativeSql(String rawSql) throws SQLException {
|
||||||
|
String sql = rawSql;
|
||||||
|
for (int i = 0; i < parameters.length; ++i) {
|
||||||
|
Object para = parameters[i];
|
||||||
|
if (para != null) {
|
||||||
|
String paraStr = para.toString();
|
||||||
|
if (para instanceof Timestamp || para instanceof String) {
|
||||||
|
paraStr = "'" + paraStr + "'";
|
||||||
|
}
|
||||||
|
sql = sql.replaceFirst("[?]", paraStr);
|
||||||
|
} else {
|
||||||
|
sql = sql.replaceFirst("[?]", "NULL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clearParameters();
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNull(int parameterIndex, int sqlType) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
setObject(parameterIndex, "NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBoolean(int parameterIndex, boolean x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setByte(int parameterIndex, byte x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setShort(int parameterIndex, short x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setInt(int parameterIndex, int x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLong(int parameterIndex, long x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFloat(int parameterIndex, float x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDouble(int parameterIndex, double x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setString(int parameterIndex, String x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBytes(int parameterIndex, byte[] x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDate(int parameterIndex, Date x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTime(int parameterIndex, Time x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
setObject(parameterIndex, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearParameters() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
this.parameters = new Object[parameters.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setObject(int parameterIndex, Object x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
if (parameterIndex < 1 && parameterIndex >= parameters.length)
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_PARAMETER_INDEX_OUT_RANGE);
|
||||||
|
|
||||||
|
parameters[parameterIndex - 1] = x;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean execute() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
if (!isPrepared)
|
||||||
|
return execute(this.rawSql);
|
||||||
|
final String sql = getNativeSql(rawSql);
|
||||||
|
return execute(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addBatch() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
|
||||||
|
final String sql = getNativeSql(this.rawSql);
|
||||||
|
addBatch(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRef(int parameterIndex, Ref x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBlob(int parameterIndex, Blob x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClob(int parameterIndex, Clob x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setArray(int parameterIndex, Array x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResultSetMetaData getMetaData() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setURL(int parameterIndex, URL x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ParameterMetaData getParameterMetaData() throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
// throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
|
||||||
|
return this.parameterMetaData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRowId(int parameterIndex, RowId x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNString(int parameterIndex, String value) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNClob(int parameterIndex, NClob value) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClob(int parameterIndex, Reader reader, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setClob(int parameterIndex, Reader reader) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNClob(int parameterIndex, Reader reader) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
|
}
|
||||||
|
}
|
|
@ -106,7 +106,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean next() throws SQLException {
|
public boolean next() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
pos++;
|
pos++;
|
||||||
if (pos <= resultSet.size() - 1) {
|
if (pos <= resultSet.size() - 1) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -124,14 +124,14 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean wasNull() throws SQLException {
|
public boolean wasNull() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
return resultSet.isEmpty();
|
return resultSet.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getString(int columnIndex) throws SQLException {
|
public String getString(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
if (columnIndex > resultSet.get(pos).size()) {
|
if (columnIndex > resultSet.get(pos).size()) {
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg("Column Index out of range, " + columnIndex + " > " + resultSet.get(pos).size()));
|
throw new SQLException(TSDBConstants.WrapErrMsg("Column Index out of range, " + columnIndex + " > " + resultSet.get(pos).size()));
|
||||||
|
@ -144,7 +144,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean getBoolean(int columnIndex) throws SQLException {
|
public boolean getBoolean(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
int result = getInt(columnIndex);
|
int result = getInt(columnIndex);
|
||||||
|
@ -154,7 +154,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public short getShort(int columnIndex) throws SQLException {
|
public short getShort(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
return Short.parseShort(resultSet.get(pos).get(columnIndex).toString());
|
return Short.parseShort(resultSet.get(pos).get(columnIndex).toString());
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public int getInt(int columnIndex) throws SQLException {
|
public int getInt(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
return Integer.parseInt(resultSet.get(pos).get(columnIndex).toString());
|
return Integer.parseInt(resultSet.get(pos).get(columnIndex).toString());
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public long getLong(int columnIndex) throws SQLException {
|
public long getLong(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
return Long.parseLong(resultSet.get(pos).get(columnIndex).toString());
|
return Long.parseLong(resultSet.get(pos).get(columnIndex).toString());
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public float getFloat(int columnIndex) throws SQLException {
|
public float getFloat(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
return Float.parseFloat(resultSet.get(pos).get(columnIndex).toString());
|
return Float.parseFloat(resultSet.get(pos).get(columnIndex).toString());
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public double getDouble(int columnIndex) throws SQLException {
|
public double getDouble(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
return Double.parseDouble(resultSet.get(pos).get(columnIndex).toString());
|
return Double.parseDouble(resultSet.get(pos).get(columnIndex).toString());
|
||||||
|
@ -208,7 +208,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public Timestamp getTimestamp(int columnIndex) throws SQLException {
|
public Timestamp getTimestamp(int columnIndex) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
columnIndex = getTrueColumnIndex(columnIndex);
|
columnIndex = getTrueColumnIndex(columnIndex);
|
||||||
String strDate = resultSet.get(pos).get(columnIndex).toString();
|
String strDate = resultSet.get(pos).get(columnIndex).toString();
|
||||||
|
@ -220,7 +220,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public ResultSetMetaData getMetaData() throws SQLException {
|
public ResultSetMetaData getMetaData() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
return this.metaData;
|
return this.metaData;
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public int findColumn(String columnLabel) throws SQLException {
|
public int findColumn(String columnLabel) throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
int columnIndex = columnNames.indexOf(columnLabel);
|
int columnIndex = columnNames.indexOf(columnLabel);
|
||||||
if (columnIndex == -1)
|
if (columnIndex == -1)
|
||||||
|
@ -244,14 +244,14 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean isBeforeFirst() throws SQLException {
|
public boolean isBeforeFirst() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
return this.pos == -1 && this.resultSet.size() != 0;
|
return this.pos == -1 && this.resultSet.size() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAfterLast() throws SQLException {
|
public boolean isAfterLast() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
return this.pos >= resultSet.size() && this.resultSet.size() != 0;
|
return this.pos >= resultSet.size() && this.resultSet.size() != 0;
|
||||||
}
|
}
|
||||||
|
@ -259,14 +259,14 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean isFirst() throws SQLException {
|
public boolean isFirst() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
return this.pos == 0;
|
return this.pos == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLast() throws SQLException {
|
public boolean isLast() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
if (this.resultSet.size() == 0)
|
if (this.resultSet.size() == 0)
|
||||||
return false;
|
return false;
|
||||||
return this.pos == (this.resultSet.size() - 1);
|
return this.pos == (this.resultSet.size() - 1);
|
||||||
|
@ -275,7 +275,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public void beforeFirst() throws SQLException {
|
public void beforeFirst() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (this.resultSet.size() > 0) {
|
if (this.resultSet.size() > 0) {
|
||||||
|
@ -287,7 +287,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public void afterLast() throws SQLException {
|
public void afterLast() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (this.resultSet.size() > 0) {
|
if (this.resultSet.size() > 0) {
|
||||||
this.pos = this.resultSet.size();
|
this.pos = this.resultSet.size();
|
||||||
|
@ -298,7 +298,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean first() throws SQLException {
|
public boolean first() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
if (this.resultSet.size() == 0)
|
if (this.resultSet.size() == 0)
|
||||||
return false;
|
return false;
|
||||||
|
@ -312,7 +312,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public boolean last() throws SQLException {
|
public boolean last() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
if (this.resultSet.size() == 0)
|
if (this.resultSet.size() == 0)
|
||||||
return false;
|
return false;
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
@ -324,7 +324,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public int getRow() throws SQLException {
|
public int getRow() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
int row;
|
int row;
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (this.pos < 0 || this.pos >= this.resultSet.size())
|
if (this.pos < 0 || this.pos >= this.resultSet.size())
|
||||||
|
@ -396,7 +396,7 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
@Override
|
@Override
|
||||||
public Statement getStatement() throws SQLException {
|
public Statement getStatement() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_RESULTSET_CLOSED);
|
||||||
|
|
||||||
return this.statement;
|
return this.statement;
|
||||||
}
|
}
|
||||||
|
@ -407,5 +407,4 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package com.taosdata.jdbc.rs;
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.taosdata.jdbc.AbstractStatement;
|
import com.taosdata.jdbc.AbstractStatement;
|
||||||
import com.taosdata.jdbc.TSDBConstants;
|
import com.taosdata.jdbc.TSDBConstants;
|
||||||
import com.taosdata.jdbc.TSDBError;
|
import com.taosdata.jdbc.TSDBError;
|
||||||
import com.taosdata.jdbc.TSDBErrorNumbers;
|
import com.taosdata.jdbc.TSDBErrorNumbers;
|
||||||
import com.taosdata.jdbc.rs.util.HttpClientPoolUtil;
|
import com.taosdata.jdbc.utils.HttpClientPoolUtil;
|
||||||
import com.taosdata.jdbc.utils.SqlSyntaxValidator;
|
import com.taosdata.jdbc.utils.SqlSyntaxValidator;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
|
@ -29,7 +30,7 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
this.database = database;
|
this.database = database;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String[] parseTableIdentifier(String sql) {
|
protected String[] parseTableIdentifier(String sql) {
|
||||||
sql = sql.trim().toLowerCase();
|
sql = sql.trim().toLowerCase();
|
||||||
String[] ret = null;
|
String[] ret = null;
|
||||||
if (sql.contains("where"))
|
if (sql.contains("where"))
|
||||||
|
@ -74,8 +75,8 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
return executeOneQuery(url, sql);
|
return executeOneQuery(url, sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.database == null || this.database.isEmpty())
|
// if (this.database == null || this.database.isEmpty())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE);
|
// throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE);
|
||||||
HttpClientPoolUtil.execute(url, "use " + this.database);
|
HttpClientPoolUtil.execute(url, "use " + this.database);
|
||||||
return executeOneQuery(url, sql);
|
return executeOneQuery(url, sql);
|
||||||
}
|
}
|
||||||
|
@ -92,8 +93,8 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
return executeOneUpdate(url, sql);
|
return executeOneUpdate(url, sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.database == null || this.database.isEmpty())
|
// if (this.database == null || this.database.isEmpty())
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE);
|
// throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_DATABASE_NOT_SPECIFIED_OR_AVAILABLE);
|
||||||
|
|
||||||
HttpClientPoolUtil.execute(url, "use " + this.database);
|
HttpClientPoolUtil.execute(url, "use " + this.database);
|
||||||
return executeOneUpdate(url, sql);
|
return executeOneUpdate(url, sql);
|
||||||
|
@ -115,24 +116,28 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE, "not a valid sql for execute: " + sql);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_FOR_EXECUTE, "not a valid sql for execute: " + sql);
|
||||||
|
|
||||||
//如果执行了use操作应该将当前Statement的catalog设置为新的database
|
//如果执行了use操作应该将当前Statement的catalog设置为新的database
|
||||||
|
boolean result = true;
|
||||||
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||||
if (SqlSyntaxValidator.isUseSql(sql)) {
|
if (SqlSyntaxValidator.isUseSql(sql)) {
|
||||||
HttpClientPoolUtil.execute(url, sql);
|
HttpClientPoolUtil.execute(url, sql);
|
||||||
this.database = sql.trim().replace("use", "").trim();
|
this.database = sql.trim().replace("use", "").trim();
|
||||||
this.conn.setCatalog(this.database);
|
this.conn.setCatalog(this.database);
|
||||||
|
result = false;
|
||||||
} else if (SqlSyntaxValidator.isDatabaseUnspecifiedQuery(sql)) {
|
} else if (SqlSyntaxValidator.isDatabaseUnspecifiedQuery(sql)) {
|
||||||
executeOneQuery(url, sql);
|
executeOneQuery(url, sql);
|
||||||
} else if (SqlSyntaxValidator.isDatabaseUnspecifiedUpdate(sql)) {
|
} else if (SqlSyntaxValidator.isDatabaseUnspecifiedUpdate(sql)) {
|
||||||
executeOneUpdate(url, sql);
|
executeOneUpdate(url, sql);
|
||||||
|
result = false;
|
||||||
} else {
|
} else {
|
||||||
if (SqlSyntaxValidator.isValidForExecuteQuery(sql)) {
|
if (SqlSyntaxValidator.isValidForExecuteQuery(sql)) {
|
||||||
executeQuery(sql);
|
executeQuery(sql);
|
||||||
} else {
|
} else {
|
||||||
executeUpdate(sql);
|
executeUpdate(sql);
|
||||||
|
result = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultSet executeOneQuery(String url, String sql) throws SQLException {
|
private ResultSet executeOneQuery(String url, String sql) throws SQLException {
|
||||||
|
@ -176,10 +181,23 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonObject.getString("desc") + "\n" + "error code: " + jsonObject.getString("code")));
|
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonObject.getString("desc") + "\n" + "error code: " + jsonObject.getString("code")));
|
||||||
}
|
}
|
||||||
this.resultSet = null;
|
this.resultSet = null;
|
||||||
this.affectedRows = Integer.parseInt(jsonObject.getString("rows"));
|
this.affectedRows = checkJsonResultSet(jsonObject);
|
||||||
return this.affectedRows;
|
return this.affectedRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int checkJsonResultSet(JSONObject jsonObject) {
|
||||||
|
// create ... SQLs should return 0 , and Restful result is this:
|
||||||
|
// {"status": "succ", "head": ["affected_rows"], "data": [[0]], "rows": 1}
|
||||||
|
JSONArray head = jsonObject.getJSONArray("head");
|
||||||
|
JSONArray data = jsonObject.getJSONArray("data");
|
||||||
|
int rows = Integer.parseInt(jsonObject.getString("rows"));
|
||||||
|
if (head.size() == 1 && "affected_rows".equals(head.getString(0))
|
||||||
|
&& data.size() == 1 && data.getJSONArray(0).getInteger(0) == 0 && rows == 1) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultSet getResultSet() throws SQLException {
|
public ResultSet getResultSet() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
|
@ -195,24 +213,6 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
return this.affectedRows;
|
return this.affectedRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addBatch(String sql) throws SQLException {
|
|
||||||
if (isClosed())
|
|
||||||
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
|
||||||
//TODO:
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clearBatch() throws SQLException {
|
|
||||||
//TODO:
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int[] executeBatch() throws SQLException {
|
|
||||||
//TODO:
|
|
||||||
return new int[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Connection getConnection() throws SQLException {
|
public Connection getConnection() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package com.taosdata.jdbc.rs.util;
|
package com.taosdata.jdbc.utils;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.http.HeaderElement;
|
import org.apache.http.HeaderElement;
|
||||||
import org.apache.http.HeaderElementIterator;
|
import org.apache.http.HeaderElementIterator;
|
||||||
import org.apache.http.HttpEntity;
|
import org.apache.http.HttpEntity;
|
||||||
|
@ -39,7 +38,7 @@ public class HttpClientPoolUtil {
|
||||||
/**
|
/**
|
||||||
* 初始化连接池
|
* 初始化连接池
|
||||||
*/
|
*/
|
||||||
public static synchronized void initPools() {
|
private static synchronized void initPools() {
|
||||||
if (httpClient == null) {
|
if (httpClient == null) {
|
||||||
cm = new PoolingHttpClientConnectionManager();
|
cm = new PoolingHttpClientConnectionManager();
|
||||||
cm.setDefaultMaxPerRoute(count);
|
cm.setDefaultMaxPerRoute(count);
|
||||||
|
@ -51,7 +50,7 @@ public class HttpClientPoolUtil {
|
||||||
/**
|
/**
|
||||||
* Http connection keepAlive 设置
|
* Http connection keepAlive 设置
|
||||||
*/
|
*/
|
||||||
public static ConnectionKeepAliveStrategy defaultStrategy = (response, context) -> {
|
private static ConnectionKeepAliveStrategy defaultStrategy = (response, context) -> {
|
||||||
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
|
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));
|
||||||
int keepTime = Http_Default_Keep_Time * 1000;
|
int keepTime = Http_Default_Keep_Time * 1000;
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
|
@ -69,14 +68,6 @@ public class HttpClientPoolUtil {
|
||||||
return keepTime;
|
return keepTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
public static CloseableHttpClient getHttpClient() {
|
|
||||||
return httpClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PoolingHttpClientConnectionManager getHttpConnectionManager() {
|
|
||||||
return cm;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行http post请求
|
* 执行http post请求
|
||||||
* 默认采用Content-Type:application/json,Accept:application/json
|
* 默认采用Content-Type:application/json,Accept:application/json
|
||||||
|
@ -95,8 +86,10 @@ public class HttpClientPoolUtil {
|
||||||
initPools();
|
initPools();
|
||||||
}
|
}
|
||||||
method = (HttpEntityEnclosingRequestBase) getRequest(uri, HttpPost.METHOD_NAME, DEFAULT_CONTENT_TYPE, 0);
|
method = (HttpEntityEnclosingRequestBase) getRequest(uri, HttpPost.METHOD_NAME, DEFAULT_CONTENT_TYPE, 0);
|
||||||
method.setHeader("Authorization", "Taosd " + token);
|
|
||||||
method.setHeader("Content-Type", "text/plain");
|
method.setHeader("Content-Type", "text/plain");
|
||||||
|
method.setHeader("Connection", "keep-alive");
|
||||||
|
method.setHeader("Authorization", "Taosd " + token);
|
||||||
|
|
||||||
method.setEntity(new StringEntity(data, Charset.forName("UTF-8")));
|
method.setEntity(new StringEntity(data, Charset.forName("UTF-8")));
|
||||||
HttpContext context = HttpClientContext.create();
|
HttpContext context = HttpClientContext.create();
|
||||||
CloseableHttpResponse httpResponse = httpClient.execute(method, context);
|
CloseableHttpResponse httpResponse = httpClient.execute(method, context);
|
||||||
|
@ -131,7 +124,7 @@ public class HttpClientPoolUtil {
|
||||||
* @return HttpRequestBase 返回类型
|
* @return HttpRequestBase 返回类型
|
||||||
* @author lisc
|
* @author lisc
|
||||||
*/
|
*/
|
||||||
public static HttpRequestBase getRequest(String uri, String methodName, String contentType, int timeout) {
|
private static HttpRequestBase getRequest(String uri, String methodName, String contentType, int timeout) {
|
||||||
if (httpClient == null) {
|
if (httpClient == null) {
|
||||||
initPools();
|
initPools();
|
||||||
}
|
}
|
||||||
|
@ -152,7 +145,7 @@ public class HttpClientPoolUtil {
|
||||||
method = new HttpPost(uri);
|
method = new HttpPost(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StringUtils.isBlank(contentType)) {
|
if (contentType == null || contentType.isEmpty() || contentType.replaceAll("\\s", "").isEmpty()) {
|
||||||
contentType = DEFAULT_CONTENT_TYPE;
|
contentType = DEFAULT_CONTENT_TYPE;
|
||||||
}
|
}
|
||||||
method.addHeader("Content-Type", contentType);
|
method.addHeader("Content-Type", contentType);
|
|
@ -1,184 +0,0 @@
|
||||||
package com.taosdata.jdbc;
|
|
||||||
|
|
||||||
import org.junit.*;
|
|
||||||
import org.junit.runners.MethodSorters;
|
|
||||||
|
|
||||||
import java.sql.*;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)
|
|
||||||
public class PreparedStatementTest {
|
|
||||||
static Connection connection;
|
|
||||||
static TSDBPreparedStatement statement;
|
|
||||||
static String dbName = "test";
|
|
||||||
static String tName = "t0";
|
|
||||||
static String host = "localhost";
|
|
||||||
|
|
||||||
@BeforeClass
|
|
||||||
public static void createConnection() throws SQLException {
|
|
||||||
try {
|
|
||||||
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Properties properties = new Properties();
|
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
|
||||||
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
|
||||||
connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/", properties);
|
|
||||||
String sql = "drop database if exists " + dbName;
|
|
||||||
statement = (TSDBPreparedStatement) connection.prepareStatement(sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void case001_createTableAndQuery() throws SQLException {
|
|
||||||
long ts = System.currentTimeMillis();
|
|
||||||
|
|
||||||
statement.executeUpdate("create database if not exists " + dbName);
|
|
||||||
statement.executeUpdate("create table if not exists " + dbName + "." + tName + "(ts timestamp, k1 int)");
|
|
||||||
statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", 1)");
|
|
||||||
|
|
||||||
PreparedStatement selectStatement = connection.prepareStatement("select * from " + dbName + "." + tName);
|
|
||||||
ResultSet resultSet = selectStatement.executeQuery();
|
|
||||||
assertTrue(null != resultSet);
|
|
||||||
|
|
||||||
boolean isClosed = statement.isClosed();
|
|
||||||
assertEquals(false, isClosed);
|
|
||||||
selectStatement.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void case002_testPreparedStatement() throws SQLException {
|
|
||||||
long ts = System.currentTimeMillis() + 20000;
|
|
||||||
|
|
||||||
PreparedStatement saveStatement = connection.prepareStatement("insert into " + dbName + "." + tName + " values (" + ts + ", 1)");
|
|
||||||
int affectedRows = saveStatement.executeUpdate();
|
|
||||||
assertTrue(1 == affectedRows);
|
|
||||||
saveStatement.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void case003_testSavedPreparedStatement() throws SQLException {
|
|
||||||
long ts = System.currentTimeMillis();
|
|
||||||
TSDBPreparedStatement saveStatement = (TSDBPreparedStatement) connection.prepareStatement("insert into " + dbName + "." + tName + " values (?, ?)");
|
|
||||||
saveStatement.setObject(1, ts + 10000);
|
|
||||||
saveStatement.setObject(2, 3);
|
|
||||||
int rows = saveStatement.executeUpdate();
|
|
||||||
assertEquals(1, rows);
|
|
||||||
saveStatement.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void case004_testUnsupport() throws SQLException {
|
|
||||||
|
|
||||||
Assert.assertNotNull(statement.unwrap(TSDBPreparedStatement.class));
|
|
||||||
Assert.assertTrue(statement.isWrapperFor(TSDBPreparedStatement.class));
|
|
||||||
|
|
||||||
try {
|
|
||||||
statement.getMaxFieldSize();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.setMaxFieldSize(0);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.setEscapeProcessing(true);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.cancel();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getWarnings();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.clearWarnings();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.setCursorName(null);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getMoreResults();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.setFetchDirection(0);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getFetchDirection();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getResultSetConcurrency();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getResultSetType();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getConnection();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getMoreResults();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getGeneratedKeys();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.executeUpdate(null, 0);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.executeUpdate(null, new int[]{0});
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.executeUpdate(null, new String[]{"str1", "str2"});
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.getResultSetHoldability();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.setPoolable(true);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.isPoolable();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.closeOnCompletion();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
statement.isCloseOnCompletion();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@AfterClass
|
|
||||||
public static void close() throws Exception {
|
|
||||||
statement.executeUpdate("drop database " + dbName);
|
|
||||||
statement.close();
|
|
||||||
connection.close();
|
|
||||||
Thread.sleep(10);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,173 +1,228 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.*;
|
||||||
import java.sql.DriverManager;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
public class TSDBPreparedStatementTest {
|
public class TSDBPreparedStatementTest {
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
private static Connection conn;
|
private static Connection conn;
|
||||||
|
private static final String sql_insert = "insert into t1 values(?, ?)";
|
||||||
|
private static PreparedStatement pstmt_insert;
|
||||||
|
private static final String sql_select = "select * from t1 where ts > ? and ts <= ? and temperature >= ?";
|
||||||
|
private static PreparedStatement pstmt_select;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void executeQuery() {
|
public void executeQuery() throws SQLException {
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
long start = end - 1000 * 60 * 60;
|
||||||
|
pstmt_select.setTimestamp(1, new Timestamp(start));
|
||||||
|
pstmt_select.setTimestamp(2, new Timestamp(end));
|
||||||
|
pstmt_select.setFloat(3, 0);
|
||||||
|
|
||||||
|
ResultSet rs = pstmt_select.executeQuery();
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
|
while (rs.next()) {
|
||||||
|
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||||
|
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void executeUpdate() {
|
public void executeUpdate() throws SQLException {
|
||||||
|
pstmt_insert.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
|
||||||
|
pstmt_insert.setFloat(2, 3.14f);
|
||||||
|
int result = pstmt_insert.executeUpdate();
|
||||||
|
Assert.assertEquals(1, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setNull() {
|
public void setNull() throws SQLException {
|
||||||
|
pstmt_insert.setNull(2, Types.FLOAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setBoolean() {
|
public void setBoolean() throws SQLException {
|
||||||
|
pstmt_insert.setBoolean(2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setByte() {
|
public void setByte() throws SQLException {
|
||||||
|
pstmt_insert.setByte(1, (byte) 0x001);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setShort() {
|
public void setShort() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setInt() {
|
public void setInt() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setLong() {
|
public void setLong() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setFloat() {
|
public void setFloat() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setDouble() {
|
public void setDouble() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setBigDecimal() {
|
public void setBigDecimal() throws SQLException {
|
||||||
|
pstmt_insert.setBigDecimal(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setString() {
|
public void setString() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setBytes() {
|
public void setBytes() throws SQLException {
|
||||||
|
pstmt_insert.setBytes(1, new byte[]{});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setDate() {
|
public void setDate() throws SQLException {
|
||||||
|
pstmt_insert.setDate(1, new Date(System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setTime() {
|
public void setTime() throws SQLException {
|
||||||
|
pstmt_insert.setTime(1, new Time(System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setTimestamp() {
|
public void setTimestamp() {
|
||||||
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setAsciiStream() {
|
public void setAsciiStream() throws SQLException {
|
||||||
|
pstmt_insert.setAsciiStream(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setUnicodeStream() {
|
public void setBinaryStream() throws SQLException {
|
||||||
}
|
pstmt_insert.setBinaryStream(1, null);
|
||||||
|
|
||||||
@Test
|
|
||||||
public void setBinaryStream() {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void clearParameters() {
|
public void clearParameters() {
|
||||||
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setObject() {
|
public void setObject() throws SQLException {
|
||||||
|
pstmt_insert.setObject(1, System.currentTimeMillis());
|
||||||
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void execute() {
|
public void execute() {
|
||||||
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void addBatch() {
|
public void addBatch() {
|
||||||
|
//TODO:
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setCharacterStream() {
|
public void setCharacterStream() throws SQLException {
|
||||||
|
pstmt_insert.setCharacterStream(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setRef() {
|
public void setRef() throws SQLException {
|
||||||
|
pstmt_insert.setRef(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setBlob() {
|
public void setBlob() throws SQLException {
|
||||||
|
pstmt_insert.setBlob(1, (Blob) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setClob() {
|
public void setClob() throws SQLException {
|
||||||
|
pstmt_insert.setClob(1, (Clob) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setArray() {
|
public void setArray() throws SQLException {
|
||||||
|
pstmt_insert.setArray(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void getMetaData() {
|
public void getMetaData() throws SQLException {
|
||||||
|
pstmt_insert.getMetaData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setURL() {
|
public void setURL() throws SQLException {
|
||||||
|
pstmt_insert.setURL(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void getParameterMetaData() {
|
public void getParameterMetaData() throws SQLException {
|
||||||
|
ParameterMetaData parameterMetaData = pstmt_insert.getParameterMetaData();
|
||||||
|
// Assert.assertNotNull(parameterMetaData);
|
||||||
|
//TODO:
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setRowId() {
|
public void setRowId() throws SQLException {
|
||||||
|
pstmt_insert.setRowId(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setNString() {
|
public void setNString() throws SQLException {
|
||||||
|
pstmt_insert.setNString(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setNCharacterStream() {
|
public void setNCharacterStream() throws SQLException {
|
||||||
|
pstmt_insert.setNCharacterStream(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setNClob() {
|
public void setNClob() throws SQLException {
|
||||||
|
pstmt_insert.setNClob(1, (NClob) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
public void setSQLXML() {
|
public void setSQLXML() throws SQLException {
|
||||||
|
pstmt_insert.setSQLXML(1, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClass() {
|
public static void beforeClass() {
|
||||||
try {
|
try {
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
Class.forName("com.taosdata.jdbc.TSDBDriver");
|
||||||
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
|
||||||
|
try (Statement stmt = conn.createStatement()) {
|
||||||
|
stmt.execute("drop database if exists test_pstmt");
|
||||||
|
stmt.execute("create database if not exists test_pstmt");
|
||||||
|
stmt.execute("use test_pstmt");
|
||||||
|
stmt.execute("create table weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
stmt.execute("create table t1 using weather tags('beijing')");
|
||||||
|
}
|
||||||
|
pstmt_insert = conn.prepareStatement(sql_insert);
|
||||||
|
pstmt_select = conn.prepareStatement(sql_select);
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (ClassNotFoundException | SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -176,6 +231,7 @@ public class TSDBPreparedStatementTest {
|
||||||
@AfterClass
|
@AfterClass
|
||||||
public static void afterClass() {
|
public static void afterClass() {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (conn != null)
|
if (conn != null)
|
||||||
conn.close();
|
conn.close();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|
|
@ -51,6 +51,68 @@ public class TSDBStatementTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void close() {
|
public void close() {
|
||||||
|
// test in AfterClass method
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxFieldSize() throws SQLException {
|
||||||
|
Assert.assertEquals(16 * 1024, stmt.getMaxFieldSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setMaxFieldSize() throws SQLException {
|
||||||
|
|
||||||
|
stmt.setMaxFieldSize(0);
|
||||||
|
stmt.setMaxFieldSize(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxRows() throws SQLException {
|
||||||
|
Assert.assertEquals(0, stmt.getMaxRows());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setMaxRows() throws SQLException {
|
||||||
|
stmt.setMaxRows(0);
|
||||||
|
stmt.setMaxRows(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setEscapeProcessing() throws SQLException {
|
||||||
|
stmt.setEscapeProcessing(true);
|
||||||
|
stmt.setEscapeProcessing(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getQueryTimeout() throws SQLException {
|
||||||
|
Assert.assertEquals(0, stmt.getQueryTimeout());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setQueryTimeout() throws SQLException {
|
||||||
|
stmt.setQueryTimeout(0);
|
||||||
|
stmt.setQueryTimeout(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void cancel() throws SQLException {
|
||||||
|
stmt.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWarnings() throws SQLException {
|
||||||
|
Assert.assertNull(stmt.getWarnings());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearWarnings() throws SQLException {
|
||||||
|
stmt.clearWarnings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setCursorName() throws SQLException {
|
||||||
|
stmt.setCursorName("");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -130,7 +192,48 @@ public class TSDBStatementTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getUpdateCount() {
|
public void getUpdateCount() {
|
||||||
execute();
|
// already test in execute method
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMoreResults() throws SQLException {
|
||||||
|
Assert.assertEquals(false, stmt.getMoreResults());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setFetchDirection() throws SQLException {
|
||||||
|
stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
|
||||||
|
stmt.setFetchDirection(ResultSet.FETCH_REVERSE);
|
||||||
|
stmt.setFetchDirection(ResultSet.FETCH_UNKNOWN);
|
||||||
|
stmt.setFetchDirection(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFetchDirection() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.FETCH_FORWARD, stmt.getFetchDirection());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setFetchSize() throws SQLException {
|
||||||
|
stmt.setFetchSize(0);
|
||||||
|
stmt.setFetchSize(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFetchSize() throws SQLException {
|
||||||
|
stmt.setFetchSize(0);
|
||||||
|
Assert.assertEquals(0, stmt.getFetchSize());
|
||||||
|
stmt.setFetchSize(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSetConcurrency() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.CONCUR_READ_ONLY, stmt.getResultSetConcurrency());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSetType() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.TYPE_FORWARD_ONLY, stmt.getResultSetType());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -194,6 +297,52 @@ public class TSDBStatementTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testGetMoreResults() throws SQLException {
|
||||||
|
Assert.assertEquals(false, stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT));
|
||||||
|
stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void getGeneratedKeys() throws SQLException {
|
||||||
|
stmt.getGeneratedKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecuteUpdate() throws SQLException {
|
||||||
|
stmt.executeUpdate("", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecuteUpdate1() throws SQLException {
|
||||||
|
stmt.executeUpdate("", new int[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecuteUpdate2() throws SQLException {
|
||||||
|
stmt.executeUpdate("", new String[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecute() throws SQLException {
|
||||||
|
stmt.execute("", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecute1() throws SQLException {
|
||||||
|
stmt.execute("", new int[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecute2() throws SQLException {
|
||||||
|
stmt.execute("", new String[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSetHoldability() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, stmt.getResultSetHoldability());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void isClosed() {
|
public void isClosed() {
|
||||||
try {
|
try {
|
||||||
|
@ -203,6 +352,38 @@ public class TSDBStatementTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setPoolable() throws SQLException {
|
||||||
|
stmt.setPoolable(true);
|
||||||
|
stmt.setPoolable(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isPoolable() throws SQLException {
|
||||||
|
Assert.assertEquals(false, stmt.isPoolable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void closeOnCompletion() throws SQLException {
|
||||||
|
stmt.closeOnCompletion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isCloseOnCompletion() throws SQLException {
|
||||||
|
Assert.assertFalse(stmt.isCloseOnCompletion());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void unwrap() throws SQLException {
|
||||||
|
TSDBStatement unwrap = stmt.unwrap(TSDBStatement.class);
|
||||||
|
Assert.assertNotNull(unwrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isWrapperFor() throws SQLException {
|
||||||
|
Assert.assertTrue(stmt.isWrapperFor(TSDBStatement.class));
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClass() {
|
public static void beforeClass() {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.taosdata.jdbc.cases;
|
package com.taosdata.jdbc.cases;
|
||||||
|
|
||||||
|
import com.taosdata.jdbc.TSDBErrorNumbers;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -16,8 +17,7 @@ public class ConnectWrongDatabaseTest {
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
System.out.println(e.getMessage());
|
Assert.assertEquals(TSDBErrorNumbers.ERROR_JNI_CONNECTION_NULL, e.getErrorCode());
|
||||||
Assert.assertEquals("TDengine Error: Invalid database name", e.getMessage());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import static org.junit.Assert.assertEquals;
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
public class ImportTest {
|
public class ImportTest {
|
||||||
private static Connection connection;
|
private static Connection connection;
|
||||||
static String dbName = "test";
|
static String dbName = "test_import";
|
||||||
static String tName = "t0";
|
static String tName = "t0";
|
||||||
static String host = "127.0.0.1";
|
static String host = "127.0.0.1";
|
||||||
private static long ts;
|
private static long ts;
|
||||||
|
|
|
@ -10,7 +10,7 @@ public class AuthenticationTest {
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
// private static final String host = "master";
|
// private static final String host = "master";
|
||||||
private static final String user = "root";
|
private static final String user = "root";
|
||||||
private static final String password = "123456";
|
private static final String password = "taos?data";
|
||||||
private Connection conn;
|
private Connection conn;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
package com.taosdata.jdbc.rs;
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
import com.taosdata.jdbc.TSDBConnection;
|
|
||||||
import com.taosdata.jdbc.TSDBDriver;
|
import com.taosdata.jdbc.TSDBDriver;
|
||||||
import com.taosdata.jdbc.TSDBResultSet;
|
|
||||||
import com.taosdata.jdbc.TSDBSubscribe;
|
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import javax.management.OperationsException;
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@ -17,6 +13,7 @@ public class RestfulConnectionTest {
|
||||||
|
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
// private static final String host = "master";
|
// private static final String host = "master";
|
||||||
|
|
||||||
private static Connection conn;
|
private static Connection conn;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -0,0 +1,246 @@
|
||||||
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
public class RestfulPreparedStatementTest {
|
||||||
|
private static final String host = "127.0.0.1";
|
||||||
|
// private static final String host = "master";
|
||||||
|
private static Connection conn;
|
||||||
|
private static final String sql_insert = "insert into t1 values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||||||
|
private static PreparedStatement pstmt_insert;
|
||||||
|
private static final String sql_select = "select * from t1 where ts > ? and ts <= ? and f1 >= ?";
|
||||||
|
private static PreparedStatement pstmt_select;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeQuery() throws SQLException {
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
long start = end - 1000 * 60 * 60;
|
||||||
|
pstmt_select.setTimestamp(1, new Timestamp(start));
|
||||||
|
pstmt_select.setTimestamp(2, new Timestamp(end));
|
||||||
|
pstmt_select.setInt(3, 0);
|
||||||
|
|
||||||
|
ResultSet rs = pstmt_select.executeQuery();
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
|
while (rs.next()) {
|
||||||
|
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||||
|
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeUpdate() throws SQLException {
|
||||||
|
pstmt_insert.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
|
||||||
|
pstmt_insert.setFloat(2, 3.14f);
|
||||||
|
int result = pstmt_insert.executeUpdate();
|
||||||
|
Assert.assertEquals(1, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setNull() throws SQLException {
|
||||||
|
pstmt_insert.setNull(2, Types.FLOAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setBoolean() throws SQLException {
|
||||||
|
pstmt_insert.setBoolean(2, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setByte() throws SQLException {
|
||||||
|
pstmt_insert.setByte(1, (byte) 0x001);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setShort() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setInt() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setLong() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setFloat() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setDouble() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setBigDecimal() throws SQLException {
|
||||||
|
pstmt_insert.setBigDecimal(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setString() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setBytes() throws SQLException {
|
||||||
|
pstmt_insert.setBytes(1, new byte[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setDate() throws SQLException {
|
||||||
|
pstmt_insert.setDate(1, new Date(System.currentTimeMillis()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setTime() throws SQLException {
|
||||||
|
pstmt_insert.setTime(1, new Time(System.currentTimeMillis()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setTimestamp() {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setAsciiStream() throws SQLException {
|
||||||
|
pstmt_insert.setAsciiStream(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setBinaryStream() throws SQLException {
|
||||||
|
pstmt_insert.setBinaryStream(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearParameters() {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setObject() throws SQLException {
|
||||||
|
pstmt_insert.setObject(1, System.currentTimeMillis());
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void execute() {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addBatch() {
|
||||||
|
//TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setCharacterStream() throws SQLException {
|
||||||
|
pstmt_insert.setCharacterStream(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setRef() throws SQLException {
|
||||||
|
pstmt_insert.setRef(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setBlob() throws SQLException {
|
||||||
|
pstmt_insert.setBlob(1, (Blob) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setClob() throws SQLException {
|
||||||
|
pstmt_insert.setClob(1, (Clob) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setArray() throws SQLException {
|
||||||
|
pstmt_insert.setArray(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void getMetaData() throws SQLException {
|
||||||
|
pstmt_insert.getMetaData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setURL() throws SQLException {
|
||||||
|
pstmt_insert.setURL(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getParameterMetaData() throws SQLException {
|
||||||
|
ParameterMetaData parameterMetaData = pstmt_insert.getParameterMetaData();
|
||||||
|
Assert.assertNull(parameterMetaData);
|
||||||
|
//TODO:
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setRowId() throws SQLException {
|
||||||
|
pstmt_insert.setRowId(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setNString() throws SQLException {
|
||||||
|
pstmt_insert.setNString(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setNCharacterStream() throws SQLException {
|
||||||
|
pstmt_insert.setNCharacterStream(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setNClob() throws SQLException {
|
||||||
|
pstmt_insert.setNClob(1, (NClob) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setSQLXML() throws SQLException {
|
||||||
|
pstmt_insert.setSQLXML(1, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClass() {
|
||||||
|
try {
|
||||||
|
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||||
|
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata");
|
||||||
|
try (Statement stmt = conn.createStatement()) {
|
||||||
|
stmt.execute("drop database if exists test_pstmt");
|
||||||
|
stmt.execute("create database if not exists test_pstmt");
|
||||||
|
stmt.execute("use test_pstmt");
|
||||||
|
stmt.execute("create table weather(ts timestamp, f1 int, f2 bigint, f3 float, f4 double, f5 smallint, f6 tinyint, f7 bool, f8 binary(64), f9 nchar(64)) tags(loc nchar(64))");
|
||||||
|
stmt.execute("create table t1 using weather tags('beijing')");
|
||||||
|
}
|
||||||
|
pstmt_insert = conn.prepareStatement(sql_insert);
|
||||||
|
pstmt_select = conn.prepareStatement(sql_select);
|
||||||
|
} catch (ClassNotFoundException | SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void afterClass() {
|
||||||
|
try {
|
||||||
|
if (pstmt_insert != null)
|
||||||
|
pstmt_insert.close();
|
||||||
|
if (pstmt_select != null)
|
||||||
|
pstmt_select.close();
|
||||||
|
if (conn != null)
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,418 @@
|
||||||
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
|
import com.taosdata.jdbc.TSDBDriver;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class RestfulStatementTest {
|
||||||
|
// private static final String host = "127.0.0.1";
|
||||||
|
private static final String host = "master";
|
||||||
|
private static Connection conn;
|
||||||
|
private static Statement stmt;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeQuery() {
|
||||||
|
try {
|
||||||
|
ResultSet rs = stmt.executeQuery("show databases");
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
|
while (rs.next()) {
|
||||||
|
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||||
|
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeUpdate() {
|
||||||
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
try {
|
||||||
|
int affectRows = stmt.executeUpdate("create database " + dbName);
|
||||||
|
Assert.assertEquals(0, affectRows);
|
||||||
|
affectRows = stmt.executeUpdate("create table " + dbName + ".weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
Assert.assertEquals(0, affectRows);
|
||||||
|
affectRows = stmt.executeUpdate("insert into " + dbName + ".t1 using " + dbName + ".weather tags('北京') values(now, 22.33)");
|
||||||
|
Assert.assertEquals(1, affectRows);
|
||||||
|
affectRows = stmt.executeUpdate("drop database " + dbName);
|
||||||
|
Assert.assertEquals(0, affectRows);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void close() {
|
||||||
|
// test in AfterClass method
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxFieldSize() throws SQLException {
|
||||||
|
Assert.assertEquals(16 * 1024, stmt.getMaxFieldSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setMaxFieldSize() throws SQLException {
|
||||||
|
|
||||||
|
stmt.setMaxFieldSize(0);
|
||||||
|
stmt.setMaxFieldSize(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMaxRows() throws SQLException {
|
||||||
|
Assert.assertEquals(0, stmt.getMaxRows());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setMaxRows() throws SQLException {
|
||||||
|
stmt.setMaxRows(0);
|
||||||
|
stmt.setMaxRows(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setEscapeProcessing() throws SQLException {
|
||||||
|
stmt.setEscapeProcessing(true);
|
||||||
|
stmt.setEscapeProcessing(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getQueryTimeout() throws SQLException {
|
||||||
|
Assert.assertEquals(0, stmt.getQueryTimeout());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setQueryTimeout() throws SQLException {
|
||||||
|
stmt.setQueryTimeout(0);
|
||||||
|
stmt.setQueryTimeout(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void cancel() throws SQLException {
|
||||||
|
stmt.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWarnings() throws SQLException {
|
||||||
|
Assert.assertNull(stmt.getWarnings());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearWarnings() throws SQLException {
|
||||||
|
stmt.clearWarnings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void setCursorName() throws SQLException {
|
||||||
|
stmt.setCursorName("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void execute() {
|
||||||
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
try {
|
||||||
|
boolean isSelect = stmt.execute("create database if not exists " + dbName);
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
int affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(0, affectedRows);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("create table if not exists " + dbName + ".weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(0, affectedRows);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("insert into " + dbName + ".t1 using " + dbName + ".weather tags('北京') values(now, 22.33)");
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(1, affectedRows);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("select * from " + dbName + ".weather");
|
||||||
|
Assert.assertEquals(true, isSelect);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("drop database " + dbName);
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(0, affectedRows);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSet() {
|
||||||
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
try {
|
||||||
|
boolean isSelect = stmt.execute("create database if not exists " + dbName);
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
int affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(0, affectedRows);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("create table if not exists " + dbName + ".weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(0, affectedRows);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("insert into " + dbName + ".t1 using " + dbName + ".weather tags('北京') values(now, 22.33)");
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(1, affectedRows);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("select * from " + dbName + ".weather");
|
||||||
|
Assert.assertEquals(true, isSelect);
|
||||||
|
ResultSet rs = stmt.getResultSet();
|
||||||
|
Assert.assertNotNull(rs);
|
||||||
|
ResultSetMetaData meta = rs.getMetaData();
|
||||||
|
Assert.assertEquals(3, meta.getColumnCount());
|
||||||
|
int count = 0;
|
||||||
|
while (rs.next()) {
|
||||||
|
for (int i = 1; i <= meta.getColumnCount(); i++) {
|
||||||
|
System.out.print(meta.getColumnLabel(i) + ": " + rs.getString(i) + "\t");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
Assert.assertEquals(1, count);
|
||||||
|
|
||||||
|
isSelect = stmt.execute("drop database " + dbName);
|
||||||
|
Assert.assertEquals(false, isSelect);
|
||||||
|
affectedRows = stmt.getUpdateCount();
|
||||||
|
Assert.assertEquals(0, affectedRows);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getUpdateCount() {
|
||||||
|
// already test in execute method
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMoreResults() throws SQLException {
|
||||||
|
Assert.assertEquals(false, stmt.getMoreResults());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setFetchDirection() throws SQLException {
|
||||||
|
stmt.setFetchDirection(ResultSet.FETCH_FORWARD);
|
||||||
|
stmt.setFetchDirection(ResultSet.FETCH_REVERSE);
|
||||||
|
stmt.setFetchDirection(ResultSet.FETCH_UNKNOWN);
|
||||||
|
stmt.setFetchDirection(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFetchDirection() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.FETCH_FORWARD, stmt.getFetchDirection());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLException.class)
|
||||||
|
public void setFetchSize() throws SQLException {
|
||||||
|
stmt.setFetchSize(0);
|
||||||
|
stmt.setFetchSize(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFetchSize() throws SQLException {
|
||||||
|
stmt.setFetchSize(0);
|
||||||
|
Assert.assertEquals(0, stmt.getFetchSize());
|
||||||
|
stmt.setFetchSize(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSetConcurrency() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.CONCUR_READ_ONLY, stmt.getResultSetConcurrency());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSetType() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.TYPE_FORWARD_ONLY, stmt.getResultSetType());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addBatch() {
|
||||||
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
try {
|
||||||
|
stmt.addBatch("create database " + dbName);
|
||||||
|
stmt.addBatch("create table " + dbName + ".weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
stmt.addBatch("insert into " + dbName + ".t1 using " + dbName + ".weather tags('北京') values(now, 22.33)");
|
||||||
|
stmt.addBatch("select * from " + dbName + ".weather");
|
||||||
|
stmt.addBatch("drop database " + dbName);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void clearBatch() {
|
||||||
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
try {
|
||||||
|
stmt.clearBatch();
|
||||||
|
stmt.addBatch("create database " + dbName);
|
||||||
|
stmt.addBatch("create table " + dbName + ".weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
stmt.addBatch("insert into " + dbName + ".t1 using " + dbName + ".weather tags('北京') values(now, 22.33)");
|
||||||
|
stmt.addBatch("select * from " + dbName + ".weather");
|
||||||
|
stmt.addBatch("drop database " + dbName);
|
||||||
|
stmt.clearBatch();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeBatch() {
|
||||||
|
final String dbName = ("test_" + UUID.randomUUID()).replace("-", "_").substring(0, 32);
|
||||||
|
try {
|
||||||
|
stmt.addBatch("create database " + dbName);
|
||||||
|
stmt.addBatch("create table " + dbName + ".weather(ts timestamp, temperature float) tags(loc nchar(64))");
|
||||||
|
stmt.addBatch("insert into " + dbName + ".t1 using " + dbName + ".weather tags('北京') values(now, 22.33)");
|
||||||
|
stmt.addBatch("select * from " + dbName + ".weather");
|
||||||
|
stmt.addBatch("drop database " + dbName);
|
||||||
|
int[] results = stmt.executeBatch();
|
||||||
|
Assert.assertEquals(0, results[0]);
|
||||||
|
Assert.assertEquals(0, results[1]);
|
||||||
|
Assert.assertEquals(1, results[2]);
|
||||||
|
Assert.assertEquals(Statement.SUCCESS_NO_INFO, results[3]);
|
||||||
|
Assert.assertEquals(0, results[4]);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getConnection() {
|
||||||
|
try {
|
||||||
|
Connection connection = stmt.getConnection();
|
||||||
|
Assert.assertNotNull(connection);
|
||||||
|
Assert.assertTrue(this.conn == connection);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testGetMoreResults() throws SQLException {
|
||||||
|
Assert.assertEquals(false, stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT));
|
||||||
|
stmt.getMoreResults(Statement.KEEP_CURRENT_RESULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void getGeneratedKeys() throws SQLException {
|
||||||
|
stmt.getGeneratedKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecuteUpdate() throws SQLException {
|
||||||
|
stmt.executeUpdate("", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecuteUpdate1() throws SQLException {
|
||||||
|
stmt.executeUpdate("", new int[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecuteUpdate2() throws SQLException {
|
||||||
|
stmt.executeUpdate("", new String[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecute() throws SQLException {
|
||||||
|
stmt.execute("", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecute1() throws SQLException {
|
||||||
|
stmt.execute("", new int[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void testExecute2() throws SQLException {
|
||||||
|
stmt.execute("", new String[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getResultSetHoldability() throws SQLException {
|
||||||
|
Assert.assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, stmt.getResultSetHoldability());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isClosed() {
|
||||||
|
try {
|
||||||
|
Assert.assertEquals(false, stmt.isClosed());
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setPoolable() throws SQLException {
|
||||||
|
stmt.setPoolable(true);
|
||||||
|
stmt.setPoolable(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isPoolable() throws SQLException {
|
||||||
|
Assert.assertEquals(false, stmt.isPoolable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void closeOnCompletion() throws SQLException {
|
||||||
|
stmt.closeOnCompletion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isCloseOnCompletion() throws SQLException {
|
||||||
|
Assert.assertFalse(stmt.isCloseOnCompletion());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void unwrap() throws SQLException {
|
||||||
|
RestfulStatement unwrap = stmt.unwrap(RestfulStatement.class);
|
||||||
|
Assert.assertNotNull(unwrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isWrapperFor() throws SQLException {
|
||||||
|
Assert.assertTrue(stmt.isWrapperFor(RestfulStatement.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClass() {
|
||||||
|
try {
|
||||||
|
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
|
||||||
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
|
||||||
|
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
|
||||||
|
conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata", properties);
|
||||||
|
stmt = conn.createStatement();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void afterClass() {
|
||||||
|
try {
|
||||||
|
if (stmt != null)
|
||||||
|
stmt.close();
|
||||||
|
if (conn != null)
|
||||||
|
conn.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -145,6 +145,14 @@ void dnodeSendRpcMWriteRsp(void *pMsg, int32_t code) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dTrace("msg:%p, app:%p type:%s master:%p will be responsed", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
|
taosMsg[pWrite->rpcMsg.msgType], pWrite->pBatchMasterMsg);
|
||||||
|
if (pWrite->pBatchMasterMsg && pWrite != pWrite->pBatchMasterMsg) {
|
||||||
|
dError("msg:%p, app:%p type:%s master:%p sub message should not response!", pWrite, pWrite->rpcMsg.ahandle,
|
||||||
|
taosMsg[pWrite->rpcMsg.msgType], pWrite->pBatchMasterMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
.handle = pWrite->rpcMsg.handle,
|
.handle = pWrite->rpcMsg.handle,
|
||||||
.pCont = pWrite->rpcRsp.rsp,
|
.pCont = pWrite->rpcRsp.rsp,
|
||||||
|
|
|
@ -27,7 +27,7 @@ typedef struct tstr {
|
||||||
#define IS_VAR_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_BINARY) || ((t) == TSDB_DATA_TYPE_NCHAR))
|
#define IS_VAR_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_BINARY) || ((t) == TSDB_DATA_TYPE_NCHAR))
|
||||||
|
|
||||||
// this data type is internally used only in 'in' query to hold the values
|
// this data type is internally used only in 'in' query to hold the values
|
||||||
#define TSDB_DATA_TYPE_ARRAY (TSDB_DATA_TYPE_NCHAR + 1)
|
#define TSDB_DATA_TYPE_ARRAY (1000)
|
||||||
|
|
||||||
#define GET_TYPED_DATA(_v, _finalType, _type, _data) \
|
#define GET_TYPED_DATA(_v, _finalType, _type, _data) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#define MAX_COMMAND_SIZE 65536
|
#define MAX_COMMAND_SIZE 65536
|
||||||
#define HISTORY_FILE ".taos_history"
|
#define HISTORY_FILE ".taos_history"
|
||||||
|
|
||||||
|
#define DEFAULT_RES_SHOW_NUM 100
|
||||||
|
|
||||||
typedef struct SShellHistory {
|
typedef struct SShellHistory {
|
||||||
char* hist[MAX_HISTORY_SIZE];
|
char* hist[MAX_HISTORY_SIZE];
|
||||||
int hstart;
|
int hstart;
|
||||||
|
|
|
@ -324,7 +324,8 @@ void shellRunCommandOnServer(TAOS *con, char command[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tscIsUpdateQuery(pSql)) { // select and show kinds of commands
|
if (!tscIsUpdateQuery(pSql)) { // select and show kinds of commands
|
||||||
int error_no = 0;
|
int error_no = 0;
|
||||||
|
|
||||||
int numOfRows = shellDumpResult(pSql, fname, &error_no, printMode);
|
int numOfRows = shellDumpResult(pSql, fname, &error_no, printMode);
|
||||||
if (numOfRows < 0) {
|
if (numOfRows < 0) {
|
||||||
atomic_store_64(&result, 0);
|
atomic_store_64(&result, 0);
|
||||||
|
@ -659,6 +660,17 @@ static void printField(const char* val, TAOS_FIELD* field, int width, int32_t le
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isSelectQuery(TAOS_RES* tres) {
|
||||||
|
char *sql = tscGetSqlStr(tres);
|
||||||
|
|
||||||
|
if (regex_match(sql, "^[\t ]*select[ \t]*", REG_EXTENDED | REG_ICASE)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int verticalPrintResult(TAOS_RES* tres) {
|
static int verticalPrintResult(TAOS_RES* tres) {
|
||||||
TAOS_ROW row = taos_fetch_row(tres);
|
TAOS_ROW row = taos_fetch_row(tres);
|
||||||
if (row == NULL) {
|
if (row == NULL) {
|
||||||
|
@ -677,18 +689,33 @@ static int verticalPrintResult(TAOS_RES* tres) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t resShowMaxNum = UINT64_MAX;
|
||||||
|
|
||||||
|
if (args.commands == NULL && args.file[0] == 0 && isSelectQuery(tres) && !tscIsQueryWithLimit(tres)) {
|
||||||
|
resShowMaxNum = DEFAULT_RES_SHOW_NUM;
|
||||||
|
}
|
||||||
|
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
do {
|
int showMore = 1;
|
||||||
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
do {
|
||||||
int32_t* length = taos_fetch_lengths(tres);
|
if (numOfRows < resShowMaxNum) {
|
||||||
for (int i = 0; i < num_fields; i++) {
|
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
||||||
TAOS_FIELD* field = fields + i;
|
|
||||||
|
|
||||||
int padding = (int)(maxColNameLen - strlen(field->name));
|
int32_t* length = taos_fetch_lengths(tres);
|
||||||
printf("%*.s%s: ", padding, " ", field->name);
|
|
||||||
|
|
||||||
printField((const char*)row[i], field, 0, length[i], precision);
|
for (int i = 0; i < num_fields; i++) {
|
||||||
putchar('\n');
|
TAOS_FIELD* field = fields + i;
|
||||||
|
|
||||||
|
int padding = (int)(maxColNameLen - strlen(field->name));
|
||||||
|
printf("%*.s%s: ", padding, " ", field->name);
|
||||||
|
|
||||||
|
printField((const char*)row[i], field, 0, length[i], precision);
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
} else if (showMore) {
|
||||||
|
printf("[100 Rows showed, and more rows are fetching but will not be showed. You can ctrl+c to stop or wait.]\n");
|
||||||
|
printf("[You can add limit statement to get more or redirect results to specific file to get all.]\n");
|
||||||
|
showMore = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
|
@ -795,16 +822,31 @@ static int horizontalPrintResult(TAOS_RES* tres) {
|
||||||
|
|
||||||
printHeader(fields, width, num_fields);
|
printHeader(fields, width, num_fields);
|
||||||
|
|
||||||
|
uint64_t resShowMaxNum = UINT64_MAX;
|
||||||
|
|
||||||
|
if (args.commands == NULL && args.file[0] == 0 && isSelectQuery(tres) && !tscIsQueryWithLimit(tres)) {
|
||||||
|
resShowMaxNum = DEFAULT_RES_SHOW_NUM;
|
||||||
|
}
|
||||||
|
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
|
int showMore = 1;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
int32_t* length = taos_fetch_lengths(tres);
|
int32_t* length = taos_fetch_lengths(tres);
|
||||||
for (int i = 0; i < num_fields; i++) {
|
if (numOfRows < resShowMaxNum) {
|
||||||
putchar(' ');
|
for (int i = 0; i < num_fields; i++) {
|
||||||
printField((const char*)row[i], fields + i, width[i], length[i], precision);
|
putchar(' ');
|
||||||
putchar(' ');
|
printField((const char*)row[i], fields + i, width[i], length[i], precision);
|
||||||
putchar('|');
|
putchar(' ');
|
||||||
|
putchar('|');
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
} else if (showMore) {
|
||||||
|
printf("[100 Rows showed, and more rows are fetching but will not be showed. You can ctrl+c to stop or wait.]\n");
|
||||||
|
printf("[You can add limit statement to show more or redirect results to specific file to get all.]\n");
|
||||||
|
showMore = 0;
|
||||||
}
|
}
|
||||||
putchar('\n');
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
row = taos_fetch_row(tres);
|
row = taos_fetch_row(tres);
|
||||||
} while(row != NULL);
|
} while(row != NULL);
|
||||||
|
|
|
@ -67,6 +67,7 @@
|
||||||
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
||||||
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
|
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static HANDLE g_stdoutHandle;
|
static HANDLE g_stdoutHandle;
|
||||||
static DWORD g_consoleMode;
|
static DWORD g_consoleMode;
|
||||||
|
|
||||||
|
@ -590,6 +591,8 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
arguments->insert_only = true;
|
arguments->insert_only = true;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'y':
|
case 'y':
|
||||||
arguments->answer_yes = true;
|
arguments->answer_yes = true;
|
||||||
break;
|
break;
|
||||||
|
@ -807,6 +810,7 @@ static void getResult(TAOS_RES *res, char* resultFileName) {
|
||||||
char* databuf = (char*) calloc(1, 100*1024*1024);
|
char* databuf = (char*) calloc(1, 100*1024*1024);
|
||||||
if (databuf == NULL) {
|
if (databuf == NULL) {
|
||||||
fprintf(stderr, "failed to malloc, warning: save result to file slowly!\n");
|
fprintf(stderr, "failed to malloc, warning: save result to file slowly!\n");
|
||||||
|
fclose(fp);
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1396,7 +1400,7 @@ static int getDbFromServer(TAOS * taos, SDbInfo** dbInfos) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(dbInfos[count]->name, (char *)row[TSDB_SHOW_DB_NAME_INDEX], fields[TSDB_SHOW_DB_NAME_INDEX].bytes);
|
tstrncpy(dbInfos[count]->name, (char *)row[TSDB_SHOW_DB_NAME_INDEX], fields[TSDB_SHOW_DB_NAME_INDEX].bytes);
|
||||||
xFormatTimestamp(dbInfos[count]->create_time, *(int64_t*)row[TSDB_SHOW_DB_CREATED_TIME_INDEX], TSDB_TIME_PRECISION_MILLI);
|
xFormatTimestamp(dbInfos[count]->create_time, *(int64_t*)row[TSDB_SHOW_DB_CREATED_TIME_INDEX], TSDB_TIME_PRECISION_MILLI);
|
||||||
dbInfos[count]->ntables = *((int32_t *)row[TSDB_SHOW_DB_NTABLES_INDEX]);
|
dbInfos[count]->ntables = *((int32_t *)row[TSDB_SHOW_DB_NTABLES_INDEX]);
|
||||||
dbInfos[count]->vgroups = *((int32_t *)row[TSDB_SHOW_DB_VGROUPS_INDEX]);
|
dbInfos[count]->vgroups = *((int32_t *)row[TSDB_SHOW_DB_VGROUPS_INDEX]);
|
||||||
|
@ -1404,7 +1408,7 @@ static int getDbFromServer(TAOS * taos, SDbInfo** dbInfos) {
|
||||||
dbInfos[count]->quorum = *((int16_t *)row[TSDB_SHOW_DB_QUORUM_INDEX]);
|
dbInfos[count]->quorum = *((int16_t *)row[TSDB_SHOW_DB_QUORUM_INDEX]);
|
||||||
dbInfos[count]->days = *((int16_t *)row[TSDB_SHOW_DB_DAYS_INDEX]);
|
dbInfos[count]->days = *((int16_t *)row[TSDB_SHOW_DB_DAYS_INDEX]);
|
||||||
|
|
||||||
strncpy(dbInfos[count]->keeplist, (char *)row[TSDB_SHOW_DB_KEEP_INDEX], fields[TSDB_SHOW_DB_KEEP_INDEX].bytes);
|
tstrncpy(dbInfos[count]->keeplist, (char *)row[TSDB_SHOW_DB_KEEP_INDEX], fields[TSDB_SHOW_DB_KEEP_INDEX].bytes);
|
||||||
dbInfos[count]->cache = *((int32_t *)row[TSDB_SHOW_DB_CACHE_INDEX]);
|
dbInfos[count]->cache = *((int32_t *)row[TSDB_SHOW_DB_CACHE_INDEX]);
|
||||||
dbInfos[count]->blocks = *((int32_t *)row[TSDB_SHOW_DB_BLOCKS_INDEX]);
|
dbInfos[count]->blocks = *((int32_t *)row[TSDB_SHOW_DB_BLOCKS_INDEX]);
|
||||||
dbInfos[count]->minrows = *((int32_t *)row[TSDB_SHOW_DB_MINROWS_INDEX]);
|
dbInfos[count]->minrows = *((int32_t *)row[TSDB_SHOW_DB_MINROWS_INDEX]);
|
||||||
|
@ -1414,9 +1418,9 @@ static int getDbFromServer(TAOS * taos, SDbInfo** dbInfos) {
|
||||||
dbInfos[count]->comp = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_COMP_INDEX]));
|
dbInfos[count]->comp = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_COMP_INDEX]));
|
||||||
dbInfos[count]->cachelast = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_CACHELAST_INDEX]));
|
dbInfos[count]->cachelast = (int8_t)(*((int8_t *)row[TSDB_SHOW_DB_CACHELAST_INDEX]));
|
||||||
|
|
||||||
strncpy(dbInfos[count]->precision, (char *)row[TSDB_SHOW_DB_PRECISION_INDEX], fields[TSDB_SHOW_DB_PRECISION_INDEX].bytes);
|
tstrncpy(dbInfos[count]->precision, (char *)row[TSDB_SHOW_DB_PRECISION_INDEX], fields[TSDB_SHOW_DB_PRECISION_INDEX].bytes);
|
||||||
dbInfos[count]->update = *((int8_t *)row[TSDB_SHOW_DB_UPDATE_INDEX]);
|
dbInfos[count]->update = *((int8_t *)row[TSDB_SHOW_DB_UPDATE_INDEX]);
|
||||||
strncpy(dbInfos[count]->status, (char *)row[TSDB_SHOW_DB_STATUS_INDEX], fields[TSDB_SHOW_DB_STATUS_INDEX].bytes);
|
tstrncpy(dbInfos[count]->status, (char *)row[TSDB_SHOW_DB_STATUS_INDEX], fields[TSDB_SHOW_DB_STATUS_INDEX].bytes);
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
if (count > MAX_DATABASE_COUNT) {
|
if (count > MAX_DATABASE_COUNT) {
|
||||||
|
@ -1429,13 +1433,13 @@ static int getDbFromServer(TAOS * taos, SDbInfo** dbInfos) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printfDbInfoForQueryToFile(char* filename, SDbInfo* dbInfos, int index) {
|
static void printfDbInfoForQueryToFile(char* filename, SDbInfo* dbInfos, int index) {
|
||||||
FILE *fp = NULL;
|
if (filename[0] == 0)
|
||||||
if (filename[0] != 0) {
|
|
||||||
fp = fopen(filename, "at");
|
|
||||||
if (fp == NULL) {
|
|
||||||
fprintf(stderr, "failed to open file: %s\n", filename);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
FILE *fp = fopen(filename, "at");
|
||||||
|
if (fp == NULL) {
|
||||||
|
fprintf(stderr, "failed to open file: %s\n", filename);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(fp, "================ database[%d] ================\n", index);
|
fprintf(fp, "================ database[%d] ================\n", index);
|
||||||
|
@ -1492,7 +1496,10 @@ static void printfQuerySystemInfo(TAOS * taos) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int dbCount = getDbFromServer(taos, dbInfos);
|
int dbCount = getDbFromServer(taos, dbInfos);
|
||||||
if (dbCount <= 0) return;
|
if (dbCount <= 0) {
|
||||||
|
free(dbInfos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < dbCount; i++) {
|
for (int i = 0; i < dbCount; i++) {
|
||||||
// printf database info
|
// printf database info
|
||||||
|
@ -1829,7 +1836,7 @@ static int getAllChildNameOfSuperTable(TAOS * taos, char* dbName, char* sTblName
|
||||||
char* pTblName = childTblName;
|
char* pTblName = childTblName;
|
||||||
while ((row = taos_fetch_row(res)) != NULL) {
|
while ((row = taos_fetch_row(res)) != NULL) {
|
||||||
int32_t* len = taos_fetch_lengths(res);
|
int32_t* len = taos_fetch_lengths(res);
|
||||||
strncpy(pTblName, (char *)row[0], len[0]);
|
tstrncpy(pTblName, (char *)row[0], len[0]);
|
||||||
//printf("==== sub table name: %s\n", pTblName);
|
//printf("==== sub table name: %s\n", pTblName);
|
||||||
count++;
|
count++;
|
||||||
if (count >= childTblCount - 1) {
|
if (count >= childTblCount - 1) {
|
||||||
|
@ -1883,16 +1890,16 @@ static int getSuperTableFromServer(TAOS * taos, char* dbName, SSuperTable* supe
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp((char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX], "TAG") == 0) {
|
if (strcmp((char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX], "TAG") == 0) {
|
||||||
strncpy(superTbls->tags[tagIndex].field, (char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX], fields[TSDB_DESCRIBE_METRIC_FIELD_INDEX].bytes);
|
tstrncpy(superTbls->tags[tagIndex].field, (char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX], fields[TSDB_DESCRIBE_METRIC_FIELD_INDEX].bytes);
|
||||||
strncpy(superTbls->tags[tagIndex].dataType, (char *)row[TSDB_DESCRIBE_METRIC_TYPE_INDEX], fields[TSDB_DESCRIBE_METRIC_TYPE_INDEX].bytes);
|
tstrncpy(superTbls->tags[tagIndex].dataType, (char *)row[TSDB_DESCRIBE_METRIC_TYPE_INDEX], fields[TSDB_DESCRIBE_METRIC_TYPE_INDEX].bytes);
|
||||||
superTbls->tags[tagIndex].dataLen = *((int *)row[TSDB_DESCRIBE_METRIC_LENGTH_INDEX]);
|
superTbls->tags[tagIndex].dataLen = *((int *)row[TSDB_DESCRIBE_METRIC_LENGTH_INDEX]);
|
||||||
strncpy(superTbls->tags[tagIndex].note, (char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX], fields[TSDB_DESCRIBE_METRIC_NOTE_INDEX].bytes);
|
tstrncpy(superTbls->tags[tagIndex].note, (char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX], fields[TSDB_DESCRIBE_METRIC_NOTE_INDEX].bytes);
|
||||||
tagIndex++;
|
tagIndex++;
|
||||||
} else {
|
} else {
|
||||||
strncpy(superTbls->columns[columnIndex].field, (char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX], fields[TSDB_DESCRIBE_METRIC_FIELD_INDEX].bytes);
|
tstrncpy(superTbls->columns[columnIndex].field, (char *)row[TSDB_DESCRIBE_METRIC_FIELD_INDEX], fields[TSDB_DESCRIBE_METRIC_FIELD_INDEX].bytes);
|
||||||
strncpy(superTbls->columns[columnIndex].dataType, (char *)row[TSDB_DESCRIBE_METRIC_TYPE_INDEX], fields[TSDB_DESCRIBE_METRIC_TYPE_INDEX].bytes);
|
tstrncpy(superTbls->columns[columnIndex].dataType, (char *)row[TSDB_DESCRIBE_METRIC_TYPE_INDEX], fields[TSDB_DESCRIBE_METRIC_TYPE_INDEX].bytes);
|
||||||
superTbls->columns[columnIndex].dataLen = *((int *)row[TSDB_DESCRIBE_METRIC_LENGTH_INDEX]);
|
superTbls->columns[columnIndex].dataLen = *((int *)row[TSDB_DESCRIBE_METRIC_LENGTH_INDEX]);
|
||||||
strncpy(superTbls->columns[columnIndex].note, (char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX], fields[TSDB_DESCRIBE_METRIC_NOTE_INDEX].bytes);
|
tstrncpy(superTbls->columns[columnIndex].note, (char *)row[TSDB_DESCRIBE_METRIC_NOTE_INDEX], fields[TSDB_DESCRIBE_METRIC_NOTE_INDEX].bytes);
|
||||||
columnIndex++;
|
columnIndex++;
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
|
@ -2449,8 +2456,8 @@ static bool getColumnAndTagTypeFromInsertJsonFile(cJSON* stbInfo, SSuperTable* s
|
||||||
printf("failed to read json, column type not found");
|
printf("failed to read json, column type not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
//strncpy(superTbls->columns[k].dataType, dataType->valuestring, MAX_TB_NAME_SIZE);
|
//tstrncpy(superTbls->columns[k].dataType, dataType->valuestring, MAX_TB_NAME_SIZE);
|
||||||
strncpy(columnCase.dataType, dataType->valuestring, MAX_TB_NAME_SIZE);
|
tstrncpy(columnCase.dataType, dataType->valuestring, MAX_TB_NAME_SIZE);
|
||||||
|
|
||||||
cJSON* dataLen = cJSON_GetObjectItem(column, "len");
|
cJSON* dataLen = cJSON_GetObjectItem(column, "len");
|
||||||
if (dataLen && dataLen->type == cJSON_Number) {
|
if (dataLen && dataLen->type == cJSON_Number) {
|
||||||
|
@ -2463,7 +2470,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(cJSON* stbInfo, SSuperTable* s
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int n = 0; n < count; ++n) {
|
for (int n = 0; n < count; ++n) {
|
||||||
strncpy(superTbls->columns[index].dataType, columnCase.dataType, MAX_TB_NAME_SIZE);
|
tstrncpy(superTbls->columns[index].dataType, columnCase.dataType, MAX_TB_NAME_SIZE);
|
||||||
superTbls->columns[index].dataLen = columnCase.dataLen;
|
superTbls->columns[index].dataLen = columnCase.dataLen;
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
@ -2508,7 +2515,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(cJSON* stbInfo, SSuperTable* s
|
||||||
printf("failed to read json, tag type not found");
|
printf("failed to read json, tag type not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
strncpy(columnCase.dataType, dataType->valuestring, MAX_TB_NAME_SIZE);
|
tstrncpy(columnCase.dataType, dataType->valuestring, MAX_TB_NAME_SIZE);
|
||||||
|
|
||||||
cJSON* dataLen = cJSON_GetObjectItem(tag, "len");
|
cJSON* dataLen = cJSON_GetObjectItem(tag, "len");
|
||||||
if (dataLen && dataLen->type == cJSON_Number) {
|
if (dataLen && dataLen->type == cJSON_Number) {
|
||||||
|
@ -2521,7 +2528,7 @@ static bool getColumnAndTagTypeFromInsertJsonFile(cJSON* stbInfo, SSuperTable* s
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int n = 0; n < count; ++n) {
|
for (int n = 0; n < count; ++n) {
|
||||||
strncpy(superTbls->tags[index].dataType, columnCase.dataType, MAX_TB_NAME_SIZE);
|
tstrncpy(superTbls->tags[index].dataType, columnCase.dataType, MAX_TB_NAME_SIZE);
|
||||||
superTbls->tags[index].dataLen = columnCase.dataLen;
|
superTbls->tags[index].dataLen = columnCase.dataLen;
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
@ -2542,14 +2549,14 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* cfgdir = cJSON_GetObjectItem(root, "cfgdir");
|
cJSON* cfgdir = cJSON_GetObjectItem(root, "cfgdir");
|
||||||
if (cfgdir && cfgdir->type == cJSON_String && cfgdir->valuestring != NULL) {
|
if (cfgdir && cfgdir->type == cJSON_String && cfgdir->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.cfgDir, cfgdir->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_Dbs.cfgDir, cfgdir->valuestring, MAX_FILE_NAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* host = cJSON_GetObjectItem(root, "host");
|
cJSON* host = cJSON_GetObjectItem(root, "host");
|
||||||
if (host && host->type == cJSON_String && host->valuestring != NULL) {
|
if (host && host->type == cJSON_String && host->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.host, host->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.host, host->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!host) {
|
} else if (!host) {
|
||||||
strncpy(g_Dbs.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, host not found\n");
|
printf("failed to read json, host not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -2564,23 +2571,23 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* user = cJSON_GetObjectItem(root, "user");
|
cJSON* user = cJSON_GetObjectItem(root, "user");
|
||||||
if (user && user->type == cJSON_String && user->valuestring != NULL) {
|
if (user && user->type == cJSON_String && user->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.user, user->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.user, user->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!user) {
|
} else if (!user) {
|
||||||
strncpy(g_Dbs.user, "root", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.user, "root", MAX_DB_NAME_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* password = cJSON_GetObjectItem(root, "password");
|
cJSON* password = cJSON_GetObjectItem(root, "password");
|
||||||
if (password && password->type == cJSON_String && password->valuestring != NULL) {
|
if (password && password->type == cJSON_String && password->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.password, password->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.password, password->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!password) {
|
} else if (!password) {
|
||||||
strncpy(g_Dbs.password, "taosdata", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.password, "taosdata", MAX_DB_NAME_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* resultfile = cJSON_GetObjectItem(root, "result_file");
|
cJSON* resultfile = cJSON_GetObjectItem(root, "result_file");
|
||||||
if (resultfile && resultfile->type == cJSON_String && resultfile->valuestring != NULL) {
|
if (resultfile && resultfile->type == cJSON_String && resultfile->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.resultFile, resultfile->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_Dbs.resultFile, resultfile->valuestring, MAX_FILE_NAME_LEN);
|
||||||
} else if (!resultfile) {
|
} else if (!resultfile) {
|
||||||
strncpy(g_Dbs.resultFile, "./insert_res.txt", MAX_FILE_NAME_LEN);
|
tstrncpy(g_Dbs.resultFile, "./insert_res.txt", MAX_FILE_NAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* threads = cJSON_GetObjectItem(root, "thread_count");
|
cJSON* threads = cJSON_GetObjectItem(root, "thread_count");
|
||||||
|
@ -2648,7 +2655,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
printf("failed to read json, db name not found");
|
printf("failed to read json, db name not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
strncpy(g_Dbs.db[i].dbName, dbName->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].dbName, dbName->valuestring, MAX_DB_NAME_SIZE);
|
||||||
|
|
||||||
cJSON *drop = cJSON_GetObjectItem(dbinfo, "drop");
|
cJSON *drop = cJSON_GetObjectItem(dbinfo, "drop");
|
||||||
if (drop && drop->type == cJSON_String && drop->valuestring != NULL) {
|
if (drop && drop->type == cJSON_String && drop->valuestring != NULL) {
|
||||||
|
@ -2666,9 +2673,9 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *precision = cJSON_GetObjectItem(dbinfo, "precision");
|
cJSON *precision = cJSON_GetObjectItem(dbinfo, "precision");
|
||||||
if (precision && precision->type == cJSON_String && precision->valuestring != NULL) {
|
if (precision && precision->type == cJSON_String && precision->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].dbCfg.precision, precision->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].dbCfg.precision, precision->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!precision) {
|
} else if (!precision) {
|
||||||
//strncpy(g_Dbs.db[i].dbCfg.precision, "ms", MAX_DB_NAME_SIZE);
|
//tstrncpy(g_Dbs.db[i].dbCfg.precision, "ms", MAX_DB_NAME_SIZE);
|
||||||
memset(g_Dbs.db[i].dbCfg.precision, 0, MAX_DB_NAME_SIZE);
|
memset(g_Dbs.db[i].dbCfg.precision, 0, MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, precision not found");
|
printf("failed to read json, precision not found");
|
||||||
|
@ -2829,14 +2836,14 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
printf("failed to read json, stb name not found");
|
printf("failed to read json, stb name not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].sTblName, stbName->valuestring, MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].sTblName, stbName->valuestring, MAX_TB_NAME_SIZE);
|
||||||
|
|
||||||
cJSON *prefix = cJSON_GetObjectItem(stbInfo, "childtable_prefix");
|
cJSON *prefix = cJSON_GetObjectItem(stbInfo, "childtable_prefix");
|
||||||
if (!prefix || prefix->type != cJSON_String || prefix->valuestring == NULL) {
|
if (!prefix || prefix->type != cJSON_String || prefix->valuestring == NULL) {
|
||||||
printf("failed to read json, childtable_prefix not found");
|
printf("failed to read json, childtable_prefix not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].childTblPrefix, prefix->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].childTblPrefix, prefix->valuestring, MAX_DB_NAME_SIZE);
|
||||||
|
|
||||||
cJSON *autoCreateTbl = cJSON_GetObjectItem(stbInfo, "auto_create_table"); // yes, no, null
|
cJSON *autoCreateTbl = cJSON_GetObjectItem(stbInfo, "auto_create_table"); // yes, no, null
|
||||||
if (autoCreateTbl && autoCreateTbl->type == cJSON_String && autoCreateTbl->valuestring != NULL) {
|
if (autoCreateTbl && autoCreateTbl->type == cJSON_String && autoCreateTbl->valuestring != NULL) {
|
||||||
|
@ -2889,9 +2896,9 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *dataSource = cJSON_GetObjectItem(stbInfo, "data_source");
|
cJSON *dataSource = cJSON_GetObjectItem(stbInfo, "data_source");
|
||||||
if (dataSource && dataSource->type == cJSON_String && dataSource->valuestring != NULL) {
|
if (dataSource && dataSource->type == cJSON_String && dataSource->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].dataSource, dataSource->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].dataSource, dataSource->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!dataSource) {
|
} else if (!dataSource) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].dataSource, "rand", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].dataSource, "rand", MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, data_source not found");
|
printf("failed to read json, data_source not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -2899,7 +2906,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *insertMode = cJSON_GetObjectItem(stbInfo, "insert_mode"); // taosc , restful
|
cJSON *insertMode = cJSON_GetObjectItem(stbInfo, "insert_mode"); // taosc , restful
|
||||||
if (insertMode && insertMode->type == cJSON_String && insertMode->valuestring != NULL) {
|
if (insertMode && insertMode->type == cJSON_String && insertMode->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].insertMode, insertMode->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].insertMode, insertMode->valuestring, MAX_DB_NAME_SIZE);
|
||||||
#ifndef TD_LOWA_CURL
|
#ifndef TD_LOWA_CURL
|
||||||
if (0 == strncasecmp(g_Dbs.db[i].superTbls[j].insertMode, "restful", 7)) {
|
if (0 == strncasecmp(g_Dbs.db[i].superTbls[j].insertMode, "restful", 7)) {
|
||||||
printf("There no libcurl, so no support resetful test! please use taosc mode.\n");
|
printf("There no libcurl, so no support resetful test! please use taosc mode.\n");
|
||||||
|
@ -2907,7 +2914,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (!insertMode) {
|
} else if (!insertMode) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].insertMode, "taosc", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].insertMode, "taosc", MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, insert_mode not found");
|
printf("failed to read json, insert_mode not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -2915,9 +2922,9 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *ts = cJSON_GetObjectItem(stbInfo, "start_timestamp");
|
cJSON *ts = cJSON_GetObjectItem(stbInfo, "start_timestamp");
|
||||||
if (ts && ts->type == cJSON_String && ts->valuestring != NULL) {
|
if (ts && ts->type == cJSON_String && ts->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].startTimestamp, ts->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].startTimestamp, ts->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!ts) {
|
} else if (!ts) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].startTimestamp, "now", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].startTimestamp, "now", MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, start_timestamp not found");
|
printf("failed to read json, start_timestamp not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -2948,9 +2955,9 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *sampleFormat = cJSON_GetObjectItem(stbInfo, "sample_format");
|
cJSON *sampleFormat = cJSON_GetObjectItem(stbInfo, "sample_format");
|
||||||
if (sampleFormat && sampleFormat->type == cJSON_String && sampleFormat->valuestring != NULL) {
|
if (sampleFormat && sampleFormat->type == cJSON_String && sampleFormat->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].sampleFormat, sampleFormat->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].sampleFormat, sampleFormat->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!sampleFormat) {
|
} else if (!sampleFormat) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].sampleFormat, "csv", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[i].superTbls[j].sampleFormat, "csv", MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, sample_format not found");
|
printf("failed to read json, sample_format not found");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -2958,7 +2965,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *sampleFile = cJSON_GetObjectItem(stbInfo, "sample_file");
|
cJSON *sampleFile = cJSON_GetObjectItem(stbInfo, "sample_file");
|
||||||
if (sampleFile && sampleFile->type == cJSON_String && sampleFile->valuestring != NULL) {
|
if (sampleFile && sampleFile->type == cJSON_String && sampleFile->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].sampleFile, sampleFile->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_Dbs.db[i].superTbls[j].sampleFile, sampleFile->valuestring, MAX_FILE_NAME_LEN);
|
||||||
} else if (!sampleFile) {
|
} else if (!sampleFile) {
|
||||||
memset(g_Dbs.db[i].superTbls[j].sampleFile, 0, MAX_FILE_NAME_LEN);
|
memset(g_Dbs.db[i].superTbls[j].sampleFile, 0, MAX_FILE_NAME_LEN);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2968,7 +2975,7 @@ static bool getMetaFromInsertJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON *tagsFile = cJSON_GetObjectItem(stbInfo, "tags_file");
|
cJSON *tagsFile = cJSON_GetObjectItem(stbInfo, "tags_file");
|
||||||
if (tagsFile && tagsFile->type == cJSON_String && tagsFile->valuestring != NULL) {
|
if (tagsFile && tagsFile->type == cJSON_String && tagsFile->valuestring != NULL) {
|
||||||
strncpy(g_Dbs.db[i].superTbls[j].tagsFile, tagsFile->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_Dbs.db[i].superTbls[j].tagsFile, tagsFile->valuestring, MAX_FILE_NAME_LEN);
|
||||||
if (0 == g_Dbs.db[i].superTbls[j].tagsFile[0]) {
|
if (0 == g_Dbs.db[i].superTbls[j].tagsFile[0]) {
|
||||||
g_Dbs.db[i].superTbls[j].tagSource = 0;
|
g_Dbs.db[i].superTbls[j].tagSource = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3100,14 +3107,14 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* cfgdir = cJSON_GetObjectItem(root, "cfgdir");
|
cJSON* cfgdir = cJSON_GetObjectItem(root, "cfgdir");
|
||||||
if (cfgdir && cfgdir->type == cJSON_String && cfgdir->valuestring != NULL) {
|
if (cfgdir && cfgdir->type == cJSON_String && cfgdir->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.cfgDir, cfgdir->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_queryInfo.cfgDir, cfgdir->valuestring, MAX_FILE_NAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* host = cJSON_GetObjectItem(root, "host");
|
cJSON* host = cJSON_GetObjectItem(root, "host");
|
||||||
if (host && host->type == cJSON_String && host->valuestring != NULL) {
|
if (host && host->type == cJSON_String && host->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.host, host->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.host, host->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!host) {
|
} else if (!host) {
|
||||||
strncpy(g_queryInfo.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, host not found\n");
|
printf("failed to read json, host not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -3122,16 +3129,16 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* user = cJSON_GetObjectItem(root, "user");
|
cJSON* user = cJSON_GetObjectItem(root, "user");
|
||||||
if (user && user->type == cJSON_String && user->valuestring != NULL) {
|
if (user && user->type == cJSON_String && user->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.user, user->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.user, user->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!user) {
|
} else if (!user) {
|
||||||
strncpy(g_queryInfo.user, "root", MAX_DB_NAME_SIZE); ;
|
tstrncpy(g_queryInfo.user, "root", MAX_DB_NAME_SIZE); ;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* password = cJSON_GetObjectItem(root, "password");
|
cJSON* password = cJSON_GetObjectItem(root, "password");
|
||||||
if (password && password->type == cJSON_String && password->valuestring != NULL) {
|
if (password && password->type == cJSON_String && password->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.password, password->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.password, password->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!password) {
|
} else if (!password) {
|
||||||
strncpy(g_queryInfo.password, "taosdata", MAX_DB_NAME_SIZE);;
|
tstrncpy(g_queryInfo.password, "taosdata", MAX_DB_NAME_SIZE);;
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *answerPrompt = cJSON_GetObjectItem(root, "confirm_parameter_prompt"); // yes, no,
|
cJSON *answerPrompt = cJSON_GetObjectItem(root, "confirm_parameter_prompt"); // yes, no,
|
||||||
|
@ -3152,7 +3159,7 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* dbs = cJSON_GetObjectItem(root, "databases");
|
cJSON* dbs = cJSON_GetObjectItem(root, "databases");
|
||||||
if (dbs && dbs->type == cJSON_String && dbs->valuestring != NULL) {
|
if (dbs && dbs->type == cJSON_String && dbs->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.dbName, dbs->valuestring, MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.dbName, dbs->valuestring, MAX_DB_NAME_SIZE);
|
||||||
} else if (!dbs) {
|
} else if (!dbs) {
|
||||||
printf("failed to read json, databases not found\n");
|
printf("failed to read json, databases not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -3160,9 +3167,9 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* queryMode = cJSON_GetObjectItem(root, "query_mode");
|
cJSON* queryMode = cJSON_GetObjectItem(root, "query_mode");
|
||||||
if (queryMode && queryMode->type == cJSON_String && queryMode->valuestring != NULL) {
|
if (queryMode && queryMode->type == cJSON_String && queryMode->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.queryMode, queryMode->valuestring, MAX_TB_NAME_SIZE);
|
tstrncpy(g_queryInfo.queryMode, queryMode->valuestring, MAX_TB_NAME_SIZE);
|
||||||
} else if (!queryMode) {
|
} else if (!queryMode) {
|
||||||
strncpy(g_queryInfo.queryMode, "taosc", MAX_TB_NAME_SIZE);
|
tstrncpy(g_queryInfo.queryMode, "taosc", MAX_TB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, query_mode not found\n");
|
printf("failed to read json, query_mode not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -3266,11 +3273,11 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
printf("failed to read json, sql not found\n");
|
printf("failed to read json, sql not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
strncpy(g_queryInfo.superQueryInfo.sql[j], sqlStr->valuestring, MAX_QUERY_SQL_LENGTH);
|
tstrncpy(g_queryInfo.superQueryInfo.sql[j], sqlStr->valuestring, MAX_QUERY_SQL_LENGTH);
|
||||||
|
|
||||||
cJSON *result = cJSON_GetObjectItem(sql, "result");
|
cJSON *result = cJSON_GetObjectItem(sql, "result");
|
||||||
if (NULL != result && result->type == cJSON_String && result->valuestring != NULL) {
|
if (NULL != result && result->type == cJSON_String && result->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.superQueryInfo.result[j], result->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_queryInfo.superQueryInfo.result[j], result->valuestring, MAX_FILE_NAME_LEN);
|
||||||
} else if (NULL == result) {
|
} else if (NULL == result) {
|
||||||
memset(g_queryInfo.superQueryInfo.result[j], 0, MAX_FILE_NAME_LEN);
|
memset(g_queryInfo.superQueryInfo.result[j], 0, MAX_FILE_NAME_LEN);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3314,7 +3321,7 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
|
|
||||||
cJSON* stblname = cJSON_GetObjectItem(subQuery, "stblname");
|
cJSON* stblname = cJSON_GetObjectItem(subQuery, "stblname");
|
||||||
if (stblname && stblname->type == cJSON_String && stblname->valuestring != NULL) {
|
if (stblname && stblname->type == cJSON_String && stblname->valuestring != NULL) {
|
||||||
strncpy(g_queryInfo.subQueryInfo.sTblName, stblname->valuestring, MAX_TB_NAME_SIZE);
|
tstrncpy(g_queryInfo.subQueryInfo.sTblName, stblname->valuestring, MAX_TB_NAME_SIZE);
|
||||||
} else {
|
} else {
|
||||||
printf("failed to read json, super table name not found\n");
|
printf("failed to read json, super table name not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
|
@ -3395,11 +3402,11 @@ static bool getMetaFromQueryJsonFile(cJSON* root) {
|
||||||
printf("failed to read json, sql not found\n");
|
printf("failed to read json, sql not found\n");
|
||||||
goto PARSE_OVER;
|
goto PARSE_OVER;
|
||||||
}
|
}
|
||||||
strncpy(g_queryInfo.subQueryInfo.sql[j], sqlStr->valuestring, MAX_QUERY_SQL_LENGTH);
|
tstrncpy(g_queryInfo.subQueryInfo.sql[j], sqlStr->valuestring, MAX_QUERY_SQL_LENGTH);
|
||||||
|
|
||||||
cJSON *result = cJSON_GetObjectItem(sql, "result");
|
cJSON *result = cJSON_GetObjectItem(sql, "result");
|
||||||
if (result != NULL && result->type == cJSON_String && result->valuestring != NULL){
|
if (result != NULL && result->type == cJSON_String && result->valuestring != NULL){
|
||||||
strncpy(g_queryInfo.subQueryInfo.result[j], result->valuestring, MAX_FILE_NAME_LEN);
|
tstrncpy(g_queryInfo.subQueryInfo.result[j], result->valuestring, MAX_FILE_NAME_LEN);
|
||||||
} else if (NULL == result) {
|
} else if (NULL == result) {
|
||||||
memset(g_queryInfo.subQueryInfo.result[j], 0, MAX_FILE_NAME_LEN);
|
memset(g_queryInfo.subQueryInfo.result[j], 0, MAX_FILE_NAME_LEN);
|
||||||
} else {
|
} else {
|
||||||
|
@ -4240,7 +4247,7 @@ void startMultiThreadInsertData(int threads, char* db_name, char* precision, SSu
|
||||||
int64_t totalDelay = 0;
|
int64_t totalDelay = 0;
|
||||||
int64_t maxDelay = 0;
|
int64_t maxDelay = 0;
|
||||||
int64_t minDelay = INT16_MAX;
|
int64_t minDelay = INT16_MAX;
|
||||||
int64_t cntDelay = 0;
|
int64_t cntDelay = 1;
|
||||||
double avgDelay = 0;
|
double avgDelay = 0;
|
||||||
|
|
||||||
for (int i = 0; i < threads; i++) {
|
for (int i = 0; i < threads; i++) {
|
||||||
|
@ -4262,14 +4269,17 @@ void startMultiThreadInsertData(int threads, char* db_name, char* precision, SSu
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
cntDelay -= 1;
|
||||||
|
|
||||||
|
assert(cntDelay != 0);
|
||||||
avgDelay = (double)totalDelay / cntDelay;
|
avgDelay = (double)totalDelay / cntDelay;
|
||||||
|
|
||||||
double end = getCurrentTime();
|
double end = getCurrentTime();
|
||||||
printf("Spent %.4f seconds to insert rows: %"PRId64", affected rows: %"PRId64" with %d thread(s) into %s.%s\n\n",
|
double t = end - start;
|
||||||
end - start, superTblInfo->totalRowsInserted, superTblInfo->totalAffectedRows, threads, db_name, superTblInfo->sTblName);
|
printf("Spent %.4f seconds to insert rows: %"PRId64", affected rows: %"PRId64" with %d thread(s) into %s.%s. %2.f records/second\n\n",
|
||||||
fprintf(g_fpOfInsertResult, "Spent %.4f seconds to insert rows: %"PRId64", affected rows: %"PRId64" with %d thread(s) into %s.%s\n\n",
|
t, superTblInfo->totalRowsInserted, superTblInfo->totalAffectedRows, threads, db_name, superTblInfo->sTblName, superTblInfo->totalRowsInserted / t);
|
||||||
end - start, superTblInfo->totalRowsInserted, superTblInfo->totalAffectedRows, threads, db_name, superTblInfo->sTblName);
|
fprintf(g_fpOfInsertResult, "Spent %.4f seconds to insert rows: %"PRId64", affected rows: %"PRId64" with %d thread(s) into %s.%s. %2.f records/second\n\n",
|
||||||
|
t, superTblInfo->totalRowsInserted, superTblInfo->totalAffectedRows, threads, db_name, superTblInfo->sTblName, superTblInfo->totalRowsInserted / t);
|
||||||
|
|
||||||
|
|
||||||
printf("insert delay, avg: %10.6fms, max: %10.6fms, min: %10.6fms\n\n",
|
printf("insert delay, avg: %10.6fms, max: %10.6fms, min: %10.6fms\n\n",
|
||||||
|
@ -4325,6 +4335,7 @@ void *readTable(void *sarg) {
|
||||||
fprintf(stderr, "Failed to query:%s\n", taos_errstr(pSql));
|
fprintf(stderr, "Failed to query:%s\n", taos_errstr(pSql));
|
||||||
taos_free_result(pSql);
|
taos_free_result(pSql);
|
||||||
taos_close(taos);
|
taos_close(taos);
|
||||||
|
fclose(fp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4400,6 +4411,7 @@ void *readMetric(void *sarg) {
|
||||||
fprintf(stderr, "Failed to query:%s\n", taos_errstr(pSql));
|
fprintf(stderr, "Failed to query:%s\n", taos_errstr(pSql));
|
||||||
taos_free_result(pSql);
|
taos_free_result(pSql);
|
||||||
taos_close(taos);
|
taos_close(taos);
|
||||||
|
fclose(fp);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -4520,7 +4532,7 @@ void *superQueryProcess(void *sarg) {
|
||||||
int64_t st = 0;
|
int64_t st = 0;
|
||||||
int64_t et = 0;
|
int64_t et = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (g_queryInfo.superQueryInfo.rate && (et - st) < g_queryInfo.superQueryInfo.rate*1000) {
|
if (g_queryInfo.superQueryInfo.rate && (et - st) < (int64_t)g_queryInfo.superQueryInfo.rate*1000) {
|
||||||
taosMsleep(g_queryInfo.superQueryInfo.rate*1000 - (et - st)); // ms
|
taosMsleep(g_queryInfo.superQueryInfo.rate*1000 - (et - st)); // ms
|
||||||
//printf("========sleep duration:%"PRId64 "========inserted rows:%d, table range:%d - %d\n", (1000 - (et - st)), i, winfo->start_table_id, winfo->end_table_id);
|
//printf("========sleep duration:%"PRId64 "========inserted rows:%d, table range:%d - %d\n", (1000 - (et - st)), i, winfo->start_table_id, winfo->end_table_id);
|
||||||
}
|
}
|
||||||
|
@ -4535,13 +4547,13 @@ void *superQueryProcess(void *sarg) {
|
||||||
}
|
}
|
||||||
selectAndGetResult(winfo->taos, g_queryInfo.superQueryInfo.sql[i], tmpFile);
|
selectAndGetResult(winfo->taos, g_queryInfo.superQueryInfo.sql[i], tmpFile);
|
||||||
int64_t t2 = taosGetTimestampUs();
|
int64_t t2 = taosGetTimestampUs();
|
||||||
printf("=[taosc] thread[%"PRIu64"] complete one sql, Spent %f s\n", taosGetSelfPthreadId(), (t2 - t1)/1000000.0);
|
printf("=[taosc] thread[%"PRId64"] complete one sql, Spent %f s\n", taosGetSelfPthreadId(), (t2 - t1)/1000000.0);
|
||||||
} else {
|
} else {
|
||||||
#ifdef TD_LOWA_CURL
|
#ifdef TD_LOWA_CURL
|
||||||
int64_t t1 = taosGetTimestampUs();
|
int64_t t1 = taosGetTimestampUs();
|
||||||
int retCode = curlProceSql(g_queryInfo.host, g_queryInfo.port, g_queryInfo.superQueryInfo.sql[i], winfo->curl_handle);
|
int retCode = curlProceSql(g_queryInfo.host, g_queryInfo.port, g_queryInfo.superQueryInfo.sql[i], winfo->curl_handle);
|
||||||
int64_t t2 = taosGetTimestampUs();
|
int64_t t2 = taosGetTimestampUs();
|
||||||
printf("=[restful] thread[%"PRIu64"] complete one sql, Spent %f s\n", taosGetSelfPthreadId(), (t2 - t1)/1000000.0);
|
printf("=[restful] thread[%"PRId64"] complete one sql, Spent %f s\n", taosGetSelfPthreadId(), (t2 - t1)/1000000.0);
|
||||||
|
|
||||||
if (0 != retCode) {
|
if (0 != retCode) {
|
||||||
printf("====curl return fail, threadID[%d]\n", winfo->threadID);
|
printf("====curl return fail, threadID[%d]\n", winfo->threadID);
|
||||||
|
@ -4551,7 +4563,7 @@ void *superQueryProcess(void *sarg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
et = taosGetTimestampMs();
|
et = taosGetTimestampMs();
|
||||||
printf("==thread[%"PRIu64"] complete all sqls to specify tables once queries duration:%.6fs\n\n", taosGetSelfPthreadId(), (double)(et - st)/1000.0);
|
printf("==thread[%"PRId64"] complete all sqls to specify tables once queries duration:%.6fs\n\n", taosGetSelfPthreadId(), (double)(et - st)/1000.0);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -4568,7 +4580,7 @@ void replaceSubTblName(char* inSql, char* outSql, int tblIndex) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(outSql, inSql, pos - inSql);
|
tstrncpy(outSql, inSql, pos - inSql);
|
||||||
//printf("1: %s\n", outSql);
|
//printf("1: %s\n", outSql);
|
||||||
strcat(outSql, subTblName);
|
strcat(outSql, subTblName);
|
||||||
//printf("2: %s\n", outSql);
|
//printf("2: %s\n", outSql);
|
||||||
|
@ -4580,7 +4592,7 @@ void *subQueryProcess(void *sarg) {
|
||||||
char sqlstr[1024];
|
char sqlstr[1024];
|
||||||
threadInfo *winfo = (threadInfo *)sarg;
|
threadInfo *winfo = (threadInfo *)sarg;
|
||||||
int64_t st = 0;
|
int64_t st = 0;
|
||||||
int64_t et = g_queryInfo.subQueryInfo.rate*1000;
|
int64_t et = (int64_t)g_queryInfo.subQueryInfo.rate*1000;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (g_queryInfo.subQueryInfo.rate && (et - st) < g_queryInfo.subQueryInfo.rate*1000) {
|
if (g_queryInfo.subQueryInfo.rate && (et - st) < g_queryInfo.subQueryInfo.rate*1000) {
|
||||||
taosMsleep(g_queryInfo.subQueryInfo.rate*1000 - (et - st)); // ms
|
taosMsleep(g_queryInfo.subQueryInfo.rate*1000 - (et - st)); // ms
|
||||||
|
@ -4600,7 +4612,7 @@ void *subQueryProcess(void *sarg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
et = taosGetTimestampMs();
|
et = taosGetTimestampMs();
|
||||||
printf("####thread[%"PRIu64"] complete all sqls to allocate all sub-tables[%d - %d] once queries duration:%.4fs\n\n", taosGetSelfPthreadId(), winfo->start_table_id, winfo->end_table_id, (double)(et - st)/1000.0);
|
printf("####thread[%"PRId64"] complete all sqls to allocate all sub-tables[%d - %d] once queries duration:%.4fs\n\n", taosGetSelfPthreadId(), winfo->start_table_id, winfo->end_table_id, (double)(et - st)/1000.0);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -4973,10 +4985,10 @@ void initOfInsertMeta() {
|
||||||
memset(&g_Dbs, 0, sizeof(SDbs));
|
memset(&g_Dbs, 0, sizeof(SDbs));
|
||||||
|
|
||||||
// set default values
|
// set default values
|
||||||
strncpy(g_Dbs.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
||||||
g_Dbs.port = 6030;
|
g_Dbs.port = 6030;
|
||||||
strncpy(g_Dbs.user, TSDB_DEFAULT_USER, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.user, TSDB_DEFAULT_USER, MAX_DB_NAME_SIZE);
|
||||||
strncpy(g_Dbs.password, TSDB_DEFAULT_PASS, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.password, TSDB_DEFAULT_PASS, MAX_DB_NAME_SIZE);
|
||||||
g_Dbs.threadCount = 2;
|
g_Dbs.threadCount = 2;
|
||||||
g_Dbs.use_metric = true;
|
g_Dbs.use_metric = true;
|
||||||
}
|
}
|
||||||
|
@ -4985,17 +4997,17 @@ void initOfQueryMeta() {
|
||||||
memset(&g_queryInfo, 0, sizeof(SQueryMetaInfo));
|
memset(&g_queryInfo, 0, sizeof(SQueryMetaInfo));
|
||||||
|
|
||||||
// set default values
|
// set default values
|
||||||
strncpy(g_queryInfo.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
||||||
g_queryInfo.port = 6030;
|
g_queryInfo.port = 6030;
|
||||||
strncpy(g_queryInfo.user, TSDB_DEFAULT_USER, MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.user, TSDB_DEFAULT_USER, MAX_DB_NAME_SIZE);
|
||||||
strncpy(g_queryInfo.password, TSDB_DEFAULT_PASS, MAX_DB_NAME_SIZE);
|
tstrncpy(g_queryInfo.password, TSDB_DEFAULT_PASS, MAX_DB_NAME_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setParaFromArg(){
|
void setParaFromArg(){
|
||||||
if (g_args.host) {
|
if (g_args.host) {
|
||||||
strcpy(g_Dbs.host, g_args.host);
|
strcpy(g_Dbs.host, g_args.host);
|
||||||
} else {
|
} else {
|
||||||
strncpy(g_Dbs.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.host, "127.0.0.1", MAX_DB_NAME_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_args.user) {
|
if (g_args.user) {
|
||||||
|
@ -5013,18 +5025,18 @@ void setParaFromArg(){
|
||||||
g_Dbs.dbCount = 1;
|
g_Dbs.dbCount = 1;
|
||||||
g_Dbs.db[0].drop = 1;
|
g_Dbs.db[0].drop = 1;
|
||||||
|
|
||||||
strncpy(g_Dbs.db[0].dbName, g_args.database, MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].dbName, g_args.database, MAX_DB_NAME_SIZE);
|
||||||
g_Dbs.db[0].dbCfg.replica = g_args.replica;
|
g_Dbs.db[0].dbCfg.replica = g_args.replica;
|
||||||
strncpy(g_Dbs.db[0].dbCfg.precision, "ms", MAX_DB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].dbCfg.precision, "ms", MAX_DB_NAME_SIZE);
|
||||||
|
|
||||||
|
|
||||||
strncpy(g_Dbs.resultFile, g_args.output_file, MAX_FILE_NAME_LEN);
|
tstrncpy(g_Dbs.resultFile, g_args.output_file, MAX_FILE_NAME_LEN);
|
||||||
|
|
||||||
g_Dbs.use_metric = g_args.use_metric;
|
g_Dbs.use_metric = g_args.use_metric;
|
||||||
g_Dbs.insert_only = g_args.insert_only;
|
g_Dbs.insert_only = g_args.insert_only;
|
||||||
|
|
||||||
g_Dbs.db[0].superTblCount = 1;
|
g_Dbs.db[0].superTblCount = 1;
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].sTblName, "meters", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].sTblName, "meters", MAX_TB_NAME_SIZE);
|
||||||
g_Dbs.db[0].superTbls[0].childTblCount = g_args.num_of_tables;
|
g_Dbs.db[0].superTbls[0].childTblCount = g_args.num_of_tables;
|
||||||
g_Dbs.threadCount = g_args.num_of_threads;
|
g_Dbs.threadCount = g_args.num_of_threads;
|
||||||
g_Dbs.threadCountByCreateTbl = 1;
|
g_Dbs.threadCountByCreateTbl = 1;
|
||||||
|
@ -5036,10 +5048,10 @@ void setParaFromArg(){
|
||||||
g_Dbs.db[0].superTbls[0].insertRate = 0;
|
g_Dbs.db[0].superTbls[0].insertRate = 0;
|
||||||
g_Dbs.db[0].superTbls[0].disorderRange = g_args.disorderRange;
|
g_Dbs.db[0].superTbls[0].disorderRange = g_args.disorderRange;
|
||||||
g_Dbs.db[0].superTbls[0].disorderRatio = g_args.disorderRatio;
|
g_Dbs.db[0].superTbls[0].disorderRatio = g_args.disorderRatio;
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].childTblPrefix, g_args.tb_prefix, MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].childTblPrefix, g_args.tb_prefix, MAX_TB_NAME_SIZE);
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].dataSource, "rand", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].dataSource, "rand", MAX_TB_NAME_SIZE);
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].insertMode, "taosc", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].insertMode, "taosc", MAX_TB_NAME_SIZE);
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].startTimestamp, "2017-07-14 10:40:00.000", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].startTimestamp, "2017-07-14 10:40:00.000", MAX_TB_NAME_SIZE);
|
||||||
g_Dbs.db[0].superTbls[0].timeStampStep = 10;
|
g_Dbs.db[0].superTbls[0].timeStampStep = 10;
|
||||||
|
|
||||||
// g_args.num_of_RPR;
|
// g_args.num_of_RPR;
|
||||||
|
@ -5063,7 +5075,7 @@ void setParaFromArg(){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType, data_type[i], MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType, data_type[i], MAX_TB_NAME_SIZE);
|
||||||
g_Dbs.db[0].superTbls[0].columns[i].dataLen = g_args.len_of_binary;
|
g_Dbs.db[0].superTbls[0].columns[i].dataLen = g_args.len_of_binary;
|
||||||
g_Dbs.db[0].superTbls[0].columnCount++;
|
g_Dbs.db[0].superTbls[0].columnCount++;
|
||||||
}
|
}
|
||||||
|
@ -5072,17 +5084,17 @@ void setParaFromArg(){
|
||||||
g_Dbs.db[0].superTbls[0].columnCount = g_args.num_of_CPR;
|
g_Dbs.db[0].superTbls[0].columnCount = g_args.num_of_CPR;
|
||||||
} else {
|
} else {
|
||||||
for (int i = g_Dbs.db[0].superTbls[0].columnCount; i < g_args.num_of_CPR; i++) {
|
for (int i = g_Dbs.db[0].superTbls[0].columnCount; i < g_args.num_of_CPR; i++) {
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType, "INT", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].columns[i].dataType, "INT", MAX_TB_NAME_SIZE);
|
||||||
g_Dbs.db[0].superTbls[0].columns[i].dataLen = 0;
|
g_Dbs.db[0].superTbls[0].columns[i].dataLen = 0;
|
||||||
g_Dbs.db[0].superTbls[0].columnCount++;
|
g_Dbs.db[0].superTbls[0].columnCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_Dbs.use_metric) {
|
if (g_Dbs.use_metric) {
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].tags[0].dataType, "INT", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].tags[0].dataType, "INT", MAX_TB_NAME_SIZE);
|
||||||
g_Dbs.db[0].superTbls[0].tags[0].dataLen = 0;
|
g_Dbs.db[0].superTbls[0].tags[0].dataLen = 0;
|
||||||
|
|
||||||
strncpy(g_Dbs.db[0].superTbls[0].tags[1].dataType, "BINARY", MAX_TB_NAME_SIZE);
|
tstrncpy(g_Dbs.db[0].superTbls[0].tags[1].dataType, "BINARY", MAX_TB_NAME_SIZE);
|
||||||
g_Dbs.db[0].superTbls[0].tags[1].dataLen = g_args.len_of_binary;
|
g_Dbs.db[0].superTbls[0].tags[1].dataLen = g_args.len_of_binary;
|
||||||
g_Dbs.db[0].superTbls[0].tagCount = 2;
|
g_Dbs.db[0].superTbls[0].tagCount = 2;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -793,6 +793,7 @@ int32_t taosSaveTableOfMetricToTempFile(TAOS *taosCon, char* metric, struct argu
|
||||||
|
|
||||||
*totalNumOfThread = numOfThread;
|
*totalNumOfThread = numOfThread;
|
||||||
|
|
||||||
|
free(tblBuf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1553,6 +1554,7 @@ int taosDumpDb(SDbInfo *dbInfo, struct arguments *arguments, FILE *fp, TAOS *tao
|
||||||
(void)remove(tmpBuf);
|
(void)remove(tmpBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(tblBuf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -777,11 +777,11 @@ static int32_t mnodeValidateCreateTableMsg(SCreateTableMsg *pCreateTable, SMnode
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCreateTable->numOfTags != 0) {
|
if (pCreateTable->numOfTags != 0) {
|
||||||
mDebug("msg:%p, app:%p table:%s, create stable msg is received from thandle:%p", pMsg, pMsg->rpcMsg.ahandle,
|
mDebug("msg:%p, app:%p table:%s, batch create stable msg is received from thandle:%p", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
pCreateTable->tableName, pMsg->rpcMsg.handle);
|
pCreateTable->tableName, pMsg->rpcMsg.handle);
|
||||||
return mnodeProcessCreateSuperTableMsg(pMsg);
|
return mnodeProcessCreateSuperTableMsg(pMsg);
|
||||||
} else {
|
} else {
|
||||||
mDebug("msg:%p, app:%p table:%s, create ctable msg is received from thandle:%p", pMsg, pMsg->rpcMsg.ahandle,
|
mDebug("msg:%p, app:%p table:%s, batch create ctable msg is received from thandle:%p", pMsg, pMsg->rpcMsg.ahandle,
|
||||||
pCreateTable->tableName, pMsg->rpcMsg.handle);
|
pCreateTable->tableName, pMsg->rpcMsg.handle);
|
||||||
return mnodeProcessCreateChildTableMsg(pMsg);
|
return mnodeProcessCreateChildTableMsg(pMsg);
|
||||||
}
|
}
|
||||||
|
@ -1904,6 +1904,19 @@ static int32_t mnodeDoCreateChildTableCb(SMnodeMsg *pMsg, int32_t code) {
|
||||||
pMsg->rpcMsg.ahandle, pTable->info.tableId, pTable->tid, pTable->uid, tstrerror(code));
|
pMsg->rpcMsg.ahandle, pTable->info.tableId, pTable->tid, pTable->uid, tstrerror(code));
|
||||||
SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pTable, .pTable = tsChildTableSdb};
|
SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pTable, .pTable = tsChildTableSdb};
|
||||||
sdbDeleteRow(&desc);
|
sdbDeleteRow(&desc);
|
||||||
|
|
||||||
|
if (pMsg->pBatchMasterMsg) {
|
||||||
|
++pMsg->pBatchMasterMsg->successed;
|
||||||
|
if (pMsg->pBatchMasterMsg->successed + pMsg->pBatchMasterMsg->received
|
||||||
|
>= pMsg->pBatchMasterMsg->expected) {
|
||||||
|
dnodeSendRpcMWriteRsp(pMsg->pBatchMasterMsg, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
mnodeDestroySubMsg(pMsg);
|
||||||
|
|
||||||
|
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -534,6 +534,19 @@ static int32_t mnodeCreateVgroupCb(SMnodeMsg *pMsg, int32_t code) {
|
||||||
tstrerror(code));
|
tstrerror(code));
|
||||||
SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .pTable = tsVgroupSdb};
|
SSdbRow desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .pTable = tsVgroupSdb};
|
||||||
sdbDeleteRow(&desc);
|
sdbDeleteRow(&desc);
|
||||||
|
|
||||||
|
if (pMsg->pBatchMasterMsg) {
|
||||||
|
++pMsg->pBatchMasterMsg->received;
|
||||||
|
if (pMsg->pBatchMasterMsg->successed + pMsg->pBatchMasterMsg->received
|
||||||
|
>= pMsg->pBatchMasterMsg->expected) {
|
||||||
|
dnodeSendRpcMWriteRsp(pMsg->pBatchMasterMsg, pMsg->code);
|
||||||
|
}
|
||||||
|
|
||||||
|
mnodeDestroySubMsg(pMsg);
|
||||||
|
|
||||||
|
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
} else {
|
} else {
|
||||||
mInfo("msg:%p, app:%p vgId:%d, is created in sdb, db:%s replica:%d", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId,
|
mInfo("msg:%p, app:%p vgId:%d, is created in sdb, db:%s replica:%d", pMsg, pMsg->rpcMsg.ahandle, pVgroup->vgId,
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <mach/mach_error.h>
|
#include <mach/mach_error.h>
|
||||||
#include <mach/semaphore.h>
|
#include <mach/semaphore.h>
|
||||||
#include <mach/task.h>
|
#include <mach/task.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
static pthread_t sem_thread;
|
static pthread_t sem_thread;
|
||||||
static pthread_once_t sem_once;
|
static pthread_once_t sem_once;
|
||||||
|
@ -288,7 +289,9 @@ bool taosCheckPthreadValid(pthread_t thread) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t taosGetSelfPthreadId() {
|
int64_t taosGetSelfPthreadId() {
|
||||||
return (int64_t)pthread_self();
|
uint64_t id;
|
||||||
|
pthread_threadid_np(0, &id);
|
||||||
|
return (int64_t) id;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t taosGetPthreadId(pthread_t thread) {
|
int64_t taosGetPthreadId(pthread_t thread) {
|
||||||
|
|
|
@ -31,7 +31,14 @@ int tsem_wait(tsem_t* sem) {
|
||||||
#ifndef TAOS_OS_FUNC_SEMPHONE_PTHREAD
|
#ifndef TAOS_OS_FUNC_SEMPHONE_PTHREAD
|
||||||
|
|
||||||
bool taosCheckPthreadValid(pthread_t thread) { return thread != 0; }
|
bool taosCheckPthreadValid(pthread_t thread) { return thread != 0; }
|
||||||
int64_t taosGetSelfPthreadId() { return (int64_t)pthread_self(); }
|
|
||||||
|
int64_t taosGetSelfPthreadId() {
|
||||||
|
static __thread int id = 0;
|
||||||
|
if (id != 0) return id;
|
||||||
|
id = syscall(SYS_gettid);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t taosGetPthreadId(pthread_t thread) { return (int64_t)thread; }
|
int64_t taosGetPthreadId(pthread_t thread) { return (int64_t)thread; }
|
||||||
void taosResetPthread(pthread_t *thread) { *thread = 0; }
|
void taosResetPthread(pthread_t *thread) { *thread = 0; }
|
||||||
bool taosComparePthread(pthread_t first, pthread_t second) { return first == second; }
|
bool taosComparePthread(pthread_t first, pthread_t second) { return first == second; }
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
bool taosCheckPthreadValid(pthread_t thread) { return thread.p != NULL; }
|
bool taosCheckPthreadValid(pthread_t thread) { return thread.p != NULL; }
|
||||||
|
|
||||||
|
@ -33,7 +34,9 @@ int64_t taosGetPthreadId(pthread_t thread) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t taosGetSelfPthreadId() { return taosGetPthreadId(pthread_self()); }
|
int64_t taosGetSelfPthreadId() {
|
||||||
|
return GetCurrentThreadId();
|
||||||
|
}
|
||||||
|
|
||||||
bool taosComparePthread(pthread_t first, pthread_t second) {
|
bool taosComparePthread(pthread_t first, pthread_t second) {
|
||||||
return first.p == second.p;
|
return first.p == second.p;
|
||||||
|
@ -55,4 +58,4 @@ int32_t taosGetCurrentAPPName(char *name, int32_t* len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -529,7 +529,7 @@ static void do_sum(SQLFunctionCtx *pCtx) {
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
uint64_t *retVal = (uint64_t *)pCtx->pOutput;
|
uint64_t *retVal = (uint64_t *)pCtx->pOutput;
|
||||||
*retVal += (uint64_t)pCtx->preAggVals.statis.sum;
|
*retVal += (uint64_t)pCtx->preAggVals.statis.sum;
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE || pCtx->inputType == TSDB_DATA_TYPE_FLOAT) {
|
} else if (IS_FLOAT_TYPE(pCtx->inputType)) {
|
||||||
double *retVal = (double*) pCtx->pOutput;
|
double *retVal = (double*) pCtx->pOutput;
|
||||||
*retVal += GET_DOUBLE_VAL((const char*)&(pCtx->preAggVals.statis.sum));
|
*retVal += GET_DOUBLE_VAL((const char*)&(pCtx->preAggVals.statis.sum));
|
||||||
}
|
}
|
||||||
|
@ -552,13 +552,13 @@ static void do_sum(SQLFunctionCtx *pCtx) {
|
||||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pCtx->inputType)) {
|
||||||
uint64_t *retVal = (uint64_t *)pCtx->pOutput;
|
uint64_t *retVal = (uint64_t *)pCtx->pOutput;
|
||||||
|
|
||||||
if (pCtx->inputType == TSDB_DATA_TYPE_TINYINT) {
|
if (pCtx->inputType == TSDB_DATA_TYPE_UTINYINT) {
|
||||||
LIST_ADD_N(*retVal, pCtx, pData, uint8_t, notNullElems, pCtx->inputType);
|
LIST_ADD_N(*retVal, pCtx, pData, uint8_t, notNullElems, pCtx->inputType);
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_SMALLINT) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_USMALLINT) {
|
||||||
LIST_ADD_N(*retVal, pCtx, pData, uint16_t, notNullElems, pCtx->inputType);
|
LIST_ADD_N(*retVal, pCtx, pData, uint16_t, notNullElems, pCtx->inputType);
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_INT) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_UINT) {
|
||||||
LIST_ADD_N(*retVal, pCtx, pData, uint32_t, notNullElems, pCtx->inputType);
|
LIST_ADD_N(*retVal, pCtx, pData, uint32_t, notNullElems, pCtx->inputType);
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_BIGINT) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_UBIGINT) {
|
||||||
LIST_ADD_N(*retVal, pCtx, pData, uint64_t, notNullElems, pCtx->inputType);
|
LIST_ADD_N(*retVal, pCtx, pData, uint64_t, notNullElems, pCtx->inputType);
|
||||||
}
|
}
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
@ -1051,7 +1051,7 @@ static void minMax_function(SQLFunctionCtx *pCtx, char *pOutput, int32_t isMin,
|
||||||
TYPED_LOOPCHECK_N(uint16_t, pOutput, p, pCtx, pCtx->inputType, isMin, *notNullElems);
|
TYPED_LOOPCHECK_N(uint16_t, pOutput, p, pCtx, pCtx->inputType, isMin, *notNullElems);
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_UINT) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_UINT) {
|
||||||
TYPED_LOOPCHECK_N(uint32_t, pOutput, p, pCtx, pCtx->inputType, isMin, *notNullElems);
|
TYPED_LOOPCHECK_N(uint32_t, pOutput, p, pCtx, pCtx->inputType, isMin, *notNullElems);
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_BIGINT) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_UBIGINT) {
|
||||||
TYPED_LOOPCHECK_N(uint64_t, pOutput, p, pCtx, pCtx->inputType, isMin, *notNullElems);
|
TYPED_LOOPCHECK_N(uint64_t, pOutput, p, pCtx, pCtx->inputType, isMin, *notNullElems);
|
||||||
}
|
}
|
||||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE) {
|
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
@ -2172,19 +2172,22 @@ static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData,
|
||||||
|
|
||||||
if (pInfo->num < maxLen) {
|
if (pInfo->num < maxLen) {
|
||||||
if (pInfo->num == 0 ||
|
if (pInfo->num == 0 ||
|
||||||
((type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) &&
|
(IS_SIGNED_NUMERIC_TYPE(type) && val.i64 >= pList[pInfo->num - 1]->v.i64) ||
|
||||||
val.i64 >= pList[pInfo->num - 1]->v.i64) ||
|
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 >= pList[pInfo->num - 1]->v.u64) ||
|
||||||
((type >= TSDB_DATA_TYPE_FLOAT && type <= TSDB_DATA_TYPE_DOUBLE) &&
|
(IS_FLOAT_TYPE(type) && val.dKey >= pList[pInfo->num - 1]->v.dKey)) {
|
||||||
val.dKey >= pList[pInfo->num - 1]->v.dKey)) {
|
|
||||||
valuePairAssign(pList[pInfo->num], type, (const char*)&val.i64, ts, pTags, pTagInfo, stage);
|
valuePairAssign(pList[pInfo->num], type, (const char*)&val.i64, ts, pTags, pTagInfo, stage);
|
||||||
} else {
|
} else {
|
||||||
int32_t i = pInfo->num - 1;
|
int32_t i = pInfo->num - 1;
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
if (type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) {
|
|
||||||
while (i >= 0 && pList[i]->v.i64 > val.i64) {
|
while (i >= 0 && pList[i]->v.i64 > val.i64) {
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
||||||
i -= 1;
|
i -= 1;
|
||||||
}
|
}
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
while (i >= 0 && pList[i]->v.u64 > val.u64) {
|
||||||
|
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
||||||
|
i -= 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
while (i >= 0 && pList[i]->v.dKey > val.dKey) {
|
while (i >= 0 && pList[i]->v.dKey > val.dKey) {
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
||||||
|
@ -2198,23 +2201,29 @@ static void do_top_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pData,
|
||||||
pInfo->num++;
|
pInfo->num++;
|
||||||
} else {
|
} else {
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
|
||||||
if (((type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) && val.i64 > pList[0]->v.i64) ||
|
if ((IS_SIGNED_NUMERIC_TYPE(type) && val.i64 > pList[0]->v.i64) ||
|
||||||
((type >= TSDB_DATA_TYPE_FLOAT && type <= TSDB_DATA_TYPE_DOUBLE) && val.dKey > pList[0]->v.dKey)) {
|
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 > pList[0]->v.u64) ||
|
||||||
|
(IS_FLOAT_TYPE(type) && val.dKey > pList[0]->v.dKey)) {
|
||||||
// find the appropriate the slot position
|
// find the appropriate the slot position
|
||||||
if (type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) {
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.i64 < val.i64) {
|
while (i + 1 < maxLen && pList[i + 1]->v.i64 < val.i64) {
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
} if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
while (i + 1 < maxLen && pList[i + 1]->v.u64 < val.u64) {
|
||||||
|
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.dKey < val.dKey) {
|
while (i + 1 < maxLen && pList[i + 1]->v.dKey < val.dKey) {
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
valuePairAssign(pList[i], type, (const char*) &val.i64, ts, pTags, pTagInfo, stage);
|
valuePairAssign(pList[i], type, (const char *)&val.i64, ts, pTags, pTagInfo, stage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2233,11 +2242,16 @@ static void do_bottom_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pDa
|
||||||
} else {
|
} else {
|
||||||
int32_t i = pInfo->num - 1;
|
int32_t i = pInfo->num - 1;
|
||||||
|
|
||||||
if (type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) {
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
while (i >= 0 && pList[i]->v.i64 < val.i64) {
|
while (i >= 0 && pList[i]->v.i64 < val.i64) {
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
||||||
i -= 1;
|
i -= 1;
|
||||||
}
|
}
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
while (i >= 0 && pList[i]->v.u64 < val.u64) {
|
||||||
|
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
||||||
|
i -= 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
while (i >= 0 && pList[i]->v.dKey < val.dKey) {
|
while (i >= 0 && pList[i]->v.dKey < val.dKey) {
|
||||||
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i + 1], pList[i], pTagInfo->tagsLen);
|
||||||
|
@ -2252,14 +2266,20 @@ static void do_bottom_function_add(STopBotInfo *pInfo, int32_t maxLen, void *pDa
|
||||||
} else {
|
} else {
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
|
||||||
if (((type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) && val.i64 < pList[0]->v.i64) ||
|
if ((IS_SIGNED_NUMERIC_TYPE(type) && val.i64 < pList[0]->v.i64) ||
|
||||||
((type >= TSDB_DATA_TYPE_FLOAT && type <= TSDB_DATA_TYPE_DOUBLE) && val.dKey < pList[0]->v.dKey)) {
|
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u64 < pList[0]->v.u64) ||
|
||||||
|
(IS_FLOAT_TYPE(type) && val.dKey < pList[0]->v.dKey)) {
|
||||||
// find the appropriate the slot position
|
// find the appropriate the slot position
|
||||||
if (type >= TSDB_DATA_TYPE_TINYINT && type <= TSDB_DATA_TYPE_BIGINT) {
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.i64 > val.i64) {
|
while (i + 1 < maxLen && pList[i + 1]->v.i64 > val.i64) {
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
} if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
while (i + 1 < maxLen && pList[i + 1]->v.u64 > val.u64) {
|
||||||
|
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
while (i + 1 < maxLen && pList[i + 1]->v.dKey > val.dKey) {
|
while (i + 1 < maxLen && pList[i + 1]->v.dKey > val.dKey) {
|
||||||
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
VALUEPAIRASSIGN(pList[i], pList[i + 1], pTagInfo->tagsLen);
|
||||||
|
@ -2289,19 +2309,24 @@ static int32_t resDataAscComparFn(const void *pLeft, const void *pRight) {
|
||||||
tValuePair *pLeftElem = *(tValuePair **)pLeft;
|
tValuePair *pLeftElem = *(tValuePair **)pLeft;
|
||||||
tValuePair *pRightElem = *(tValuePair **)pRight;
|
tValuePair *pRightElem = *(tValuePair **)pRight;
|
||||||
|
|
||||||
int32_t type = pLeftElem->v.nType;
|
if (IS_FLOAT_TYPE(pLeftElem->v.nType)) {
|
||||||
if (type == TSDB_DATA_TYPE_FLOAT || type == TSDB_DATA_TYPE_DOUBLE) {
|
|
||||||
if (pLeftElem->v.dKey == pRightElem->v.dKey) {
|
if (pLeftElem->v.dKey == pRightElem->v.dKey) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return pLeftElem->v.dKey > pRightElem->v.dKey ? 1 : -1;
|
return pLeftElem->v.dKey > pRightElem->v.dKey ? 1 : -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (IS_SIGNED_NUMERIC_TYPE(pLeftElem->v.nType)){
|
||||||
if (pLeftElem->v.i64 == pRightElem->v.i64) {
|
if (pLeftElem->v.i64 == pRightElem->v.i64) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return pLeftElem->v.i64 > pRightElem->v.i64 ? 1 : -1;
|
return pLeftElem->v.i64 > pRightElem->v.i64 ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (pLeftElem->v.u64 == pRightElem->v.u64) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return pLeftElem->v.u64 > pRightElem->v.u64 ? 1 : -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3034,17 +3059,17 @@ static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
||||||
numOfElem++;
|
numOfElem++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t *p = pData;
|
int64_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double *p = pData;
|
double *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float *p = pData;
|
float *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
|
@ -3054,12 +3079,32 @@ static void leastsquares_function(SQLFunctionCtx *pCtx) {
|
||||||
int16_t *p = pData;
|
int16_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t *p = pData;
|
int8_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
uint8_t *p = pData;
|
||||||
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
uint16_t *p = pData;
|
||||||
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
uint32_t *p = pData;
|
||||||
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
uint64_t *p = pData;
|
||||||
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].dKey);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->startVal = x;
|
pInfo->startVal = x;
|
||||||
|
@ -3956,6 +4001,58 @@ static int32_t twa_function_impl(SQLFunctionCtx* pCtx, int32_t index, int32_t si
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
|
uint8_t *val = (uint8_t*) GET_INPUT_DATA(pCtx, 0);
|
||||||
|
for (; i < size && i >= 0; i += step) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPoint1 st = {.key = tsList[i], .val = val[i]};
|
||||||
|
pInfo->dOutput += twa_get_area(pInfo->p, st);
|
||||||
|
pInfo->p = st;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
|
uint16_t *val = (uint16_t*) GET_INPUT_DATA(pCtx, 0);
|
||||||
|
for (; i < size && i >= 0; i += step) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPoint1 st = {.key = tsList[i], .val = val[i]};
|
||||||
|
pInfo->dOutput += twa_get_area(pInfo->p, st);
|
||||||
|
pInfo->p = st;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
|
uint32_t *val = (uint32_t*) GET_INPUT_DATA(pCtx, 0);
|
||||||
|
for (; i < size && i >= 0; i += step) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPoint1 st = {.key = tsList[i], .val = val[i]};
|
||||||
|
pInfo->dOutput += twa_get_area(pInfo->p, st);
|
||||||
|
pInfo->p = st;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
|
uint64_t *val = (uint64_t*) GET_INPUT_DATA(pCtx, 0);
|
||||||
|
for (; i < size && i >= 0; i += step) {
|
||||||
|
if (pCtx->hasNull && isNull((const char*) &val[i], pCtx->inputType)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPoint1 st = {.key = tsList[i], .val = (double) val[i]};
|
||||||
|
pInfo->dOutput += twa_get_area(pInfo->p, st);
|
||||||
|
pInfo->p = st;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: assert(0);
|
default: assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4743,7 +4743,11 @@ static FORCE_INLINE void setEnvForEachBlock(SQInfo* pQInfo, STableQueryInfo* pTa
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
||||||
setIntervalQueryRange(pQInfo, pBlockInfo->window.skey);
|
if (!QUERY_IS_ASC_QUERY(pRuntimeEnv->pQuery)) {
|
||||||
|
setIntervalQueryRange(pQInfo, pBlockInfo->window.ekey);
|
||||||
|
} else {
|
||||||
|
setIntervalQueryRange(pQInfo, pBlockInfo->window.skey);
|
||||||
|
}
|
||||||
} else { // non-interval query
|
} else { // non-interval query
|
||||||
setExecutionContext(pQInfo, pTableQueryInfo->groupIndex, pBlockInfo->window.ekey + step);
|
setExecutionContext(pQInfo, pTableQueryInfo->groupIndex, pBlockInfo->window.ekey + step);
|
||||||
}
|
}
|
||||||
|
|
|
@ -413,7 +413,55 @@ void tSqlSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType)
|
||||||
} else {
|
} else {
|
||||||
pField->bytes = pType->bytes;
|
pField->bytes = pType->bytes;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tryParseNameTwoParts(SStrToken *type) {
|
||||||
|
int32_t t = -1;
|
||||||
|
|
||||||
|
char* str = strndup(type->z, type->n);
|
||||||
|
if (str == NULL) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* p = strtok(str, " ");
|
||||||
|
if (p == NULL) {
|
||||||
|
tfree(str);
|
||||||
|
return t;
|
||||||
|
} else {
|
||||||
|
char* unsign = strtok(NULL, " ");
|
||||||
|
if (unsign == NULL) {
|
||||||
|
tfree(str);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncasecmp(unsign, "UNSIGNED", 8) == 0) {
|
||||||
|
for(int32_t j = TSDB_DATA_TYPE_TINYINT; j <= TSDB_DATA_TYPE_BIGINT; ++j) {
|
||||||
|
if (strcasecmp(p, tDataTypes[j].name) == 0) {
|
||||||
|
t = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tfree(str);
|
||||||
|
|
||||||
|
if (t == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(t) {
|
||||||
|
case TSDB_DATA_TYPE_TINYINT: return TSDB_DATA_TYPE_UTINYINT;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT: return TSDB_DATA_TYPE_USMALLINT;
|
||||||
|
case TSDB_DATA_TYPE_INT: return TSDB_DATA_TYPE_UINT;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT: return TSDB_DATA_TYPE_UBIGINT;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
tfree(str);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
||||||
|
@ -431,8 +479,12 @@ void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no qualified data type found, try unsigned data type
|
||||||
if (i == tListLen(tDataTypes)) {
|
if (i == tListLen(tDataTypes)) {
|
||||||
return;
|
i = tryParseNameTwoParts(type);
|
||||||
|
if (i == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pField->type = i;
|
pField->type = i;
|
||||||
|
|
|
@ -276,7 +276,8 @@ void *syncRestoreData(void *param) {
|
||||||
atomic_add_fetch_32(&tsSyncNum, 1);
|
atomic_add_fetch_32(&tsSyncNum, 1);
|
||||||
sInfo("%s, start to restore data, sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
|
sInfo("%s, start to restore data, sstatus:%s", pPeer->id, syncStatus[nodeSStatus]);
|
||||||
|
|
||||||
(*pNode->notifyRoleFp)(pNode->vgId, TAOS_SYNC_ROLE_SYNCING);
|
nodeRole = TAOS_SYNC_ROLE_SYNCING;
|
||||||
|
(*pNode->notifyRoleFp)(pNode->vgId, nodeRole);
|
||||||
|
|
||||||
if (syncOpenRecvBuffer(pNode) < 0) {
|
if (syncOpenRecvBuffer(pNode) < 0) {
|
||||||
sError("%s, failed to allocate recv buffer, restart connection", pPeer->id);
|
sError("%s, failed to allocate recv buffer, restart connection", pPeer->id);
|
||||||
|
|
|
@ -297,32 +297,14 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
||||||
__compar_fn_t comparFn = NULL;
|
__compar_fn_t comparFn = NULL;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
|
||||||
comparFn = compareInt16Val; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_INT: {
|
|
||||||
comparFn = compareInt32Val; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP: {
|
|
||||||
comparFn = compareInt64Val; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
case TSDB_DATA_TYPE_TINYINT:{
|
case TSDB_DATA_TYPE_TINYINT: comparFn = compareInt8Val; break;
|
||||||
comparFn = compareInt8Val; break;
|
case TSDB_DATA_TYPE_SMALLINT: comparFn = compareInt16Val; break;
|
||||||
}
|
case TSDB_DATA_TYPE_INT: comparFn = compareInt32Val; break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_TIMESTAMP: comparFn = compareInt64Val; break;
|
||||||
comparFn = compareFloatVal; break;
|
case TSDB_DATA_TYPE_FLOAT: comparFn = compareFloatVal; break;
|
||||||
}
|
case TSDB_DATA_TYPE_DOUBLE: comparFn = compareDoubleVal; break;
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
|
||||||
comparFn = compareDoubleVal; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_BINARY: {
|
case TSDB_DATA_TYPE_BINARY: {
|
||||||
if (optr == TSDB_RELATION_LIKE) { /* wildcard query using like operator */
|
if (optr == TSDB_RELATION_LIKE) { /* wildcard query using like operator */
|
||||||
comparFn = compareStrPatternComp;
|
comparFn = compareStrPatternComp;
|
||||||
|
@ -341,10 +323,14 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
||||||
} else {
|
} else {
|
||||||
comparFn = compareLenPrefixedWStr;
|
comparFn = compareLenPrefixedWStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT: comparFn = compareUint8Val; break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT: comparFn = compareUint16Val;break;
|
||||||
|
case TSDB_DATA_TYPE_UINT: comparFn = compareUint32Val;break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT: comparFn = compareUint64Val;break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
comparFn = compareInt32Val;
|
comparFn = compareInt32Val;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -28,10 +28,13 @@
|
||||||
#define MAX_LOGLINE_DUMP_CONTENT_SIZE (MAX_LOGLINE_DUMP_SIZE - 100)
|
#define MAX_LOGLINE_DUMP_CONTENT_SIZE (MAX_LOGLINE_DUMP_SIZE - 100)
|
||||||
|
|
||||||
#define LOG_FILE_NAME_LEN 300
|
#define LOG_FILE_NAME_LEN 300
|
||||||
#define TSDB_DEFAULT_LOG_BUF_SIZE (512 * 1024) // 512K
|
#define TSDB_DEFAULT_LOG_BUF_SIZE (20 * 1024 * 1024) // 20MB
|
||||||
#define TSDB_MIN_LOG_BUF_SIZE 1024 // 1K
|
|
||||||
#define TSDB_MAX_LOG_BUF_SIZE (1024 * 1024) // 1M
|
#define DEFAULT_LOG_INTERVAL 25
|
||||||
#define TSDB_DEFAULT_LOG_BUF_UNIT 1024 // 1K
|
#define LOG_INTERVAL_STEP 5
|
||||||
|
#define MIN_LOG_INTERVAL 5
|
||||||
|
#define MAX_LOG_INTERVAL 25
|
||||||
|
#define LOG_MAX_WAIT_MSEC 1000
|
||||||
|
|
||||||
#define LOG_BUF_BUFFER(x) ((x)->buffer)
|
#define LOG_BUF_BUFFER(x) ((x)->buffer)
|
||||||
#define LOG_BUF_START(x) ((x)->buffStart)
|
#define LOG_BUF_START(x) ((x)->buffStart)
|
||||||
|
@ -44,6 +47,7 @@ typedef struct {
|
||||||
int32_t buffStart;
|
int32_t buffStart;
|
||||||
int32_t buffEnd;
|
int32_t buffEnd;
|
||||||
int32_t buffSize;
|
int32_t buffSize;
|
||||||
|
int32_t minBuffSize;
|
||||||
int32_t fd;
|
int32_t fd;
|
||||||
int32_t stop;
|
int32_t stop;
|
||||||
pthread_t asyncThread;
|
pthread_t asyncThread;
|
||||||
|
@ -68,6 +72,15 @@ int8_t tsAsyncLog = 1;
|
||||||
float tsTotalLogDirGB = 0;
|
float tsTotalLogDirGB = 0;
|
||||||
float tsAvailLogDirGB = 0;
|
float tsAvailLogDirGB = 0;
|
||||||
float tsMinimalLogDirGB = 1.0f;
|
float tsMinimalLogDirGB = 1.0f;
|
||||||
|
int64_t asyncLogLostLines = 0;
|
||||||
|
int32_t writeInterval = DEFAULT_LOG_INTERVAL;
|
||||||
|
|
||||||
|
int64_t dbgEmptyW = 0;
|
||||||
|
int64_t dbgWN = 0;
|
||||||
|
int64_t dbgSmallWN = 0;
|
||||||
|
int64_t dbgBigWN = 0;
|
||||||
|
int64_t dbgWSize = 0;
|
||||||
|
|
||||||
#ifdef _TD_POWER_
|
#ifdef _TD_POWER_
|
||||||
char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/power";
|
char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/power";
|
||||||
#else
|
#else
|
||||||
|
@ -108,7 +121,8 @@ static void taosStopLog() {
|
||||||
|
|
||||||
void taosCloseLog() {
|
void taosCloseLog() {
|
||||||
taosStopLog();
|
taosStopLog();
|
||||||
tsem_post(&(tsLogObj.logHandle->buffNotEmpty));
|
//tsem_post(&(tsLogObj.logHandle->buffNotEmpty));
|
||||||
|
taosMsleep(MAX_LOG_INTERVAL/1000);
|
||||||
if (taosCheckPthreadValid(tsLogObj.logHandle->asyncThread)) {
|
if (taosCheckPthreadValid(tsLogObj.logHandle->asyncThread)) {
|
||||||
pthread_join(tsLogObj.logHandle->asyncThread, NULL);
|
pthread_join(tsLogObj.logHandle->asyncThread, NULL);
|
||||||
}
|
}
|
||||||
|
@ -365,7 +379,7 @@ void taosPrintLog(const char *flags, int32_t dflag, const char *format, ...) {
|
||||||
curTime = timeSecs.tv_sec;
|
curTime = timeSecs.tv_sec;
|
||||||
ptm = localtime_r(&curTime, &Tm);
|
ptm = localtime_r(&curTime, &Tm);
|
||||||
|
|
||||||
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%08" PRIx64 " ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
||||||
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId());
|
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId());
|
||||||
len += sprintf(buffer + len, "%s", flags);
|
len += sprintf(buffer + len, "%s", flags);
|
||||||
|
|
||||||
|
@ -451,7 +465,7 @@ void taosPrintLongString(const char *flags, int32_t dflag, const char *format, .
|
||||||
curTime = timeSecs.tv_sec;
|
curTime = timeSecs.tv_sec;
|
||||||
ptm = localtime_r(&curTime, &Tm);
|
ptm = localtime_r(&curTime, &Tm);
|
||||||
|
|
||||||
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%08" PRIx64 " ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
||||||
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId());
|
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId());
|
||||||
len += sprintf(buffer + len, "%s", flags);
|
len += sprintf(buffer + len, "%s", flags);
|
||||||
|
|
||||||
|
@ -497,8 +511,6 @@ static void taosCloseLogByFd(int32_t fd) {
|
||||||
static SLogBuff *taosLogBuffNew(int32_t bufSize) {
|
static SLogBuff *taosLogBuffNew(int32_t bufSize) {
|
||||||
SLogBuff *tLogBuff = NULL;
|
SLogBuff *tLogBuff = NULL;
|
||||||
|
|
||||||
if (bufSize < TSDB_MIN_LOG_BUF_SIZE || bufSize > TSDB_MAX_LOG_BUF_SIZE) return NULL;
|
|
||||||
|
|
||||||
tLogBuff = calloc(1, sizeof(SLogBuff));
|
tLogBuff = calloc(1, sizeof(SLogBuff));
|
||||||
if (tLogBuff == NULL) return NULL;
|
if (tLogBuff == NULL) return NULL;
|
||||||
|
|
||||||
|
@ -507,10 +519,11 @@ static SLogBuff *taosLogBuffNew(int32_t bufSize) {
|
||||||
|
|
||||||
LOG_BUF_START(tLogBuff) = LOG_BUF_END(tLogBuff) = 0;
|
LOG_BUF_START(tLogBuff) = LOG_BUF_END(tLogBuff) = 0;
|
||||||
LOG_BUF_SIZE(tLogBuff) = bufSize;
|
LOG_BUF_SIZE(tLogBuff) = bufSize;
|
||||||
|
tLogBuff->minBuffSize = bufSize / 10;
|
||||||
tLogBuff->stop = 0;
|
tLogBuff->stop = 0;
|
||||||
|
|
||||||
if (pthread_mutex_init(&LOG_BUF_MUTEX(tLogBuff), NULL) < 0) goto _err;
|
if (pthread_mutex_init(&LOG_BUF_MUTEX(tLogBuff), NULL) < 0) goto _err;
|
||||||
tsem_init(&(tLogBuff->buffNotEmpty), 0, 0);
|
//tsem_init(&(tLogBuff->buffNotEmpty), 0, 0);
|
||||||
|
|
||||||
return tLogBuff;
|
return tLogBuff;
|
||||||
|
|
||||||
|
@ -529,24 +542,7 @@ static void taosLogBuffDestroy(SLogBuff *tLogBuff) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int32_t taosPushLogBuffer(SLogBuff *tLogBuff, char *msg, int32_t msgLen) {
|
static void taosCopyLogBuffer(SLogBuff *tLogBuff, int32_t start, int32_t end, char *msg, int32_t msgLen) {
|
||||||
int32_t start = 0;
|
|
||||||
int32_t end = 0;
|
|
||||||
int32_t remainSize = 0;
|
|
||||||
|
|
||||||
if (tLogBuff == NULL || tLogBuff->stop) return -1;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&LOG_BUF_MUTEX(tLogBuff));
|
|
||||||
start = LOG_BUF_START(tLogBuff);
|
|
||||||
end = LOG_BUF_END(tLogBuff);
|
|
||||||
|
|
||||||
remainSize = (start > end) ? (end - start - 1) : (start + LOG_BUF_SIZE(tLogBuff) - end - 1);
|
|
||||||
|
|
||||||
if (remainSize <= msgLen) {
|
|
||||||
pthread_mutex_unlock(&LOG_BUF_MUTEX(tLogBuff));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start > end) {
|
if (start > end) {
|
||||||
memcpy(LOG_BUF_BUFFER(tLogBuff) + end, msg, msgLen);
|
memcpy(LOG_BUF_BUFFER(tLogBuff) + end, msg, msgLen);
|
||||||
} else {
|
} else {
|
||||||
|
@ -558,61 +554,144 @@ static int32_t taosPushLogBuffer(SLogBuff *tLogBuff, char *msg, int32_t msgLen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG_BUF_END(tLogBuff) = (LOG_BUF_END(tLogBuff) + msgLen) % LOG_BUF_SIZE(tLogBuff);
|
LOG_BUF_END(tLogBuff) = (LOG_BUF_END(tLogBuff) + msgLen) % LOG_BUF_SIZE(tLogBuff);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO : put string in the buffer
|
static int32_t taosPushLogBuffer(SLogBuff *tLogBuff, char *msg, int32_t msgLen) {
|
||||||
|
int32_t start = 0;
|
||||||
|
int32_t end = 0;
|
||||||
|
int32_t remainSize = 0;
|
||||||
|
static int64_t lostLine = 0;
|
||||||
|
char tmpBuf[40] = {0};
|
||||||
|
int32_t tmpBufLen = 0;
|
||||||
|
|
||||||
tsem_post(&(tLogBuff->buffNotEmpty));
|
if (tLogBuff == NULL || tLogBuff->stop) return -1;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOG_BUF_MUTEX(tLogBuff));
|
||||||
|
start = LOG_BUF_START(tLogBuff);
|
||||||
|
end = LOG_BUF_END(tLogBuff);
|
||||||
|
|
||||||
|
remainSize = (start > end) ? (start - end - 1) : (start + LOG_BUF_SIZE(tLogBuff) - end - 1);
|
||||||
|
|
||||||
|
if (lostLine > 0) {
|
||||||
|
sprintf(tmpBuf, "...Lost %"PRId64" lines here...\n", lostLine);
|
||||||
|
tmpBufLen = (int32_t)strlen(tmpBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remainSize <= msgLen || ((lostLine > 0) && (remainSize <= (msgLen + tmpBufLen)))) {
|
||||||
|
lostLine++;
|
||||||
|
asyncLogLostLines++;
|
||||||
|
pthread_mutex_unlock(&LOG_BUF_MUTEX(tLogBuff));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lostLine > 0) {
|
||||||
|
taosCopyLogBuffer(tLogBuff, start, end, tmpBuf, tmpBufLen);
|
||||||
|
lostLine = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosCopyLogBuffer(tLogBuff, LOG_BUF_START(tLogBuff), LOG_BUF_END(tLogBuff), msg, msgLen);
|
||||||
|
|
||||||
|
//int32_t w = atomic_sub_fetch_32(&waitLock, 1);
|
||||||
|
/*
|
||||||
|
if (w <= 0 || ((remainSize - msgLen - tmpBufLen) < (LOG_BUF_SIZE(tLogBuff) * 4 /5))) {
|
||||||
|
tsem_post(&(tLogBuff->buffNotEmpty));
|
||||||
|
dbgPostN++;
|
||||||
|
} else {
|
||||||
|
dbgNoPostN++;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
pthread_mutex_unlock(&LOG_BUF_MUTEX(tLogBuff));
|
pthread_mutex_unlock(&LOG_BUF_MUTEX(tLogBuff));
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t taosPollLogBuffer(SLogBuff *tLogBuff, char *buf, int32_t bufSize) {
|
static int32_t taosGetLogRemainSize(SLogBuff *tLogBuff, int32_t start, int32_t end) {
|
||||||
int32_t start = LOG_BUF_START(tLogBuff);
|
int32_t rSize = end - start;
|
||||||
int32_t end = LOG_BUF_END(tLogBuff);
|
|
||||||
int32_t pollSize = 0;
|
|
||||||
|
|
||||||
if (start == end) {
|
return rSize >= 0 ? rSize : LOG_BUF_SIZE(tLogBuff) + rSize;
|
||||||
return 0;
|
}
|
||||||
} else if (start < end) {
|
|
||||||
pollSize = MIN(end - start, bufSize);
|
|
||||||
|
|
||||||
memcpy(buf, LOG_BUF_BUFFER(tLogBuff) + start, pollSize);
|
static void taosWriteLog(SLogBuff *tLogBuff) {
|
||||||
return pollSize;
|
static int32_t lastDuration = 0;
|
||||||
} else {
|
int32_t remainChecked = 0;
|
||||||
pollSize = MIN(end + LOG_BUF_SIZE(tLogBuff) - start, bufSize);
|
int32_t start, end, pollSize;
|
||||||
if (pollSize > LOG_BUF_SIZE(tLogBuff) - start) {
|
|
||||||
int32_t tsize = LOG_BUF_SIZE(tLogBuff) - start;
|
do {
|
||||||
memcpy(buf, LOG_BUF_BUFFER(tLogBuff) + start, tsize);
|
if (remainChecked == 0) {
|
||||||
memcpy(buf + tsize, LOG_BUF_BUFFER(tLogBuff), pollSize - tsize);
|
start = LOG_BUF_START(tLogBuff);
|
||||||
|
end = LOG_BUF_END(tLogBuff);
|
||||||
|
|
||||||
} else {
|
if (start == end) {
|
||||||
memcpy(buf, LOG_BUF_BUFFER(tLogBuff) + start, pollSize);
|
dbgEmptyW++;
|
||||||
|
writeInterval = MAX_LOG_INTERVAL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pollSize = taosGetLogRemainSize(tLogBuff, start, end);
|
||||||
|
if (pollSize < tLogBuff->minBuffSize) {
|
||||||
|
lastDuration += writeInterval;
|
||||||
|
if (lastDuration < LOG_MAX_WAIT_MSEC) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lastDuration = 0;
|
||||||
}
|
}
|
||||||
return pollSize;
|
|
||||||
}
|
if (start < end) {
|
||||||
|
taosWrite(tLogBuff->fd, LOG_BUF_BUFFER(tLogBuff) + start, pollSize);
|
||||||
|
} else {
|
||||||
|
int32_t tsize = LOG_BUF_SIZE(tLogBuff) - start;
|
||||||
|
taosWrite(tLogBuff->fd, LOG_BUF_BUFFER(tLogBuff) + start, tsize);
|
||||||
|
|
||||||
|
taosWrite(tLogBuff->fd, LOG_BUF_BUFFER(tLogBuff), end);
|
||||||
|
}
|
||||||
|
|
||||||
|
dbgWN++;
|
||||||
|
dbgWSize+=pollSize;
|
||||||
|
|
||||||
|
if (pollSize < tLogBuff->minBuffSize) {
|
||||||
|
dbgSmallWN++;
|
||||||
|
if (writeInterval < MAX_LOG_INTERVAL) {
|
||||||
|
writeInterval += LOG_INTERVAL_STEP;
|
||||||
|
}
|
||||||
|
} else if (pollSize > LOG_BUF_SIZE(tLogBuff)/3) {
|
||||||
|
dbgBigWN++;
|
||||||
|
writeInterval = MIN_LOG_INTERVAL;
|
||||||
|
} else if (pollSize > LOG_BUF_SIZE(tLogBuff)/4) {
|
||||||
|
if (writeInterval > MIN_LOG_INTERVAL) {
|
||||||
|
writeInterval -= LOG_INTERVAL_STEP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_BUF_START(tLogBuff) = (LOG_BUF_START(tLogBuff) + pollSize) % LOG_BUF_SIZE(tLogBuff);
|
||||||
|
|
||||||
|
start = LOG_BUF_START(tLogBuff);
|
||||||
|
end = LOG_BUF_END(tLogBuff);
|
||||||
|
|
||||||
|
pollSize = taosGetLogRemainSize(tLogBuff, start, end);
|
||||||
|
if (pollSize < tLogBuff->minBuffSize) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeInterval = MIN_LOG_INTERVAL;
|
||||||
|
|
||||||
|
remainChecked = 1;
|
||||||
|
}while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *taosAsyncOutputLog(void *param) {
|
static void *taosAsyncOutputLog(void *param) {
|
||||||
SLogBuff *tLogBuff = (SLogBuff *)param;
|
SLogBuff *tLogBuff = (SLogBuff *)param;
|
||||||
int32_t log_size = 0;
|
|
||||||
|
|
||||||
char tempBuffer[TSDB_DEFAULT_LOG_BUF_UNIT];
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
tsem_wait(&(tLogBuff->buffNotEmpty));
|
//tsem_wait(&(tLogBuff->buffNotEmpty));
|
||||||
|
|
||||||
|
taosMsleep(writeInterval);
|
||||||
|
|
||||||
// Polling the buffer
|
// Polling the buffer
|
||||||
while (1) {
|
taosWriteLog(tLogBuff);
|
||||||
log_size = taosPollLogBuffer(tLogBuff, tempBuffer, TSDB_DEFAULT_LOG_BUF_UNIT);
|
|
||||||
if (log_size) {
|
|
||||||
taosWrite(tLogBuff->fd, tempBuffer, log_size);
|
|
||||||
LOG_BUF_START(tLogBuff) = (LOG_BUF_START(tLogBuff) + log_size) % LOG_BUF_SIZE(tLogBuff);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tLogBuff->stop) break;
|
if (tLogBuff->stop) break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ void taosNotePrint(SNoteObj *pNote, const char *const format, ...) {
|
||||||
gettimeofday(&timeSecs, NULL);
|
gettimeofday(&timeSecs, NULL);
|
||||||
curTime = timeSecs.tv_sec;
|
curTime = timeSecs.tv_sec;
|
||||||
ptm = localtime_r(&curTime, &Tm);
|
ptm = localtime_r(&curTime, &Tm);
|
||||||
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d 0x%08" PRIx64 " ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
len = sprintf(buffer, "%02d/%02d %02d:%02d:%02d.%06d %08" PRId64 " ", ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour,
|
||||||
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId());
|
ptm->tm_min, ptm->tm_sec, (int32_t)timeSecs.tv_usec, taosGetSelfPthreadId());
|
||||||
va_start(argpointer, format);
|
va_start(argpointer, format);
|
||||||
len += vsnprintf(buffer + len, MAX_NOTE_LINE_SIZE - len, format, argpointer);
|
len += vsnprintf(buffer + len, MAX_NOTE_LINE_SIZE - len, format, argpointer);
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.18</version>
|
<version>2.0.20</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.19</version>
|
<version>2.0.20</version>
|
||||||
<!-- <scope>system</scope>-->
|
<!-- <scope>system</scope>-->
|
||||||
<!-- <systemPath>${project.basedir}/src/main/resources/lib/taos-jdbcdriver-2.0.15-dist.jar</systemPath>-->
|
<!-- <systemPath>${project.basedir}/src/main/resources/lib/taos-jdbcdriver-2.0.15-dist.jar</systemPath>-->
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
|
@ -1,4 +1,11 @@
|
||||||
|
```
|
||||||
|
cd tests/examples/JDBC/taosdemo
|
||||||
|
mvn clean package -Dmaven.test.skip=true
|
||||||
|
# 先建表,再插入的
|
||||||
|
java -jar target/taosdemo-2.0-jar-with-dependencies.jar -host [hostname] -database [database] -doCreateTable true -superTableSQL "create table weather(ts timestamp, f1 int) tags(t1 nchar(4))" -numOfTables 1000 -numOfRowsPerTable 100000000 -numOfThreadsForInsert 10 -numOfTablesPerSQL 10 -numOfValuesPerSQL 100
|
||||||
|
# 不建表,直接插入的
|
||||||
|
java -jar target/taosdemo-2.0-jar-with-dependencies.jar -host [hostname] -database [database] -doCreateTable false -superTableSQL "create table weather(ts timestamp, f1 int) tags(t1 nchar(4))" -numOfTables 1000 -numOfRowsPerTable 100000000 -numOfThreadsForInsert 10 -numOfTablesPerSQL 10 -numOfValuesPerSQL 100
|
||||||
|
```
|
||||||
|
|
||||||
需求:
|
需求:
|
||||||
1. 可以读lowa的配置文件
|
1. 可以读lowa的配置文件
|
||||||
|
|
|
@ -35,7 +35,7 @@ public class TaosDemoApplication {
|
||||||
final DatabaseService databaseService = new DatabaseService(dataSource);
|
final DatabaseService databaseService = new DatabaseService(dataSource);
|
||||||
final SuperTableService superTableService = new SuperTableService(dataSource);
|
final SuperTableService superTableService = new SuperTableService(dataSource);
|
||||||
final SubTableService subTableService = new SubTableService(dataSource);
|
final SubTableService subTableService = new SubTableService(dataSource);
|
||||||
final QueryService queryService = new QueryService(dataSource);
|
|
||||||
// 创建数据库
|
// 创建数据库
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
Map<String, String> databaseParam = new HashMap<>();
|
Map<String, String> databaseParam = new HashMap<>();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
jdbc.driver=com.taosdata.jdbc.rs.RestfulDriver
|
jdbc.driver=com.taosdata.jdbc.rs.RestfulDriver
|
||||||
#jdbc.driver=com.taosdata.jdbc.TSDBDriver
|
#jdbc.driver=com.taosdata.jdbc.TSDBDriver
|
||||||
hikari.maximum-pool-size=1
|
hikari.maximum-pool-size=20
|
||||||
hikari.minimum-idle=1
|
hikari.minimum-idle=20
|
||||||
hikari.max-lifetime=0
|
hikari.max-lifetime=0
|
|
@ -22,6 +22,7 @@ python3 ./test.py -f insert/insertIntoTwoTables.py
|
||||||
#python3 ./test.py -f insert/before_1970.py
|
#python3 ./test.py -f insert/before_1970.py
|
||||||
python3 ./test.py -f insert/metadataUpdate.py
|
python3 ./test.py -f insert/metadataUpdate.py
|
||||||
python3 bug2265.py
|
python3 bug2265.py
|
||||||
|
python3 ./test.py -f insert/boundary2.py
|
||||||
|
|
||||||
#table
|
#table
|
||||||
python3 ./test.py -f table/alter_wal0.py
|
python3 ./test.py -f table/alter_wal0.py
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
###################################################################
|
||||||
|
# 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 random
|
||||||
|
import string
|
||||||
|
import time
|
||||||
|
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)
|
||||||
|
|
||||||
|
self.ts = 1538548685000
|
||||||
|
|
||||||
|
def get_random_string(self, length):
|
||||||
|
letters = string.ascii_lowercase
|
||||||
|
result_str = ''.join(random.choice(letters) for i in range(length))
|
||||||
|
return result_str
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
|
||||||
|
startTime = time.time()
|
||||||
|
print("==============step1")
|
||||||
|
sql = "create table stb(ts timestamp, "
|
||||||
|
for i in range(1022):
|
||||||
|
sql += "col%d binary(14), " % (i + 1)
|
||||||
|
sql += "col1023 binary(22))"
|
||||||
|
tdSql.execute(sql)
|
||||||
|
|
||||||
|
for i in range(4096):
|
||||||
|
sql = "insert into stb values(%d, "
|
||||||
|
for j in range(1022):
|
||||||
|
str = "'%s', " % self.get_random_string(14)
|
||||||
|
sql += str
|
||||||
|
sql += "'%s')" % self.get_random_string(22)
|
||||||
|
tdSql.execute(sql % (self.ts + i))
|
||||||
|
|
||||||
|
tdSql.query("select * from stb")
|
||||||
|
tdSql.checkRows(4096)
|
||||||
|
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
tdDnodes.start(1)
|
||||||
|
|
||||||
|
tdSql.query("select * from stb")
|
||||||
|
tdSql.checkRows(4096)
|
||||||
|
|
||||||
|
endTime = time.time()
|
||||||
|
|
||||||
|
print("total time %ds" % (endTime - startTime))
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
Loading…
Reference in New Issue