diff --git a/.travis.yml b/.travis.yml
index 9aac6c597cd9608c293b3d0f9b49c0db3fa5d9a4..d814a465e67468fc05c2d03b62c092a9c5130e22 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -270,19 +270,20 @@ matrix:
fi
- make > /dev/null
-# - os: osx
-# language: c
-# compiler: clang
-# env: DESC="mac/clang build"
-# git:
-# - depth: 1
-# addons:
-# homebrew:
-# - cmake
-#
-# script:
-# - cd ${TRAVIS_BUILD_DIR}
-# - mkdir debug
-# - cd debug
-# - cmake .. > /dev/null
-# - make > /dev/null
+ - os: osx
+ osx_image: xcode11.4
+ language: c
+ compiler: clang
+ env: DESC="mac/clang build"
+ git:
+ - depth: 1
+ addons:
+ homebrew:
+ - cmake
+
+ script:
+ - cd ${TRAVIS_BUILD_DIR}
+ - mkdir debug
+ - cd debug
+ - cmake .. > /dev/null
+ - make > /dev/null
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7ac06c165d3d51f27f9072387a214a19978f432e..315036d115c091ab2a90846b65886e254918a4c2 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,7 +30,7 @@ MESSAGE(STATUS "Community directory: " ${TD_COMMUNITY_DIR})
INCLUDE(cmake/input.inc)
INCLUDE(cmake/platform.inc)
-IF (TD_WINDOWS)
+IF (TD_WINDOWS OR TD_DARWIN)
SET(TD_SOMODE_STATIC TRUE)
ENDIF ()
diff --git a/Jenkinsfile b/Jenkinsfile
index 73bb832d8ea4c16d65f6fff88cb8844415c19f9c..516b179dce12184f6841ddb3d007781d216345cd 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -176,5 +176,84 @@ pipeline {
}
}
}
+ post {
+
+ success {
+ emailext (
+ subject: "PR-result: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
+ body: '''
+
+
+
+
+
+
+
+
+ 构建信息
+
|
+
+
+
+
+
+ - 构建名称>>分支:${PROJECT_NAME}
+ - 构建结果: Successful
+ - 构建编号:${BUILD_NUMBER}
+ - 触发用户:${CAUSE}
+ - 提交信息:${CHANGE_TITLE}
+ - 构建地址:${BUILD_URL}
+ - 构建日志:${BUILD_URL}console
+ - 变更集:${JELLY_SCRIPT}
+
+
+ |
+
+
+
+ ''',
+ to: "${env.CHANGE_AUTHOR_EMAIL}",
+ from: "support@taosdata.com"
+ )
+ }
+ failure {
+ emailext (
+ subject: "PR-result: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
+ body: '''
+
+
+
+
+
+
+
+
+ 构建信息
+
|
+
+
+
+
+
+ - 构建名称>>分支:${PROJECT_NAME}
+ - 构建结果: Successful
+ - 构建编号:${BUILD_NUMBER}
+ - 触发用户:${CAUSE}
+ - 提交信息:${CHANGE_TITLE}
+ - 构建地址:${BUILD_URL}
+ - 构建日志:${BUILD_URL}console
+ - 变更集:${JELLY_SCRIPT}
+
+
+ |
+
+
+
+ ''',
+ to: "${env.CHANGE_AUTHOR_EMAIL}",
+ from: "support@taosdata.com"
+ )
+ }
+ }
}
diff --git a/README.md b/README.md
index fafcdc8321aab717d0d900819bdd1e7b974e20a2..ded262b6741aff4ec94187295c97c8ce7cf20a31 100644
--- a/README.md
+++ b/README.md
@@ -126,7 +126,7 @@ cmake .. -DCPUTYPE=aarch32 && cmake --build .
If you use the Visual Studio 2013, please open a command window by executing "cmd.exe".
Please specify "x86_amd64" for 64 bits Windows or specify "x86" is for 32 bits Windows when you execute vcvarsall.bat.
-```
+```cmd
mkdir debug && cd debug
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" < x86_amd64 | x86 >
cmake .. -G "NMake Makefiles"
@@ -137,7 +137,8 @@ If you use the Visual Studio 2019 or 2017:
please open a command window by executing "cmd.exe".
Please specify "x64" for 64 bits Windows or specify "x86" is for 32 bits Windows when you execute vcvarsall.bat.
-```
+
+```cmd
mkdir debug && cd debug
"c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" < x64 | x86 >
cmake .. -G "NMake Makefiles"
@@ -145,27 +146,37 @@ nmake
```
Or, you can simply open a command window by clicking Windows Start -> "Visual Studio < 2019 | 2017 >" folder -> "x64 Native Tools Command Prompt for VS < 2019 | 2017 >" or "x86 Native Tools Command Prompt for VS < 2019 | 2017 >" depends what architecture your Windows is, then execute commands as follows:
-```
+```cmd
mkdir debug && cd debug
cmake .. -G "NMake Makefiles"
nmake
```
+### On Mac OS X platform
+
+Please install XCode command line tools and cmake. Verified with XCode 11.4+ on Catalina and Big Sur.
+
+```shell
+mkdir debug && cd debug
+cmake .. && cmake --build .
+```
+
# Quick Run
+
# Quick Run
To quickly start a TDengine server after building, run the command below in terminal:
-```cmd
+```bash
./build/bin/taosd -c test/cfg
```
In another terminal, use the TDengine shell to connect the server:
-```
+```bash
./build/bin/taos -c test/cfg
```
option "-c test/cfg" specifies the system configuration file directory.
# Installing
After building successfully, TDengine can be installed by:
-```cmd
+```bash
make install
```
Users can find more information about directories installed on the system in the [directory and files](https://www.taosdata.com/en/documentation/administrator/#Directory-and-Files) section. It should be noted that installing from source code does not configure service management for TDengine.
diff --git a/cmake/define.inc b/cmake/define.inc
index 9ee7b34e6af43ff19e0709f8b62f2aeffc98fc88..91adfa64c329a8c50ed6df068044f3fb1a23a849 100755
--- a/cmake/define.inc
+++ b/cmake/define.inc
@@ -128,6 +128,8 @@ IF (TD_DARWIN_64)
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -Wno-missing-braces -fPIC -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
SET(DEBUG_FLAGS "-O0 -g3 -DDEBUG")
SET(RELEASE_FLAGS "-Og")
+ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
+ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/lz4/inc)
ENDIF ()
IF (TD_WINDOWS)
diff --git a/cmake/install.inc b/cmake/install.inc
index a5b01f43cb7e8a302a9cf2d6d7ef48ddb8ed944e..2f0404334c06125e6ee8241ab91b22064ab20b89 100755
--- a/cmake/install.inc
+++ b/cmake/install.inc
@@ -32,7 +32,7 @@ ELSEIF (TD_WINDOWS)
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
IF (TD_MVN_INSTALLED)
- INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.17-dist.jar DESTINATION connector/jdbc)
+ INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.18-dist.jar DESTINATION connector/jdbc)
ENDIF ()
ELSEIF (TD_DARWIN)
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt
index 1d725add214f0e96d1a60aa9b889899790a4aef1..1e59396c702dfa9c67eee09a3aed5cc6b421abf4 100644
--- a/deps/CMakeLists.txt
+++ b/deps/CMakeLists.txt
@@ -12,4 +12,8 @@ ADD_SUBDIRECTORY(MsvcLibX)
IF (TD_LINUX AND TD_MQTT)
ADD_SUBDIRECTORY(MQTT-C)
-ENDIF ()
\ No newline at end of file
+ENDIF ()
+
+IF (TD_DARWIN AND TD_MQTT)
+ ADD_SUBDIRECTORY(MQTT-C)
+ENDIF ()
diff --git a/documentation20/webdocs/markdowndocs/connector-java-ch.md b/documentation20/webdocs/markdowndocs/connector-java-ch.md
index b8390e7af50569b62f031c5a3af3020d43b6f98a..0654ccd1b9219231e9dfae8fd98f188250b159e4 100644
--- a/documentation20/webdocs/markdowndocs/connector-java-ch.md
+++ b/documentation20/webdocs/markdowndocs/connector-java-ch.md
@@ -2,7 +2,7 @@
TDengine 提供了遵循 JDBC 标准(3.0)API 规范的 `taos-jdbcdriver` 实现,可在 maven 的中央仓库 [Sonatype Repository][1] 搜索下载。
-`taos-jdbcdriver` 的实现包括 2 种形式: JDBC-JNI 和 JDBC-RESTful(taos-jdbcdriver-2.0.17 开始支持 JDBC-RESTful)。 JDBC-JNI 通过调用客户端 libtaos.so(或 taos.dll )的本地方法实现, JDBC-RESTful 则在内部封装了 RESTful 接口实现。
+`taos-jdbcdriver` 的实现包括 2 种形式: JDBC-JNI 和 JDBC-RESTful(taos-jdbcdriver-2.0.18 开始支持 JDBC-RESTful)。 JDBC-JNI 通过调用客户端 libtaos.so(或 taos.dll )的本地方法实现, JDBC-RESTful 则在内部封装了 RESTful 接口实现。
![tdengine-connector](../assets/tdengine-jdbc-connector.png)
@@ -67,7 +67,7 @@ maven 项目中使用如下 pom.xml 配置即可:
com.taosdata.jdbc
taos-jdbcdriver
- 2.0.17
+ 2.0.18
```
@@ -334,16 +334,17 @@ conn.close();
```java
public static void main(String[] args) throws SQLException {
HikariConfig config = new HikariConfig();
+ // jdbc properties
config.setJdbcUrl("jdbc:TAOS://127.0.0.1:6030/log");
config.setUsername("root");
config.setPassword("taosdata");
-
- config.setMinimumIdle(3); //minimum number of idle connection
+ // connection pool configurations
+ config.setMinimumIdle(10); //minimum number of idle connection
config.setMaximumPoolSize(10); //maximum number of connection in the pool
- config.setConnectionTimeout(10000); //maximum wait milliseconds for get connection from pool
- config.setIdleTimeout(60000); // max idle time for recycle idle connection
- config.setConnectionTestQuery("describe log.dn"); //validation query
- config.setValidationTimeout(3000); //validation query timeout
+ config.setConnectionTimeout(30000); //maximum wait milliseconds for get connection from pool
+ config.setMaxLifetime(0); // maximum life time for each connection
+ config.setIdleTimeout(0); // max idle time for recycle idle connection
+ config.setConnectionTestQuery("select server_status()"); //validation query
HikariDataSource ds = new HikariDataSource(config); //create datasource
@@ -375,32 +376,22 @@ conn.close();
* 使用示例如下:
```java
public static void main(String[] args) throws Exception {
- Properties properties = new Properties();
- properties.put("driverClassName","com.taosdata.jdbc.TSDBDriver");
- properties.put("url","jdbc:TAOS://127.0.0.1:6030/log");
- properties.put("username","root");
- properties.put("password","taosdata");
-
- properties.put("maxActive","10"); //maximum number of connection in the pool
- properties.put("initialSize","3");//initial number of connection
- properties.put("maxWait","10000");//maximum wait milliseconds for get connection from pool
- properties.put("minIdle","3");//minimum number of connection in the pool
-
- properties.put("timeBetweenEvictionRunsMillis","3000");// the interval milliseconds to test connection
-
- properties.put("minEvictableIdleTimeMillis","60000");//the minimum milliseconds to keep idle
- properties.put("maxEvictableIdleTimeMillis","90000");//the maximum milliseconds to keep idle
- properties.put("validationQuery","describe log.dn"); //validation query
- properties.put("testWhileIdle","true"); // test connection while idle
- properties.put("testOnBorrow","false"); // don't need while testWhileIdle is true
- properties.put("testOnReturn","false"); // don't need while testWhileIdle is true
-
- //create druid datasource
- DataSource ds = DruidDataSourceFactory.createDataSource(properties);
- Connection connection = ds.getConnection(); // get connection
+ DruidDataSource dataSource = new DruidDataSource();
+ // jdbc properties
+ dataSource.setDriverClassName("com.taosdata.jdbc.TSDBDriver");
+ dataSource.setUrl(url);
+ dataSource.setUsername("root");
+ dataSource.setPassword("taosdata");
+ // pool configurations
+ dataSource.setInitialSize(10);
+ dataSource.setMinIdle(10);
+ dataSource.setMaxActive(10);
+ dataSource.setMaxWait(30000);
+ dataSource.setValidationQuery("select server_status()");
+
+ Connection connection = dataSource.getConnection(); // get connection
Statement statement = connection.createStatement(); // get statement
-
//query or insert
// ...
diff --git a/packaging/deb/makedeb.sh b/packaging/deb/makedeb.sh
index 431093be950e2c2bb199ed294b57641290fe6221..a2f58619dfa28a3fb28e2a2dbe7edb0ca7f8265d 100755
--- a/packaging/deb/makedeb.sh
+++ b/packaging/deb/makedeb.sh
@@ -43,6 +43,7 @@ mkdir -p ${pkg_dir}${install_home_path}/include
mkdir -p ${pkg_dir}${install_home_path}/init.d
mkdir -p ${pkg_dir}${install_home_path}/script
+echo "" > ${pkg_dir}${install_home_path}/email
cp ${compile_dir}/../packaging/cfg/taos.cfg ${pkg_dir}${install_home_path}/cfg
cp ${compile_dir}/../packaging/deb/taosd ${pkg_dir}${install_home_path}/init.d
cp ${compile_dir}/../packaging/tools/post.sh ${pkg_dir}${install_home_path}/script
diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec
index 6f012aa80eac67ba42e7ca561c95ef6d905c2100..a143d0afdb305d01ee8fc891d829261d323f183c 100644
--- a/packaging/rpm/tdengine.spec
+++ b/packaging/rpm/tdengine.spec
@@ -51,6 +51,7 @@ mkdir -p %{buildroot}%{homepath}/include
mkdir -p %{buildroot}%{homepath}/init.d
mkdir -p %{buildroot}%{homepath}/script
+echo "" > %{buildroot}%{homepath}/email
cp %{_compiledir}/../packaging/cfg/taos.cfg %{buildroot}%{homepath}/cfg
cp %{_compiledir}/../packaging/rpm/taosd %{buildroot}%{homepath}/init.d
cp %{_compiledir}/../packaging/tools/post.sh %{buildroot}%{homepath}/script
diff --git a/packaging/tools/install_client.sh b/packaging/tools/install_client.sh
index dd116e9bfb0472b661321e9af786521300ed2f74..d52428dc83805b6f03a36bb39edc774e79d04398 100755
--- a/packaging/tools/install_client.sh
+++ b/packaging/tools/install_client.sh
@@ -21,7 +21,7 @@ else
cd ${script_dir}
script_dir="$(pwd)"
data_dir="/var/lib/taos"
- log_dir="~/TDengineLog"
+ log_dir=~/TDengine/log
fi
log_link_dir="/usr/local/taos/log"
diff --git a/packaging/tools/make_install.sh b/packaging/tools/make_install.sh
index 831012851ad70d05080bfae161c0b925d5215ae9..474b6f4619201d609cf9f41e50680d2d19e3ac3e 100755
--- a/packaging/tools/make_install.sh
+++ b/packaging/tools/make_install.sh
@@ -24,7 +24,7 @@ data_dir="/var/lib/taos"
if [ "$osType" != "Darwin" ]; then
log_dir="/var/log/taos"
else
- log_dir="~/TDengineLog"
+ log_dir=~/TDengine/log
fi
data_link_dir="/usr/local/taos/data"
@@ -178,7 +178,9 @@ function install_bin() {
function install_lib() {
# Remove links
${csudo} rm -f ${lib_link_dir}/libtaos.* || :
- ${csudo} rm -f ${lib64_link_dir}/libtaos.* || :
+ if [ "$osType" != "Darwin" ]; then
+ ${csudo} rm -f ${lib64_link_dir}/libtaos.* || :
+ fi
if [ "$osType" != "Darwin" ]; then
${csudo} cp ${binary_dir}/build/lib/libtaos.so.${verNumber} ${install_main_dir}/driver && ${csudo} chmod 777 ${install_main_dir}/driver/*
@@ -190,12 +192,14 @@ function install_lib() {
${csudo} ln -sf ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so
fi
else
- ${csudo} cp ${binary_dir}/build/lib/libtaos.* ${install_main_dir}/driver && ${csudo} chmod 777 ${install_main_dir}/driver/*
- ${csudo} ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.1.dylib
+ ${csudo} cp -Rf ${binary_dir}/build/lib/libtaos.* ${install_main_dir}/driver && ${csudo} chmod 777 ${install_main_dir}/driver/*
+ ${csudo} ln -sf ${install_main_dir}/driver/libtaos.1.dylib ${lib_link_dir}/libtaos.1.dylib
${csudo} ln -sf ${lib_link_dir}/libtaos.1.dylib ${lib_link_dir}/libtaos.dylib
fi
- ${csudo} ldconfig
+ if [ "$osType" != "Darwin" ]; then
+ ${csudo} ldconfig
+ fi
}
function install_header() {
diff --git a/src/balance/CMakeLists.txt b/src/balance/CMakeLists.txt
index 3c93f63d1ad91ba363f0dca8cdaf1577cb36879d..bcb37690876462c227b43343d9bd3228d4405963 100644
--- a/src/balance/CMakeLists.txt
+++ b/src/balance/CMakeLists.txt
@@ -8,6 +8,4 @@ INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_LIBRARY(balance ${SRC})
-ENDIF ()
+ADD_LIBRARY(balance ${SRC})
diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt
index 4049c0d72908486d289631362c19e7caa25f99f8..660ad564a5cb611da4411b5f23eb494f6255c7af 100644
--- a/src/client/CMakeLists.txt
+++ b/src/client/CMakeLists.txt
@@ -28,6 +28,28 @@ IF (TD_LINUX)
ADD_SUBDIRECTORY(tests)
+ELSEIF (TD_DARWIN)
+ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/jni/linux)
+
+ # set the static lib name
+ ADD_LIBRARY(taos_static STATIC ${SRC})
+ TARGET_LINK_LIBRARIES(taos_static common query trpc tutil pthread m)
+ SET_TARGET_PROPERTIES(taos_static PROPERTIES OUTPUT_NAME "taos_static")
+ SET_TARGET_PROPERTIES(taos_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+
+ # generate dynamic library (*.dylib)
+ ADD_LIBRARY(taos SHARED ${SRC})
+ TARGET_LINK_LIBRARIES(taos common query trpc tutil pthread m)
+ SET_TARGET_PROPERTIES(taos PROPERTIES CLEAN_DIRECT_OUTPUT 1)
+
+ #set version of .dylib
+ #VERSION dylib version
+ #SOVERSION dylib version
+ #MESSAGE(STATUS "build version ${TD_VER_NUMBER}")
+ SET_TARGET_PROPERTIES(taos PROPERTIES VERSION ${TD_VER_NUMBER} SOVERSION 1)
+
+ ADD_SUBDIRECTORY(tests)
+
ELSEIF (TD_WINDOWS)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/jni/windows)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/jni/windows/win32)
@@ -49,12 +71,12 @@ ELSEIF (TD_DARWIN)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/jni/linux)
ADD_LIBRARY(taos_static STATIC ${SRC})
- TARGET_LINK_LIBRARIES(taos_static trpc tutil pthread m)
+ TARGET_LINK_LIBRARIES(taos_static query trpc tutil pthread m)
SET_TARGET_PROPERTIES(taos_static PROPERTIES OUTPUT_NAME "taos_static")
# generate dynamic library (*.dylib)
ADD_LIBRARY(taos SHARED ${SRC})
- TARGET_LINK_LIBRARIES(taos trpc tutil pthread m)
+ TARGET_LINK_LIBRARIES(taos query trpc tutil pthread m)
SET_TARGET_PROPERTIES(taos PROPERTIES CLEAN_DIRECT_OUTPUT 1)
diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c
index 4b1ab477304d68d5d52ed02b9b2d2c0121c4ffa6..bb015bce3d1a8ea9d92f3915d1edccd7f31539a3 100644
--- a/src/client/src/tscLocal.c
+++ b/src/client/src/tscLocal.c
@@ -749,7 +749,10 @@ static int32_t tscProcessCurrentUser(SSqlObj *pSql) {
static int32_t tscProcessCurrentDB(SSqlObj *pSql) {
char db[TSDB_DB_NAME_LEN] = {0};
+
+ pthread_mutex_lock(&pSql->pTscObj->mutex);
extractDBName(pSql->pTscObj->db, db);
+ pthread_mutex_unlock(&pSql->pTscObj->mutex);
SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, pSql->cmd.clauseIndex);
diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c
index 0b419a330566601727c440587d5eac4961baf23d..a5906f5539a8d40b055f580933feb4b1184331f1 100644
--- a/src/client/src/tscParseInsert.c
+++ b/src/client/src/tscParseInsert.c
@@ -905,6 +905,13 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql) {
return tscInvalidSQLErrMsg(pCmd->payload, "keyword TAGS expected", sToken.z);
}
+ index = 0;
+ sToken = tStrGetToken(sql, &index, false, 0, NULL);
+ sql += index;
+ if (sToken.type != TK_LP) {
+ return tscInvalidSQLErrMsg(pCmd->payload, NULL, sToken.z);
+ }
+
SKVRowBuilder kvRowBuilder = {0};
if (tdInitKVRowBuilder(&kvRowBuilder) < 0) {
return TSDB_CODE_TSC_OUT_OF_MEMORY;
@@ -1554,6 +1561,7 @@ void tscImportDataFromFile(SSqlObj *pSql) {
tscError("%p failed to open file %s to load data from file, code:%s", pSql, pCmd->payload, tstrerror(pSql->res.code));
tfree(pSupporter);
+ taos_free_result(pNew);
tscAsyncResultOnError(pSql);
return;
}
diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c
index f9eedff7eb0d94644fdded08747fa4eadbe37b99..ec699408de943f228e2c0aa7057f265bc9fc446a 100644
--- a/src/client/src/tscSQLParser.c
+++ b/src/client/src/tscSQLParser.c
@@ -13,10 +13,12 @@
* along with this program. If not, see .
*/
+#ifndef __APPLE__
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _DEFAULT_SOURCE
#define _GNU_SOURCE
+#endif // __APPLE__
#include "os.h"
#include "ttype.h"
@@ -60,7 +62,7 @@ static int32_t setShowInfo(SSqlObj* pSql, SSqlInfo* pInfo);
static char* getAccountId(SSqlObj* pSql);
static bool has(SArray* pFieldList, int32_t startIdx, const char* name);
-static char* getCurrentDBName(SSqlObj* pSql);
+static char* cloneCurrentDBName(SSqlObj* pSql);
static bool hasSpecifyDB(SStrToken* pTableName);
static bool validateTableColumnInfo(SArray* pFieldList, SSqlCmd* pCmd);
static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pCmd);
@@ -921,16 +923,19 @@ int32_t tscSetTableFullName(STableMetaInfo* pTableMetaInfo, SStrToken* pTableNam
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
}
} else { // get current DB name first, and then set it into path
- char* t = getCurrentDBName(pSql);
+ char* t = cloneCurrentDBName(pSql);
if (strlen(t) == 0) {
return TSDB_CODE_TSC_DB_NOT_SELECTED;
}
code = tNameFromString(&pTableMetaInfo->name, t, T_NAME_ACCT | T_NAME_DB);
if (code != 0) {
+ free(t);
return TSDB_CODE_TSC_DB_NOT_SELECTED;
}
+ free(t);
+
if (pTableName->n >= TSDB_TABLE_NAME_LEN) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
}
@@ -1244,8 +1249,12 @@ static bool has(SArray* pFieldList, int32_t startIdx, const char* name) {
static char* getAccountId(SSqlObj* pSql) { return pSql->pTscObj->acctId; }
-static char* getCurrentDBName(SSqlObj* pSql) {
- return pSql->pTscObj->db;
+static char* cloneCurrentDBName(SSqlObj* pSql) {
+ pthread_mutex_lock(&pSql->pTscObj->mutex);
+ char *p = strdup(pSql->pTscObj->db);
+ pthread_mutex_unlock(&pSql->pTscObj->mutex);
+
+ return p;
}
/* length limitation, strstr cannot be applied */
@@ -4300,6 +4309,77 @@ static void doAddJoinTagsColumnsIntoTagList(SSqlCmd* pCmd, SQueryInfo* pQueryInf
}
}
+static int32_t validateTagCondExpr(SSqlCmd* pCmd, tExprNode *p) {
+ const char *msg1 = "invalid tag operator";
+ const char* msg2 = "not supported filter condition";
+
+ do {
+ if (p->nodeType != TSQL_NODE_EXPR) {
+ break;
+ }
+
+ if (!p->_node.pLeft || !p->_node.pRight) {
+ break;
+ }
+
+ if (IS_ARITHMETIC_OPTR(p->_node.optr)) {
+ return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1);
+ }
+
+ if (!IS_RELATION_OPTR(p->_node.optr)) {
+ break;
+ }
+
+ tVariant * vVariant = NULL;
+ int32_t schemaType = -1;
+
+ if (p->_node.pLeft->nodeType == TSQL_NODE_VALUE && p->_node.pRight->nodeType == TSQL_NODE_COL) {
+ if (!p->_node.pRight->pSchema) {
+ break;
+ }
+
+ vVariant = p->_node.pLeft->pVal;
+ schemaType = p->_node.pRight->pSchema->type;
+ } else if (p->_node.pLeft->nodeType == TSQL_NODE_COL && p->_node.pRight->nodeType == TSQL_NODE_VALUE) {
+ if (!p->_node.pLeft->pSchema) {
+ break;
+ }
+
+ vVariant = p->_node.pRight->pVal;
+ schemaType = p->_node.pLeft->pSchema->type;
+ } else {
+ break;
+ }
+
+ if (schemaType >= TSDB_DATA_TYPE_TINYINT && schemaType <= TSDB_DATA_TYPE_BIGINT) {
+ schemaType = TSDB_DATA_TYPE_BIGINT;
+ } else if (schemaType == TSDB_DATA_TYPE_FLOAT || schemaType == TSDB_DATA_TYPE_DOUBLE) {
+ schemaType = TSDB_DATA_TYPE_DOUBLE;
+ }
+
+ int32_t retVal = TSDB_CODE_SUCCESS;
+ if (schemaType == TSDB_DATA_TYPE_BINARY) {
+ char *tmp = calloc(1, vVariant->nLen + TSDB_NCHAR_SIZE);
+ retVal = tVariantDump(vVariant, tmp, schemaType, false);
+ free(tmp);
+ } else if (schemaType == TSDB_DATA_TYPE_NCHAR) {
+ // pRight->val.nLen + 1 is larger than the actual nchar string length
+ char *tmp = calloc(1, (vVariant->nLen + 1) * TSDB_NCHAR_SIZE);
+ retVal = tVariantDump(vVariant, tmp, schemaType, false);
+ free(tmp);
+ } else {
+ double tmp;
+ retVal = tVariantDump(vVariant, (char*)&tmp, schemaType, false);
+ }
+
+ if (retVal != TSDB_CODE_SUCCESS) {
+ return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
+ }
+ }while (0);
+
+ return TSDB_CODE_SUCCESS;
+}
+
static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondExpr* pCondExpr, tSQLExpr** pExpr) {
int32_t ret = TSDB_CODE_SUCCESS;
@@ -4342,6 +4422,10 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
tsSetSTableQueryCond(&pQueryInfo->tagCond, uid, &bw);
doCompactQueryExpr(pExpr);
+ if (ret == TSDB_CODE_SUCCESS) {
+ ret = validateTagCondExpr(pCmd, p);
+ }
+
tSqlExprDestroy(p1);
tExprTreeDestroy(p, NULL);
@@ -4349,6 +4433,10 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0 && !UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "filter on tag not supported for normal table");
}
+
+ if (ret) {
+ break;
+ }
}
pCondExpr->pTagCond = NULL;
diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c
index 840387656691e0bd0e76908d311b0ac124db5baf..6035a270c5494560744b12cfa77c7449ca2fcb06 100644
--- a/src/client/src/tscServer.c
+++ b/src/client/src/tscServer.c
@@ -1250,8 +1250,10 @@ int32_t tscBuildShowMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0);
- if (tNameIsEmpty(&pTableMetaInfo->name)) {
- tstrncpy(pShowMsg->db, pObj->db, sizeof(pShowMsg->db));
+ if (tNameIsEmpty(&pTableMetaInfo->name)) {
+ pthread_mutex_lock(&pObj->mutex);
+ tstrncpy(pShowMsg->db, pObj->db, sizeof(pShowMsg->db));
+ pthread_mutex_unlock(&pObj->mutex);
} else {
tNameGetFullDbName(&pTableMetaInfo->name, pShowMsg->db);
}
@@ -1611,9 +1613,14 @@ int tscBuildConnectMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
// TODO refactor full_name
char *db; // ugly code to move the space
+
+ pthread_mutex_lock(&pObj->mutex);
db = strstr(pObj->db, TS_PATH_DELIMITER);
+
db = (db == NULL) ? pObj->db : db + 1;
tstrncpy(pConnect->db, db, sizeof(pConnect->db));
+ pthread_mutex_unlock(&pObj->mutex);
+
tstrncpy(pConnect->clientVersion, version, sizeof(pConnect->clientVersion));
tstrncpy(pConnect->msgVersion, "", sizeof(pConnect->msgVersion));
@@ -2131,10 +2138,13 @@ int tscProcessConnectRsp(SSqlObj *pSql) {
SConnectRsp *pConnect = (SConnectRsp *)pRes->pRsp;
tstrncpy(pObj->acctId, pConnect->acctId, sizeof(pObj->acctId)); // copy acctId from response
+
+ pthread_mutex_lock(&pObj->mutex);
int32_t len = sprintf(temp, "%s%s%s", pObj->acctId, TS_PATH_DELIMITER, pObj->db);
assert(len <= sizeof(pObj->db));
tstrncpy(pObj->db, temp, sizeof(pObj->db));
+ pthread_mutex_unlock(&pObj->mutex);
if (pConnect->epSet.numOfEps > 0) {
tscEpSetHtons(&pConnect->epSet);
@@ -2161,11 +2171,18 @@ int tscProcessConnectRsp(SSqlObj *pSql) {
int tscProcessUseDbRsp(SSqlObj *pSql) {
STscObj * pObj = pSql->pTscObj;
STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pSql->cmd, 0, 0);
- return tNameExtractFullName(&pTableMetaInfo->name, pObj->db);
+
+ pthread_mutex_lock(&pObj->mutex);
+ int ret = tNameExtractFullName(&pTableMetaInfo->name, pObj->db);
+ pthread_mutex_unlock(&pObj->mutex);
+
+ return ret;
}
int tscProcessDropDbRsp(SSqlObj *pSql) {
- pSql->pTscObj->db[0] = 0;
+ //TODO LOCK DB WHEN MODIFY IT
+ //pSql->pTscObj->db[0] = 0;
+
taosHashEmpty(tscTableMetaInfo);
return 0;
}
diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c
index 6b4d9809454528cc0df29a4a7683aa4223e4d7c5..36146a49b9a2f1b9e59a1cc69ebeda4ef983ef64 100644
--- a/src/client/src/tscSql.c
+++ b/src/client/src/tscSql.c
@@ -295,6 +295,10 @@ void taos_close(TAOS *taos) {
tscDebug("%p HB is freed", pHb);
taosReleaseRef(tscObjRef, pHb->self);
+#ifdef __APPLE__
+ // to satisfy later tsem_destroy in taos_free_result
+ tsem_init(&pHb->rspSem, 0, 0);
+#endif // __APPLE__
taos_free_result(pHb);
}
}
diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c
index d580eccca82e536f25184abf8b2e350be0c07662..d045000e24485f27d9cbde89ff76e794d12b2c32 100644
--- a/src/client/src/tscUtil.c
+++ b/src/client/src/tscUtil.c
@@ -1942,6 +1942,10 @@ SSqlObj* createSimpleSubObj(SSqlObj* pSql, __async_cb_func_t fp, void* param, in
}
if (tscAddSubqueryInfo(pCmd) != TSDB_CODE_SUCCESS) {
+#ifdef __APPLE__
+ // to satisfy later tsem_destroy in taos_free_result
+ tsem_init(&pNew->rspSem, 0, 0);
+#endif // __APPLE__
tscFreeSqlObj(pNew);
return NULL;
}
@@ -2508,7 +2512,11 @@ bool tscSetSqlOwner(SSqlObj* pSql) {
SSqlRes* pRes = &pSql->res;
// set the sql object owner
+#ifdef __APPLE__
+ 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) {
pRes->code = TSDB_CODE_QRY_IN_EXEC;
return false;
diff --git a/src/common/src/tglobal.c b/src/common/src/tglobal.c
index bda4dce5930665f7bc327ad03e89261ebefa091a..4a9b4c3e4357679e034fbda8ae296ed7b3589483 100644
--- a/src/common/src/tglobal.c
+++ b/src/common/src/tglobal.c
@@ -137,7 +137,7 @@ int32_t tsTableIncStepPerVnode = TSDB_TABLES_STEP;
int8_t tsEnableBalance = 1;
int8_t tsAlternativeRole = 0;
int32_t tsBalanceInterval = 300; // seconds
-int32_t tsOfflineThreshold = 86400 * 100; // seconds 10days
+int32_t tsOfflineThreshold = 86400 * 100; // seconds 100 days
int32_t tsMnodeEqualVnodeNum = 4;
int8_t tsEnableFlowCtrl = 1;
int8_t tsEnableSlaveQuery = 1;
@@ -550,7 +550,7 @@ static void doInitGlobalConfig(void) {
cfg.valType = TAOS_CFG_VTYPE_INT32;
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
cfg.minValue = 3;
- cfg.maxValue = 7200000;
+ cfg.maxValue = 86400 * 365;
cfg.ptrLength = 0;
cfg.unitType = TAOS_CFG_UTYPE_SECOND;
taosInitConfigOption(cfg);
diff --git a/src/common/src/tvariant.c b/src/common/src/tvariant.c
index 95aa576889a21f04611dabcf2379cd091b435399..cfad85be60c19811909c0f6abbcfa26a2f5bad69 100644
--- a/src/common/src/tvariant.c
+++ b/src/common/src/tvariant.c
@@ -430,7 +430,7 @@ static FORCE_INLINE int32_t convertToInteger(tVariant *pVariant, int64_t *result
}
errno = 0;
- if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType)) {
+ if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
*result = pVariant->i64;
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
*result = pVariant->u64;
@@ -775,7 +775,7 @@ int32_t tVariantDump(tVariant *pVariant, char *payload, int16_t type, bool inclu
return -1;
}
} else {
- wcsncpy((wchar_t *)p, pVariant->wpz, pVariant->nLen);
+ memcpy(p, pVariant->wpz, pVariant->nLen);
newlen = pVariant->nLen;
}
@@ -867,4 +867,4 @@ int32_t tVariantTypeSetType(tVariant *pVariant, char type) {
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/src/connector/jdbc/CMakeLists.txt b/src/connector/jdbc/CMakeLists.txt
index b64161e2e4fd6fc00abb659118cfdcd50dfcf0a8..59b09c8695d59c1fd0584f73a7e4be1eb1ab1c0b 100644
--- a/src/connector/jdbc/CMakeLists.txt
+++ b/src/connector/jdbc/CMakeLists.txt
@@ -8,7 +8,7 @@ IF (TD_MVN_INSTALLED)
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
POST_BUILD
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.17-dist.jar ${LIBRARY_OUTPUT_PATH}
+ COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.18-dist.jar ${LIBRARY_OUTPUT_PATH}
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
COMMENT "build jdbc driver")
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
diff --git a/src/connector/jdbc/deploy-pom.xml b/src/connector/jdbc/deploy-pom.xml
index 1f03c3c6fe5e1d5f1d7d12a0df7babb6edb789f1..34b0a3c6d37530ad01600a455d426c1606613c23 100755
--- a/src/connector/jdbc/deploy-pom.xml
+++ b/src/connector/jdbc/deploy-pom.xml
@@ -5,7 +5,7 @@
com.taosdata.jdbc
taos-jdbcdriver
- 2.0.17
+ 2.0.18
jar
JDBCDriver
diff --git a/src/connector/jdbc/pom.xml b/src/connector/jdbc/pom.xml
index 6be0ca036e797decb668c42a81eeaafb91d52787..4756ac555fa3b32f1e261b3376d811f5e24bcc70 100755
--- a/src/connector/jdbc/pom.xml
+++ b/src/connector/jdbc/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.taosdata.jdbc
taos-jdbcdriver
- 2.0.17
+ 2.0.18
jar
JDBCDriver
https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc
@@ -126,7 +126,7 @@
**/*Test.java
- **/BatchInsertTest.java
+ **/AppMemoryLeakTest.java
**/FailOverTest.java
true
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java
index 4f4911aad9c138eb13fffdd698b794a03222160f..4fb172ceb59040e2f531fd91b83c776cd7d89067 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBConstants.java
@@ -19,9 +19,12 @@ import java.util.Map;
public abstract class TSDBConstants {
+ public static final String STATEMENT_CLOSED = "Statement already closed.";
public static final String DEFAULT_PORT = "6200";
public static final String UNSUPPORT_METHOD_EXCEPTIONZ_MSG = "this operation is NOT supported currently!";
public static final String INVALID_VARIABLES = "invalid variables";
+ public static final String RESULT_SET_IS_CLOSED = "resultSet is closed.";
+
public static Map DATATYPE_MAP = null;
public static final long JNI_NULL_POINTER = 0L;
@@ -74,7 +77,7 @@ public abstract class TSDBConstants {
}
static {
- DATATYPE_MAP = new HashMap();
+ DATATYPE_MAP = new HashMap<>();
DATATYPE_MAP.put(1, "BOOL");
DATATYPE_MAP.put(2, "TINYINT");
DATATYPE_MAP.put(3, "SMALLINT");
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
index 230943fd53ae8fa36b9de40f851a5c263c052f0d..c6b41ce004d739a94c00e87f141b9180efa18e57 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBPreparedStatement.java
@@ -100,7 +100,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
* order to process those supported SQLs.
*/
private void preprocessSql() {
-
/***** For processing some of Spark SQLs*****/
// should replace it first
this.rawSql = this.rawSql.replaceAll("or (.*) is null", "");
@@ -149,7 +148,6 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
rawSql = rawSql.replace(matcher.group(1), tableFullName);
}
/***** for inner queries *****/
-
}
/**
@@ -196,7 +194,7 @@ public class TSDBPreparedStatement extends TSDBStatement implements PreparedStat
@Override
public void setNull(int parameterIndex, int sqlType) throws SQLException {
- setObject(parameterIndex, new String("NULL"));
+ setObject(parameterIndex, "NULL");
}
@Override
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java
index a8a8b3ca876cf1d2cbc9363b49f0f49da7550b90..d06922c680ccec9c4ec6f53cdbe60cb530deae97 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java
@@ -40,1060 +40,1070 @@ import java.util.List;
import java.util.Map;
public class TSDBResultSet implements ResultSet {
- private TSDBJNIConnector jniConnector = null;
-
- private long resultSetPointer = 0L;
- private List columnMetaDataList = new ArrayList();
-
- private TSDBResultSetRowData rowData;
- private TSDBResultSetBlockData blockData;
-
- private boolean batchFetch = false;
- private boolean lastWasNull = false;
- private final int COLUMN_INDEX_START_VALUE = 1;
-
- private int rowIndex = 0;
-
- public TSDBJNIConnector getJniConnector() {
- return jniConnector;
- }
-
- public void setJniConnector(TSDBJNIConnector jniConnector) {
- this.jniConnector = jniConnector;
- }
-
- public long getResultSetPointer() {
- return resultSetPointer;
- }
-
- public void setResultSetPointer(long resultSetPointer) {
- this.resultSetPointer = resultSetPointer;
- }
-
- public void setBatchFetch(boolean batchFetch) {
- this.batchFetch = batchFetch;
- }
-
- public Boolean getBatchFetch() {
- return this.batchFetch;
- }
-
- public List getColumnMetaDataList() {
- return columnMetaDataList;
- }
-
- public void setColumnMetaDataList(List columnMetaDataList) {
- this.columnMetaDataList = columnMetaDataList;
- }
-
- public TSDBResultSetRowData getRowData() {
- return rowData;
- }
-
- public void setRowData(TSDBResultSetRowData rowData) {
- this.rowData = rowData;
- }
-
- public boolean isLastWasNull() {
- return lastWasNull;
- }
-
- public void setLastWasNull(boolean lastWasNull) {
- this.lastWasNull = lastWasNull;
- }
-
- public TSDBResultSet() {
-
- }
-
- public TSDBResultSet(TSDBJNIConnector connector, long resultSetPointer) throws SQLException {
- this.jniConnector = connector;
- this.resultSetPointer = resultSetPointer;
- int code = this.jniConnector.getSchemaMetaData(this.resultSetPointer, this.columnMetaDataList);
- if (code == TSDBConstants.JNI_CONNECTION_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
- } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
- } else if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_NUM_OF_FIELDS_0));
- }
-
- this.rowData = new TSDBResultSetRowData(this.columnMetaDataList.size());
- this.blockData = new TSDBResultSetBlockData(this.columnMetaDataList, this.columnMetaDataList.size());
- }
-
- public T unwrap(Class iface) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean isWrapperFor(Class> iface) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean next() throws SQLException {
- if (this.getBatchFetch()) {
- if (this.blockData.forward()) {
- return true;
- }
-
- int code = this.jniConnector.fetchBlock(this.resultSetPointer, this.blockData);
- this.blockData.reset();
-
- if (code == TSDBConstants.JNI_CONNECTION_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
- } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
- } else if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_NUM_OF_FIELDS_0));
- } else if (code == TSDBConstants.JNI_FETCH_END) {
- return false;
- }
-
- return true;
- } else {
- if (rowData != null) {
- this.rowData.clear();
- }
-
- int code = this.jniConnector.fetchRow(this.resultSetPointer, this.rowData);
- if (code == TSDBConstants.JNI_CONNECTION_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
- } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
- } else if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_NUM_OF_FIELDS_0));
- } else if (code == TSDBConstants.JNI_FETCH_END) {
- return false;
- } else {
- return true;
- }
- }
- }
-
- public void close() throws SQLException {
- if (this.jniConnector != null) {
- int code = this.jniConnector.freeResultSet(this.resultSetPointer);
- if (code == TSDBConstants.JNI_CONNECTION_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
- } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
- throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
- }
- }
- }
-
- public boolean wasNull() throws SQLException {
- return this.lastWasNull;
- }
-
- public String getString(int columnIndex) throws SQLException {
- String res = null;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getString(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return this.blockData.getString(colIndex);
- }
- }
-
- public boolean getBoolean(int columnIndex) throws SQLException {
- boolean res = false;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getBoolean(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- } else {
- return this.blockData.getBoolean(colIndex);
- }
-
- return res;
- }
-
- public byte getByte(int columnIndex) throws SQLException {
- byte res = 0;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = (byte) this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return (byte) this.blockData.getInt(colIndex);
- }
- }
-
- public short getShort(int columnIndex) throws SQLException {
- short res = 0;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = (short) this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return (short) this.blockData.getInt(colIndex);
- }
- }
-
- public int getInt(int columnIndex) throws SQLException {
- int res = 0;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return this.blockData.getInt(colIndex);
- }
-
- }
-
- public long getLong(int columnIndex) throws SQLException {
- long res = 0l;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getLong(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return this.blockData.getLong(colIndex);
- }
- }
-
- public float getFloat(int columnIndex) throws SQLException {
- float res = 0;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getFloat(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return (float) this.blockData.getDouble(colIndex);
- }
- }
-
- public double getDouble(int columnIndex) throws SQLException {
- double res = 0;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getDouble(colIndex, this.columnMetaDataList.get(colIndex).getColType());
- }
- return res;
- } else {
- return this.blockData.getDouble(colIndex);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.ResultSet#getBigDecimal(int, int)
- *
- * @deprecated Use {@code getBigDecimal(int columnIndex)} or {@code
- * getBigDecimal(String columnLabel)}
- */
- @Deprecated
- public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
- return new BigDecimal(getLong(columnIndex));
- }
-
- public byte[] getBytes(int columnIndex) throws SQLException {
- return getString(columnIndex).getBytes();
- }
-
- public Date getDate(int columnIndex) throws SQLException {
- int colIndex = getTrueColumnIndex(columnIndex);
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public Time getTime(int columnIndex) throws SQLException {
- int colIndex = getTrueColumnIndex(columnIndex);
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public Timestamp getTimestamp(int columnIndex) throws SQLException {
- Timestamp res = null;
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- if (!lastWasNull) {
- res = this.rowData.getTimestamp(colIndex);
- }
- return res;
- } else {
- return this.blockData.getTimestamp(columnIndex);
- }
- }
-
- public InputStream getAsciiStream(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.ResultSet#getUnicodeStream(int)
- *
- * * @deprecated use getCharacterStream
in place of
- * getUnicodeStream
- */
- @Deprecated
- public InputStream getUnicodeStream(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public InputStream getBinaryStream(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public String getString(String columnLabel) throws SQLException {
- return this.getString(this.findColumn(columnLabel));
- }
-
- public boolean getBoolean(String columnLabel) throws SQLException {
- return this.getBoolean(this.findColumn(columnLabel));
- }
-
- public byte getByte(String columnLabel) throws SQLException {
- return this.getByte(this.findColumn(columnLabel));
- }
-
- public short getShort(String columnLabel) throws SQLException {
- return this.getShort(this.findColumn(columnLabel));
- }
-
- public int getInt(String columnLabel) throws SQLException {
- return this.getInt(this.findColumn(columnLabel));
- }
-
- public long getLong(String columnLabel) throws SQLException {
- return this.getLong(this.findColumn(columnLabel));
- }
-
- public float getFloat(String columnLabel) throws SQLException {
- return this.getFloat(this.findColumn(columnLabel));
- }
-
- public double getDouble(String columnLabel) throws SQLException {
- return this.getDouble(this.findColumn(columnLabel));
- }
-
- /*
- * used by spark
- */
- @Deprecated
- public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException {
- return this.getBigDecimal(this.findColumn(columnLabel), scale);
- }
-
- public byte[] getBytes(String columnLabel) throws SQLException {
- return this.getBytes(this.findColumn(columnLabel));
- }
-
- public Date getDate(String columnLabel) throws SQLException {
- return this.getDate(this.findColumn(columnLabel));
- }
-
- public Time getTime(String columnLabel) throws SQLException {
- return this.getTime(this.findColumn(columnLabel));
- }
-
- public Timestamp getTimestamp(String columnLabel) throws SQLException {
- return this.getTimestamp(this.findColumn(columnLabel));
- }
-
- public InputStream getAsciiStream(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- @Deprecated
- public InputStream getUnicodeStream(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public InputStream getBinaryStream(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public SQLWarning getWarnings() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void clearWarnings() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public String getCursorName() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public ResultSetMetaData getMetaData() throws SQLException {
- return new TSDBResultSetMetaData(this.columnMetaDataList);
- }
-
- public Object getObject(int columnIndex) throws SQLException {
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- return this.rowData.get(colIndex);
- } else {
- return this.blockData.get(colIndex);
- }
- }
-
- public Object getObject(String columnLabel) throws SQLException {
- return this.getObject(this.findColumn(columnLabel));
- }
-
- public int findColumn(String columnLabel) throws SQLException {
- Iterator colMetaDataIt = this.columnMetaDataList.iterator();
- while (colMetaDataIt.hasNext()) {
- ColumnMetaData colMetaData = colMetaDataIt.next();
- if (colMetaData.getColName() != null && colMetaData.getColName().equalsIgnoreCase(columnLabel)) {
- return colMetaData.getColIndex() + 1;
- }
- }
- throw new SQLException(TSDBConstants.INVALID_VARIABLES);
- }
-
- public Reader getCharacterStream(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public Reader getCharacterStream(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- /*
- * used by spark
- */
- public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
- int colIndex = getTrueColumnIndex(columnIndex);
-
- if (!this.getBatchFetch()) {
- this.lastWasNull = this.rowData.wasNull(colIndex);
- return new BigDecimal(this.rowData.getLong(colIndex, this.columnMetaDataList.get(colIndex).getColType()));
- } else {
- return new BigDecimal(this.blockData.getLong(colIndex));
- }
- }
-
- public BigDecimal getBigDecimal(String columnLabel) throws SQLException {
- return this.getBigDecimal(this.findColumn(columnLabel));
- }
-
- public boolean isBeforeFirst() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean isAfterLast() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean isFirst() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean isLast() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void beforeFirst() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void afterLast() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean first() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean last() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public int getRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean absolute(int row) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean relative(int rows) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean previous() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void setFetchDirection(int direction) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public int getFetchDirection() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void setFetchSize(int rows) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public int getFetchSize() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public int getType() throws SQLException {
- return ResultSet.TYPE_FORWARD_ONLY;
- }
-
- public int getConcurrency() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean rowUpdated() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean rowInserted() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean rowDeleted() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNull(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ private TSDBJNIConnector jniConnector = null;
- public void updateBoolean(int columnIndex, boolean x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ private long resultSetPointer = 0L;
+ private List columnMetaDataList = new ArrayList();
+
+ private TSDBResultSetRowData rowData;
+ private TSDBResultSetBlockData blockData;
+
+ private boolean batchFetch = false;
+ private boolean lastWasNull = false;
+ private final int COLUMN_INDEX_START_VALUE = 1;
+
+ private int rowIndex = 0;
+
+ public TSDBJNIConnector getJniConnector() {
+ return jniConnector;
+ }
+
+ public void setJniConnector(TSDBJNIConnector jniConnector) {
+ this.jniConnector = jniConnector;
+ }
+
+ public long getResultSetPointer() {
+ return resultSetPointer;
+ }
+
+ public void setResultSetPointer(long resultSetPointer) {
+ this.resultSetPointer = resultSetPointer;
+ }
+
+ public void setBatchFetch(boolean batchFetch) {
+ this.batchFetch = batchFetch;
+ }
+
+ public Boolean getBatchFetch() {
+ return this.batchFetch;
+ }
+
+ public List getColumnMetaDataList() {
+ return columnMetaDataList;
+ }
+
+ public void setColumnMetaDataList(List columnMetaDataList) {
+ this.columnMetaDataList = columnMetaDataList;
+ }
+
+ public TSDBResultSetRowData getRowData() {
+ return rowData;
+ }
+
+ public void setRowData(TSDBResultSetRowData rowData) {
+ this.rowData = rowData;
+ }
+
+ public boolean isLastWasNull() {
+ return lastWasNull;
+ }
+
+ public void setLastWasNull(boolean lastWasNull) {
+ this.lastWasNull = lastWasNull;
+ }
+
+ public TSDBResultSet() {
+
+ }
+
+ public TSDBResultSet(TSDBJNIConnector connector, long resultSetPointer) throws SQLException {
+ this.jniConnector = connector;
+ this.resultSetPointer = resultSetPointer;
+ int code = this.jniConnector.getSchemaMetaData(this.resultSetPointer, this.columnMetaDataList);
+ if (code == TSDBConstants.JNI_CONNECTION_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
+ } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
+ } else if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_NUM_OF_FIELDS_0));
+ }
+
+ this.rowData = new TSDBResultSetRowData(this.columnMetaDataList.size());
+ this.blockData = new TSDBResultSetBlockData(this.columnMetaDataList, this.columnMetaDataList.size());
+ }
+
+ public T unwrap(Class iface) throws SQLException {
+ if (isClosed())
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+ try {
+ return iface.cast(this);
+ } catch (ClassCastException cce) {
+ throw new SQLException("Unable to unwrap to " + iface.toString());
+ }
+ }
+
+ public boolean isWrapperFor(Class> iface) throws SQLException {
+ if (isClosed())
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+ return iface.isInstance(this);
+ }
+
+ public boolean next() throws SQLException {
+ if (this.getBatchFetch()) {
+ if (this.blockData.forward()) {
+ return true;
+ }
+
+ int code = this.jniConnector.fetchBlock(this.resultSetPointer, this.blockData);
+ this.blockData.reset();
+
+ if (code == TSDBConstants.JNI_CONNECTION_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
+ } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
+ } else if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_NUM_OF_FIELDS_0));
+ } else if (code == TSDBConstants.JNI_FETCH_END) {
+ return false;
+ }
+
+ return true;
+ } else {
+ if (rowData != null) {
+ this.rowData.clear();
+ }
+
+ int code = this.jniConnector.fetchRow(this.resultSetPointer, this.rowData);
+ if (code == TSDBConstants.JNI_CONNECTION_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
+ } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
+ } else if (code == TSDBConstants.JNI_NUM_OF_FIELDS_0) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_NUM_OF_FIELDS_0));
+ } else if (code == TSDBConstants.JNI_FETCH_END) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ }
+
+ public void close() throws SQLException {
+ if (this.jniConnector != null) {
+ int code = this.jniConnector.freeResultSet(this.resultSetPointer);
+ if (code == TSDBConstants.JNI_CONNECTION_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL));
+ } else if (code == TSDBConstants.JNI_RESULT_SET_NULL) {
+ throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_RESULT_SET_NULL));
+ }
+ }
+ }
+
+ public boolean wasNull() throws SQLException {
+ return this.lastWasNull;
+ }
+
+ public String getString(int columnIndex) throws SQLException {
+ String res = null;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getString(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return this.blockData.getString(colIndex);
+ }
+ }
+
+ public boolean getBoolean(int columnIndex) throws SQLException {
+ boolean res = false;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getBoolean(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ } else {
+ return this.blockData.getBoolean(colIndex);
+ }
+
+ return res;
+ }
+
+ public byte getByte(int columnIndex) throws SQLException {
+ byte res = 0;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = (byte) this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return (byte) this.blockData.getInt(colIndex);
+ }
+ }
+
+ public short getShort(int columnIndex) throws SQLException {
+ short res = 0;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = (short) this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return (short) this.blockData.getInt(colIndex);
+ }
+ }
+
+ public int getInt(int columnIndex) throws SQLException {
+ int res = 0;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return this.blockData.getInt(colIndex);
+ }
+
+ }
+
+ public long getLong(int columnIndex) throws SQLException {
+ long res = 0l;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getLong(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return this.blockData.getLong(colIndex);
+ }
+ }
+
+ public float getFloat(int columnIndex) throws SQLException {
+ float res = 0;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getFloat(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return (float) this.blockData.getDouble(colIndex);
+ }
+ }
+
+ public double getDouble(int columnIndex) throws SQLException {
+ double res = 0;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getDouble(colIndex, this.columnMetaDataList.get(colIndex).getColType());
+ }
+ return res;
+ } else {
+ return this.blockData.getDouble(colIndex);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.sql.ResultSet#getBigDecimal(int, int)
+ *
+ * @deprecated Use {@code getBigDecimal(int columnIndex)} or {@code
+ * getBigDecimal(String columnLabel)}
+ */
+ @Deprecated
+ public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
+ return new BigDecimal(getLong(columnIndex));
+ }
+
+ public byte[] getBytes(int columnIndex) throws SQLException {
+ return getString(columnIndex).getBytes();
+ }
+
+ public Date getDate(int columnIndex) throws SQLException {
+ int colIndex = getTrueColumnIndex(columnIndex);
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public Time getTime(int columnIndex) throws SQLException {
+ int colIndex = getTrueColumnIndex(columnIndex);
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public Timestamp getTimestamp(int columnIndex) throws SQLException {
+ Timestamp res = null;
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ if (!lastWasNull) {
+ res = this.rowData.getTimestamp(colIndex);
+ }
+ return res;
+ } else {
+ return this.blockData.getTimestamp(columnIndex);
+ }
+ }
+
+ public InputStream getAsciiStream(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.sql.ResultSet#getUnicodeStream(int)
+ *
+ * * @deprecated use getCharacterStream
in place of
+ * getUnicodeStream
+ */
+ @Deprecated
+ public InputStream getUnicodeStream(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public InputStream getBinaryStream(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public String getString(String columnLabel) throws SQLException {
+ return this.getString(this.findColumn(columnLabel));
+ }
+
+ public boolean getBoolean(String columnLabel) throws SQLException {
+ return this.getBoolean(this.findColumn(columnLabel));
+ }
+
+ public byte getByte(String columnLabel) throws SQLException {
+ return this.getByte(this.findColumn(columnLabel));
+ }
+
+ public short getShort(String columnLabel) throws SQLException {
+ return this.getShort(this.findColumn(columnLabel));
+ }
+
+ public int getInt(String columnLabel) throws SQLException {
+ return this.getInt(this.findColumn(columnLabel));
+ }
+
+ public long getLong(String columnLabel) throws SQLException {
+ return this.getLong(this.findColumn(columnLabel));
+ }
+
+ public float getFloat(String columnLabel) throws SQLException {
+ return this.getFloat(this.findColumn(columnLabel));
+ }
+
+ public double getDouble(String columnLabel) throws SQLException {
+ return this.getDouble(this.findColumn(columnLabel));
+ }
+
+ /*
+ * used by spark
+ */
+ @Deprecated
+ public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException {
+ return this.getBigDecimal(this.findColumn(columnLabel), scale);
+ }
+
+ public byte[] getBytes(String columnLabel) throws SQLException {
+ return this.getBytes(this.findColumn(columnLabel));
+ }
+
+ public Date getDate(String columnLabel) throws SQLException {
+ return this.getDate(this.findColumn(columnLabel));
+ }
+
+ public Time getTime(String columnLabel) throws SQLException {
+ return this.getTime(this.findColumn(columnLabel));
+ }
+
+ public Timestamp getTimestamp(String columnLabel) throws SQLException {
+ return this.getTimestamp(this.findColumn(columnLabel));
+ }
+
+ public InputStream getAsciiStream(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ @Deprecated
+ public InputStream getUnicodeStream(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public InputStream getBinaryStream(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public SQLWarning getWarnings() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void clearWarnings() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public String getCursorName() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public ResultSetMetaData getMetaData() throws SQLException {
+ return new TSDBResultSetMetaData(this.columnMetaDataList);
+ }
+
+ public Object getObject(int columnIndex) throws SQLException {
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ return this.rowData.get(colIndex);
+ } else {
+ return this.blockData.get(colIndex);
+ }
+ }
+
+ public Object getObject(String columnLabel) throws SQLException {
+ return this.getObject(this.findColumn(columnLabel));
+ }
+
+ public int findColumn(String columnLabel) throws SQLException {
+ Iterator colMetaDataIt = this.columnMetaDataList.iterator();
+ while (colMetaDataIt.hasNext()) {
+ ColumnMetaData colMetaData = colMetaDataIt.next();
+ if (colMetaData.getColName() != null && colMetaData.getColName().equalsIgnoreCase(columnLabel)) {
+ return colMetaData.getColIndex() + 1;
+ }
+ }
+ throw new SQLException(TSDBConstants.INVALID_VARIABLES);
+ }
+
+ public Reader getCharacterStream(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public Reader getCharacterStream(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ /*
+ * used by spark
+ */
+ public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
+ int colIndex = getTrueColumnIndex(columnIndex);
+
+ if (!this.getBatchFetch()) {
+ this.lastWasNull = this.rowData.wasNull(colIndex);
+ return new BigDecimal(this.rowData.getLong(colIndex, this.columnMetaDataList.get(colIndex).getColType()));
+ } else {
+ return new BigDecimal(this.blockData.getLong(colIndex));
+ }
+ }
+
+ public BigDecimal getBigDecimal(String columnLabel) throws SQLException {
+ return this.getBigDecimal(this.findColumn(columnLabel));
+ }
+
+ public boolean isBeforeFirst() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean isAfterLast() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean isFirst() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean isLast() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void beforeFirst() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void afterLast() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean first() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean last() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public int getRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean absolute(int row) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean relative(int rows) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean previous() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void setFetchDirection(int direction) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public int getFetchDirection() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void setFetchSize(int rows) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public int getFetchSize() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public int getType() throws SQLException {
+ return ResultSet.TYPE_FORWARD_ONLY;
+ }
+
+ public int getConcurrency() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean rowUpdated() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean rowInserted() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean rowDeleted() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNull(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateByte(int columnIndex, byte x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBoolean(int columnIndex, boolean x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateShort(int columnIndex, short x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateByte(int columnIndex, byte x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateInt(int columnIndex, int x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateShort(int columnIndex, short x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateLong(int columnIndex, long x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateInt(int columnIndex, int x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateFloat(int columnIndex, float x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateLong(int columnIndex, long x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateDouble(int columnIndex, double x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateFloat(int columnIndex, float x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateDouble(int columnIndex, double x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateString(int columnIndex, String x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBytes(int columnIndex, byte[] x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateString(int columnIndex, String x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateDate(int columnIndex, Date x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBytes(int columnIndex, byte[] x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateTime(int columnIndex, Time x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateDate(int columnIndex, Date x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateTime(int columnIndex, Time x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateObject(int columnIndex, Object x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateNull(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateObject(int columnIndex, Object x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBoolean(String columnLabel, boolean x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateNull(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateByte(String columnLabel, byte x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBoolean(String columnLabel, boolean x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateShort(String columnLabel, short x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateByte(String columnLabel, byte x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateInt(String columnLabel, int x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateShort(String columnLabel, short x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateLong(String columnLabel, long x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateInt(String columnLabel, int x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateFloat(String columnLabel, float x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateLong(String columnLabel, long x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateDouble(String columnLabel, double x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateFloat(String columnLabel, float x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateDouble(String columnLabel, double x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateString(String columnLabel, String x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBytes(String columnLabel, byte[] x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateString(String columnLabel, String x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateDate(String columnLabel, Date x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBytes(String columnLabel, byte[] x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateTime(String columnLabel, Time x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateDate(String columnLabel, Date x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateTime(String columnLabel, Time x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateObject(String columnLabel, Object x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void insertRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateObject(String columnLabel, Object x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void insertRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void deleteRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void refreshRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void deleteRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void cancelRowUpdates() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void refreshRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void moveToInsertRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void cancelRowUpdates() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void moveToCurrentRow() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void moveToInsertRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Statement getStatement() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void moveToCurrentRow() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Object getObject(int columnIndex, Map> map) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Statement getStatement() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Ref getRef(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Object getObject(int columnIndex, Map> map) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Blob getBlob(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Ref getRef(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Clob getClob(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Blob getBlob(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Array getArray(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Clob getClob(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Object getObject(String columnLabel, Map> map) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Array getArray(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Ref getRef(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Object getObject(String columnLabel, Map> map) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Blob getBlob(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Ref getRef(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Clob getClob(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Blob getBlob(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Array getArray(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Clob getClob(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Date getDate(int columnIndex, Calendar cal) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Array getArray(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Date getDate(String columnLabel, Calendar cal) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Date getDate(int columnIndex, Calendar cal) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Time getTime(int columnIndex, Calendar cal) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Date getDate(String columnLabel, Calendar cal) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Time getTime(String columnLabel, Calendar cal) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Time getTime(int columnIndex, Calendar cal) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Time getTime(String columnLabel, Calendar cal) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public URL getURL(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public URL getURL(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public URL getURL(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateRef(int columnIndex, Ref x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateRef(String columnLabel, Ref x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBlob(int columnIndex, Blob x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBlob(String columnLabel, Blob x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateClob(int columnIndex, Clob x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateClob(String columnLabel, Clob x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateArray(int columnIndex, Array x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateArray(String columnLabel, Array x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public RowId getRowId(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public RowId getRowId(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateRowId(int columnIndex, RowId x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateRowId(String columnLabel, RowId x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public int getHoldability() throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public boolean isClosed() throws SQLException {
- boolean isClosed = true;
- if (jniConnector != null) {
- isClosed = jniConnector.isResultsetClosed();
- }
- return isClosed;
- }
-
- public void updateNString(int columnIndex, String nString) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNString(String columnLabel, String nString) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNClob(int columnIndex, NClob nClob) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNClob(String columnLabel, NClob nClob) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public NClob getNClob(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public NClob getNClob(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public SQLXML getSQLXML(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public SQLXML getSQLXML(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public String getNString(int columnIndex) throws SQLException {
- int colIndex = getTrueColumnIndex(columnIndex);
- return (String) rowData.get(colIndex);
- }
-
- public String getNString(String columnLabel) throws SQLException {
- return (String) this.getString(columnLabel);
- }
-
- public Reader getNCharacterStream(int columnIndex) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public Reader getNCharacterStream(String columnLabel) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateClob(int columnIndex, Reader reader, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateClob(String columnLabel, Reader reader, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateCharacterStream(int columnIndex, Reader x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
-
- public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public URL getURL(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateRef(int columnIndex, Ref x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateRef(String columnLabel, Ref x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBlob(int columnIndex, Blob x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBlob(String columnLabel, Blob x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateClob(int columnIndex, Clob x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateClob(String columnLabel, Clob x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateArray(int columnIndex, Array x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateArray(String columnLabel, Array x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public RowId getRowId(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public RowId getRowId(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateRowId(int columnIndex, RowId x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateRowId(String columnLabel, RowId x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public int getHoldability() throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public boolean isClosed() throws SQLException {
+ boolean isClosed = true;
+ if (jniConnector != null) {
+ isClosed = jniConnector.isResultsetClosed();
+ }
+ return isClosed;
+ }
+
+ public void updateNString(int columnIndex, String nString) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNString(String columnLabel, String nString) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNClob(int columnIndex, NClob nClob) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNClob(String columnLabel, NClob nClob) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public NClob getNClob(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public NClob getNClob(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public SQLXML getSQLXML(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public SQLXML getSQLXML(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public String getNString(int columnIndex) throws SQLException {
+ int colIndex = getTrueColumnIndex(columnIndex);
+ return (String) rowData.get(colIndex);
+ }
+
+ public String getNString(String columnLabel) throws SQLException {
+ return (String) this.getString(columnLabel);
+ }
+
+ public Reader getNCharacterStream(int columnIndex) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public Reader getNCharacterStream(String columnLabel) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateClob(int columnIndex, Reader reader, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateClob(String columnLabel, Reader reader, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateCharacterStream(int columnIndex, Reader x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
+
+ public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateClob(int columnIndex, Reader reader) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateClob(String columnLabel, Reader reader) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateClob(int columnIndex, Reader reader) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateNClob(int columnIndex, Reader reader) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateClob(String columnLabel, Reader reader) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public void updateNClob(String columnLabel, Reader reader) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateNClob(int columnIndex, Reader reader) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public T getObject(int columnIndex, Class type) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public void updateNClob(String columnLabel, Reader reader) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- public T getObject(String columnLabel, Class type) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
- }
+ public T getObject(int columnIndex, Class type) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- private int getTrueColumnIndex(int columnIndex) throws SQLException {
- if (columnIndex < this.COLUMN_INDEX_START_VALUE) {
- throw new SQLException("Column Index out of range, " + columnIndex + " < " + this.COLUMN_INDEX_START_VALUE);
- }
-
- int numOfCols = this.columnMetaDataList.size();
- if (columnIndex > numOfCols) {
- throw new SQLException("Column Index out of range, " + columnIndex + " > " + numOfCols);
- }
+ public T getObject(String columnLabel, Class type) throws SQLException {
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ }
- return columnIndex - 1;
- }
+ private int getTrueColumnIndex(int columnIndex) throws SQLException {
+ if (columnIndex < this.COLUMN_INDEX_START_VALUE) {
+ throw new SQLException("Column Index out of range, " + columnIndex + " < " + this.COLUMN_INDEX_START_VALUE);
+ }
+
+ int numOfCols = this.columnMetaDataList.size();
+ if (columnIndex > numOfCols) {
+ throw new SQLException("Column Index out of range, " + columnIndex + " > " + numOfCols);
+ }
+
+ return columnIndex - 1;
+ }
}
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBStatement.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBStatement.java
index 381f1d3622a393cd47361c6e367e310d29fc5d72..e7317b8e1d6eb2744c50a5bf1d106c7b687cc965 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBStatement.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBStatement.java
@@ -52,12 +52,18 @@ public class TSDBStatement implements Statement {
this.isClosed = false;
}
+ @Override
public T unwrap(Class iface) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ try {
+ return iface.cast(this);
+ } catch (ClassCastException cce) {
+ throw new SQLException("Unable to unwrap to " + iface.toString());
+ }
}
+ @Override
public boolean isWrapperFor(Class> iface) throws SQLException {
- throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ return iface.isInstance(this);
}
public ResultSet executeQuery(String sql) throws SQLException {
@@ -130,10 +136,15 @@ public class TSDBStatement implements Statement {
}
public void setMaxFieldSize(int max) throws SQLException {
+ if (isClosed())
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
+
throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
public int getMaxRows() throws SQLException {
+ if (isClosed())
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
// always set maxRows to zero, meaning unlimitted rows in a resultSet
return 0;
}
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java
index 1aa3d5b3cefe2524f0246b500af6687a79d6b20c..38d3f2b6aa21427647d108038fdd616927221520 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java
@@ -15,28 +15,28 @@ import java.util.List;
import java.util.Map;
public class RestfulResultSet implements ResultSet {
- private static final String RESULT_SET_IS_CLOSED = "resultSet is closed.";
private volatile boolean isClosed;
private int pos = -1;
private final String database;
private final Statement statement;
// data
- private ArrayList> resultSet;
+ private ArrayList> resultSet = new ArrayList<>();
// meta
- private ArrayList columnNames;
- private ArrayList columns;
+ private ArrayList columnNames = new ArrayList<>();
+ private ArrayList columns = new ArrayList<>();
private RestfulResultSetMetaData metaData;
/**
- * 由一个result的Json构造结果集,对应执行show databases,show tables等这些语句,返回结果集,但无法获取结果集对应的meta,统一当成String处理
+ * 由一个result的Json构造结果集,对应执行show databases, show tables等这些语句,返回结果集,但无法获取结果集对应的meta,统一当成String处理
+ *
+ * @param resultJson: 包含data信息的结果集,有sql返回的结果集
***/
public RestfulResultSet(String database, Statement statement, JSONObject resultJson) {
this.database = database;
this.statement = statement;
// row data
JSONArray data = resultJson.getJSONArray("data");
- resultSet = new ArrayList<>();
int columnIndex = 0;
for (; columnIndex < data.size(); columnIndex++) {
ArrayList oneRow = new ArrayList<>();
@@ -48,15 +48,13 @@ public class RestfulResultSet implements ResultSet {
}
// column only names
- columnNames = new ArrayList<>();
- columns = new ArrayList<>();
JSONArray head = resultJson.getJSONArray("head");
for (int i = 0; i < head.size(); i++) {
String name = head.getString(i);
columnNames.add(name);
columns.add(new Field(name, "", 0, ""));
}
- this.metaData = new RestfulResultSetMetaData(this.database, columns);
+ this.metaData = new RestfulResultSetMetaData(this.database, columns, this);
}
/**
@@ -78,7 +76,7 @@ public class RestfulResultSet implements ResultSet {
}
}
this.columns = newColumns;
- this.metaData = new RestfulResultSetMetaData(this.database, this.columns);
+ this.metaData = new RestfulResultSetMetaData(this.database, this.columns, this);
}
public Field findField(String columnName, List fieldJsonList) {
@@ -91,7 +89,6 @@ public class RestfulResultSet implements ResultSet {
}
}
}
-
return null;
}
@@ -112,10 +109,9 @@ public class RestfulResultSet implements ResultSet {
@Override
public boolean next() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- if (pos < resultSet.size() - 1) {
- pos++;
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ pos++;
+ if (pos <= resultSet.size() - 1) {
return true;
}
return false;
@@ -131,37 +127,38 @@ public class RestfulResultSet implements ResultSet {
@Override
public boolean wasNull() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return resultSet.isEmpty();
}
@Override
public String getString(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
if (columnIndex > resultSet.get(pos).size()) {
throw new SQLException(TSDBConstants.WrapErrMsg("Column Index out of range, " + columnIndex + " > " + resultSet.get(pos).size()));
}
- return resultSet.get(pos).get(columnIndex - 1).toString();
+
+ columnIndex = getTrueColumnIndex(columnIndex);
+ return resultSet.get(pos).get(columnIndex).toString();
}
+
@Override
public boolean getBoolean(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
- String result = getString(columnIndex);
- if (!(result.equals("true") || result.equals("false"))) {
- throw new SQLException("not boolean value");
- }
- return result.equals("true");
+ columnIndex = getTrueColumnIndex(columnIndex);
+ int result = getInt(columnIndex);
+ return result == 0 ? false : true;
}
@Override
public byte getByte(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -169,40 +166,55 @@ public class RestfulResultSet implements ResultSet {
@Override
public short getShort(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- return Short.parseShort(getString(columnIndex));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ columnIndex = getTrueColumnIndex(columnIndex);
+ return Short.parseShort(resultSet.get(pos).get(columnIndex).toString());
}
@Override
public int getInt(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
- return Integer.parseInt(getString(columnIndex));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ columnIndex = getTrueColumnIndex(columnIndex);
+ return Integer.parseInt(resultSet.get(pos).get(columnIndex).toString());
}
@Override
public long getLong(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- return Long.parseLong(getString(columnIndex));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ columnIndex = getTrueColumnIndex(columnIndex);
+ return Long.parseLong(resultSet.get(pos).get(columnIndex).toString());
}
@Override
public float getFloat(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- return Float.parseFloat(getString(columnIndex));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ columnIndex = getTrueColumnIndex(columnIndex);
+ return Float.parseFloat(resultSet.get(pos).get(columnIndex).toString());
}
@Override
public double getDouble(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+ columnIndex = getTrueColumnIndex(columnIndex);
+ return Double.parseDouble(resultSet.get(pos).get(columnIndex).toString());
+ }
+
+ private int getTrueColumnIndex(int columnIndex) throws SQLException {
+ if (columnIndex < 1) {
+ throw new SQLException("Column Index out of range, " + columnIndex + " < 1");
+ }
+
+ int numOfCols = resultSet.get(pos).size();
+ if (columnIndex > numOfCols) {
+ throw new SQLException("Column Index out of range, " + columnIndex + " > " + numOfCols);
+ }
- return Double.parseDouble(getString(columnIndex));
+ return columnIndex - 1;
}
/*******************************************************************************************************************/
@@ -210,7 +222,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -218,7 +230,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public byte[] getBytes(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -226,7 +238,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public Date getDate(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -234,7 +246,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public Time getTime(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -242,17 +254,18 @@ public class RestfulResultSet implements ResultSet {
@Override
public Timestamp getTimestamp(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
- String strDate = getString(columnIndex);
- strDate = strDate.substring(1, strDate.length() - 1);
+ columnIndex = getTrueColumnIndex(columnIndex);
+ String strDate = resultSet.get(pos).get(columnIndex).toString();
+// strDate = strDate.substring(1, strDate.length() - 1);
return Timestamp.valueOf(strDate);
}
@Override
public InputStream getAsciiStream(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -260,7 +273,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public InputStream getUnicodeStream(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -268,17 +281,16 @@ public class RestfulResultSet implements ResultSet {
@Override
public InputStream getBinaryStream(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
+ /*************************************************************************************************************/
+
@Override
public String getString(String columnLabel) throws SQLException {
- if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- return getString(findColumn(columnLabel) + 1);
+ return getString(findColumn(columnLabel));
}
@Override
@@ -338,53 +350,44 @@ public class RestfulResultSet implements ResultSet {
@Override
public Timestamp getTimestamp(String columnLabel) throws SQLException {
- if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
- return Timestamp.valueOf(getString(findColumn(columnLabel)));
+ return getTimestamp(findColumn(columnLabel));
}
@Override
public InputStream getAsciiStream(String columnLabel) throws SQLException {
- if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ return getAsciiStream(findColumn(columnLabel));
}
@Override
public InputStream getUnicodeStream(String columnLabel) throws SQLException {
- if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ return getUnicodeStream(findColumn(columnLabel));
}
@Override
public InputStream getBinaryStream(String columnLabel) throws SQLException {
- if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ return getBinaryStream(findColumn(columnLabel));
}
+ /*************************************************************************************************************/
+
@Override
public SQLWarning getWarnings() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return null;
}
@Override
public void clearWarnings() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return;
}
@Override
public String getCursorName() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -392,7 +395,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public ResultSetMetaData getMetaData() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return this.metaData;
}
@@ -400,7 +403,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public Object getObject(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -413,15 +416,18 @@ public class RestfulResultSet implements ResultSet {
@Override
public int findColumn(String columnLabel) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
- return columnNames.indexOf(columnLabel);
+ int columnIndex = columnNames.indexOf(columnLabel);
+ if (columnIndex == -1)
+ throw new SQLException("cannot find Column in resultSet");
+ return columnIndex + 1;
}
@Override
public Reader getCharacterStream(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -429,7 +435,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public Reader getCharacterStream(String columnLabel) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -437,7 +443,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -445,7 +451,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public BigDecimal getBigDecimal(String columnLabel) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -453,78 +459,132 @@ public class RestfulResultSet implements ResultSet {
@Override
public boolean isBeforeFirst() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ return this.pos == -1 && this.resultSet.size() != 0;
}
@Override
public boolean isAfterLast() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+ return this.pos >= resultSet.size() && this.resultSet.size() != 0;
}
@Override
public boolean isFirst() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ return this.pos == 0;
}
@Override
public boolean isLast() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ if (this.resultSet.size() == 0)
+ return false;
+ return this.pos == (this.resultSet.size() - 1);
}
@Override
public void beforeFirst() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ synchronized (this) {
+ if (this.resultSet.size() > 0) {
+ this.pos = -1;
+ }
+ }
}
@Override
public void afterLast() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ synchronized (this) {
+ if (this.resultSet.size() > 0) {
+ this.pos = this.resultSet.size();
+ }
+ }
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@Override
public boolean first() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ if (this.resultSet.size() == 0)
+ return false;
+
+ synchronized (this) {
+ this.pos = 0;
+ }
+ return true;
}
@Override
public boolean last() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ if (this.resultSet.size() == 0)
+ return false;
+ synchronized (this) {
+ this.pos = this.resultSet.size() - 1;
+ }
+ return true;
}
@Override
public int getRow() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
-
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ int row;
+ synchronized (this) {
+ if (this.pos < 0 || this.pos >= this.resultSet.size())
+ return 0;
+ row = this.pos + 1;
+ }
+ return row;
}
@Override
public boolean absolute(int row) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+// if (this.resultSet.size() == 0)
+// return false;
+//
+// if (row == 0) {
+// beforeFirst();
+// return false;
+// } else if (row == 1) {
+// return first();
+// } else if (row == -1) {
+// return last();
+// } else if (row > this.resultSet.size()) {
+// afterLast();
+// return false;
+// } else {
+// if (row < 0) {
+// // adjust to reflect after end of result set
+// int newRowPosition = this.resultSet.size() + row + 1;
+// if (newRowPosition <= 0) {
+// beforeFirst();
+// return false;
+// } else {
+// return absolute(newRowPosition);
+// }
+// } else {
+// row--; // adjust for index difference
+// this.pos = row;
+// return true;
+// }
+// }
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -532,7 +592,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public boolean relative(int rows) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -540,7 +600,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public boolean previous() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@@ -548,17 +608,18 @@ public class RestfulResultSet implements ResultSet {
@Override
public void setFetchDirection(int direction) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
- if (direction != ResultSet.FETCH_REVERSE || direction != ResultSet.FETCH_REVERSE || direction != ResultSet.FETCH_UNKNOWN)
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+ if ((direction != ResultSet.FETCH_FORWARD) && (direction != ResultSet.FETCH_REVERSE) && (direction != ResultSet.FETCH_UNKNOWN))
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ if (!(getType() == ResultSet.TYPE_FORWARD_ONLY && direction == ResultSet.FETCH_FORWARD))
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@Override
public int getFetchDirection() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return ResultSet.FETCH_FORWARD;
}
@@ -566,17 +627,17 @@ public class RestfulResultSet implements ResultSet {
@Override
public void setFetchSize(int rows) throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
if (rows < 0)
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@Override
public int getFetchSize() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return this.resultSet.size();
}
@@ -834,7 +895,7 @@ public class RestfulResultSet implements ResultSet {
@Override
public Statement getStatement() throws SQLException {
if (isClosed())
- throw new SQLException(TSDBConstants.WrapErrMsg(RESULT_SET_IS_CLOSED));
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
return this.statement;
}
@@ -992,14 +1053,15 @@ public class RestfulResultSet implements ResultSet {
@Override
public int getHoldability() throws SQLException {
+ if (isClosed())
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
return ResultSet.HOLD_CURSORS_OVER_COMMIT;
}
@Override
public boolean isClosed() throws SQLException {
- return false;
- //TODO: SQLFeature Not Supported
-// throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ return isClosed;
}
@Override
@@ -1224,11 +1286,21 @@ public class RestfulResultSet implements ResultSet {
@Override
public T unwrap(Class iface) throws SQLException {
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ if (isClosed())
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+ try {
+ return iface.cast(this);
+ } catch (ClassCastException cce) {
+ throw new SQLException("Unable to unwrap to " + iface.toString());
+ }
}
@Override
public boolean isWrapperFor(Class> iface) throws SQLException {
- throw new SQLFeatureNotSupportedException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
+ if (isClosed())
+ throw new SQLException(TSDBConstants.WrapErrMsg(TSDBConstants.RESULT_SET_IS_CLOSED));
+
+ return iface.isInstance(this);
}
}
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java
index 1af3088b172f751ef40be5dd92b205949bc009d6..44a02f486b22063cabb8950c21d3a9f55bfc70c8 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java
@@ -1,17 +1,22 @@
package com.taosdata.jdbc.rs;
+import com.taosdata.jdbc.TSDBConstants;
+
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
+import java.sql.Timestamp;
import java.util.ArrayList;
public class RestfulResultSetMetaData implements ResultSetMetaData {
private final String database;
private ArrayList fields;
+ private final RestfulResultSet resultSet;
- public RestfulResultSetMetaData(String database, ArrayList fields) {
+ public RestfulResultSetMetaData(String database, ArrayList fields, RestfulResultSet resultSet) {
this.database = database;
this.fields = fields;
+ this.resultSet = resultSet;
}
@Override
@@ -26,13 +31,12 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
@Override
public boolean isCaseSensitive(int column) throws SQLException {
- //TODO
return false;
}
@Override
public boolean isSearchable(int column) throws SQLException {
- return false;
+ return true;
}
@Override
@@ -42,17 +46,30 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
@Override
public int isNullable(int column) throws SQLException {
+ if (column == 1)
+ return ResultSetMetaData.columnNoNulls;
return ResultSetMetaData.columnNullable;
}
@Override
public boolean isSigned(int column) throws SQLException {
- return false;
+ String type = this.fields.get(column - 1).type.toUpperCase();
+ switch (type) {
+ case "TINYINT":
+ case "SMALLINT":
+ case "INT":
+ case "BIGINT":
+ case "FLOAT":
+ case "DOUBLE":
+ return true;
+ default:
+ return false;
+ }
}
@Override
public int getColumnDisplaySize(int column) throws SQLException {
- return 0;
+ return this.fields.get(column - 1).length;
}
@Override
@@ -62,27 +79,46 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
@Override
public String getColumnName(int column) throws SQLException {
- return null;
+ return fields.get(column - 1).name;
}
@Override
public String getSchemaName(int column) throws SQLException {
- return this.database;
+ return "";
}
@Override
public int getPrecision(int column) throws SQLException {
- return 0;
+ String type = this.fields.get(column - 1).type.toUpperCase();
+ switch (type) {
+ case "FLOAT":
+ return 5;
+ case "DOUBLE":
+ return 9;
+ case "BINARY":
+ case "NCHAR":
+ return this.fields.get(column - 1).length;
+ default:
+ return 0;
+ }
}
@Override
public int getScale(int column) throws SQLException {
- return 0;
+ String type = this.fields.get(column - 1).type.toUpperCase();
+ switch (type) {
+ case "FLOAT":
+ return 5;
+ case "DOUBLE":
+ return 9;
+ default:
+ return 0;
+ }
}
@Override
public String getTableName(int column) throws SQLException {
- return null;
+ return "";
}
@Override
@@ -92,17 +128,41 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
@Override
public int getColumnType(int column) throws SQLException {
- return 0;
+ String type = this.fields.get(column - 1).type.toUpperCase();
+ switch (type) {
+ case "BOOL":
+ return java.sql.Types.BOOLEAN;
+ case "TINYINT":
+ return java.sql.Types.TINYINT;
+ case "SMALLINT":
+ return java.sql.Types.SMALLINT;
+ case "INT":
+ return java.sql.Types.INTEGER;
+ case "BIGINT":
+ return java.sql.Types.BIGINT;
+ case "FLOAT":
+ return java.sql.Types.FLOAT;
+ case "DOUBLE":
+ return java.sql.Types.DOUBLE;
+ case "BINARY":
+ return java.sql.Types.BINARY;
+ case "TIMESTAMP":
+ return java.sql.Types.TIMESTAMP;
+ case "NCHAR":
+ return java.sql.Types.NCHAR;
+ }
+ throw new SQLException(TSDBConstants.INVALID_VARIABLES);
}
@Override
public String getColumnTypeName(int column) throws SQLException {
- return null;
+ String type = fields.get(column - 1).type;
+ return type.toUpperCase();
}
@Override
public boolean isReadOnly(int column) throws SQLException {
- return false;
+ return true;
}
@Override
@@ -117,16 +177,43 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
@Override
public String getColumnClassName(int column) throws SQLException {
- return null;
+ String type = this.fields.get(column - 1).type;
+ String columnClassName = "";
+ switch (type) {
+ case "BOOL":
+ return Boolean.class.getName();
+ case "TINYINT":
+ case "SMALLINT":
+ return Short.class.getName();
+ case "INT":
+ return Integer.class.getName();
+ case "BIGINT":
+ return Long.class.getName();
+ case "FLOAT":
+ return Float.class.getName();
+ case "DOUBLE":
+ return Double.class.getName();
+ case "TIMESTAMP":
+ return Timestamp.class.getName();
+ case "BINARY":
+ case "NCHAR":
+ return String.class.getName();
+ }
+ return columnClassName;
}
@Override
public T unwrap(Class iface) throws SQLException {
- return null;
+ try {
+ return iface.cast(this);
+ } catch (ClassCastException cce) {
+ throw new SQLException("Unable to unwrap to " + iface.toString());
+ }
}
@Override
public boolean isWrapperFor(Class> iface) throws SQLException {
- return false;
+ return iface.isInstance(this);
}
+
}
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulStatement.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulStatement.java
index 8b2276fbb055cd18c86173f387fb7c93e296fe43..14ea3180924a8b23055ff610a8f7db5a70522039 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulStatement.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/rs/RestfulStatement.java
@@ -14,7 +14,6 @@ import java.util.stream.Collectors;
public class RestfulStatement implements Statement {
- private static final String STATEMENT_CLOSED = "Statement already closed.";
private boolean closed;
private String database;
private final RestfulConnection conn;
@@ -65,37 +64,18 @@ public class RestfulStatement implements Statement {
public ResultSet executeQuery(String sql) throws SQLException {
if (isClosed())
throw new SQLException("statement already closed");
- if (!SqlSyntaxValidator.isSelectSql(sql))
- throw new SQLException("not a select sql for executeQuery: " + sql);
+ if (!SqlSyntaxValidator.isValidForExecuteQuery(sql))
+ throw new SQLException("not a valid sql for executeQuery: " + sql);
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
- // row data
- String result = HttpClientPoolUtil.execute(url, sql);
- JSONObject resultJson = JSON.parseObject(result);
- if (resultJson.getString("status").equals("error")) {
- throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
+ if (SqlSyntaxValidator.isDatabaseUnspecifiedQuery(sql)) {
+ return executeOneQuery(url, sql);
}
- // parse table name from sql
- String[] tableIdentifiers = parseTableIdentifier(sql);
- if (tableIdentifiers != null) {
- List fieldJsonList = new ArrayList<>();
- for (String tableIdentifier : tableIdentifiers) {
- // field meta
- String fields = HttpClientPoolUtil.execute(url, "DESCRIBE " + tableIdentifier);
- JSONObject fieldJson = JSON.parseObject(fields);
- if (fieldJson.getString("status").equals("error")) {
- throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + fieldJson.getString("desc") + "\n" + "error code: " + fieldJson.getString("code")));
- }
- fieldJsonList.add(fieldJson);
- }
- this.resultSet = new RestfulResultSet(database, this, resultJson, fieldJsonList);
- } else {
- this.resultSet = new RestfulResultSet(database, this, resultJson);
- }
-
- this.affectedRows = 0;
- return resultSet;
+ if (this.database == null || this.database.isEmpty())
+ throw new SQLException("Database not specified or available");
+ HttpClientPoolUtil.execute(url, "use " + this.database);
+ return executeOneQuery(url, sql);
}
@Override
@@ -105,19 +85,15 @@ public class RestfulStatement implements Statement {
if (!SqlSyntaxValidator.isValidForExecuteUpdate(sql))
throw new SQLException("not a valid sql for executeUpdate: " + sql);
- if (this.database == null)
- throw new SQLException("Database not specified or available");
-
- final String url = "http://" + conn.getHost().trim() + ":" + conn.getPort() + "/rest/sql";
-// HttpClientPoolUtil.execute(url, "use " + conn.getDatabase());
- String result = HttpClientPoolUtil.execute(url, sql);
- JSONObject jsonObject = JSON.parseObject(result);
- if (jsonObject.getString("status").equals("error")) {
- throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonObject.getString("desc") + "\n" + "error code: " + jsonObject.getString("code")));
+ final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
+ if (SqlSyntaxValidator.isDatabaseUnspecifiedUpdate(sql)) {
+ return executeOneUpdate(url, sql);
}
- this.resultSet = null;
- this.affectedRows = Integer.parseInt(jsonObject.getString("rows"));
- return this.affectedRows;
+
+ if (this.database == null || this.database.isEmpty())
+ throw new SQLException("Database not specified or available");
+ HttpClientPoolUtil.execute(url, "use " + this.database);
+ return executeOneUpdate(url, sql);
}
@Override
@@ -131,14 +107,14 @@ public class RestfulStatement implements Statement {
@Override
public int getMaxFieldSize() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return TSDBConstants.maxFieldSize;
}
@Override
public void setMaxFieldSize(int max) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
if (max < 0)
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
// nothing to do
@@ -147,14 +123,14 @@ public class RestfulStatement implements Statement {
@Override
public int getMaxRows() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return 0;
}
@Override
public void setMaxRows(int max) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
if (max < 0)
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
// nothing to do
@@ -163,20 +139,20 @@ public class RestfulStatement implements Statement {
@Override
public void setEscapeProcessing(boolean enable) throws SQLException {
if (isClosed())
- throw new SQLException(RestfulStatement.STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
}
@Override
public int getQueryTimeout() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return 0;
}
@Override
public void setQueryTimeout(int seconds) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
if (seconds < 0)
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
}
@@ -189,7 +165,7 @@ public class RestfulStatement implements Statement {
@Override
public SQLWarning getWarnings() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return null;
}
@@ -197,53 +173,93 @@ public class RestfulStatement implements Statement {
public void clearWarnings() throws SQLException {
// nothing to do
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
}
@Override
public void setCursorName(String name) throws SQLException {
if (isClosed())
- throw new SQLException(RestfulStatement.STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG);
}
@Override
public boolean execute(String sql) throws SQLException {
- if (isClosed()) {
+ if (isClosed())
throw new SQLException("Invalid method call on a closed statement.");
- }
+ if (!SqlSyntaxValidator.isValidForExecute(sql))
+ throw new SQLException("not a valid sql for execute: " + sql);
+
//如果执行了use操作应该将当前Statement的catalog设置为新的database
+ final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
if (SqlSyntaxValidator.isUseSql(sql)) {
+ HttpClientPoolUtil.execute(url, sql);
this.database = sql.trim().replace("use", "").trim();
this.conn.setCatalog(this.database);
+ } else if (SqlSyntaxValidator.isDatabaseUnspecifiedQuery(sql)) {
+ executeOneQuery(url, sql);
+ } else if (SqlSyntaxValidator.isDatabaseUnspecifiedUpdate(sql)) {
+ executeOneUpdate(url, sql);
+ } else {
+ if (SqlSyntaxValidator.isValidForExecuteQuery(sql)) {
+ executeQuery(sql);
+ } else {
+ executeUpdate(sql);
+ }
}
- if (this.database == null)
- throw new SQLException("Database not specified or available");
- if (SqlSyntaxValidator.isSelectSql(sql)) {
- executeQuery(sql);
- } else if (SqlSyntaxValidator.isShowSql(sql) || SqlSyntaxValidator.isDescribeSql(sql)) {
- final String url = "http://" + conn.getHost().trim() + ":" + conn.getPort() + "/rest/sql";
- if (!SqlSyntaxValidator.isShowDatabaseSql(sql)) {
- HttpClientPoolUtil.execute(url, "use " + conn.getDatabase());
- }
- String result = HttpClientPoolUtil.execute(url, sql);
- JSONObject resultJson = JSON.parseObject(result);
- if (resultJson.getString("status").equals("error")) {
- throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
+ return true;
+ }
+
+ private ResultSet executeOneQuery(String url, String sql) throws SQLException {
+ if (!SqlSyntaxValidator.isValidForExecuteQuery(sql))
+ throw new SQLException("not a select sql for executeQuery: " + sql);
+
+ // row data
+ String result = HttpClientPoolUtil.execute(url, sql);
+ JSONObject resultJson = JSON.parseObject(result);
+ if (resultJson.getString("status").equals("error")) {
+ throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
+ }
+ // parse table name from sql
+ String[] tableIdentifiers = parseTableIdentifier(sql);
+ if (tableIdentifiers != null) {
+ List fieldJsonList = new ArrayList<>();
+ for (String tableIdentifier : tableIdentifiers) {
+ // field meta
+ String fields = HttpClientPoolUtil.execute(url, "DESCRIBE " + tableIdentifier);
+ JSONObject fieldJson = JSON.parseObject(fields);
+ if (fieldJson.getString("status").equals("error")) {
+ throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + fieldJson.getString("desc") + "\n" + "error code: " + fieldJson.getString("code")));
+ }
+ fieldJsonList.add(fieldJson);
}
- this.resultSet = new RestfulResultSet(database, this, resultJson);
+ this.resultSet = new RestfulResultSet(database, this, resultJson, fieldJsonList);
} else {
- executeUpdate(sql);
+ this.resultSet = new RestfulResultSet(database, this, resultJson);
}
+ this.affectedRows = 0;
+ return resultSet;
+ }
- return true;
+ private int executeOneUpdate(String url, String sql) throws SQLException {
+ if (!SqlSyntaxValidator.isValidForExecuteUpdate(sql))
+ throw new SQLException("not a valid sql for executeUpdate: " + sql);
+
+ String result = HttpClientPoolUtil.execute(url, sql);
+ JSONObject jsonObject = JSON.parseObject(result);
+ if (jsonObject.getString("status").equals("error")) {
+ throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + jsonObject.getString("desc") + "\n" + "error code: " + jsonObject.getString("code")));
+ }
+ this.resultSet = null;
+ this.affectedRows = Integer.parseInt(jsonObject.getString("rows"));
+ return this.affectedRows;
}
@Override
public ResultSet getResultSet() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return resultSet;
}
@@ -275,7 +291,7 @@ public class RestfulStatement implements Statement {
@Override
public void setFetchSize(int rows) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
if (rows < 0)
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
//nothing to do
@@ -284,28 +300,28 @@ public class RestfulStatement implements Statement {
@Override
public int getFetchSize() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return 0;
}
@Override
public int getResultSetConcurrency() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return this.resultSet.getConcurrency();
}
@Override
public int getResultSetType() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return this.resultSet.getType();
}
@Override
public void addBatch(String sql) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
//TODO:
}
@@ -323,14 +339,14 @@ public class RestfulStatement implements Statement {
@Override
public Connection getConnection() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return this.conn;
}
@Override
public boolean getMoreResults(int current) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
if (resultSet == null)
return false;
@@ -388,7 +404,7 @@ public class RestfulStatement implements Statement {
@Override
public int getResultSetHoldability() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return this.resultSet.getHoldability();
}
@@ -400,28 +416,28 @@ public class RestfulStatement implements Statement {
@Override
public void setPoolable(boolean poolable) throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
//nothing to do
}
@Override
public boolean isPoolable() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return false;
}
@Override
public void closeOnCompletion() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
this.closeOnCompletion = true;
}
@Override
public boolean isCloseOnCompletion() throws SQLException {
if (isClosed())
- throw new SQLException(STATEMENT_CLOSED);
+ throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
return this.closeOnCompletion;
}
diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/SqlSyntaxValidator.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/SqlSyntaxValidator.java
index f0d92346167411ca6da78015392ba8a21286e1cf..251ca2af013e2b1c9cb314b776621455c91d9384 100644
--- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/SqlSyntaxValidator.java
+++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/utils/SqlSyntaxValidator.java
@@ -20,8 +20,11 @@ import java.sql.Connection;
public class SqlSyntaxValidator {
- private static final String[] updateSQL = {"insert", "update", "delete", "create", "alter", "drop", "show", "describe", "use", "import"};
- private static final String[] querySQL = {"select"};
+ private static final String[] SQL = {"select", "insert", "import", "create", "use", "alter", "drop", "set", "show", "describe"};
+ private static final String[] updateSQL = {"insert", "import", "create", "use", "alter", "drop", "set"};
+ private static final String[] querySQL = {"select", "show", "describe"};
+
+ private static final String[] databaseUnspecifiedShow = {"databases", "dnodes", "mnodes", "variables"};
private TSDBConnection tsdbConnection;
@@ -37,8 +40,38 @@ public class SqlSyntaxValidator {
return false;
}
+ public static boolean isValidForExecuteQuery(String sql) {
+ for (String prefix : querySQL) {
+ if (sql.trim().toLowerCase().startsWith(prefix))
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isValidForExecute(String sql) {
+ for (String prefix : SQL) {
+ if (sql.trim().toLowerCase().startsWith(prefix))
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isDatabaseUnspecifiedQuery(String sql) {
+ for (String databaseObj : databaseUnspecifiedShow) {
+ if (sql.trim().toLowerCase().matches("show\\s+" + databaseObj + ".*"))
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean isDatabaseUnspecifiedUpdate(String sql) {
+ sql = sql.trim().toLowerCase();
+ return sql.matches("create\\s+database.*") || sql.startsWith("set") || sql.matches("drop\\s+database.*");
+ }
+
public static boolean isUseSql(String sql) {
- return sql.trim().toLowerCase().startsWith("use") || sql.trim().toLowerCase().matches("create\\s*database.*") || sql.toLowerCase().toLowerCase().matches("drop\\s*database.*");
+ return sql.trim().toLowerCase().startsWith("use");
+// || sql.trim().toLowerCase().matches("create\\s*database.*") || sql.toLowerCase().toLowerCase().matches("drop\\s*database.*");
}
public static boolean isShowSql(String sql) {
@@ -58,8 +91,9 @@ public class SqlSyntaxValidator {
return sql.trim().toLowerCase().startsWith("select");
}
-
public static boolean isShowDatabaseSql(String sql) {
return sql.trim().toLowerCase().matches("show\\s*databases");
}
+
+
}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/BaseTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/BaseTest.java
deleted file mode 100644
index ce3735c12894807efadd1f5673fc34eee43ae01b..0000000000000000000000000000000000000000
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/BaseTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.taosdata.jdbc;
-
-import com.taosdata.jdbc.utils.TDNodes;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public abstract class BaseTest {
-
- private static boolean testCluster = false;
- private static TDNodes nodes = new TDNodes();
-
- @BeforeClass
- public static void setupEnv() {
- try {
- if (nodes.getTDNode(1).getTaosdPid() != null) {
- System.out.println("Kill taosd before running JDBC test");
- nodes.getTDNode(1).setRunning(1);
- nodes.stop(1);
- }
- nodes.setTestCluster(testCluster);
- nodes.deploy(1);
- nodes.start(1);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- @AfterClass
- public static void cleanUpEnv() {
- nodes.stop(1);
- }
-}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/BatchInsertTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/BatchInsertTest.java
deleted file mode 100644
index 4046e3edf6e1d9d62ceddaf99f73212dd1dd02c2..0000000000000000000000000000000000000000
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/BatchInsertTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package com.taosdata.jdbc;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.sql.*;
-import java.util.Properties;
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertEquals;
-
-public class BatchInsertTest {
-
- private Connection connection;
-
- private static String dbName = "test";
- private static String stbName = "meters";
- private static String host = "127.0.0.1";
- private static int numOfTables = 30;
- private static int numOfRecordsPerTable = 1000;
- private static long ts = 1496732686000l;
- private static String tablePrefix = "t";
-
- @Before
- public void createDatabase() 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);
-
- Statement stmt = connection.createStatement();
- stmt.execute("drop database if exists " + dbName);
- stmt.execute("create database if not exists " + dbName);
- stmt.execute("use " + dbName);
-
- String createTableSql = "create table " + stbName + "(ts timestamp, f1 int, f2 int, f3 int) tags(areaid int, loc binary(20))";
- stmt.execute(createTableSql);
-
- for (int i = 0; i < numOfTables; i++) {
- String loc = i % 2 == 0 ? "beijing" : "shanghai";
- String createSubTalbesSql = "create table " + tablePrefix + i + " using " + stbName + " tags(" + i + ", '" + loc + "')";
- stmt.execute(createSubTalbesSql);
- }
- stmt.close();
- }
-
- @Test
- public void testBatchInsert() throws SQLException {
- ExecutorService executorService = Executors.newFixedThreadPool(numOfTables);
- for (int i = 0; i < numOfTables; i++) {
- final int index = i;
- executorService.execute(() -> {
- try {
- long startTime = System.currentTimeMillis();
- Statement statement = connection.createStatement(); // get statement
- StringBuilder sb = new StringBuilder();
- sb.append("INSERT INTO " + tablePrefix + index + " VALUES");
- Random rand = new Random();
- for (int j = 1; j <= numOfRecordsPerTable; j++) {
- sb.append("(" + (ts + j) + ", ");
- sb.append(rand.nextInt(100) + ", ");
- sb.append(rand.nextInt(100) + ", ");
- sb.append(rand.nextInt(100) + ")");
- }
- statement.addBatch(sb.toString());
- statement.executeBatch();
- long endTime = System.currentTimeMillis();
- System.out.println("Thread " + index + " takes " + (endTime - startTime) + " microseconds");
- connection.commit();
- statement.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- });
- }
- executorService.shutdown();
-
- try {
- executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- Statement statement = connection.createStatement();
- ResultSet rs = statement.executeQuery("select * from meters");
- int num = 0;
- while (rs.next()) {
- num++;
- }
- assertEquals(num, numOfTables * numOfRecordsPerTable);
- rs.close();
- }
-
- @After
- public void close() {
- try {
- if (connection != null)
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/PreparedStatementTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/PreparedStatementTest.java
index f52c50ff1a6dde4709a99a0172eef2d13877d3d0..8c9b258dcdf8d4e5bb2f6cfc91fe945f3425b4d2 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/PreparedStatementTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/PreparedStatementTest.java
@@ -1,9 +1,7 @@
package com.taosdata.jdbc;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
+import org.junit.*;
+import org.junit.runners.MethodSorters;
import java.sql.*;
import java.util.Properties;
@@ -11,14 +9,13 @@ import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-@FixMethodOrder()
-public class PreparedStatementTest extends BaseTest {
- static Connection connection = null;
- static PreparedStatement statement = null;
+@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";
- static ResultSet resSet = null;
@BeforeClass
public static void createConnection() throws SQLException {
@@ -28,19 +25,16 @@ public class PreparedStatementTest extends BaseTest {
return;
}
Properties properties = new Properties();
- properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
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 createTableAndQuery() throws SQLException {
+ public void case001_createTableAndQuery() throws SQLException {
long ts = System.currentTimeMillis();
statement.executeUpdate("create database if not exists " + dbName);
@@ -48,141 +42,132 @@ public class PreparedStatementTest extends BaseTest {
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 testPreparedStatement() throws SQLException {
+ public void case002_testPreparedStatement() throws SQLException {
long ts = System.currentTimeMillis() + 20000;
- PreparedStatement saveStatement = connection
- .prepareStatement("insert into " + dbName + "." + tName + " values (" + ts + ", 1)");
+ PreparedStatement saveStatement = connection.prepareStatement("insert into " + dbName + "." + tName + " values (" + ts + ", 1)");
int affectedRows = saveStatement.executeUpdate();
assertTrue(1 == affectedRows);
+ saveStatement.close();
}
@Test
- public void testSavedPreparedStatement() throws SQLException {
+ public void case003_testSavedPreparedStatement() throws SQLException {
long ts = System.currentTimeMillis();
-
- TSDBPreparedStatement saveStatement = (TSDBPreparedStatement) connection
- .prepareStatement("insert into " + dbName + "." + tName + " values (?, ?)");
-
+ 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 testUnsupport() {
- // if(null == resSet) {
- // return;
- // }
- TSDBPreparedStatement tsdbStatement = (TSDBPreparedStatement) statement;
- try {
- tsdbStatement.unwrap(null);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.isWrapperFor(null);
- } catch (SQLException e) {
- }
+ public void case004_testUnsupport() throws SQLException {
+
+ Assert.assertNotNull(statement.unwrap(TSDBPreparedStatement.class));
+ Assert.assertTrue(statement.isWrapperFor(TSDBPreparedStatement.class));
+
try {
- tsdbStatement.getMaxFieldSize();
+ statement.getMaxFieldSize();
} catch (SQLException e) {
}
try {
- tsdbStatement.setMaxFieldSize(0);
+ statement.setMaxFieldSize(0);
} catch (SQLException e) {
}
try {
- tsdbStatement.setEscapeProcessing(true);
+ statement.setEscapeProcessing(true);
} catch (SQLException e) {
}
try {
- tsdbStatement.cancel();
+ statement.cancel();
} catch (SQLException e) {
}
try {
- tsdbStatement.getWarnings();
+ statement.getWarnings();
} catch (SQLException e) {
}
try {
- tsdbStatement.clearWarnings();
+ statement.clearWarnings();
} catch (SQLException e) {
}
try {
- tsdbStatement.setCursorName(null);
+ statement.setCursorName(null);
} catch (SQLException e) {
}
try {
- tsdbStatement.getMoreResults();
+ statement.getMoreResults();
} catch (SQLException e) {
}
try {
- tsdbStatement.setFetchDirection(0);
+ statement.setFetchDirection(0);
} catch (SQLException e) {
}
try {
- tsdbStatement.getFetchDirection();
+ statement.getFetchDirection();
} catch (SQLException e) {
}
try {
- tsdbStatement.getResultSetConcurrency();
+ statement.getResultSetConcurrency();
} catch (SQLException e) {
}
try {
- tsdbStatement.getResultSetType();
+ statement.getResultSetType();
} catch (SQLException e) {
}
try {
- tsdbStatement.getConnection();
+ statement.getConnection();
} catch (SQLException e) {
}
try {
- tsdbStatement.getMoreResults();
+ statement.getMoreResults();
} catch (SQLException e) {
}
try {
- tsdbStatement.getGeneratedKeys();
+ statement.getGeneratedKeys();
} catch (SQLException e) {
}
try {
- tsdbStatement.executeUpdate(null, 0);
+ statement.executeUpdate(null, 0);
} catch (SQLException e) {
}
try {
- tsdbStatement.executeUpdate(null, new int[]{0});
+ statement.executeUpdate(null, new int[]{0});
} catch (SQLException e) {
}
try {
- tsdbStatement.executeUpdate(null, new String[]{"str1", "str2"});
+ statement.executeUpdate(null, new String[]{"str1", "str2"});
} catch (SQLException e) {
}
try {
- tsdbStatement.getResultSetHoldability();
+ statement.getResultSetHoldability();
} catch (SQLException e) {
}
try {
- tsdbStatement.setPoolable(true);
+ statement.setPoolable(true);
} catch (SQLException e) {
}
try {
- tsdbStatement.isPoolable();
+ statement.isPoolable();
} catch (SQLException e) {
}
try {
- tsdbStatement.closeOnCompletion();
+ statement.closeOnCompletion();
} catch (SQLException e) {
+
}
try {
- tsdbStatement.isCloseOnCompletion();
+ statement.isCloseOnCompletion();
} catch (SQLException e) {
}
}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/QueryDataTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/QueryDataTest.java
index 611e21e887b1988a66019d437133d6c3f7926961..37fbc284877dbb27ecb8c9da1b752cfaff029023 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/QueryDataTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/QueryDataTest.java
@@ -6,76 +6,67 @@ import org.junit.Test;
import java.sql.*;
import java.util.Properties;
-import java.util.Random;
import static org.junit.Assert.assertEquals;
-import java.util.Properties;
-import java.util.concurrent.Executors;
-import java.util.concurrent.*;
-
-import static org.junit.Assert.assertTrue;
-public class QueryDataTest extends BaseTest {
+public class QueryDataTest {
- static Connection connection = null;
- static Statement statement = null;
+ static Connection connection;
+ static Statement statement;
static String dbName = "test";
static String stbName = "meters";
- static String host = "localhost";
- static int numOfTables = 30;
- final static int numOfRecordsPerTable = 1000;
- static long ts = 1496732686000l;
- final static String tablePrefix = "t";
+ static String host = "127.0.0.1";
@Before
- public void createDatabase() throws SQLException {
+ public void createDatabase() {
try {
Class.forName("com.taosdata.jdbc.TSDBDriver");
- } catch (ClassNotFoundException e) {
+ 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);
+
+ statement = connection.createStatement();
+ statement.executeUpdate("drop database if exists " + dbName);
+ statement.executeUpdate("create database if not exists " + dbName);
+ statement.executeUpdate("use " + dbName);
+
+ String createTableSql = "create table " + stbName + "(ts timestamp, name binary(64))";
+ statement.executeUpdate(createTableSql);
+
+ } catch (ClassNotFoundException | SQLException e) {
return;
}
-
- Properties properties = new Properties();
- properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
- 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);
-
- statement = connection.createStatement();
- statement.executeUpdate("drop database if exists " + dbName);
- statement.executeUpdate("create database if not exists " + dbName);
- statement.executeUpdate("use " + dbName);
-
- String createTableSql = "create table " + stbName + "(ts timestamp, name binary(6))";
- statement.executeUpdate(createTableSql);
}
-
- @Test
- public void testQueryBinaryData() throws SQLException{
-
- String insertSql = "insert into " + stbName + " values(now, 'taosda')";
- System.out.println(insertSql);
+ @Test
+ public void testQueryBinaryData() throws SQLException {
+ String insertSql = "insert into " + stbName + " values(now, 'taosdata')";
+ System.out.println(insertSql);
statement.executeUpdate(insertSql);
String querySql = "select * from " + stbName;
- ResultSet rs = statement.executeQuery(querySql);
+ ResultSet rs = statement.executeQuery(querySql);
- while(rs.next()) {
- String name = rs.getString(2) + "001";
+ while (rs.next()) {
+ String name = rs.getString(2);
System.out.println("name = " + name);
- assertEquals(name, "taosda001");
+ assertEquals("taosdata", name);
}
- rs.close();
+ rs.close();
}
-
@After
- public void close() throws Exception {
- statement.close();
- connection.close();
- Thread.sleep(10);
+ public void close() {
+ try {
+ if (statement != null)
+ statement.close();
+ if (connection != null)
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
}
-
+
}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ResultSetTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ResultSetTest.java
index 8067c547df148587766d87e204f5abad2bfb659d..3d80ff066cacfdf71f087942f11e2ee5e86b65ee 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ResultSetTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ResultSetTest.java
@@ -1,6 +1,7 @@
package com.taosdata.jdbc;
import org.junit.AfterClass;
+import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -13,42 +14,37 @@ import java.util.Properties;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-public class ResultSetTest extends BaseTest {
- static Connection connection = null;
- static Statement statement = null;
+public class ResultSetTest {
+ static Connection connection;
+ static Statement statement;
static String dbName = "test";
static String tName = "t0";
static String host = "localhost";
- static ResultSet resSet = null;
+ static ResultSet resSet;
@BeforeClass
- public static void createDatabaseAndTable() throws SQLException {
+ public static void createDatabaseAndTable() {
try {
Class.forName("com.taosdata.jdbc.TSDBDriver");
- } catch (ClassNotFoundException e) {
+ Properties properties = new Properties();
+ properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
+ properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
+ properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
+ connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/", properties);
+ statement = connection.createStatement();
+ statement.executeUpdate("drop database if exists " + dbName);
+ statement.executeUpdate("create database if not exists " + dbName);
+ statement.execute("use " + dbName);
+ statement.executeUpdate("create table if not exists " + dbName + "." + tName + " (ts timestamp, k1 int, k2 bigint, k3 float, k4 double, k5 binary(30), k6 smallint, k7 bool, k8 nchar(20))");
+ } catch (ClassNotFoundException | SQLException e) {
return;
}
- Properties properties = new Properties();
- properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
- properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
- 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);
-
- statement = connection.createStatement();
- statement.executeUpdate("drop database if exists " + dbName);
- statement.executeUpdate("create database if not exists " + dbName);
- statement.executeUpdate("create table if not exists " + dbName + "." + tName +
- " (ts timestamp, k1 int, k2 bigint, k3 float, k4 double, k5 binary(30), k6 smallint, k7 bool, k8 nchar(20))");
-
- statement.executeQuery("use " + dbName);
}
@Test
public void testResultSet() {
- String sql = null;
+ String sql;
long ts = 1496732686000l;
int v1 = 2147483600;
long v2 = ts + 1000;
@@ -119,16 +115,8 @@ public class ResultSetTest extends BaseTest {
public void testUnsupport() throws SQLException {
statement.executeQuery("show databases");
resSet = statement.getResultSet();
- try {
- resSet.unwrap(null);
- } catch (SQLException e) {
- assertTrue(e.getMessage().contains("this operation is NOT supported currently!"));
- }
- try {
- resSet.isWrapperFor(null);
- } catch (SQLException e) {
- assertTrue(e.getMessage().contains("this operation is NOT supported currently!"));
- }
+ Assert.assertNotNull(resSet.unwrap(TSDBResultSet.class));
+ Assert.assertTrue(resSet.isWrapperFor(TSDBResultSet.class));
try {
resSet.getAsciiStream(0);
} catch (SQLException e) {
@@ -815,13 +803,18 @@ public class ResultSetTest extends BaseTest {
assertEquals(res.length, 2);
statement.clearBatch();
}
- @AfterClass
- public static void close() throws Exception {
- statement.executeUpdate("drop database " + dbName);
- statement.close();
- connection.close();
- Thread.sleep(10);
+ @AfterClass
+ public static void close() {
+ try {
+ statement.executeUpdate("drop database " + dbName);
+ if (statement != null)
+ statement.close();
+ if (connection != null)
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
}
}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StableTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StableTest.java
index c86a0b4c6aeeab5def76d758268b2b9e0d84b01f..0a1c548baa330edada8c393f79cc89583bea7b18 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StableTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StableTest.java
@@ -29,6 +29,7 @@ public class StableTest {
properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/", properties);
Statement statement = connection.createStatement();
+ statement.execute("drop database if exists " + dbName);
statement.execute("create database if not exists " + dbName);
statement.execute("use " + dbName);
statement.close();
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StatementTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StatementTest.java
index a79512984e6d78fda30b1281fefe91ddea7c2434..b09482fb03f643cd183468b18bf36e50c50bf0b4 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StatementTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StatementTest.java
@@ -1,6 +1,7 @@
package com.taosdata.jdbc;
import org.junit.AfterClass;
+import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -16,23 +17,22 @@ public class StatementTest {
static String dbName = "test";
static String tName = "t0";
static String host = "localhost";
- static ResultSet resSet = null;
@BeforeClass
public static void createConnection() throws SQLException {
try {
Class.forName("com.taosdata.jdbc.TSDBDriver");
+ 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/?user=root&password=taosdata", properties);
+ statement = connection.createStatement();
+ statement.executeUpdate("drop database if exists " + dbName);
+
} 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/?user=root&password=taosdata", properties);
-
- statement = connection.createStatement();
- statement.executeUpdate("drop database if exists " + dbName);
}
@Test
@@ -49,7 +49,6 @@ public class StatementTest {
} catch (SQLException e) {
e.printStackTrace();
}
-
}
@Test
@@ -67,118 +66,46 @@ public class StatementTest {
assertEquals(false, isClosed);
}
- @Test
- public void testUnsupport() {
- TSDBStatement tsdbStatement = (TSDBStatement) statement;
- try {
- tsdbStatement.unwrap(null);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.isWrapperFor(null);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getMaxFieldSize();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.setMaxFieldSize(0);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.setEscapeProcessing(true);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.cancel();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getWarnings();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.clearWarnings();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.setCursorName(null);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getMoreResults();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.setFetchDirection(0);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getFetchDirection();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getResultSetConcurrency();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getResultSetType();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getConnection();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getMoreResults();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getGeneratedKeys();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.executeUpdate(null, 0);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.executeUpdate(null, new int[]{0});
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.executeUpdate(null, new String[]{"str1", "str2"});
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.getResultSetHoldability();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.setPoolable(true);
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.isPoolable();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.closeOnCompletion();
- } catch (SQLException e) {
- }
- try {
- tsdbStatement.isCloseOnCompletion();
- } catch (SQLException e) {
- }
+ @Test(expected = SQLException.class)
+ public void testUnsupport() throws SQLException {
+ Assert.assertNotNull(statement.unwrap(TSDBStatement.class));
+ Assert.assertTrue(statement.isWrapperFor(TSDBStatement.class));
+
+ statement.getMaxFieldSize();
+ statement.setMaxFieldSize(0);
+ statement.setEscapeProcessing(true);
+ statement.cancel();
+ statement.getWarnings();
+ statement.clearWarnings();
+ statement.setCursorName(null);
+ statement.getMoreResults();
+ statement.setFetchDirection(0);
+ statement.getFetchDirection();
+ statement.getResultSetConcurrency();
+ statement.getResultSetType();
+ statement.getConnection();
+ statement.getMoreResults();
+ statement.getGeneratedKeys();
+ statement.executeUpdate(null, 0);
+ statement.executeUpdate(null, new int[]{0});
+ statement.executeUpdate(null, new String[]{"str1", "str2"});
+ statement.getResultSetHoldability();
+ statement.setPoolable(true);
+ statement.isPoolable();
+ statement.closeOnCompletion();
+ statement.isCloseOnCompletion();
}
@AfterClass
- public static void close() throws Exception {
- if (!statement.isClosed()) {
- statement.executeUpdate("drop database if exists " + dbName);
- statement.close();
- connection.close();
- Thread.sleep(10);
+ public static void close() {
+ try {
+ statement.execute("drop database if exists " + dbName);
+ if (statement != null)
+ statement.close();
+ if (connection != null)
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
}
}
}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java
index 0a71c77d1d9dc718cc029c6a0b11ed63cd3034c1..1d8ff08db6d5f177fe74de579e1b6bb26ee35750 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java
@@ -10,36 +10,37 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
-public class SubscribeTest extends BaseTest {
- Connection connection = null;
- Statement statement = null;
+public class SubscribeTest {
+ Connection connection;
+ Statement statement;
String dbName = "test";
String tName = "t0";
String host = "localhost";
String topic = "test";
@Before
- public void createDatabase() throws SQLException {
+ public void createDatabase() {
try {
Class.forName("com.taosdata.jdbc.TSDBDriver");
- } catch (ClassNotFoundException e) {
- return;
- }
- Properties properties = new Properties();
- properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
- 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);
+ Properties properties = new Properties();
+ properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
+ 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);
- statement = connection.createStatement();
- statement.executeUpdate("create database if not exists " + dbName);
- statement.executeUpdate("create table if not exists " + dbName + "." + tName + " (ts timestamp, k int, v int)");
- long ts = System.currentTimeMillis();
- for (int i = 0; i < 2; i++) {
- ts += i;
- String sql = "insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")";
- statement.executeUpdate(sql);
+ statement = connection.createStatement();
+ statement.executeUpdate("create database if not exists " + dbName);
+ statement.executeUpdate("create table if not exists " + dbName + "." + tName + " (ts timestamp, k int, v int)");
+ long ts = System.currentTimeMillis();
+ for (int i = 0; i < 2; i++) {
+ ts += i;
+ String sql = "insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")";
+ statement.executeUpdate(sql);
+ }
+
+ } catch (ClassNotFoundException | SQLException e) {
+ return;
}
}
@@ -79,10 +80,16 @@ public class SubscribeTest extends BaseTest {
}
@After
- public void close() throws Exception {
- statement.executeQuery("drop database " + dbName);
- statement.close();
- connection.close();
- Thread.sleep(10);
+ public void close() {
+ try {
+ statement.executeQuery("drop database " + dbName);
+ if (statement != null)
+ statement.close();
+ if (connection != null)
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
}
}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDatabaseMetaDataTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDatabaseMetaDataTest.java
index 8066b38573b87d9d5b91a628b56ab5700e379113..a7657fa3e581c96cf85555b16fca5f8b4c7f8ebb 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDatabaseMetaDataTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDatabaseMetaDataTest.java
@@ -6,37 +6,9 @@ import java.sql.*;
import java.util.Properties;
public class TSDBDatabaseMetaDataTest {
- private TSDBDatabaseMetaData metaData;
private static final String host = "127.0.0.1";
- private Connection connection;
-
- @BeforeClass
- public void before() {
- try {
- Class.forName("com.taosdata.jdbc.TSDBDriver");
- Properties properties = new Properties();
- properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
- 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 + ":6030/?user=root&password=taosdata", properties);
- metaData = connection.getMetaData().unwrap(TSDBDatabaseMetaData.class);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- @AfterClass
- public void after() {
- try {
- if (connection != null)
- connection.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
+ private static Connection connection;
+ private static TSDBDatabaseMetaData metaData;
@Test
public void unwrap() throws SQLException {
@@ -61,7 +33,7 @@ public class TSDBDatabaseMetaDataTest {
@Test
public void getURL() throws SQLException {
- Assert.assertEquals("jdbc:TAOS://localhost:6030/?user=root&password=taosdata", metaData.getURL());
+ Assert.assertEquals("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata", metaData.getURL());
}
@Test
@@ -975,4 +947,32 @@ public class TSDBDatabaseMetaDataTest {
public void generatedKeyAlwaysReturned() throws SQLException {
Assert.assertFalse(metaData.generatedKeyAlwaysReturned());
}
+
+ @BeforeClass
+ public static void beforeClass() {
+ try {
+ Class.forName("com.taosdata.jdbc.TSDBDriver");
+ 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 + ":6030/?user=root&password=taosdata", properties);
+ metaData = connection.getMetaData().unwrap(TSDBDatabaseMetaData.class);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ try {
+ if (connection != null)
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDriverTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDriverTest.java
index 8adcdefb2974d5817793297091eee1c2f40a52b9..445723f501a85f7c697afffb59b273bcf6a1a630 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDriverTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBDriverTest.java
@@ -3,9 +3,6 @@ package com.taosdata.jdbc;
import org.junit.BeforeClass;
import org.junit.Test;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
import java.sql.*;
import java.util.Properties;
@@ -27,54 +24,15 @@ public class TSDBDriverTest {
"jdbc:TAOS://:/test",
"jdbc:TAOS://localhost:0/?user=root&password=taosdata"
};
- private static boolean islibLoaded = false;
- private static boolean isTaosdActived;
private Connection conn;
- @BeforeClass
- public static void before() {
- String osName = System.getProperty("os.name").toLowerCase();
- if (!osName.equals("linux"))
- return;
- // try to load taos lib
- try {
- System.loadLibrary("taos");
- islibLoaded = true;
- } catch (UnsatisfiedLinkError error) {
- System.out.println("load tdengine lib failed.");
- error.printStackTrace();
- }
- // check taosd is activated
- try {
- String[] cmd = {"/bin/bash", "-c", "ps -ef | grep taosd | grep -v \"grep\""};
- Process exec = Runtime.getRuntime().exec(cmd);
- BufferedReader reader = new BufferedReader(new InputStreamReader(exec.getInputStream()));
- int lineCnt = 0;
- while (reader.readLine() != null) {
- lineCnt++;
- }
- if (lineCnt > 0)
- isTaosdActived = true;
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- try {
- Class.forName("com.taosdata.jdbc.TSDBDriver");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
@Test
public void testConnectWithJdbcURL() {
final String url = "jdbc:TAOS://localhost:6030/log?user=root&password=taosdata";
try {
- if (islibLoaded && isTaosdActived) {
- conn = DriverManager.getConnection(url);
- assertNotNull("failure - connection should not be null", conn);
- }
+ conn = DriverManager.getConnection(url);
+ assertNotNull("failure - connection should not be null", conn);
} catch (SQLException e) {
e.printStackTrace();
fail("failure - should not throw Exception");
@@ -89,10 +47,8 @@ public class TSDBDriverTest {
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
try {
- if (islibLoaded && isTaosdActived) {
- conn = DriverManager.getConnection(jdbcUrl, connProps);
- assertNotNull("failure - connection should not be null", conn);
- }
+ conn = DriverManager.getConnection(jdbcUrl, connProps);
+ assertNotNull("failure - connection should not be null", conn);
} catch (SQLException e) {
e.printStackTrace();
fail("failure - should not throw Exception");
@@ -107,10 +63,8 @@ public class TSDBDriverTest {
connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "UTC-8");
try {
- if (islibLoaded && isTaosdActived) {
- conn = DriverManager.getConnection(jdbcUrl, connProps);
- assertNotNull("failure - connection should not be null", conn);
- }
+ conn = DriverManager.getConnection(jdbcUrl, connProps);
+ assertNotNull("failure - connection should not be null", conn);
} catch (SQLException e) {
e.printStackTrace();
fail("failure - should not throw Exception");
@@ -207,4 +161,14 @@ public class TSDBDriverTest {
assertNull("failure - getParentLogger should be be null", new TSDBDriver().getParentLogger());
}
+ @BeforeClass
+ public static void before() {
+ try {
+ Class.forName("com.taosdata.jdbc.TSDBDriver");
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+
}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBPreparedStatementTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBPreparedStatementTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebacf6af6b480d7d8b9364256551f4cdb0034608
--- /dev/null
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBPreparedStatementTest.java
@@ -0,0 +1,186 @@
+package com.taosdata.jdbc;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class TSDBPreparedStatementTest {
+ private static final String host = "127.0.0.1";
+ private static Connection conn;
+
+ @Test
+ public void executeQuery() {
+
+ }
+
+ @Test
+ public void executeUpdate() {
+
+ }
+
+ @Test
+ public void setNull() {
+ }
+
+ @Test
+ public void setBoolean() {
+ }
+
+ @Test
+ public void setByte() {
+ }
+
+ @Test
+ public void setShort() {
+ }
+
+ @Test
+ public void setInt() {
+ }
+
+ @Test
+ public void setLong() {
+ }
+
+ @Test
+ public void setFloat() {
+ }
+
+ @Test
+ public void setDouble() {
+ }
+
+ @Test
+ public void setBigDecimal() {
+ }
+
+ @Test
+ public void setString() {
+ }
+
+ @Test
+ public void setBytes() {
+ }
+
+ @Test
+ public void setDate() {
+ }
+
+ @Test
+ public void setTime() {
+ }
+
+ @Test
+ public void setTimestamp() {
+ }
+
+ @Test
+ public void setAsciiStream() {
+ }
+
+ @Test
+ public void setUnicodeStream() {
+ }
+
+ @Test
+ public void setBinaryStream() {
+ }
+
+ @Test
+ public void clearParameters() {
+ }
+
+ @Test
+ public void setObject() {
+
+ }
+
+ @Test
+ public void execute() {
+ }
+
+ @Test
+ public void addBatch() {
+
+ }
+
+ @Test
+ public void setCharacterStream() {
+ }
+
+ @Test
+ public void setRef() {
+ }
+
+ @Test
+ public void setBlob() {
+ }
+
+ @Test
+ public void setClob() {
+ }
+
+ @Test
+ public void setArray() {
+ }
+
+ @Test
+ public void getMetaData() {
+ }
+
+ @Test
+ public void setURL() {
+ }
+
+ @Test
+ public void getParameterMetaData() {
+ }
+
+ @Test
+ public void setRowId() {
+ }
+
+ @Test
+ public void setNString() {
+ }
+
+ @Test
+ public void setNCharacterStream() {
+ }
+
+ @Test
+ public void setNClob() {
+
+ }
+
+ @Test
+ public void setSQLXML() {
+
+ }
+
+
+ @BeforeClass
+ public static void beforeClass() {
+ try {
+ Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
+ conn = DriverManager.getConnection("jdbc:TAOS://" + host + ":6030/?user=root&password=taosdata");
+ } catch (ClassNotFoundException | SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ try {
+ if (conn != null)
+ conn.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/BatchInsertTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/BatchInsertTest.java
index 9608c4985db15312e8e2966badfe4db8241bc306..472da34980d98cbe694783b120bc5533a908fa5b 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/BatchInsertTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/cases/BatchInsertTest.java
@@ -1,14 +1,12 @@
package com.taosdata.jdbc.cases;
-import com.taosdata.jdbc.lib.TSDBCommon;
+import com.taosdata.jdbc.TSDBDriver;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
+import java.sql.*;
+import java.util.Properties;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -18,57 +16,71 @@ import static org.junit.Assert.assertEquals;
public class BatchInsertTest {
- static String host = "localhost";
+ static String host = "127.0.0.1";
static String dbName = "test";
static String stbName = "meters";
static int numOfTables = 30;
final static int numOfRecordsPerTable = 1000;
static long ts = 1496732686000l;
final static String tablePrefix = "t";
-
private Connection connection;
@Before
public void before() {
try {
- connection = TSDBCommon.getConn(host);
- TSDBCommon.createDatabase(connection, dbName);
- TSDBCommon.createStable(connection, stbName);
- TSDBCommon.createTables(connection, numOfTables, stbName, tablePrefix);
+ Class.forName("com.taosdata.jdbc.TSDBDriver");
+ Properties properties = new Properties();
+ properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
+ 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);
+
+ Statement statement = connection.createStatement();
+ statement.executeUpdate("drop database if exists " + dbName);
+ statement.executeUpdate("create database if not exists " + dbName);
+ statement.executeUpdate("use " + dbName);
+ // create stable
+ String createTableSql = "create table " + stbName + "(ts timestamp, f1 int, f2 int, f3 int) tags(areaid int, loc binary(20))";
+ statement.executeUpdate(createTableSql);
+ // create tables
+ for(int i = 0; i < numOfTables; i++) {
+ String loc = i % 2 == 0 ? "beijing" : "shanghai";
+ String createSubTalbesSql = "create table " + tablePrefix + i + " using " + stbName + " tags(" + i + ", '" + loc + "')";
+ statement.executeUpdate(createSubTalbesSql);
+ }
+ statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
- public void testBatchInsert(){
+ public void testBatchInsert() {
ExecutorService executorService = Executors.newFixedThreadPool(numOfTables);
for (int i = 0; i < numOfTables; i++) {
final int index = i;
- executorService.execute(new Runnable() {
- @Override
- public void run() {
- try {
- long startTime = System.currentTimeMillis();
- Statement statement = connection.createStatement(); // get statement
- StringBuilder sb = new StringBuilder();
- sb.append("INSERT INTO " + tablePrefix + index + " VALUES");
- Random rand = new Random();
- for (int j = 1; j <= numOfRecordsPerTable; j++) {
- sb.append("(" + (ts + j) + ", ");
- sb.append(rand.nextInt(100) + ", ");
- sb.append(rand.nextInt(100) + ", ");
- sb.append(rand.nextInt(100) + ")");
- }
- statement.addBatch(sb.toString());
- statement.executeBatch();
- long endTime = System.currentTimeMillis();
- System.out.println("Thread " + index + " takes " + (endTime - startTime) + " microseconds");
- connection.commit();
- statement.close();
- } catch (Exception e) {
- e.printStackTrace();
+ executorService.execute(() -> {
+ try {
+ long startTime = System.currentTimeMillis();
+ Statement statement = connection.createStatement(); // get statement
+ StringBuilder sb = new StringBuilder();
+ sb.append("INSERT INTO " + tablePrefix + index + " VALUES");
+ Random rand = new Random();
+ for (int j = 1; j <= numOfRecordsPerTable; j++) {
+ sb.append("(" + (ts + j) + ", ");
+ sb.append(rand.nextInt(100) + ", ");
+ sb.append(rand.nextInt(100) + ", ");
+ sb.append(rand.nextInt(100) + ")");
}
+ statement.addBatch(sb.toString());
+ statement.executeBatch();
+ long endTime = System.currentTimeMillis();
+ System.out.println("Thread " + index + " takes " + (endTime - startTime) + " microseconds");
+ connection.commit();
+ statement.close();
+ } catch (Exception e) {
+ e.printStackTrace();
}
});
}
@@ -80,7 +92,7 @@ public class BatchInsertTest {
e.printStackTrace();
}
- try{
+ try {
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("select * from meters");
int num = 0;
@@ -89,7 +101,7 @@ public class BatchInsertTest {
}
assertEquals(num, numOfTables * numOfRecordsPerTable);
rs.close();
- }catch (Exception e){
+ } catch (Exception e) {
e.printStackTrace();
}
}
@@ -102,7 +114,6 @@ public class BatchInsertTest {
} catch (SQLException e) {
e.printStackTrace();
}
-
}
}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/lib/TSDBCommon.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/lib/TSDBCommon.java
deleted file mode 100644
index 0e2613d617074571c86c39ef253d68af9a0f6922..0000000000000000000000000000000000000000
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/lib/TSDBCommon.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.taosdata.jdbc.lib;
-
-import com.taosdata.jdbc.TSDBDriver;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Properties;
-
-public class TSDBCommon {
-
- public static Connection getConn(String host) throws SQLException, ClassNotFoundException {
- Class.forName("com.taosdata.jdbc.TSDBDriver");
- Properties properties = new Properties();
- properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host);
- 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");
- return DriverManager.getConnection("jdbc:TAOS://" + host + ":0/", properties);
- }
-
- public static void createDatabase(Connection connection, String dbName) throws SQLException {
- Statement statement = connection.createStatement();
- statement.executeUpdate("drop database if exists " + dbName);
- statement.executeUpdate("create database if not exists " + dbName);
- statement.executeUpdate("use " + dbName);
- statement.close();
- }
-
- public static void createStable(Connection connection, String stbName) throws SQLException {
- Statement statement = connection.createStatement();
- String createTableSql = "create table " + stbName + "(ts timestamp, f1 int, f2 int, f3 int) tags(areaid int, loc binary(20))";
- statement.executeUpdate(createTableSql);
- statement.close();
- }
-
- public static void createTables(Connection connection, int numOfTables, String stbName,String tablePrefix) throws SQLException {
- Statement statement = connection.createStatement();
- for(int i = 0; i < numOfTables; i++) {
- String loc = i % 2 == 0 ? "beijing" : "shanghai";
- String createSubTalbesSql = "create table " + tablePrefix + i + " using " + stbName + " tags(" + i + ", '" + loc + "')";
- statement.executeUpdate(createSubTalbesSql);
- }
- statement.close();
- }
-}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/AuthenticationTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/AuthenticationTest.java
index 918714da22d45df3e78af93c07423689f1baccc2..11d4a143535d7e116d92875a6eb52b5bf7a5b6e0 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/AuthenticationTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/AuthenticationTest.java
@@ -8,6 +8,7 @@ import java.sql.*;
public class AuthenticationTest {
private static final String host = "127.0.0.1";
+ // private static final String host = "master";
private static final String user = "root";
private static final String password = "123456";
private Connection conn;
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulJDBCTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulJDBCTest.java
index ee4b2ed4dd2944a5b09df9afb5d15638422d52cb..185c0306f5259206c96072b7f306f18a7a8a8f7e 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulJDBCTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulJDBCTest.java
@@ -10,23 +10,12 @@ import java.util.Random;
public class RestfulJDBCTest {
private static final String host = "127.0.0.1";
- private Connection connection;
-
- @Before
- public void before() throws ClassNotFoundException, SQLException {
- Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
- connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
- }
-
- @After
- public void after() throws SQLException {
- if (connection != null)
- connection.close();
- }
-
+ // private static final String host = "master";
+ private static Connection connection;
+ private Random random = new Random(System.currentTimeMillis());
/**
- * 查询所有log.log
+ * select * from log.log
**/
@Test
public void testCase001() {
@@ -85,7 +74,6 @@ public class RestfulJDBCTest {
}
}
- private Random random = new Random(System.currentTimeMillis());
@Test
public void testCase005() {
@@ -105,5 +93,50 @@ public class RestfulJDBCTest {
}
}
+ @Test
+ public void testCase006() {
+ try (Statement stmt = connection.createStatement()) {
+ ResultSet rs = stmt.executeQuery("select * from weather");
+ while (rs.next()) {
+ System.out.print("ts: " + rs.getTimestamp("ts"));
+ System.out.print(", temperature: " + rs.getString("temperature"));
+ System.out.print(", humidity: " + rs.getString("humidity"));
+ System.out.println(", location: " + rs.getString("location"));
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testCase007() {
+ try (Statement stmt = connection.createStatement()) {
+ ResultSet rs = stmt.executeQuery("select * from weather");
+ ResultSetMetaData meta = rs.getMetaData();
+ while (rs.next()) {
+ int columnCount = meta.getColumnCount();
+ for (int i = 1; i <= columnCount; i++) {
+ String columnLabel = meta.getColumnLabel(i);
+ String value = rs.getString(i);
+ System.out.print(columnLabel + ": " + value + "\t");
+ }
+ System.out.println();
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @BeforeClass
+ public static void before() throws ClassNotFoundException, SQLException {
+ Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
+ connection = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
+ }
+
+ @AfterClass
+ public static void after() throws SQLException {
+ if (connection != null)
+ connection.close();
+ }
}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulResultSetMetaDataTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulResultSetMetaDataTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..13973d8b6bf6c11ced27866724b91c0746a024d0
--- /dev/null
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulResultSetMetaDataTest.java
@@ -0,0 +1,221 @@
+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 RestfulResultSetMetaDataTest {
+
+ private static final String host = "127.0.0.1";
+// private static final String host = "master";
+
+ private static Connection conn;
+ private static Statement stmt;
+ private static ResultSet rs;
+ private static ResultSetMetaData meta;
+
+ @Test
+ public void getColumnCount() throws SQLException {
+ Assert.assertEquals(10, meta.getColumnCount());
+ }
+
+ @Test
+ public void isAutoIncrement() throws SQLException {
+ Assert.assertFalse(meta.isAutoIncrement(1));
+ Assert.assertFalse(meta.isAutoIncrement(2));
+ Assert.assertFalse(meta.isAutoIncrement(3));
+ Assert.assertFalse(meta.isAutoIncrement(4));
+ Assert.assertFalse(meta.isAutoIncrement(5));
+ Assert.assertFalse(meta.isAutoIncrement(6));
+ Assert.assertFalse(meta.isAutoIncrement(7));
+ Assert.assertFalse(meta.isAutoIncrement(8));
+ Assert.assertFalse(meta.isAutoIncrement(9));
+ Assert.assertFalse(meta.isAutoIncrement(10));
+ }
+
+ @Test
+ public void isCaseSensitive() throws SQLException {
+ Assert.assertFalse(meta.isCaseSensitive(1));
+ }
+
+ @Test
+ public void isSearchable() throws SQLException {
+ Assert.assertTrue(meta.isSearchable(1));
+ }
+
+ @Test
+ public void isCurrency() throws SQLException {
+ Assert.assertFalse(meta.isCurrency(1));
+ }
+
+ @Test
+ public void isNullable() throws SQLException {
+ Assert.assertEquals(ResultSetMetaData.columnNoNulls, meta.isNullable(1));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(2));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(3));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(4));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(5));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(6));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(7));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(8));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(9));
+ Assert.assertEquals(ResultSetMetaData.columnNullable, meta.isNullable(10));
+ }
+
+ @Test
+ public void isSigned() throws SQLException {
+ Assert.assertFalse(meta.isSigned(1));
+ }
+
+ @Test
+ public void getColumnDisplaySize() throws SQLException {
+ Assert.assertEquals(64, meta.getColumnDisplaySize(10));
+ }
+
+ @Test
+ public void getColumnLabel() throws SQLException {
+ Assert.assertEquals("f1", meta.getColumnLabel(1));
+ }
+
+ @Test
+ public void getColumnName() throws SQLException {
+ Assert.assertEquals("f1", meta.getColumnName(1));
+ }
+
+ @Test
+ public void getSchemaName() throws SQLException {
+ Assert.assertEquals("", meta.getSchemaName(1));
+ }
+
+ @Test
+ public void getPrecision() throws SQLException {
+ Assert.assertEquals(0, meta.getPrecision(1));
+ }
+
+ @Test
+ public void getScale() throws SQLException {
+ Assert.assertEquals(0, meta.getScale(1));
+ }
+
+ @Test
+ public void getTableName() throws SQLException {
+ Assert.assertEquals("", meta.getTableName(1));
+ }
+
+ @Test
+ public void getCatalogName() throws SQLException {
+ Assert.assertEquals("restful_test", meta.getCatalogName(1));
+ Assert.assertEquals("restful_test", meta.getCatalogName(2));
+ Assert.assertEquals("restful_test", meta.getCatalogName(3));
+ Assert.assertEquals("restful_test", meta.getCatalogName(4));
+ Assert.assertEquals("restful_test", meta.getCatalogName(5));
+ Assert.assertEquals("restful_test", meta.getCatalogName(6));
+ Assert.assertEquals("restful_test", meta.getCatalogName(7));
+ Assert.assertEquals("restful_test", meta.getCatalogName(8));
+ Assert.assertEquals("restful_test", meta.getCatalogName(9));
+ Assert.assertEquals("restful_test", meta.getCatalogName(10));
+ }
+
+ @Test
+ public void getColumnType() throws SQLException {
+ Assert.assertEquals(Types.TIMESTAMP, meta.getColumnType(1));
+ Assert.assertEquals(Types.INTEGER, meta.getColumnType(2));
+ Assert.assertEquals(Types.BIGINT, meta.getColumnType(3));
+ Assert.assertEquals(Types.FLOAT, meta.getColumnType(4));
+ Assert.assertEquals(Types.DOUBLE, meta.getColumnType(5));
+ Assert.assertEquals(Types.BINARY, meta.getColumnType(6));
+ Assert.assertEquals(Types.SMALLINT, meta.getColumnType(7));
+ Assert.assertEquals(Types.TINYINT, meta.getColumnType(8));
+ Assert.assertEquals(Types.BOOLEAN, meta.getColumnType(9));
+ Assert.assertEquals(Types.NCHAR, meta.getColumnType(10));
+ }
+
+ @Test
+ public void getColumnTypeName() throws SQLException {
+ Assert.assertEquals("TIMESTAMP", meta.getColumnTypeName(1));
+ Assert.assertEquals("INT", meta.getColumnTypeName(2));
+ Assert.assertEquals("BIGINT", meta.getColumnTypeName(3));
+ Assert.assertEquals("FLOAT", meta.getColumnTypeName(4));
+ Assert.assertEquals("DOUBLE", meta.getColumnTypeName(5));
+ Assert.assertEquals("BINARY", meta.getColumnTypeName(6));
+ Assert.assertEquals("SMALLINT", meta.getColumnTypeName(7));
+ Assert.assertEquals("TINYINT", meta.getColumnTypeName(8));
+ Assert.assertEquals("BOOL", meta.getColumnTypeName(9));
+ Assert.assertEquals("NCHAR", meta.getColumnTypeName(10));
+ }
+
+ @Test
+ public void isReadOnly() throws SQLException {
+ Assert.assertTrue(meta.isReadOnly(1));
+ }
+
+ @Test
+ public void isWritable() throws SQLException {
+ Assert.assertFalse(meta.isWritable(1));
+ }
+
+ @Test
+ public void isDefinitelyWritable() throws SQLException {
+ Assert.assertFalse(meta.isDefinitelyWritable(1));
+ }
+
+ @Test
+ public void getColumnClassName() throws SQLException {
+ Assert.assertEquals(Timestamp.class.getName(), meta.getColumnClassName(1));
+ Assert.assertEquals(Integer.class.getName(), meta.getColumnClassName(2));
+ Assert.assertEquals(Long.class.getName(), meta.getColumnClassName(3));
+ Assert.assertEquals(Float.class.getName(), meta.getColumnClassName(4));
+ Assert.assertEquals(Double.class.getName(), meta.getColumnClassName(5));
+ Assert.assertEquals(String.class.getName(), meta.getColumnClassName(6));
+ Assert.assertEquals(Short.class.getName(), meta.getColumnClassName(7));
+ Assert.assertEquals(Short.class.getName(), meta.getColumnClassName(8));
+ Assert.assertEquals(Boolean.class.getName(), meta.getColumnClassName(9));
+ Assert.assertEquals(String.class.getName(), meta.getColumnClassName(10));
+ }
+
+ @Test
+ public void unwrap() throws SQLException {
+ Assert.assertNotNull(meta.unwrap(RestfulResultSetMetaData.class));
+ }
+
+ @Test
+ public void isWrapperFor() throws SQLException {
+ Assert.assertTrue(meta.isWrapperFor(RestfulResultSetMetaData.class));
+ }
+
+ @BeforeClass
+ public static void beforeClass() {
+ try {
+ Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
+ conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
+ stmt = conn.createStatement();
+ stmt.execute("create database if not exists restful_test");
+ stmt.execute("use restful_test");
+ stmt.execute("drop table if exists weather");
+ stmt.execute("create table if not exists weather(f1 timestamp, f2 int, f3 bigint, f4 float, f5 double, f6 binary(64), f7 smallint, f8 tinyint, f9 bool, f10 nchar(64))");
+ stmt.execute("insert into restful_test.weather values('2021-01-01 00:00:00.000', 1, 100, 3.1415, 3.1415926, 'abc', 10, 10, true, '涛思数据')");
+ rs = stmt.executeQuery("select * from restful_test.weather");
+ rs.next();
+ meta = rs.getMetaData();
+ } catch (ClassNotFoundException | SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ try {
+ if (rs != null)
+ rs.close();
+ if (stmt != null)
+ stmt.close();
+ if (conn != null)
+ conn.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulResultSetTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulResultSetTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..a14d09588d21f5d405cbb2456c9833d2a411ea96
--- /dev/null
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/RestfulResultSetTest.java
@@ -0,0 +1,588 @@
+package com.taosdata.jdbc.rs;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.sql.*;
+
+public class RestfulResultSetTest {
+
+ private static final String host = "127.0.0.1";
+// private static final String host = "master";
+
+ private static Connection conn;
+ private static Statement stmt;
+ private static ResultSet rs;
+
+ @Test
+ public void wasNull() throws SQLException {
+ Assert.assertFalse(rs.wasNull());
+ }
+
+ @Test
+ public void getString() throws SQLException {
+ String f10 = rs.getString("f10");
+ Assert.assertEquals("涛思数据", f10);
+ f10 = rs.getString(10);
+ Assert.assertEquals("涛思数据", f10);
+ }
+
+ @Test
+ public void getBoolean() throws SQLException {
+ Boolean f9 = rs.getBoolean("f9");
+ Assert.assertEquals(true, f9);
+ f9 = rs.getBoolean(9);
+ Assert.assertEquals(true, f9);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getByte() throws SQLException {
+ rs.getByte(1);
+ }
+
+ @Test
+ public void getShort() throws SQLException {
+ short f7 = rs.getShort("f7");
+ Assert.assertEquals(10, f7);
+ f7 = rs.getShort(7);
+ Assert.assertEquals(10, f7);
+ }
+
+ @Test
+ public void getInt() throws SQLException {
+ int f2 = rs.getInt("f2");
+ Assert.assertEquals(1, f2);
+ f2 = rs.getInt(2);
+ Assert.assertEquals(1, f2);
+ }
+
+ @Test
+ public void getLong() throws SQLException {
+ long f3 = rs.getLong("f3");
+ Assert.assertEquals(100, f3);
+ f3 = rs.getLong(3);
+ Assert.assertEquals(100, f3);
+ }
+
+ @Test
+ public void getFloat() throws SQLException {
+ float f4 = rs.getFloat("f4");
+ Assert.assertEquals(3.1415f, f4, 0f);
+ f4 = rs.getFloat(4);
+ Assert.assertEquals(3.1415f, f4, 0f);
+ }
+
+ @Test
+ public void getDouble() throws SQLException {
+ double f5 = rs.getDouble("f5");
+ Assert.assertEquals(3.1415926, f5, 0.0);
+ f5 = rs.getDouble(5);
+ Assert.assertEquals(3.1415926, f5, 0.0);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getBigDecimal() throws SQLException {
+ rs.getBigDecimal("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getBytes() throws SQLException {
+ rs.getBytes("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getDate() throws SQLException {
+ rs.getDate("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getTime() throws SQLException {
+ rs.getTime("f1");
+ }
+
+ @Test
+ public void getTimestamp() throws SQLException {
+ Timestamp f1 = rs.getTimestamp("f1");
+ Assert.assertEquals("2021-01-01 00:00:00.0", f1.toString());
+ f1 = rs.getTimestamp(1);
+ Assert.assertEquals("2021-01-01 00:00:00.0", f1.toString());
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getAsciiStream() throws SQLException {
+ rs.getAsciiStream("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getUnicodeStream() throws SQLException {
+ rs.getUnicodeStream("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getBinaryStream() throws SQLException {
+ rs.getBinaryStream("f1");
+ }
+
+ @Test
+ public void getWarnings() throws SQLException {
+ Assert.assertNull(rs.getWarnings());
+ }
+
+ @Test
+ public void clearWarnings() throws SQLException {
+ rs.clearWarnings();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getCursorName() throws SQLException {
+ rs.getCursorName();
+ }
+
+ @Test
+ public void getMetaData() throws SQLException {
+ ResultSetMetaData meta = rs.getMetaData();
+ Assert.assertNotNull(meta);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getObject() throws SQLException {
+ rs.getObject("f1");
+ }
+
+ @Test(expected = SQLException.class)
+ public void findColumn() throws SQLException {
+ int columnIndex = rs.findColumn("f1");
+ Assert.assertEquals(1, columnIndex);
+ columnIndex = rs.findColumn("f2");
+ Assert.assertEquals(2, columnIndex);
+ columnIndex = rs.findColumn("f3");
+ Assert.assertEquals(3, columnIndex);
+ columnIndex = rs.findColumn("f4");
+ Assert.assertEquals(4, columnIndex);
+ columnIndex = rs.findColumn("f5");
+ Assert.assertEquals(5, columnIndex);
+ columnIndex = rs.findColumn("f6");
+ Assert.assertEquals(6, columnIndex);
+ columnIndex = rs.findColumn("f7");
+ Assert.assertEquals(7, columnIndex);
+ columnIndex = rs.findColumn("f8");
+ Assert.assertEquals(8, columnIndex);
+ columnIndex = rs.findColumn("f9");
+ Assert.assertEquals(9, columnIndex);
+ columnIndex = rs.findColumn("f10");
+ Assert.assertEquals(10, columnIndex);
+
+ rs.findColumn("f11");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getCharacterStream() throws SQLException {
+ rs.getCharacterStream(1);
+ }
+
+ @Test
+ public void isBeforeFirst() throws SQLException {
+ Assert.assertFalse(rs.isBeforeFirst());
+ rs.beforeFirst();
+ Assert.assertTrue(rs.isBeforeFirst());
+ rs.next();
+ }
+
+ @Test
+ public void isAfterLast() throws SQLException {
+ Assert.assertFalse(rs.isAfterLast());
+ }
+
+ @Test
+ public void isFirst() throws SQLException {
+ Assert.assertTrue(rs.isFirst());
+ }
+
+ @Test
+ public void isLast() throws SQLException {
+ Assert.assertTrue(rs.isLast());
+ }
+
+ @Test
+ public void beforeFirst() throws SQLException {
+ rs.beforeFirst();
+ Assert.assertTrue(rs.isBeforeFirst());
+ rs.next();
+ }
+
+ @Test
+ public void afterLast() throws SQLException {
+ rs.afterLast();
+ Assert.assertTrue(rs.isAfterLast());
+ rs.first();
+ }
+
+ @Test
+ public void first() throws SQLException {
+ rs.first();
+ Assert.assertEquals("2021-01-01 00:00:00.0", rs.getTimestamp("f1").toString());
+ }
+
+ @Test
+ public void last() throws SQLException {
+ rs.last();
+ Assert.assertEquals("2021-01-01 00:00:00.0", rs.getTimestamp("f1").toString());
+ }
+
+ @Test
+ public void getRow() throws SQLException {
+ int row = rs.getRow();
+ Assert.assertEquals(1, row);
+ rs.beforeFirst();
+ row = rs.getRow();
+ Assert.assertEquals(0, row);
+ rs.first();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void absolute() throws SQLException {
+ rs.absolute(-1);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void relative() throws SQLException {
+ rs.relative(-1);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void previous() throws SQLException {
+ rs.previous();
+ }
+
+ @Test(expected = SQLException.class)
+ public void setFetchDirection() throws SQLException {
+ rs.setFetchDirection(ResultSet.FETCH_FORWARD);
+ rs.setFetchDirection(ResultSet.FETCH_UNKNOWN);
+ }
+
+ @Test
+ public void getFetchDirection() throws SQLException {
+ Assert.assertEquals(ResultSet.FETCH_FORWARD, rs.getFetchDirection());
+ }
+
+ @Test(expected = SQLException.class)
+ public void setFetchSize() throws SQLException {
+ rs.setFetchSize(0);
+ }
+
+ @Test
+ public void getFetchSize() throws SQLException {
+ Assert.assertEquals(1, rs.getFetchSize());
+ }
+
+ @Test
+ public void getType() throws SQLException {
+ Assert.assertEquals(ResultSet.TYPE_FORWARD_ONLY, rs.getType());
+ }
+
+ @Test
+ public void getConcurrency() throws SQLException {
+ Assert.assertEquals(ResultSet.CONCUR_READ_ONLY, rs.getConcurrency());
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void rowUpdated() throws SQLException {
+ rs.rowUpdated();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void rowInserted() throws SQLException {
+ rs.rowInserted();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void rowDeleted() throws SQLException {
+ rs.rowDeleted();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateNull() throws SQLException {
+ rs.updateNull("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateBoolean() throws SQLException {
+ rs.updateBoolean(1, false);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateByte() throws SQLException {
+ rs.updateByte(1, new Byte("0"));
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateShort() throws SQLException {
+ rs.updateShort(1, new Short("0"));
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateInt() throws SQLException {
+ rs.updateInt(1, 1);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateLong() throws SQLException {
+ rs.updateLong(1, 1l);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateFloat() throws SQLException {
+ rs.updateFloat(1, 1f);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateDouble() throws SQLException {
+ rs.updateDouble(1, 1.0);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateBigDecimal() throws SQLException {
+ rs.updateBigDecimal(1, new BigDecimal(1));
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateString() throws SQLException {
+ rs.updateString(1, "abc");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateBytes() throws SQLException {
+ rs.updateBytes(1, new byte[]{});
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateDate() throws SQLException {
+ rs.updateDate(1, new Date(System.currentTimeMillis()));
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateTime() throws SQLException {
+ rs.updateTime(1, new Time(System.currentTimeMillis()));
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateTimestamp() throws SQLException {
+ rs.updateTimestamp(1, new Timestamp(System.currentTimeMillis()));
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateAsciiStream() throws SQLException {
+ rs.updateAsciiStream(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateBinaryStream() throws SQLException {
+ rs.updateBinaryStream(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateCharacterStream() throws SQLException {
+ rs.updateCharacterStream(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateObject() throws SQLException {
+ rs.updateObject(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void insertRow() throws SQLException {
+ rs.insertRow();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateRow() throws SQLException {
+ rs.updateRow();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void deleteRow() throws SQLException {
+ rs.deleteRow();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void refreshRow() throws SQLException {
+ rs.refreshRow();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void cancelRowUpdates() throws SQLException {
+ rs.cancelRowUpdates();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void moveToInsertRow() throws SQLException {
+ rs.moveToInsertRow();
+ }
+
+ @Test
+ public void getStatement() throws SQLException {
+ Statement stmt = rs.getStatement();
+ Assert.assertNotNull(stmt);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void moveToCurrentRow() throws SQLException {
+ rs.moveToCurrentRow();
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getRef() throws SQLException {
+ rs.getRef(1);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getBlob() throws SQLException {
+ rs.getBlob("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getClob() throws SQLException {
+ rs.getClob("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getArray() throws SQLException {
+ rs.getArray("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getURL() throws SQLException {
+ rs.getURL("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateRef() throws SQLException {
+ rs.updateRef("f1", null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateBlob() throws SQLException {
+ rs.updateBlob(1, (InputStream) null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateClob() throws SQLException {
+ rs.updateClob(1, (Reader) null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateArray() throws SQLException {
+ rs.updateArray(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getRowId() throws SQLException {
+ rs.getRowId("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateRowId() throws SQLException {
+ rs.updateRowId(1, null);
+ }
+
+ @Test
+ public void getHoldability() throws SQLException {
+ Assert.assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, rs.getHoldability());
+ }
+
+ @Test
+ public void isClosed() throws SQLException {
+ Assert.assertFalse(rs.isClosed());
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateNString() throws SQLException {
+ rs.updateNString(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateNClob() throws SQLException {
+ rs.updateNClob(1, (Reader) null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getNClob() throws SQLException {
+ rs.getNClob("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getSQLXML() throws SQLException {
+ rs.getSQLXML("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateSQLXML() throws SQLException {
+ rs.updateSQLXML(1, null);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getNString() throws SQLException {
+ rs.getNString("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void getNCharacterStream() throws SQLException {
+ rs.getNCharacterStream("f1");
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void updateNCharacterStream() throws SQLException {
+ rs.updateNCharacterStream(1, null);
+ }
+
+ @Test
+ public void unwrap() throws SQLException {
+ RestfulResultSet unwrap = rs.unwrap(RestfulResultSet.class);
+ Assert.assertNotNull(unwrap);
+ }
+
+ @Test
+ public void isWrapperFor() throws SQLException {
+ Assert.assertTrue(rs.isWrapperFor(RestfulResultSet.class));
+ }
+
+ @BeforeClass
+ public static void beforeClass() {
+ try {
+ Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
+ conn = DriverManager.getConnection("jdbc:TAOS-RS://" + host + ":6041/restful_test?user=root&password=taosdata");
+ stmt = conn.createStatement();
+ stmt.execute("create database if not exists restful_test");
+ stmt.execute("use restful_test");
+ stmt.execute("drop table if exists weather");
+ stmt.execute("create table if not exists weather(f1 timestamp, f2 int, f3 bigint, f4 float, f5 double, f6 binary(64), f7 smallint, f8 tinyint, f9 bool, f10 nchar(64))");
+ stmt.execute("insert into restful_test.weather values('2021-01-01 00:00:00.000', 1, 100, 3.1415, 3.1415926, 'abc', 10, 10, true, '涛思数据')");
+ rs = stmt.executeQuery("select * from restful_test.weather");
+ rs.next();
+ } catch (ClassNotFoundException | SQLException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ try {
+ if (rs != null)
+ rs.close();
+ if (stmt != null)
+ stmt.close();
+ if (conn != null)
+ conn.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/SQLTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/SQLTest.java
index ad6ed43ac737429707ff4f086a320cb62336b020..313abfd27865ef37d8b522b38951b17902f5a486 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/SQLTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/rs/SQLTest.java
@@ -1,5 +1,6 @@
package com.taosdata.jdbc.rs;
+import com.taosdata.jdbc.utils.SQLExecutor;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
@@ -11,378 +12,315 @@ import java.sql.*;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SQLTest {
private static final String host = "127.0.0.1";
-
+ // private static final String host = "master";
private static Connection connection;
@Test
public void testCase001() {
String sql = "create database if not exists restful_test";
- execute(sql);
+ SQLExecutor.execute(connection, sql);
}
@Test
public void testCase002() {
String sql = "use restful_test";
- execute(sql);
+ SQLExecutor.execute(connection, sql);
}
@Test
public void testCase003() {
String sql = "show databases";
- executeWithResult(sql);
+ SQLExecutor.executeWithResult(connection, sql);
}
@Test
public void testCase004() {
String sql = "show tables";
- executeWithResult(sql);
+ SQLExecutor.executeWithResult(connection, sql);
}
@Test
public void testCase005() {
String sql = "show stables";
- executeWithResult(sql);
+ SQLExecutor.executeWithResult(connection, sql);
}
@Test
public void testCase006() {
String sql = "show dnodes";
- executeWithResult(sql);
+ SQLExecutor.executeWithResult(connection, sql);
}
@Test
public void testCase007() {
String sql = "show vgroups";
- executeWithResult(sql);
+ SQLExecutor.executeWithResult(connection, sql);
}
@Test
public void testCase008() {
String sql = "drop table if exists restful_test.weather";
- execute(sql);
+ SQLExecutor.execute(connection, sql);
}
@Test
public void testCase009() {
String sql = "create table if not exists restful_test.weather(ts timestamp, temperature float) tags(location nchar(64))";
- execute(sql);
+ SQLExecutor.execute(connection, sql);
}
@Test
public void testCase010() {
String sql = "create table t1 using restful_test.weather tags('北京')";
- execute(sql);
+ SQLExecutor.execute(connection, sql);
}
@Test
public void testCase011() {
String sql = "insert into restful_test.t1 values(now, 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase012() {
String sql = "insert into restful_test.t1 values('2020-01-01 00:00:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase013() {
String sql = "insert into restful_test.t1 values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase014() {
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:03:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase015() {
String sql = "insert into restful_test.t2 using weather tags('上海') values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase016() {
String sql = "insert into t1 values('2020-01-01 01:0:00.000', 22.22),('2020-01-01 02:00:00.000', 22.22) t2 values('2020-01-01 01:0:00.000', 33.33),('2020-01-01 02:00:00.000', 33.33)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase017() {
String sql = "Insert into t3 using weather tags('广东') values('2020-01-01 01:0:00.000', 22.22),('2020-01-01 02:00:00.000', 22.22) t4 using weather tags('天津') values('2020-01-01 01:0:00.000', 33.33),('2020-01-01 02:00:00.000', 33.33)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase018() {
String sql = "select * from restful_test.t1";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase019() {
String sql = "select * from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase020() {
String sql = "select ts, temperature from restful_test.t1";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase021() {
String sql = "select ts, temperature from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase022() {
String sql = "select temperature, ts from restful_test.t1";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase023() {
String sql = "select temperature, ts from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase024() {
String sql = "import into restful_test.t5 using weather tags('石家庄') values('2020-01-01 00:01:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase025() {
String sql = "import into restful_test.t6 using weather tags('沈阳') values('2020-01-01 00:01:00.000', 22.22),('2020-01-01 00:02:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase026() {
String sql = "import into restful_test.t7 using weather tags('长沙') values('2020-01-01 00:01:00.000', 22.22) restful_test.t8 using weather tags('吉林') values('2020-01-01 00:01:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase027() {
String sql = "import into restful_test.t9 using weather tags('武汉') values('2020-01-01 00:01:00.000', 22.22) ,('2020-01-02 00:01:00.000', 22.22) restful_test.t10 using weather tags('哈尔滨') values('2020-01-01 00:01:00.000', 22.22),('2020-01-02 00:01:00.000', 22.22)";
- executeUpdate(sql);
+ SQLExecutor.executeUpdate(connection, sql);
}
@Test
public void testCase028() {
String sql = "select location, temperature, ts from restful_test.weather where temperature > 1";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase029() {
String sql = "select location, temperature, ts from restful_test.weather where temperature < 1";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase030() {
String sql = "select location, temperature, ts from restful_test.weather where ts > now";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase031() {
String sql = "select location, temperature, ts from restful_test.weather where ts < now";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase032() {
String sql = "select count(*) from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase033() {
String sql = "select first(*) from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase034() {
String sql = "select last(*) from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase035() {
String sql = "select last_row(*) from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase036() {
String sql = "select ts, ts as primary_key from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase037() {
String sql = "select database()";
- execute("use restful_test");
- executeQuery(sql);
+ SQLExecutor.execute(connection, "use restful_test");
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase038() {
String sql = "select client_version()";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase039() {
String sql = "select server_status()";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase040() {
String sql = "select server_status() as status";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase041() {
String sql = "select tbname, location from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase042() {
String sql = "select count(tbname) from restful_test.weather";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase043() {
String sql = "select * from restful_test.weather where ts < now - 1h";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase044() {
String sql = "select * from restful_test.weather where ts < now - 1h and location like '%'";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase045() {
String sql = "select * from restful_test.weather where ts < now - 1h order by ts";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase046() {
String sql = "select last(*) from restful_test.weather where ts < now - 1h group by tbname order by tbname";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase047() {
String sql = "select * from restful_test.weather limit 2";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase048() {
String sql = "select * from restful_test.weather limit 2 offset 5";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase049() {
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts ";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase050() {
String sql = "select * from restful_test.t1, restful_test.t3 where t1.ts = t3.ts and t1.location = t3.location";
- executeQuery(sql);
+ SQLExecutor.executeQuery(connection, sql);
}
@Test
public void testCase051() {
String sql = "select * from restful_test.t1 tt, restful_test.t3 yy where tt.ts = yy.ts";
- executeQuery(sql);
- }
-
- private void executeUpdate(String sql) {
- try (Statement statement = connection.createStatement()) {
- long start = System.currentTimeMillis();
- int affectedRows = statement.executeUpdate(sql);
- long end = System.currentTimeMillis();
- System.out.println("[ affected rows : " + affectedRows + " ] time cost: " + (end - start) + " ms, execute statement ====> " + sql);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- private void executeWithResult(String sql) {
- try (Statement statement = connection.createStatement()) {
- statement.execute(sql);
- ResultSet resultSet = statement.getResultSet();
- printResult(resultSet);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- private void execute(String sql) {
- try (Statement statement = connection.createStatement()) {
- long start = System.currentTimeMillis();
- boolean execute = statement.execute(sql);
- long end = System.currentTimeMillis();
- printSql(sql, execute, (end - start));
- } catch (SQLException e) {
- System.out.println("ERROR execute SQL ===> " + sql);
- e.printStackTrace();
- }
- }
-
- private static void printSql(String sql, boolean succeed, long cost) {
- System.out.println("[ " + (succeed ? "OK" : "ERROR!") + " ] time cost: " + cost + " ms, execute statement ====> " + sql);
- }
-
- private void executeQuery(String sql) {
- try (Statement statement = connection.createStatement()) {
- long start = System.currentTimeMillis();
- ResultSet resultSet = statement.executeQuery(sql);
- long end = System.currentTimeMillis();
- printSql(sql, true, (end - start));
- printResult(resultSet);
- } catch (SQLException e) {
- System.out.println("ERROR execute SQL ===> " + sql);
- e.printStackTrace();
- }
- }
-
- private static void printResult(ResultSet resultSet) throws SQLException {
- ResultSetMetaData metaData = resultSet.getMetaData();
- while (resultSet.next()) {
- StringBuilder sb = new StringBuilder();
- for (int i = 1; i <= metaData.getColumnCount(); i++) {
- String columnLabel = metaData.getColumnLabel(i);
- String value = resultSet.getString(i);
- sb.append(columnLabel + ": " + value + "\t");
- }
- System.out.println(sb.toString());
- }
+ SQLExecutor.executeQuery(connection, sql);
}
@BeforeClass
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SQLExecutor.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SQLExecutor.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf034bf458bcb8eadaaacb5cf633f0905a8c1bd6
--- /dev/null
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SQLExecutor.java
@@ -0,0 +1,74 @@
+package com.taosdata.jdbc.utils;
+
+import java.sql.*;
+
+public class SQLExecutor {
+
+ // insert, import
+ public static void executeUpdate(Connection connection, String sql) {
+ try (Statement statement = connection.createStatement()) {
+ long start = System.currentTimeMillis();
+ int affectedRows = statement.executeUpdate(sql);
+ long end = System.currentTimeMillis();
+ System.out.println("[ affected rows : " + affectedRows + " ] time cost: " + (end - start) + " ms, execute statement ====> " + sql);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // show databases, show tables, show stables
+ public static void executeWithResult(Connection connection, String sql) {
+ try (Statement statement = connection.createStatement()) {
+ statement.execute(sql);
+ ResultSet resultSet = statement.getResultSet();
+ printResult(resultSet);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // use database, create database, create table, drop table...
+ public static void execute(Connection connection, String sql) {
+ try (Statement statement = connection.createStatement()) {
+ long start = System.currentTimeMillis();
+ boolean execute = statement.execute(sql);
+ long end = System.currentTimeMillis();
+ printSql(sql, execute, (end - start));
+ } catch (SQLException e) {
+ System.out.println("ERROR execute SQL ===> " + sql);
+ e.printStackTrace();
+ }
+ }
+
+ // select
+ public static void executeQuery(Connection connection, String sql) {
+ try (Statement statement = connection.createStatement()) {
+ long start = System.currentTimeMillis();
+ ResultSet resultSet = statement.executeQuery(sql);
+ long end = System.currentTimeMillis();
+ printSql(sql, true, (end - start));
+ printResult(resultSet);
+ } catch (SQLException e) {
+ System.out.println("ERROR execute SQL ===> " + sql);
+ e.printStackTrace();
+ }
+ }
+
+ private static void printSql(String sql, boolean succeed, long cost) {
+ System.out.println("[ " + (succeed ? "OK" : "ERROR!") + " ] time cost: " + cost + " ms, execute statement ====> " + sql);
+ }
+
+ private static void printResult(ResultSet resultSet) throws SQLException {
+ ResultSetMetaData metaData = resultSet.getMetaData();
+ while (resultSet.next()) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 1; i <= metaData.getColumnCount(); i++) {
+ String columnLabel = metaData.getColumnLabel(i);
+ String value = resultSet.getString(i);
+ sb.append(columnLabel + ": " + value + "\t");
+ }
+ System.out.println(sb.toString());
+ }
+ }
+
+}
diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SqlSyntaxValidatorTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SqlSyntaxValidatorTest.java
index c38958c6ceb50af5d3925003f34e5cc16c272b97..ccb0941da00e2755eaf8fde2553b8a8e6b33cd25 100644
--- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SqlSyntaxValidatorTest.java
+++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/utils/SqlSyntaxValidatorTest.java
@@ -16,10 +16,6 @@ public class SqlSyntaxValidatorTest {
@Test
public void isUseSQL() {
Assert.assertTrue(SqlSyntaxValidator.isUseSql("use database test"));
- Assert.assertTrue(SqlSyntaxValidator.isUseSql("create database test"));
- Assert.assertTrue(SqlSyntaxValidator.isUseSql("create database if not exist test"));
- Assert.assertTrue(SqlSyntaxValidator.isUseSql("drop database test"));
- Assert.assertTrue(SqlSyntaxValidator.isUseSql("drop database if exist test"));
}
}
\ No newline at end of file
diff --git a/src/cq/CMakeLists.txt b/src/cq/CMakeLists.txt
index dd84e96ecf9826ac544004aa45cf4735814e5736..73d5eebd6d3d20d8ed4e0c150d8873c27c217d51 100644
--- a/src/cq/CMakeLists.txt
+++ b/src/cq/CMakeLists.txt
@@ -6,12 +6,10 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC)
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_LIBRARY(tcq ${SRC})
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(tcq tutil common taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(tcq tutil common taos)
- ENDIF ()
- ADD_SUBDIRECTORY(test)
+ADD_LIBRARY(tcq ${SRC})
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(tcq tutil common taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(tcq tutil common taos)
ENDIF ()
+ADD_SUBDIRECTORY(test)
diff --git a/src/dnode/CMakeLists.txt b/src/dnode/CMakeLists.txt
index 59a8b2b486ab493920e7fb1a40e0ba5c962061c8..14ec98b8f83e7af29acbf1b73eae625da9d8264b 100644
--- a/src/dnode/CMakeLists.txt
+++ b/src/dnode/CMakeLists.txt
@@ -10,40 +10,38 @@ INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_EXECUTABLE(taosd ${SRC})
- TARGET_LINK_LIBRARIES(taosd mnode monitor http tsdb twal vnode cJson lz4 balance sync)
-
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(taosd taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(taosd taos)
- ENDIF ()
-
- IF (TD_ACCOUNT)
- TARGET_LINK_LIBRARIES(taosd account)
- ENDIF ()
-
- IF (TD_GRANT)
- TARGET_LINK_LIBRARIES(taosd grant)
- ENDIF ()
-
- IF (TD_LINUX AND TD_MQTT)
- TARGET_LINK_LIBRARIES(taosd mqtt)
- ENDIF ()
-
- SET(PREPARE_ENV_CMD "prepare_env_cmd")
- SET(PREPARE_ENV_TARGET "prepare_env_target")
- ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
- POST_BUILD
- COMMAND echo "make test directory"
- DEPENDS taosd
- COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/cfg/
- COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/log/
- COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/data/
- COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
- COMMENT "prepare taosd environment")
- ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD})
+ADD_EXECUTABLE(taosd ${SRC})
+TARGET_LINK_LIBRARIES(taosd mnode monitor http tsdb twal vnode cJson lz4 balance sync)
+
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(taosd taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(taosd taos)
+ENDIF ()
+
+IF (TD_ACCOUNT)
+ TARGET_LINK_LIBRARIES(taosd account)
+ENDIF ()
+
+IF (TD_GRANT)
+ TARGET_LINK_LIBRARIES(taosd grant)
+ENDIF ()
+
+IF ((TD_LINUX OR TD_WINDOWS) AND TD_MQTT)
+ TARGET_LINK_LIBRARIES(taosd mqtt)
ENDIF ()
+
+SET(PREPARE_ENV_CMD "prepare_env_cmd")
+SET(PREPARE_ENV_TARGET "prepare_env_target")
+ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
+ POST_BUILD
+ COMMAND echo "make test directory"
+ DEPENDS taosd
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/cfg/
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/log/
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${TD_TESTS_OUTPUT_DIR}/data/
+ COMMAND ${CMAKE_COMMAND} -E echo dataDir ${TD_TESTS_OUTPUT_DIR}/data > ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
+ COMMAND ${CMAKE_COMMAND} -E echo logDir ${TD_TESTS_OUTPUT_DIR}/log >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
+ COMMAND ${CMAKE_COMMAND} -E echo charset UTF-8 >> ${TD_TESTS_OUTPUT_DIR}/cfg/taos.cfg
+ COMMENT "prepare taosd environment")
+ADD_CUSTOM_TARGET(${PREPARE_ENV_TARGET} ALL WORKING_DIRECTORY ${TD_EXECUTABLE_OUTPUT_PATH} DEPENDS ${PREPARE_ENV_CMD})
diff --git a/src/dnode/src/dnodeTelemetry.c b/src/dnode/src/dnodeTelemetry.c
index 7a9cf454313870b46c3f9e9c00cded826887a286..1da1486dda3723a31d8d71c4e1ccfc5a663512ee 100644
--- a/src/dnode/src/dnodeTelemetry.c
+++ b/src/dnode/src/dnodeTelemetry.c
@@ -236,6 +236,13 @@ static void sendTelemetryReport() {
taosCloseSocket(fd);
}
+#ifdef __APPLE__
+static int sem_timedwait(tsem_t *sem, struct timespec *to) {
+ fprintf(stderr, "%s[%d]%s(): not implemented yet!\n", basename(__FILE__), __LINE__, __func__);
+ abort();
+}
+#endif // __APPLE__
+
static void* telemetryThread(void* param) {
struct timespec end = {0};
clock_gettime(CLOCK_REALTIME, &end);
diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h
index 6fea04907492d29f50e12f2ac43af0ae20c79a27..9f3c31f22595d6dc6007dc9517390b970b781943 100644
--- a/src/inc/taosdef.h
+++ b/src/inc/taosdef.h
@@ -163,6 +163,11 @@ do { \
#define TSDB_BINARY_OP_MULTIPLY 32
#define TSDB_BINARY_OP_DIVIDE 33
#define TSDB_BINARY_OP_REMAINDER 34
+
+
+#define IS_RELATION_OPTR(op) (((op) >= TSDB_RELATION_LESS) && ((op) <= TSDB_RELATION_IN))
+#define IS_ARITHMETIC_OPTR(op) (((op) >= TSDB_BINARY_OP_ADD) && ((op) <= TSDB_BINARY_OP_REMAINDER))
+
#define TS_PATH_DELIMITER_LEN 1
#define TSDB_UNI_LEN 24
diff --git a/src/inc/taoserror.h b/src/inc/taoserror.h
index b6cf1b5f1f56cc4eaae652907fc14b6cf8965b9e..ebed2caaa610fe3ac0452728894032a93730b843 100644
--- a/src/inc/taoserror.h
+++ b/src/inc/taoserror.h
@@ -256,6 +256,8 @@ TAOS_DEFINE_ERROR(TSDB_CODE_QRY_HAS_RSP, 0, 0x0708, "Query shou
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_IN_EXEC, 0, 0x0709, "Multiple retrieval of this query")
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_TOO_MANY_TIMEWINDOW, 0, 0x070A, "Too many time window in query")
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_NOT_ENOUGH_BUFFER, 0, 0x070B, "Query buffer limit has reached")
+TAOS_DEFINE_ERROR(TSDB_CODE_QRY_INCONSISTAN, 0, 0x070C, "File inconsistance in replica")
+
// grant
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_EXPIRED, 0, 0x0800, "License expired")
diff --git a/src/kit/shell/CMakeLists.txt b/src/kit/shell/CMakeLists.txt
index 45da99e5722968591ffccf16432a8cb84d3557ff..c4f3cc5696a1442b38d7511ff69ddd7ff557b896 100644
--- a/src/kit/shell/CMakeLists.txt
+++ b/src/kit/shell/CMakeLists.txt
@@ -9,14 +9,14 @@ IF (TD_LINUX)
AUX_SOURCE_DIRECTORY(./src SRC)
LIST(REMOVE_ITEM SRC ./src/shellWindows.c)
LIST(REMOVE_ITEM SRC ./src/shellDarwin.c)
- ADD_EXECUTABLE(shell ${SRC})
-
+ ADD_EXECUTABLE(shell ${SRC})
+
IF (TD_SOMODE_STATIC)
TARGET_LINK_LIBRARIES(shell taos_static)
ELSE ()
TARGET_LINK_LIBRARIES(shell taos)
ENDIF ()
-
+
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME taos)
ELSEIF (TD_WINDOWS)
LIST(APPEND SRC ./src/shellEngine.c)
@@ -27,7 +27,7 @@ ELSEIF (TD_WINDOWS)
IF (TD_POWER)
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME power)
- ELSE ()
+ ELSE ()
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME taos)
ENDIF ()
ELSEIF (TD_DARWIN)
@@ -37,7 +37,10 @@ ELSEIF (TD_DARWIN)
LIST(APPEND SRC ./src/shellCommand.c)
LIST(APPEND SRC ./src/shellImport.c)
ADD_EXECUTABLE(shell ${SRC})
- TARGET_LINK_LIBRARIES(shell taos_static)
+ # linking with dylib
+ TARGET_LINK_LIBRARIES(shell taos)
+ # linking taos statically
+ # TARGET_LINK_LIBRARIES(shell taos_static)
SET_TARGET_PROPERTIES(shell PROPERTIES OUTPUT_NAME taos)
ENDIF ()
diff --git a/src/kit/shell/src/shellDarwin.c b/src/kit/shell/src/shellDarwin.c
index ddf7b21bef354817f67ccda4106abf1bc648ad6b..dbec3fdb05761d386d54a8e3e5a0d2d6dcb6bfeb 100644
--- a/src/kit/shell/src/shellDarwin.c
+++ b/src/kit/shell/src/shellDarwin.c
@@ -21,6 +21,8 @@
#include "shellCommand.h"
#include "tkey.h"
+#include "tscLog.h"
+
#define OPT_ABORT 1 /* �Cabort */
int indicator = 1;
@@ -348,6 +350,9 @@ void *shellLoopQuery(void *arg) {
reset_terminal_mode();
} while (shellRunCommand(con, command) == 0);
+ tfree(command);
+ exitShell();
+
pthread_cleanup_pop(1);
return NULL;
diff --git a/src/kit/shell/src/shellWindows.c b/src/kit/shell/src/shellWindows.c
index 7cb6c75302a0d2417469c5571c88fc382c6919ea..73216f9ca3aa3d29c9b83ee12c1ec661b10311ca 100644
--- a/src/kit/shell/src/shellWindows.c
+++ b/src/kit/shell/src/shellWindows.c
@@ -19,6 +19,10 @@
extern char configDir[];
+void printVersion() {
+ printf("version: %s\n", version);
+}
+
void printHelp() {
char indent[10] = " ";
printf("taos shell is used to test the TDengine database\n");
@@ -51,6 +55,8 @@ void printHelp() {
printf("%s%s%s\n", indent, indent, "Net role when network connectivity test, default is startup, options: client|server|rpc|startup.");
printf("%s%s\n", indent, "-l");
printf("%s%s%s\n", indent, indent, "Packet length used for net test, default is 1000 bytes.");
+ printf("%s%s\n", indent, "-V");
+ printf("%s%s%s\n", indent, indent, "Print program version.");
exit(EXIT_SUCCESS);
}
@@ -69,6 +75,9 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) {
// for password
else if (strcmp(argv[i], "-p") == 0) {
arguments->is_use_passwd = true;
+ if (i < argc - 1 && argv[i + 1][0] != '-') {
+ arguments->password = argv[++i];
+ }
}
// for management port
else if (strcmp(argv[i], "-P") == 0) {
@@ -145,7 +154,6 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) {
exit(EXIT_FAILURE);
}
}
- // For time zone
else if (strcmp(argv[i], "-n") == 0) {
if (i < argc - 1) {
arguments->netTestRole = argv[++i];
@@ -154,7 +162,6 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) {
exit(EXIT_FAILURE);
}
}
- // For time zone
else if (strcmp(argv[i], "-l") == 0) {
if (i < argc - 1) {
arguments->pktLen = atoi(argv[++i]);
@@ -163,10 +170,14 @@ void shellParseArgument(int argc, char *argv[], SShellArguments *arguments) {
exit(EXIT_FAILURE);
}
}
+ else if (strcmp(argv[i], "-V") == 0) {
+ printVersion();
+ exit(EXIT_SUCCESS);
+ }
// For temperory command TODO
else if (strcmp(argv[i], "--help") == 0) {
printHelp();
- exit(EXIT_FAILURE);
+ exit(EXIT_SUCCESS);
} else {
fprintf(stderr, "wrong options\n");
printHelp();
diff --git a/src/kit/taosdemo/CMakeLists.txt b/src/kit/taosdemo/CMakeLists.txt
index 91c743939c26ce9bb20e18dd1f701f6eb75fd573..f74dbc2de4c045e209fe0510207d1f38a89d7a6c 100644
--- a/src/kit/taosdemo/CMakeLists.txt
+++ b/src/kit/taosdemo/CMakeLists.txt
@@ -7,7 +7,7 @@ INCLUDE_DIRECTORIES(inc)
IF (TD_LINUX)
AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(taosdemo ${SRC})
-
+
IF (TD_SOMODE_STATIC)
TARGET_LINK_LIBRARIES(taosdemo taos_static)
ELSE ()
@@ -17,4 +17,13 @@ ELSEIF (TD_WINDOWS)
AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(taosdemo ${SRC})
TARGET_LINK_LIBRARIES(taosdemo taos_static)
+ELSEIF (TD_DARWIN)
+ AUX_SOURCE_DIRECTORY(. SRC)
+ ADD_EXECUTABLE(taosdemo ${SRC})
+
+ IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(taosdemo taos_static)
+ ELSE ()
+ TARGET_LINK_LIBRARIES(taosdemo taos)
+ ENDIF ()
ENDIF ()
diff --git a/src/kit/taosdemox/CMakeLists.txt b/src/kit/taosdemox/CMakeLists.txt
index 7db6c04b281aa6dea3e9b51fc47a8796fd64371b..3993cb0feb749d4bb2d762f203baeb920f8db495 100644
--- a/src/kit/taosdemox/CMakeLists.txt
+++ b/src/kit/taosdemox/CMakeLists.txt
@@ -4,22 +4,44 @@ PROJECT(TDengine)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/libcurl/include)
-IF (TD_LINUX)
+IF (TD_LINUX)
AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(taosdemox ${SRC})
-
- #find_program(HAVE_CURL NAMES curl)
- IF ((NOT TD_ARM_64) AND (NOT TD_ARM_32))
+
+ #find_program(HAVE_CURL NAMES curl)
+ IF ((NOT TD_ARM_64) AND (NOT TD_ARM_32))
ADD_DEFINITIONS(-DTD_LOWA_CURL)
LINK_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/libcurl/lib)
ADD_LIBRARY(curl STATIC IMPORTED)
SET_PROPERTY(TARGET curl PROPERTY IMPORTED_LOCATION ${TD_COMMUNITY_DIR}/deps/libcurl/lib/libcurl.a)
- TARGET_LINK_LIBRARIES(taosdemox curl)
+ TARGET_LINK_LIBRARIES(taosdemox curl)
ENDIF ()
-
+
IF (TD_SOMODE_STATIC)
TARGET_LINK_LIBRARIES(taosdemox taos_static cJson)
ELSE ()
TARGET_LINK_LIBRARIES(taosdemox taos cJson)
ENDIF ()
ENDIF ()
+
+IF (TD_DARWIN)
+ # missing a few dependencies, such as
+ # AUX_SOURCE_DIRECTORY(. SRC)
+ # ADD_EXECUTABLE(taosdemox ${SRC})
+ #
+ # #find_program(HAVE_CURL NAMES curl)
+ # IF ((NOT TD_ARM_64) AND (NOT TD_ARM_32))
+ # ADD_DEFINITIONS(-DTD_LOWA_CURL)
+ # LINK_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/libcurl/lib)
+ # ADD_LIBRARY(curl STATIC IMPORTED)
+ # SET_PROPERTY(TARGET curl PROPERTY IMPORTED_LOCATION ${TD_COMMUNITY_DIR}/deps/libcurl/lib/libcurl.a)
+ # TARGET_LINK_LIBRARIES(taosdemox curl)
+ # ENDIF ()
+ #
+ # IF (TD_SOMODE_STATIC)
+ # TARGET_LINK_LIBRARIES(taosdemox taos_static cJson)
+ # ELSE ()
+ # TARGET_LINK_LIBRARIES(taosdemox taos cJson)
+ # ENDIF ()
+ENDIF ()
+
diff --git a/src/kit/taosdump/CMakeLists.txt b/src/kit/taosdump/CMakeLists.txt
index dc9ac6d4a789c4292480f522240690e13b47245b..b50ad85c08cf5fa35862ce42bcc441dc502c3166 100644
--- a/src/kit/taosdump/CMakeLists.txt
+++ b/src/kit/taosdump/CMakeLists.txt
@@ -12,5 +12,15 @@ IF (TD_LINUX)
TARGET_LINK_LIBRARIES(taosdump taos_static)
ELSE ()
TARGET_LINK_LIBRARIES(taosdump taos)
- ENDIF ()
+ ENDIF ()
+ENDIF ()
+
+IF (TD_DARWIN)
+ # missing for macosx
+ # ADD_EXECUTABLE(taosdump ${SRC})
+ # IF (TD_SOMODE_STATIC)
+ # TARGET_LINK_LIBRARIES(taosdump taos_static)
+ # ELSE ()
+ # TARGET_LINK_LIBRARIES(taosdump taos)
+ # ENDIF ()
ENDIF ()
diff --git a/src/mnode/CMakeLists.txt b/src/mnode/CMakeLists.txt
index 9a344891e84ed340862aa2db4976426bc5fb6a25..fffc82c6ef2fb5741d81fb59e4e5fa271e3100f4 100644
--- a/src/mnode/CMakeLists.txt
+++ b/src/mnode/CMakeLists.txt
@@ -1,12 +1,10 @@
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
PROJECT(TDengine)
-IF (TD_LINUX OR TD_WINDOWS)
- INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
- INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
+INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
+INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
- INCLUDE_DIRECTORIES(inc)
- AUX_SOURCE_DIRECTORY(src SRC)
+INCLUDE_DIRECTORIES(inc)
+AUX_SOURCE_DIRECTORY(src SRC)
- ADD_LIBRARY(mnode ${SRC})
-ENDIF ()
\ No newline at end of file
+ADD_LIBRARY(mnode ${SRC})
diff --git a/src/os/inc/eok.h b/src/os/inc/eok.h
new file mode 100644
index 0000000000000000000000000000000000000000..0874ca975b44a2e355c7eb746af4f30b4d163610
--- /dev/null
+++ b/src/os/inc/eok.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef _eok_h_fd274616_996c_400e_9023_ae70be881fa3_
+#define _eok_h_fd274616_996c_400e_9023_ae70be881fa3_
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __APPLE__
+
+enum EPOLL_EVENTS
+ {
+ EPOLLIN = 0x001,
+#define EPOLLIN EPOLLIN
+ EPOLLPRI = 0x002,
+#define EPOLLPRI EPOLLPRI
+ EPOLLOUT = 0x004,
+#define EPOLLOUT EPOLLOUT
+ EPOLLRDNORM = 0x040,
+#define EPOLLRDNORM EPOLLRDNORM
+ EPOLLRDBAND = 0x080,
+#define EPOLLRDBAND EPOLLRDBAND
+ EPOLLWRNORM = 0x100,
+#define EPOLLWRNORM EPOLLWRNORM
+ EPOLLWRBAND = 0x200,
+#define EPOLLWRBAND EPOLLWRBAND
+ EPOLLMSG = 0x400,
+#define EPOLLMSG EPOLLMSG
+ EPOLLERR = 0x008,
+#define EPOLLERR EPOLLERR
+ EPOLLHUP = 0x010,
+#define EPOLLHUP EPOLLHUP
+ EPOLLRDHUP = 0x2000,
+#define EPOLLRDHUP EPOLLRDHUP
+ EPOLLEXCLUSIVE = 1u << 28,
+#define EPOLLEXCLUSIVE EPOLLEXCLUSIVE
+ EPOLLWAKEUP = 1u << 29,
+#define EPOLLWAKEUP EPOLLWAKEUP
+ EPOLLONESHOT = 1u << 30,
+#define EPOLLONESHOT EPOLLONESHOT
+ EPOLLET = 1u << 31
+#define EPOLLET EPOLLET
+ };
+
+/* Valid opcodes ( "op" parameter ) to issue to epoll_ctl(). */
+#define EPOLL_CTL_ADD 1 /* Add a file descriptor to the interface. */
+#define EPOLL_CTL_DEL 2 /* Remove a file descriptor from the interface. */
+#define EPOLL_CTL_MOD 3 /* Change file descriptor epoll_event structure. */
+
+
+typedef union epoll_data
+{
+ void *ptr;
+ int fd;
+ uint32_t u32;
+ uint64_t u64;
+} epoll_data_t;
+
+struct epoll_event
+{
+ uint32_t events; /* Epoll events */
+ epoll_data_t data; /* User data variable */
+};
+
+int epoll_create(int size);
+int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
+int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
+int epoll_close(int epfd);
+
+#endif // __APPLE__
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _eok_h_fd274616_996c_400e_9023_ae70be881fa3_
+
diff --git a/src/os/inc/osDarwin.h b/src/os/inc/osDarwin.h
index 1461ec6d3b177c300e667d93043308d93ea67d0f..14b8ccf53c5ca2c857a47c007a8ba5933e06ddc6 100644
--- a/src/os/inc/osDarwin.h
+++ b/src/os/inc/osDarwin.h
@@ -75,11 +75,11 @@ extern "C" {
#define TAOS_OS_FUNC_FILE_SENDIFLE
#define TAOS_OS_FUNC_SEMPHONE
- #define tsem_t dispatch_semaphore_t
- int tsem_init(dispatch_semaphore_t *sem, int pshared, unsigned int value);
- int tsem_wait(dispatch_semaphore_t *sem);
- int tsem_post(dispatch_semaphore_t *sem);
- int tsem_destroy(dispatch_semaphore_t *sem);
+ typedef struct tsem_s *tsem_t;
+ int tsem_init(tsem_t *sem, int pshared, unsigned int value);
+ int tsem_wait(tsem_t *sem);
+ int tsem_post(tsem_t *sem);
+ int tsem_destroy(tsem_t *sem);
#define TAOS_OS_FUNC_SOCKET_SETSOCKETOPT
#define TAOS_OS_FUNC_STRING_STR2INT64
@@ -91,7 +91,12 @@ extern "C" {
typedef int(*__compar_fn_t)(const void *, const void *);
// for send function in tsocket.c
+#if defined(MSG_NOSIGNAL)
+#undef MSG_NOSIGNAL
+#endif
+
#define MSG_NOSIGNAL 0
+
#define SO_NO_CHECK 0x1234
#define SOL_TCP 0x1234
#define TCP_KEEPIDLE 0x1234
@@ -100,6 +105,18 @@ typedef int(*__compar_fn_t)(const void *, const void *);
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#endif
+int64_t tsosStr2int64(char *str);
+
+#include "eok.h"
+
+void taos_block_sigalrm(void);
+
+#define TAOS_OS_DEF_EPOLL
+ #define TAOS_EPOLL_WAIT_TIME 500
+ typedef int32_t SOCKET;
+ typedef SOCKET EpollFd;
+ #define EpollClose(pollFd) epoll_close(pollFd)
+
#ifdef __cplusplus
}
#endif
diff --git a/src/os/inc/osDef.h b/src/os/inc/osDef.h
index a21b721565911b12a3f5d41051c250897ca61946..04cb8b6e74b870d73c8f27707bd8a92f7b309e98 100644
--- a/src/os/inc/osDef.h
+++ b/src/os/inc/osDef.h
@@ -96,7 +96,7 @@ extern "C" {
#ifdef _ISOC11_SOURCE
#define threadlocal _Thread_local
#elif defined(__APPLE__)
- #define threadlocal
+ #define threadlocal __thread
#elif defined(__GNUC__) && !defined(threadlocal)
#define threadlocal __thread
#else
diff --git a/src/os/src/darwin/darwinEnv.c b/src/os/src/darwin/darwinEnv.c
index 6adebabec01ae378a4c5f3d82389508334210972..da4b32139e837a21a4a5a04c129b5a9a50081c5a 100644
--- a/src/os/src/darwin/darwinEnv.c
+++ b/src/os/src/darwin/darwinEnv.c
@@ -30,3 +30,4 @@ void osInit() {
strcpy(tsScriptDir, "~/TDengine/cfg");
strcpy(tsOsName, "Darwin");
}
+
diff --git a/src/os/src/darwin/darwinSemphone.c b/src/os/src/darwin/darwinSemphone.c
index 97ff5437895c3715bbe3eeaf2abe178ffbd5d733..6df44a52b36505c7d1407b119e2da5c2494e2437 100644
--- a/src/os/src/darwin/darwinSemphone.c
+++ b/src/os/src/darwin/darwinSemphone.c
@@ -13,28 +13,269 @@
* along with this program. If not, see .
*/
+// fail-fast or let-it-crash philosophy
+// https://en.wikipedia.org/wiki/Fail-fast
+// https://stackoverflow.com/questions/4393197/erlangs-let-it-crash-philosophy-applicable-elsewhere
+// experimentally, we follow log-and-crash here
+
#define _DEFAULT_SOURCE
#include "os.h"
-int tsem_init(dispatch_semaphore_t *sem, int pshared, unsigned int value) {
- *sem = dispatch_semaphore_create(value);
- if (*sem == NULL) {
+// #define SEM_USE_PTHREAD
+// #define SEM_USE_POSIX
+#define SEM_USE_SEM
+
+#ifdef SEM_USE_SEM
+#include
+#include
+#include
+#include
+
+static pthread_t sem_thread;
+static pthread_once_t sem_once;
+static task_t sem_port;
+static volatile int sem_inited = 0;
+static semaphore_t sem_exit;
+
+static void* sem_thread_routine(void *arg) {
+ (void)arg;
+ sem_port = mach_task_self();
+ kern_return_t ret = semaphore_create(sem_port, &sem_exit, SYNC_POLICY_FIFO, 0);
+ if (ret != KERN_SUCCESS) {
+ fprintf(stderr, "==%s[%d]%s()==failed to create sem_exit\n", basename(__FILE__), __LINE__, __func__);
+ sem_inited = -1;
+ return NULL;
+ }
+ sem_inited = 1;
+ semaphore_wait(sem_exit);
+ return NULL;
+}
+
+static void once_init(void) {
+ int r = 0;
+ r = pthread_create(&sem_thread, NULL, sem_thread_routine, NULL);
+ if (r) {
+ fprintf(stderr, "==%s[%d]%s()==failed to create thread\n", basename(__FILE__), __LINE__, __func__);
+ return;
+ }
+ while (sem_inited==0) {
+ ;
+ }
+}
+#endif
+
+struct tsem_s {
+#ifdef SEM_USE_PTHREAD
+ pthread_mutex_t lock;
+ pthread_cond_t cond;
+ volatile int64_t val;
+#elif defined(SEM_USE_POSIX)
+ size_t id;
+ sem_t *sem;
+#elif defined(SEM_USE_SEM)
+ semaphore_t sem;
+#else // SEM_USE_PTHREAD
+ dispatch_semaphore_t sem;
+#endif // SEM_USE_PTHREAD
+
+ volatile unsigned int valid:1;
+};
+
+int tsem_init(tsem_t *sem, int pshared, unsigned int value) {
+ // fprintf(stderr, "==%s[%d]%s():[%p]==creating\n", basename(__FILE__), __LINE__, __func__, sem);
+ if (*sem) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==already initialized\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ struct tsem_s *p = (struct tsem_s*)calloc(1, sizeof(*p));
+ if (!p) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==out of memory\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+
+#ifdef SEM_USE_PTHREAD
+ int r = pthread_mutex_init(&p->lock, NULL);
+ do {
+ if (r) break;
+ r = pthread_cond_init(&p->cond, NULL);
+ if (r) {
+ pthread_mutex_destroy(&p->lock);
+ break;
+ }
+ p->val = value;
+ } while (0);
+ if (r) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+#elif defined(SEM_USE_POSIX)
+ static size_t tick = 0;
+ do {
+ size_t id = atomic_add_fetch_64(&tick, 1);
+ if (id==SEM_VALUE_MAX) {
+ atomic_store_64(&tick, 0);
+ id = 0;
+ }
+ char name[NAME_MAX-4];
+ snprintf(name, sizeof(name), "/t%ld", id);
+ p->sem = sem_open(name, O_CREAT|O_EXCL, pshared, value);
+ p->id = id;
+ if (p->sem!=SEM_FAILED) break;
+ int e = errno;
+ if (e==EEXIST) continue;
+ if (e==EINTR) continue;
+ fprintf(stderr, "==%s[%d]%s():[%p]==not created[%d]%s\n", basename(__FILE__), __LINE__, __func__, sem, e, strerror(e));
+ abort();
+ } while (p->sem==SEM_FAILED);
+#elif defined(SEM_USE_SEM)
+ pthread_once(&sem_once, once_init);
+ if (sem_inited!=1) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal resource init failed\n", basename(__FILE__), __LINE__, __func__, sem);
+ errno = ENOMEM;
return -1;
- } else {
- return 0;
}
+ kern_return_t ret = semaphore_create(sem_port, &p->sem, SYNC_POLICY_FIFO, value);
+ if (ret != KERN_SUCCESS) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==semophore_create failed\n", basename(__FILE__), __LINE__, __func__, sem);
+ // we fail-fast here, because we have less-doc about semaphore_create for the moment
+ abort();
+ }
+#else // SEM_USE_PTHREAD
+ p->sem = dispatch_semaphore_create(value);
+ if (p->sem == NULL) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+#endif // SEM_USE_PTHREAD
+
+ p->valid = 1;
+
+ *sem = p;
+
+ return 0;
}
-int tsem_wait(dispatch_semaphore_t *sem) {
- dispatch_semaphore_wait(*sem, DISPATCH_TIME_FOREVER);
+int tsem_wait(tsem_t *sem) {
+ if (!*sem) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ struct tsem_s *p = *sem;
+ if (!p->valid) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+#ifdef SEM_USE_PTHREAD
+ if (pthread_mutex_lock(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ p->val -= 1;
+ if (p->val < 0) {
+ if (pthread_cond_wait(&p->cond, &p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ }
+ if (pthread_mutex_unlock(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
return 0;
+#elif defined(SEM_USE_POSIX)
+ return sem_wait(p->sem);
+#elif defined(SEM_USE_SEM)
+ return semaphore_wait(p->sem);
+#else // SEM_USE_PTHREAD
+ return dispatch_semaphore_wait(p->sem, DISPATCH_TIME_FOREVER);
+#endif // SEM_USE_PTHREAD
}
-int tsem_post(dispatch_semaphore_t *sem) {
- dispatch_semaphore_signal(*sem);
+int tsem_post(tsem_t *sem) {
+ if (!*sem) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ struct tsem_s *p = *sem;
+ if (!p->valid) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+#ifdef SEM_USE_PTHREAD
+ if (pthread_mutex_lock(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ p->val += 1;
+ if (p->val <= 0) {
+ if (pthread_cond_signal(&p->cond)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ }
+ if (pthread_mutex_unlock(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
return 0;
+#elif defined(SEM_USE_POSIX)
+ return sem_post(p->sem);
+#elif defined(SEM_USE_SEM)
+ return semaphore_signal(p->sem);
+#else // SEM_USE_PTHREAD
+ return dispatch_semaphore_signal(p->sem);
+#endif // SEM_USE_PTHREAD
}
-int tsem_destroy(dispatch_semaphore_t *sem) {
+int tsem_destroy(tsem_t *sem) {
+ // fprintf(stderr, "==%s[%d]%s():[%p]==destroying\n", basename(__FILE__), __LINE__, __func__, sem);
+ if (!*sem) {
+ // fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", basename(__FILE__), __LINE__, __func__, sem);
+ // abort();
+ return 0;
+ }
+ struct tsem_s *p = *sem;
+ if (!p->valid) {
+ // fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", basename(__FILE__), __LINE__, __func__, sem);
+ // abort();
+ return 0;
+ }
+#ifdef SEM_USE_PTHREAD
+ if (pthread_mutex_lock(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ p->valid = 0;
+ if (pthread_cond_destroy(&p->cond)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ if (pthread_mutex_unlock(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+ if (pthread_mutex_destroy(&p->lock)) {
+ fprintf(stderr, "==%s[%d]%s():[%p]==internal logic error\n", basename(__FILE__), __LINE__, __func__, sem);
+ abort();
+ }
+#elif defined(SEM_USE_POSIX)
+ char name[NAME_MAX-4];
+ snprintf(name, sizeof(name), "/t%ld", p->id);
+ int r = sem_unlink(name);
+ if (r) {
+ int e = errno;
+ fprintf(stderr, "==%s[%d]%s():[%p]==unlink failed[%d]%s\n", basename(__FILE__), __LINE__, __func__, sem, e, strerror(e));
+ abort();
+ }
+#elif defined(SEM_USE_SEM)
+ semaphore_destroy(sem_port, p->sem);
+#else // SEM_USE_PTHREAD
+#endif // SEM_USE_PTHREAD
+
+ p->valid = 0;
+ free(p);
+
+ *sem = NULL;
return 0;
}
+
diff --git a/src/os/src/darwin/darwinSysInfo.c b/src/os/src/darwin/darwinSysInfo.c
index f8aa02dcffd14e2def6339ccb507b9f9ab2489d1..0eb784e9f052233986a13590a2c56be4de0e6e8e 100644
--- a/src/os/src/darwin/darwinSysInfo.c
+++ b/src/os/src/darwin/darwinSysInfo.c
@@ -101,4 +101,16 @@ int taosSystem(const char *cmd) {
return -1;
}
-void taosSetCoreDump() {}
\ No newline at end of file
+void taosSetCoreDump() {}
+
+char *taosGetCmdlineByPID(int pid) {
+ return "[not supported yet]";
+}
+
+bool taosGetSystemUid(char *uid) {
+ uuid_t uuid = {0};
+ uuid_generate(uuid);
+ // it's caller's responsibility to make enough space for `uid`, that's 36-char + 1-null
+ uuid_unparse(uuid, uid);
+ return true;
+}
diff --git a/src/os/src/darwin/darwinTimer.c b/src/os/src/darwin/darwinTimer.c
index 5fe65fb99ed72357d88ecbf5d4699bcbb42360c6..ee1becc91af5237296bb2a562982b33cc5c78f10 100644
--- a/src/os/src/darwin/darwinTimer.c
+++ b/src/os/src/darwin/darwinTimer.c
@@ -13,9 +13,82 @@
* along with this program. If not, see .
*/
+// fail-fast or let-it-crash philosophy
+// https://en.wikipedia.org/wiki/Fail-fast
+// https://stackoverflow.com/questions/4393197/erlangs-let-it-crash-philosophy-applicable-elsewhere
+// experimentally, we follow log-and-crash here
+
#define _DEFAULT_SOURCE
#include "os.h"
+#if 1
+#include
+
+static void (*timer_callback)(int);
+static int timer_ms = 0;
+static pthread_t timer_thread;
+static int timer_kq = -1;
+static volatile int timer_stop = 0;
+
+static void* timer_routine(void *arg) {
+ (void)arg;
+
+ int r = 0;
+ struct timespec to = {0};
+ to.tv_sec = timer_ms / 1000;
+ to.tv_nsec = (timer_ms % 1000) * 1000000;
+ while (!timer_stop) {
+ struct kevent64_s kev[10] = {0};
+ r = kevent64(timer_kq, NULL, 0, kev, sizeof(kev)/sizeof(kev[0]), 0, &to);
+ if (r!=0) {
+ fprintf(stderr, "==%s[%d]%s()==kevent64 failed\n", basename(__FILE__), __LINE__, __func__);
+ abort();
+ }
+ timer_callback(SIGALRM); // just mock
+ }
+
+ return NULL;
+}
+
+int taosInitTimer(void (*callback)(int), int ms) {
+ int r = 0;
+ timer_ms = ms;
+ timer_callback = callback;
+
+ timer_kq = kqueue();
+ if (timer_kq==-1) {
+ fprintf(stderr, "==%s[%d]%s()==failed to create timer kq\n", basename(__FILE__), __LINE__, __func__);
+ // since no caller of this func checks the return value for the moment
+ abort();
+ }
+
+ r = pthread_create(&timer_thread, NULL, timer_routine, NULL);
+ if (r) {
+ fprintf(stderr, "==%s[%d]%s()==failed to create timer thread\n", basename(__FILE__), __LINE__, __func__);
+ // since no caller of this func checks the return value for the moment
+ abort();
+ }
+ return 0;
+}
+
+void taosUninitTimer() {
+ int r = 0;
+ timer_stop = 1;
+ r = pthread_join(timer_thread, NULL);
+ if (r) {
+ fprintf(stderr, "==%s[%d]%s()==failed to join timer thread\n", basename(__FILE__), __LINE__, __func__);
+ // since no caller of this func checks the return value for the moment
+ abort();
+ }
+ close(timer_kq);
+ timer_kq = -1;
+}
+
+void taos_block_sigalrm(void) {
+ // we don't know if there's any specific API for SIGALRM to deliver to specific thread
+ // this implementation relies on kqueue rather than SIGALRM
+}
+#else
int taosInitTimer(void (*callback)(int), int ms) {
signal(SIGALRM, callback);
@@ -34,3 +107,17 @@ void taosUninitTimer() {
setitimer(ITIMER_REAL, &tv, NULL);
}
+void taos_block_sigalrm(void) {
+ // since SIGALRM has been used
+ // consideration: any better solution?
+ static __thread int already_set = 0;
+ if (!already_set) {
+ sigset_t set;
+ sigemptyset(&set);
+ sigaddset(&set, SIGALRM);
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
+ already_set = 1;
+ }
+}
+#endif
+
diff --git a/src/os/src/darwin/eok.c b/src/os/src/darwin/eok.c
new file mode 100644
index 0000000000000000000000000000000000000000..f731aaf330cb8618aa8a2dc51401ac45ecdc5440
--- /dev/null
+++ b/src/os/src/darwin/eok.c
@@ -0,0 +1,893 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+// fail-fast or let-it-crash philosophy
+// https://en.wikipedia.org/wiki/Fail-fast
+// https://stackoverflow.com/questions/4393197/erlangs-let-it-crash-philosophy-applicable-elsewhere
+// experimentally, we follow log-and-crash here
+
+#include "eok.h"
+
+#include "os.h"
+
+#include
+
+// #define BALANCE_CHECK_WHEN_CLOSE
+
+#ifdef ENABLE_LOG
+#define D(fmt, ...) fprintf(stderr, "%s[%d]%s(): " fmt "\n", basename(__FILE__), __LINE__, __func__, ##__VA_ARGS__)
+#define E(fmt, ...) do { \
+ fprintf(stderr, "%s[%d]%s(): %d[%s]: " fmt "\n", \
+ basename(__FILE__), __LINE__, __func__, \
+ errno, strerror(errno), \
+ ##__VA_ARGS__); \
+} while (0)
+#else // !ENABLE_LOG
+#define D(fmt, ...) (void)fmt
+#define E(fmt, ...) (void)fmt
+#endif // ENABLE_LOG
+
+#define A(statement, fmt, ...) do { \
+ if (statement) break; \
+ fprintf(stderr, "%s[%d]%s(): assert [%s] failed: %d[%s]: " fmt "\n", \
+ basename(__FILE__), __LINE__, __func__, \
+ #statement, errno, strerror(errno), \
+ ##__VA_ARGS__); \
+ abort(); \
+} while (0)
+
+static int eok_dummy = 0;
+
+typedef struct ep_over_kq_s ep_over_kq_t;
+typedef struct eok_event_s eok_event_t;
+
+struct ep_over_kq_s {
+ int kq;
+
+ // !!!
+ // idx in the eoks list
+ // used as pseudo-file-desciptor
+ // must be 'closed' with epoll_close
+ int idx;
+
+ ep_over_kq_t *next;
+
+ int sv[2]; // 0 for read, 1 for write
+
+ // all registered 'epoll events, key by fd'
+ int evs_count;
+ eok_event_t *evs_head;
+ eok_event_t *evs_tail;
+ eok_event_t *evs_free;
+
+ // all kev changes list pending to be processed by kevent64
+ // key by tuple (ident,filter), ident === fd in this case
+ struct kevent64_s *kchanges;
+ int nchanges;
+ int ichanges;
+
+ // kev eventslist for kevent64 to store active events
+ // they remain alive among kevent64 calls
+ struct kevent64_s *kevslist;
+ int nevslist;
+
+ pthread_mutex_t lock;
+
+ volatile unsigned int lock_valid:1;
+ volatile unsigned int waiting:1;
+ volatile unsigned int changed:1;
+ volatile unsigned int wakenup:1;
+ volatile unsigned int stopping:1;
+};
+
+struct eok_event_s {
+ int fd;
+ struct epoll_event epev;
+ volatile unsigned int changed; // 0:registered;1:add;2:mod;3:del
+
+ eok_event_t *next;
+ eok_event_t *prev;
+};
+
+typedef struct eoks_s eoks_t;
+struct eoks_s {
+ pthread_mutex_t lock;
+ ep_over_kq_t **eoks; // note: this memory leaks when process terminates
+ int neoks; // we can add an extra api to let user clean
+ ep_over_kq_t *eoks_free_list; // currently, we just keep it simple stupid
+};
+
+static eoks_t eoks = {
+ .lock = PTHREAD_MUTEX_INITIALIZER,
+ .eoks = NULL,
+ .neoks = 0,
+ .eoks_free_list = NULL,
+};
+
+#ifdef ENABLE_LOG
+static const char* op_str(int op) {
+ switch (op) {
+ case EPOLL_CTL_ADD: return "EPOLL_CTL_ADD";
+ case EPOLL_CTL_MOD: return "EPOLL_CTL_MOD";
+ case EPOLL_CTL_DEL: return "EPOLL_CTL_DEL";
+ default: return "UNKNOWN";
+ }
+}
+
+static __thread char buf_slots[10][1024] = {0};
+static __thread int buf_slots_linelen = sizeof(buf_slots[0])/sizeof(buf_slots[0][0]);
+static __thread int buf_slots_count = sizeof(buf_slots)/(sizeof(buf_slots[0])/sizeof(buf_slots[0][0]));
+
+static const char* events_str(uint32_t events, int slots) {
+ A(slots>=0 && slots on linux
+ // EPOLLIN = 0x001,
+ // #define EPOLLIN EPOLLIN
+ // EPOLLPRI = 0x002,
+ // #define EPOLLPRI EPOLLPRI
+ // EPOLLOUT = 0x004,
+ // #define EPOLLOUT EPOLLOUT
+ // EPOLLRDNORM = 0x040,
+ // #define EPOLLRDNORM EPOLLRDNORM
+ // EPOLLRDBAND = 0x080,
+ // #define EPOLLRDBAND EPOLLRDBAND
+ // EPOLLWRNORM = 0x100,
+ // #define EPOLLWRNORM EPOLLWRNORM
+ // EPOLLWRBAND = 0x200,
+ // #define EPOLLWRBAND EPOLLWRBAND
+ // EPOLLMSG = 0x400,
+ // #define EPOLLMSG EPOLLMSG
+ // EPOLLERR = 0x008,
+ // #define EPOLLERR EPOLLERR
+ // EPOLLHUP = 0x010,
+ // #define EPOLLHUP EPOLLHUP
+ // EPOLLRDHUP = 0x2000,
+ // #define EPOLLRDHUP EPOLLRDHUP
+ // EPOLLEXCLUSIVE = 1u << 28,
+ // #define EPOLLEXCLUSIVE EPOLLEXCLUSIVE
+ // EPOLLWAKEUP = 1u << 29,
+ // #define EPOLLWAKEUP EPOLLWAKEUP
+ // EPOLLONESHOT = 1u << 30,
+ // #define EPOLLONESHOT EPOLLONESHOT
+ // EPOLLET = 1u << 31
+ // #define EPOLLET EPOLLET
+#define CHK_EV(ev) \
+ if (len>0 && (events & (ev))==(ev)) { \
+ n = snprintf(p, len, "%s%s", p!=buf ? "|" : "", #ev); \
+ p += n; \
+ len -= n; \
+ }
+ CHK_EV(EPOLLIN);
+ CHK_EV(EPOLLPRI);
+ CHK_EV(EPOLLOUT);
+ CHK_EV(EPOLLRDNORM);
+ CHK_EV(EPOLLRDBAND);
+ CHK_EV(EPOLLWRNORM);
+ CHK_EV(EPOLLWRBAND);
+ CHK_EV(EPOLLMSG);
+ CHK_EV(EPOLLERR);
+ CHK_EV(EPOLLHUP);
+ CHK_EV(EPOLLRDHUP);
+ CHK_EV(EPOLLEXCLUSIVE);
+ CHK_EV(EPOLLWAKEUP);
+ CHK_EV(EPOLLONESHOT);
+ CHK_EV(EPOLLET);
+#undef CHK_EV
+ return buf;
+}
+
+static const char* kev_flags_str(uint16_t flags, int slots) {
+ A(slots>=0 && slots
+ // #define EV_ADD 0x0001 /* add event to kq (implies enable) */
+ // #define EV_DELETE 0x0002 /* delete event from kq */
+ // #define EV_ENABLE 0x0004 /* enable event */
+ // #define EV_DISABLE 0x0008 /* disable event (not reported) */
+ // /* flags */
+ // #define EV_ONESHOT 0x0010 /* only report one occurrence */
+ // #define EV_CLEAR 0x0020 /* clear event state after reporting */
+ // #define EV_RECEIPT 0x0040 /* force immediate event output */
+ // /* ... with or without EV_ERROR */
+ // /* ... use KEVENT_FLAG_ERROR_EVENTS */
+ // /* on syscalls supporting flags */
+ // #define EV_DISPATCH 0x0080 /* disable event after reporting */
+ // #define EV_UDATA_SPECIFIC 0x0100 /* unique kevent per udata value */
+ // #define EV_DISPATCH2 (EV_DISPATCH | EV_UDATA_SPECIFIC)
+ // /* ... in combination with EV_DELETE */
+ // /* will defer delete until udata-specific */
+ // /* event enabled. EINPROGRESS will be */
+ // /* returned to indicate the deferral */
+ // #define EV_VANISHED 0x0200 /* report that source has vanished */
+ // /* ... only valid with EV_DISPATCH2 */
+ // #define EV_SYSFLAGS 0xF000 /* reserved by system */
+ // #define EV_FLAG0 0x1000 /* filter-specific flag */
+ // #define EV_FLAG1 0x2000 /* filter-specific flag */
+ // /* returned values */
+ // #define EV_EOF 0x8000 /* EOF detected */
+ // #define EV_ERROR 0x4000 /* error, data contains errno */
+#define CHK_EV(ev) \
+ if (len>0 && (flags & (ev))==(ev)) { \
+ n = snprintf(p, len, "%s%s", p!=buf ? "|" : "", #ev); \
+ p += n; \
+ len -= n; \
+ }
+ CHK_EV(EV_ADD);
+ CHK_EV(EV_DELETE);
+ CHK_EV(EV_ENABLE);
+ CHK_EV(EV_DISABLE);
+ CHK_EV(EV_ONESHOT);
+ CHK_EV(EV_CLEAR);
+ CHK_EV(EV_RECEIPT);
+ CHK_EV(EV_DISPATCH);
+ CHK_EV(EV_UDATA_SPECIFIC);
+ CHK_EV(EV_DISPATCH2);
+ CHK_EV(EV_VANISHED);
+ CHK_EV(EV_SYSFLAGS);
+ CHK_EV(EV_FLAG0);
+ CHK_EV(EV_FLAG1);
+ CHK_EV(EV_EOF);
+ CHK_EV(EV_ERROR);
+#undef CHK_EV
+ return buf;
+}
+#endif // ENABLE_LOG
+
+static ep_over_kq_t* eoks_alloc(void);
+static void eoks_free(ep_over_kq_t *eok);
+static ep_over_kq_t* eoks_find(int epfd);
+
+static eok_event_t* eok_find_ev(ep_over_kq_t *eok, int fd);
+static eok_event_t* eok_calloc_ev(ep_over_kq_t *eok);
+static void eok_free_ev(ep_over_kq_t *eok, eok_event_t *ev);
+static void eok_wakeup(ep_over_kq_t *eok);
+
+static int eok_chgs_refresh(ep_over_kq_t *eok, eok_event_t *oev, eok_event_t *ev, struct kevent64_s *krev, struct kevent64_s *kwev);
+
+static struct kevent64_s* eok_alloc_eventslist(ep_over_kq_t *eok, int maxevents);
+
+int epoll_create(int size) {
+ (void)size;
+ int e = 0;
+ ep_over_kq_t *eok = eoks_alloc();
+ if (!eok) return -1;
+
+ A(eok->kq==-1, "internal logic error");
+ A(eok->lock_valid, "internal logic error");
+ A(eok->idx>=0 && eok->idxnext==NULL, "internal logic error");
+ A(eok->sv[0]==-1, "internal logic error");
+ A(eok->sv[1]==-1, "internal logic error");
+
+ eok->kq = kqueue();
+ if (eok->kq==-1) {
+ e = errno;
+ eoks_free(eok);
+ errno = e;
+ return -1;
+ }
+
+ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, eok->sv)) {
+ e = errno;
+ eoks_free(eok);
+ errno = e;
+ return -1;
+ }
+
+ struct epoll_event ev = {0};
+ ev.events = EPOLLIN;
+ ev.data.ptr = &eok_dummy;
+ D("epoll_create epfd:[%d] and sv0[%d]", eok->idx, eok->sv[0]);
+ if (epoll_ctl(eok->idx, EPOLL_CTL_ADD, eok->sv[0], &ev)) {
+ e = errno;
+ epoll_close(eok->idx);
+ errno = e;
+ return -1;
+ }
+
+ return eok->idx;
+}
+
+int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) {
+ D("epoll_ctling epfd:[%d], op:[%s], fd:[%d], events:[%04x:%s]",
+ epfd, op_str(op), fd,
+ event ? event->events : 0,
+ event ? events_str(event->events, 0) : "NULL");
+ int e = 0;
+ if (epfd<0 || epfd>=eoks.neoks) {
+ errno = EBADF;
+ return -1;
+ }
+ if (fd==-1) {
+ errno = EBADF;
+ return -1;
+ }
+ if (event && !(event->events & (EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP | EPOLLOUT))) {
+ e = ENOTSUP;
+ return -1;
+ }
+
+ ep_over_kq_t *eok = eoks_find(epfd);
+ if (!eok) {
+ errno = EBADF;
+ return -1;
+ }
+
+ A(0==pthread_mutex_lock(&eok->lock), "");
+ do {
+ eok_event_t* oev = eok_find_ev(eok, fd);
+ if (op==EPOLL_CTL_ADD && oev) {
+ e = EEXIST;
+ break;
+ }
+ if (op!=EPOLL_CTL_ADD && !oev) {
+ e = ENOENT;
+ break;
+ }
+ if (op!=EPOLL_CTL_DEL && !event) {
+ e = EINVAL;
+ break;
+ }
+
+ // prepare krev/kwev
+ struct kevent64_s krev = {0};
+ struct kevent64_s kwev = {0};
+ krev.ident = -1;
+ kwev.ident = -1;
+ uint16_t flags = 0;
+ // prepare internal eok event
+ eok_event_t ev = {0};
+ ev.fd = fd;
+ if (event) ev.epev = *event;
+ struct epoll_event *pev = event;
+ switch (op) {
+ case EPOLL_CTL_ADD: {
+ flags = EV_ADD;
+ ev.changed = 1;
+ } break;
+ case EPOLL_CTL_MOD: {
+ flags = EV_ADD;
+ ev.changed = 2;
+ } break;
+ case EPOLL_CTL_DEL: {
+ // event is ignored
+ // pev points to registered epoll_event
+ pev = &oev->epev;
+ flags = EV_DELETE;
+ ev.changed = 3;
+ } break;
+ default: {
+ e = ENOTSUP;
+ } break;
+ }
+
+ if (e) break;
+
+ // udata will be delayed to be set
+ if (pev->events & (EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP)) {
+ flags |= EV_EOF;
+ EV_SET64(&krev, ev.fd, EVFILT_READ, flags, 0, 0, -1, 0, 0);
+ }
+ if (pev->events & EPOLLOUT) {
+ EV_SET64(&kwev, ev.fd, EVFILT_WRITE, flags, 0, 0, -1, 0, 0);
+ }
+
+ // refresh registered evlist and changelist in a transaction way
+ if (eok_chgs_refresh(eok, oev, &ev, &krev, &kwev)) {
+ e = errno;
+ A(e, "internal logic error");
+ break;
+ }
+ eok->changed = 1;
+ eok_wakeup(eok);
+ } while (0);
+ A(0==pthread_mutex_unlock(&eok->lock), "");
+
+ if (e) {
+ errno = e;
+ return -1;
+ }
+
+ return 0;
+}
+
+static struct timespec do_timespec_diff(struct timespec *from, struct timespec *to);
+
+int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) {
+ taos_block_sigalrm();
+
+ int e = 0;
+ if (!events) {
+ errno = EINVAL;
+ E("epoll_waiting epfd:[%d], maxevents:[%d], timeout:[%d] failed", epfd, maxevents, timeout);
+ return -1;
+ }
+ if (maxevents<=0) {
+ errno = EINVAL;
+ E("epoll_waiting epfd:[%d], maxevents:[%d], timeout:[%d] failed", epfd, maxevents, timeout);
+ return -1;
+ }
+
+ struct timespec abstime = {0};
+ A(TIME_UTC==timespec_get(&abstime, TIME_UTC), "internal logic error");
+
+ if (timeout!=-1) {
+ if (timeout<0) timeout = 0;
+ int64_t t = abstime.tv_nsec + timeout * 1000000;
+ abstime.tv_sec += t / 1000000000;
+ abstime.tv_nsec = t % 1000000000;
+ }
+
+ int r = 0;
+
+ ep_over_kq_t *eok = eoks_find(epfd);
+ if (!eok) {
+ errno = EBADF;
+ E("epoll_waiting epfd:[%d], maxevents:[%d], timeout:[%d] failed", epfd, maxevents, timeout);
+ errno = EBADF;
+ return -1;
+ }
+
+ int cnts = 0;
+ A(0==pthread_mutex_lock(&eok->lock), "");
+ do {
+ cnts = 0;
+ A(eok->waiting==0, "internal logic error");
+ struct kevent64_s *eventslist = eok_alloc_eventslist(eok, maxevents);
+ if (!eventslist) {
+ e = ENOMEM;
+ E("epoll_waiting epfd:[%d], maxevents:[%d], timeout:[%d] failed", epfd, maxevents, timeout);
+ break;
+ }
+ memset(eventslist, 0, maxevents * sizeof(*eventslist));
+
+ struct timespec now = {0};
+ A(TIME_UTC==timespec_get(&now, TIME_UTC), "internal logic error");
+ struct timespec to = do_timespec_diff(&now, &abstime);
+ struct timespec *pto = &to;
+ if (timeout==-1) {
+ pto = NULL;
+ }
+
+ // taking the changelist
+ struct kevent64_s *kchanges = eok->kchanges;
+ int nchanges = eok->nchanges;
+ int ichanges = eok->ichanges;
+ // let outside world to add changes
+ eok->kchanges = NULL;
+ eok->nchanges = 0;
+ eok->ichanges = 0;
+
+ eok->changed = 0;
+ eok->wakenup = 0;
+ eok->waiting = 1;
+
+ A(0==pthread_mutex_unlock(&eok->lock), "");
+ if (ichanges>0) {
+ D("kevent64 epfd[%d] changing [%d] changes and waiting...", eok->idx, ichanges);
+ }
+ errno = 0;
+ r = kevent64(eok->kq, kchanges, ichanges, eventslist, maxevents, 0, pto);
+ e = errno;
+ if (e) {
+ E("kevent64 epfd[%d] waiting done, with r[%d]", eok->idx, r);
+ }
+ A(0==pthread_mutex_lock(&eok->lock), "");
+
+ eok->waiting = 0;
+
+ if (kchanges) {
+ if (eok->kchanges==NULL) {
+ // reuse
+ A(eok->nchanges==0 && eok->ichanges==0, "internal logic error");
+ eok->kchanges = kchanges;
+ eok->nchanges = nchanges;
+ } else {
+ free(kchanges);
+ kchanges = NULL;
+ }
+ nchanges = 0;
+ ichanges = 0;
+ }
+
+ if (r==0) {
+ A(timeout!=-1, "internal logic error");
+ }
+ for (int i=0; iudata && eok->evs_head && eok->evs_tail, "internal logic error");
+ eok_event_t *ev = (eok_event_t*)kev->udata;
+ A(kev->ident == ev->fd, "internal logic error");
+ if (kev->flags & EV_ERROR) {
+ D("epfd[%d] error when processing change list for fd[%d], error[%s], kev_flags:[%04x:%s]",
+ epfd, ev->fd, strerror(kev->data), kev->flags, kev_flags_str(kev->flags, 0));
+ }
+ switch (kev->filter) {
+ case EVFILT_READ: {
+ A((ev->epev.events & EPOLLIN), "internal logic errro");
+ if (ev->epev.data.ptr==&eok_dummy) {
+ // it's coming from wakeup socket pair
+ char c = '\0';
+ A(1==recv(kev->ident, &c, 1, 0), "internal logic error");
+ A(0==memcmp(&c, "1", 1), "internal logic error");
+ D("epfd[%d] wokenup", epfd);
+ continue;
+ } else {
+ if (ev->changed==3) {
+ D("epfd[%d] already requested to delete for fd[%d]", epfd, ev->fd);
+ // TODO: write a unit test for this case
+ // EV_DELETE?
+ continue;
+ }
+ // converting to epoll_event
+ // we shall collect all kevents for the uniq fd into one epoll_evnt
+ // but currently, taos never use EPOLLOUT
+ // just let it this way for the moment
+ struct epoll_event pev = {0};
+ pev.data.ptr = ev->epev.data.ptr;
+ pev.events = EPOLLIN;
+ if (kev->flags & EV_EOF) {
+ // take all these as EOF for the moment
+ pev.events |= (EPOLLHUP | EPOLLERR | EPOLLRDHUP);
+ }
+ // rounded to what user care
+ pev.events = pev.events & ev->epev.events;
+ D("epfd[%d] events found for fd[%d]: [%04x:%s], which was registered: [%04x:%s], kev_flags: [%04x:%s]",
+ epfd,
+ ev->fd, pev.events, events_str(pev.events, 0),
+ ev->epev.events, events_str(ev->epev.events, 1),
+ kev->flags, kev_flags_str(kev->flags, 2));
+ // now we get ev and store it
+ events[cnts++] = pev;
+ }
+ } break;
+ case EVFILT_WRITE: {
+ A(0, "not implemented yet");
+ } break;
+ default: {
+ A(0, "internal logic error");
+ } break;
+ }
+ }
+ if (r>=0) {
+ // we can safely rule out delete-requested-events from the regitered evlists
+ // if only changelist are correctly registered
+ eok_event_t *p = eok->evs_head;
+ while (p) {
+ eok_event_t *next = p->next;
+ if (p->changed==3) {
+ D("epfd[%d] removing registered event for fd[%d]: [%04x:%s]", epfd, p->fd, p->epev.events, events_str(p->epev.events, 0));
+ eok_free_ev(eok, p);
+ }
+ p = next;
+ }
+ }
+ if (cnts==0) {
+ // if no user-cared-events is up
+ // we check to see if time is up
+ if (timeout!=-1) {
+ A(TIME_UTC==timespec_get(&now, TIME_UTC), "internal logic error");
+ to = do_timespec_diff(&now, &abstime);
+ if (to.tv_sec==0 && to.tv_nsec==0) break;
+ }
+ // time is not up yet, continue loop
+ }
+ } while (cnts==0);
+ if (cnts>0) {
+ D("kevent64 epfd[%d] waiting done with [%d] events", epfd, cnts);
+ }
+ A(0==pthread_mutex_unlock(&eok->lock), "");
+
+ if (e) {
+ errno = e;
+ E("epfd[%d] epoll_wait failed", epfd);
+ return -1;
+ }
+
+ // tell user how many events are valid
+ return cnts;
+}
+
+static struct timespec do_timespec_diff(struct timespec *from, struct timespec *to) {
+ struct timespec delta;
+ delta.tv_sec = to->tv_sec - from->tv_sec;
+ delta.tv_nsec = to->tv_nsec - from->tv_nsec;
+ // norm and round up
+ while (delta.tv_nsec<0) {
+ delta.tv_sec -= 1;
+ delta.tv_nsec += 1000000000;
+ }
+ if (delta.tv_sec < 0) {
+ delta.tv_sec = 0;
+ delta.tv_nsec = 0;
+ }
+ return delta;
+}
+
+int epoll_close(int epfd) {
+ D("epoll_closing epfd: [%d]", epfd);
+ ep_over_kq_t *eok = eoks_find(epfd);
+ if (!eok) {
+ errno = EBADF;
+ return -1;
+ }
+
+ A(0==pthread_mutex_lock(&eok->lock), "");
+ do {
+ // panic if it would be double-closed
+ A(eok->stopping==0, "internal logic error");
+ eok->stopping = 1;
+ // panic if epoll_wait is pending
+ A(eok->waiting==0, "internal logic error");
+
+ if (eok->kq!=-1) {
+ close(eok->kq);
+ eok->kq = -1;
+ }
+ } while (0);
+ A(0==pthread_mutex_unlock(&eok->lock), "");
+ eoks_free(eok);
+
+ return 0;
+}
+
+static struct kevent64_s* eok_alloc_eventslist(ep_over_kq_t *eok, int maxevents) {
+ if (maxevents<=eok->nevslist) return eok->kevslist;
+ struct kevent64_s *p = (struct kevent64_s*)realloc(eok->kevslist, sizeof(*p)*maxevents);
+ if (!p) return NULL;
+ eok->kevslist = p;
+ eok->nevslist = maxevents;
+ return p;
+}
+
+static eok_event_t* eok_find_ev(ep_over_kq_t *eok, int fd) {
+ eok_event_t *p = eok->evs_head;
+ while (p) {
+ if (p->fd == fd) return p;
+ p = p->next;
+ }
+ errno = ENOENT;
+ return NULL;
+}
+
+static eok_event_t* eok_calloc_ev(ep_over_kq_t *eok) {
+ eok_event_t *p = NULL;
+ if (eok->evs_free) {
+ p = eok->evs_free;
+ eok->evs_free = p->next;
+ p->next = NULL;
+ A(p->prev==NULL, "internal logic error");
+ } else {
+ p = (eok_event_t*)calloc(1, sizeof(*p));
+ if (!p) return NULL;
+ A(p->next==NULL, "internal logic error");
+ A(p->prev==NULL, "internal logic error");
+ }
+ // dirty link
+ p->prev = eok->evs_tail;
+ if (eok->evs_tail) eok->evs_tail->next = p;
+ else eok->evs_head = p;
+ eok->evs_tail = p;
+
+ eok->evs_count += 1;
+
+ return p;
+}
+
+static void eok_free_ev(ep_over_kq_t *eok, eok_event_t *ev) {
+ if (ev->prev) ev->prev->next = ev->next;
+ else eok->evs_head = ev->next;
+ if (ev->next) ev->next->prev = ev->prev;
+ else eok->evs_tail = ev->prev;
+ ev->prev = NULL;
+ ev->next = eok->evs_free;
+ eok->evs_free = ev;
+
+ eok->evs_count -= 1;
+}
+
+static void eok_wakeup(ep_over_kq_t *eok) {
+ if (!eok->waiting) return;
+ if (eok->wakenup) return;
+ eok->wakenup = 1;
+ A(1==send(eok->sv[1], "1", 1, 0), "");
+}
+
+static int eok_chgs_refresh(ep_over_kq_t *eok, eok_event_t *oev, eok_event_t *ev, struct kevent64_s *krev, struct kevent64_s *kwev) {
+ if (!oev) oev = eok_calloc_ev(eok);
+ if (!oev) return -1;
+ int n = 0;
+ if (krev->ident==ev->fd) ++n;
+ if (kwev->ident==ev->fd) ++n;
+ A(n, "internal logic error");
+ if (eok->ichanges+n>eok->nchanges) {
+ struct kevent64_s *p = (struct kevent64_s*)realloc(eok->kchanges, sizeof(*p) * (eok->nchanges + 10));
+ if (!p) {
+ if (ev->changed==1) {
+ // roll back
+ A(oev, "internal logic error");
+ eok_free_ev(eok, oev);
+ }
+ errno = ENOMEM;
+ return -1;
+ }
+ eok->kchanges = p;
+ eok->nchanges += 10;
+ }
+
+ // copy to registered event slot
+ oev->fd = ev->fd;
+ if (ev->changed!=3) {
+ // if add/mod, copy epoll_event
+ oev->epev = ev->epev;
+ }
+ oev->changed = ev->changed;
+
+ // copy to changes list
+ n = 0;
+ if (krev->ident==ev->fd) {
+ krev->udata = (uint64_t)oev;
+ eok->kchanges[eok->ichanges++] = *krev;
+ ++n;
+ }
+ if (kwev->ident==ev->fd) {
+ kwev->udata = (uint64_t)oev;
+ eok->kchanges[eok->ichanges++] = *kwev;
+ ++n;
+ }
+ D("epfd[%d]: add #changes[%d] for fd[%d], and now #changes/registers [%d/%d]", eok->idx, n, ev->fd, eok->ichanges, eok->evs_count);
+ return 0;
+}
+
+static ep_over_kq_t* eoks_alloc(void) {
+ ep_over_kq_t *eok = NULL;
+
+ A(0==pthread_mutex_lock(&eoks.lock), "");
+ do {
+ if (eoks.eoks_free_list) {
+ eok = eoks.eoks_free_list;
+ eoks.eoks_free_list = eok->next;
+ A(eoks.eoks, "internal logic error");
+ A(eok->idx>=0 && eok->idxidx)==NULL, "internal logic error");
+ *(eoks.eoks + eok->idx) = eok;
+ eok->next = NULL;
+ eok->stopping = 0;
+ break;
+ }
+ eok = (ep_over_kq_t*)calloc(1, sizeof(*eok));
+ if (!eok) break;
+ eok->idx = -1;
+ ep_over_kq_t **ar = (ep_over_kq_t**)realloc(eoks.eoks, sizeof(**ar) * (eoks.neoks+1));
+ if (!ar) break;
+ eoks.eoks = ar;
+ *(eoks.eoks + eoks.neoks) = eok;
+ eok->idx = eoks.neoks;
+ eok->kq = -1;
+ eok->sv[0] = -1;
+ eok->sv[1] = -1;
+ eoks.neoks += 1;
+ } while (0);
+ A(0==pthread_mutex_unlock(&eoks.lock), "");
+
+ if (!eok) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (eok->idx==-1) {
+ free(eok);
+ errno = ENOMEM;
+ return NULL;
+ }
+ if (eok->lock_valid) {
+ return eok;
+ }
+
+ if (0==pthread_mutex_init(&eok->lock, NULL)) {
+ eok->lock_valid = 1;
+ return eok;
+ }
+
+ eoks_free(eok);
+ errno = ENOMEM;
+ return NULL;
+}
+
+static void eoks_free(ep_over_kq_t *eok) {
+ A(0==pthread_mutex_lock(&eoks.lock), "");
+ do {
+ A(eok->idx>=0 && eok->idxnext==NULL, "internal logic error");
+
+ // leave eok->kchanges as is
+ A(eok->ichanges==0, "internal logic error");
+
+ A(eok->waiting==0, "internal logic error");
+ eok_event_t *ev = eok->evs_head;
+ int sv_closed = 0;
+ while (ev) {
+ eok_event_t *next = ev->next;
+ if (ev->fd==eok->sv[0]) {
+ // fd is critical system resource
+ A(sv_closed==0, "internal logic error");
+ close(eok->sv[0]);
+ eok->sv[0] = -1;
+ close(eok->sv[1]);
+ eok->sv[1] = -1;
+ eok_free_ev(eok, ev);
+ } else {
+ // user forget calling epoll_ctl(EPOLL_CTL_DEL) before calling epoll_close/close?
+ // calling close(ev->fd) here smells really bad
+#ifndef BALANCE_CHECK_WHEN_CLOSE
+ // we just let it be and reclaim ev
+ eok_free_ev(eok, ev);
+#else
+ // panic otherwise, if BALANCE_CHECK_WHEN_CLOSE is defined
+ A(eok->evs_head==NULL && eok->evs_tail==NULL && eok->evs_count==0,
+ "epfd[%d] fd[%d]: internal logic error: have you epoll_ctl(EPOLL_CTL_DEL) everything before calling epoll_close?",
+ eok->idx, ev->fd);
+#endif
+ }
+ ev = next;
+ }
+ // if (eok->evs_count==1) {
+ // A(eok->evs_head && eok->evs_tail && eok->evs_head==eok->evs_tail, "internal logic error");
+ // A(eok->evs_head->fd==eok->sv[0] && eok->sv[0]!=-1 && eok->sv[1]!=-1, "internal logic error");
+ // // fd is critical system resource
+ // close(eok->sv[0]);
+ // eok->sv[0] = -1;
+ // close(eok->sv[1]);
+ // eok->sv[1] = -1;
+ // eok_free_ev(eok, eok->evs_head);
+ // }
+ A(eok->evs_head==NULL && eok->evs_tail==NULL && eok->evs_count==0,
+ "internal logic error: have you epoll_ctl(EPOLL_CTL_DEL) everything before calling epoll_close?");
+ A(eok->sv[0]==-1 && eok->sv[1]==-1, "internal logic error");
+ if (eok->kq!=-1) {
+ close(eok->kq);
+ eok->kq = -1;
+ }
+ eok->next = eoks.eoks_free_list;
+ eoks.eoks_free_list = eok;
+ *(eoks.eoks + eok->idx) = NULL;
+ } while (0);
+ A(0==pthread_mutex_unlock(&eoks.lock), "");
+}
+
+static ep_over_kq_t* eoks_find(int epfd) {
+ ep_over_kq_t *eok = NULL;
+ A(0==pthread_mutex_lock(&eoks.lock), "");
+ do {
+ if (epfd<0 || epfd>=eoks.neoks) {
+ break;
+ }
+ A(eoks.eoks, "internal logic error");
+ eok = *(eoks.eoks + epfd);
+ A(eok->next==NULL, "internal logic error");
+ A(eok->lock_valid, "internal logic error");
+ } while (0);
+ A(0==pthread_mutex_unlock(&eoks.lock), "");
+ return eok;
+}
+
diff --git a/src/os/src/detail/CMakeLists.txt b/src/os/src/detail/CMakeLists.txt
index e4052a4fb32d4d8bda1ea05443cf95c276251e57..1c5e55a522250a1532e35075616e9efddb008217 100644
--- a/src/os/src/detail/CMakeLists.txt
+++ b/src/os/src/detail/CMakeLists.txt
@@ -13,3 +13,4 @@ TARGET_LINK_LIBRARIES(osdetail os)
IF (TD_ARM_32 OR TD_LINUX_32)
TARGET_LINK_LIBRARIES(osdetail atomic)
ENDIF ()
+
diff --git a/src/os/src/detail/osSocket.c b/src/os/src/detail/osSocket.c
index d03e8086bf6138ffc6cace250b7a7459b56d927f..1186a6dd0a0247f3df44f1065fdacfa7d8df6e07 100644
--- a/src/os/src/detail/osSocket.c
+++ b/src/os/src/detail/osSocket.c
@@ -83,4 +83,4 @@ const char *taosInetNtoa(struct in_addr ipInt) {
return inet_ntoa(ipInt);
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/os/src/detail/osTimer.c b/src/os/src/detail/osTimer.c
index 1d3ba30def9416785d72556ac218bd5a48aead77..c1135ce292c4ef0a5ae968525ca2685a97b6f62e 100644
--- a/src/os/src/detail/osTimer.c
+++ b/src/os/src/detail/osTimer.c
@@ -116,6 +116,9 @@ void taosUninitTimer() {
pthread_sigmask(SIG_BLOCK, &set, NULL);
*/
void taosMsleep(int mseconds) {
+#ifdef __APPLE__
+ taos_block_sigalrm();
+#endif // __APPLE__
#if 1
usleep(mseconds * 1000);
#else
@@ -136,6 +139,7 @@ void taosMsleep(int mseconds) {
/* pthread_sigmask(SIG_UNBLOCK, &set, NULL); */
#endif
+
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/plugins/http/CMakeLists.txt b/src/plugins/http/CMakeLists.txt
index 4bad06b90fe551ff792579084adbc4b24e624196..42016b8645690e24d1bced4c31261b9d785269c5 100644
--- a/src/plugins/http/CMakeLists.txt
+++ b/src/plugins/http/CMakeLists.txt
@@ -8,18 +8,16 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_LIBRARY(http ${SRC})
- TARGET_LINK_LIBRARIES(http z)
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(http taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(http taos)
- ENDIF ()
+ADD_LIBRARY(http ${SRC})
+TARGET_LINK_LIBRARIES(http z)
- IF (TD_ADMIN)
- TARGET_LINK_LIBRARIES(http admin)
- ENDIF ()
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(http taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(http taos)
+ENDIF ()
+
+IF (TD_ADMIN)
+ TARGET_LINK_LIBRARIES(http admin)
ENDIF ()
diff --git a/src/plugins/http/inc/httpUtil.h b/src/plugins/http/inc/httpUtil.h
index 61cd50a77a29ad8b9a2058f4ad569493b18618ac..54c95b6980f8241c3ea6c8e563e0e42c7c737286 100644
--- a/src/plugins/http/inc/httpUtil.h
+++ b/src/plugins/http/inc/httpUtil.h
@@ -17,7 +17,7 @@
#define TDENGINE_HTTP_UTIL_H
bool httpCheckUsedbSql(char *sql);
-void httpTimeToString(time_t t, char *buf, int32_t buflen);
+void httpTimeToString(int32_t t, char *buf, int32_t buflen);
bool httpUrlMatch(HttpContext *pContext, int32_t pos, char *cmp);
bool httpParseRequest(HttpContext *pContext);
diff --git a/src/plugins/http/src/httpParser.c b/src/plugins/http/src/httpParser.c
index 0de437c7617d2634c367328bca5dd289a8c0c3d5..e537253f0d886dfd3d93d632fda43c77d49acf15 100644
--- a/src/plugins/http/src/httpParser.c
+++ b/src/plugins/http/src/httpParser.c
@@ -535,7 +535,7 @@ char *httpDecodeUrl(const char *enc) {
dec = str.str;
str.str = NULL;
}
- httpCleanupString(&str);
+ //httpCleanupString(&str);
return dec;
}
@@ -646,7 +646,7 @@ static int32_t httpParserOnTarget(HttpParser *parser, HTTP_PARSER_STATE state, c
}
break;
}
- parser->target = strdup(parser->str.str);
+ parser->target = httpDecodeUrl(parser->str.str);
if (!parser->target) {
httpError("context:%p, fd:%d, parser state:%d, char:[%c]%02x, oom", pContext, pContext->fd, state, c, c);
ok = -1;
@@ -715,6 +715,10 @@ static int32_t httpParserOnVersion(HttpParser *parser, HTTP_PARSER_STATE state,
if (parser->method) {
ok = httpOnRequestLine(parser, parser->method, parser->target, parser->version);
+ if (parser->target) {
+ free(parser->target);
+ parser->target = NULL;
+ }
}
httpClearString(&parser->str);
diff --git a/src/plugins/http/src/httpServer.c b/src/plugins/http/src/httpServer.c
index 932f3e3808832ec834418dd4f4953ba102a4357f..a5f40fdc4cf89f6322d310ca2093336862a9045d 100644
--- a/src/plugins/http/src/httpServer.c
+++ b/src/plugins/http/src/httpServer.c
@@ -27,11 +27,36 @@
static bool httpReadData(HttpContext *pContext);
+#ifdef __APPLE__
+static int sv_dummy = 0;
+#endif
+
static void httpStopThread(HttpThread *pThread) {
pThread->stop = true;
// signal the thread to stop, try graceful method first,
// and use pthread_cancel when failed
+#ifdef __APPLE__
+ int sv[2];
+ sv[0] = sv[1] = -1;
+ int r = socketpair(PF_LOCAL, SOCK_STREAM, 0, sv);
+ do {
+ if (r) break;
+ struct epoll_event ev = {0};
+ ev.events = EPOLLIN;
+ ev.data.ptr = &sv_dummy;
+ pThread->stop = true;
+ r = epoll_ctl(pThread->pollFd, EPOLL_CTL_ADD, sv[0], &ev);
+ if (r) break;
+ if (1 != send(sv[1], "1", 1, 0)) {
+ r = -1;
+ break;
+ }
+ } while (0);
+ if (r) {
+ pthread_cancel(pThread->thread);
+ }
+#else
struct epoll_event event = {.events = EPOLLIN};
eventfd_t fd = eventfd(1, 0);
if (fd == -1) {
@@ -44,11 +69,24 @@ static void httpStopThread(HttpThread *pThread) {
pThread->label, strerror(errno));
pthread_cancel(pThread->thread);
}
+#endif // __APPLE__
pthread_join(pThread->thread, NULL);
+
+#ifdef __APPLE__
+ if (sv[0] != -1) {
+ close(sv[0]);
+ sv[0] = -1;
+ }
+ if (sv[1] != -1) {
+ close(sv[1]);
+ sv[1] = -1;
+ }
+#else // __APPLE__
if (fd != -1) {
taosCloseSocket(fd);
}
+#endif // __APPLE__
EpollClose(pThread->pollFd);
pthread_mutex_destroy(&(pThread->threadMutex));
@@ -91,6 +129,15 @@ static void httpProcessHttpData(void *param) {
if (fdNum <= 0) continue;
for (int32_t i = 0; i < fdNum; ++i) {
+#ifdef __APPLE__
+ if (events[i].data.ptr == &sv_dummy) {
+ // no need to drain the recv buffer of sv[0]
+ // since there's only one time to send at most 1 byte to sv[0]
+ // btw, pThread->stop shall be already set, thus never reached here
+ httpDebug("if you see this line, there's internal logic error");
+ continue;
+ }
+#endif // __APPLE__
pContext = httpGetContext(events[i].data.ptr);
if (pContext == NULL) {
httpError("context:%p, is already released, close connect", events[i].data.ptr);
diff --git a/src/plugins/http/src/httpUtil.c b/src/plugins/http/src/httpUtil.c
index 7f1e2a94d1918151277f46670f54681d64e8b56f..a84ae9f617d7ecd43c98d942dea95d99fd9ba901 100644
--- a/src/plugins/http/src/httpUtil.c
+++ b/src/plugins/http/src/httpUtil.c
@@ -29,7 +29,7 @@ bool httpCheckUsedbSql(char *sql) {
return false;
}
-void httpTimeToString(time_t t, char *buf, int32_t buflen) {
+void httpTimeToString(int32_t t, char *buf, int32_t buflen) {
memset(buf, 0, (size_t)buflen);
char ts[32] = {0};
@@ -37,7 +37,7 @@ void httpTimeToString(time_t t, char *buf, int32_t buflen) {
time_t tt = t / 1000;
ptm = localtime(&tt);
strftime(ts, 31, "%Y-%m-%d %H:%M:%S", ptm);
- sprintf(buf, "%s.%03" PRId64, ts, t % 1000);
+ sprintf(buf, "%s.%03d", ts, t % 1000);
}
int32_t httpAddToSqlCmdBuffer(HttpContext *pContext, const char *const format, ...) {
diff --git a/src/plugins/monitor/CMakeLists.txt b/src/plugins/monitor/CMakeLists.txt
index 6e7e16bc2891cb9139c492eaeecb0ffd8612ddc3..abab07e0cd026d00499c5835e5446fdab9c16df7 100644
--- a/src/plugins/monitor/CMakeLists.txt
+++ b/src/plugins/monitor/CMakeLists.txt
@@ -6,12 +6,10 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
AUX_SOURCE_DIRECTORY(./src SRC)
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_LIBRARY(monitor ${SRC})
-
- IF (TD_SOMODE_STATIC)
- TARGET_LINK_LIBRARIES(monitor taos_static)
- ELSE ()
- TARGET_LINK_LIBRARIES(monitor taos)
- ENDIF ()
-ENDIF ()
+ADD_LIBRARY(monitor ${SRC})
+
+IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(monitor taos_static)
+ELSE ()
+ TARGET_LINK_LIBRARIES(monitor taos)
+ENDIF ()
diff --git a/src/plugins/mqtt/CMakeLists.txt b/src/plugins/mqtt/CMakeLists.txt
index 3761f70134501a5db7b7d5080e5a5bcf5f592858..b6de4215170be827c9e049044508d586ae6a6977 100644
--- a/src/plugins/mqtt/CMakeLists.txt
+++ b/src/plugins/mqtt/CMakeLists.txt
@@ -18,3 +18,15 @@ IF (TD_LINUX)
TARGET_LINK_LIBRARIES(mqtt taos)
ENDIF ()
ENDIF ()
+
+IF (TD_DARWIN)
+ ADD_LIBRARY(mqtt ${SRC})
+ TARGET_LINK_LIBRARIES(mqtt cJson mqttc)
+
+ IF (TD_SOMODE_STATIC)
+ TARGET_LINK_LIBRARIES(mqtt taos_static)
+ ELSE ()
+ TARGET_LINK_LIBRARIES(mqtt taos)
+ ENDIF ()
+ENDIF ()
+
diff --git a/src/query/CMakeLists.txt b/src/query/CMakeLists.txt
index e403251858bdea2c89cc050ab3dbe3a5110843e3..967e86de3c5d9288834e3eb3b3222e551009bc49 100644
--- a/src/query/CMakeLists.txt
+++ b/src/query/CMakeLists.txt
@@ -14,3 +14,8 @@ IF (TD_LINUX)
TARGET_LINK_LIBRARIES(query m rt)
ADD_SUBDIRECTORY(tests)
ENDIF ()
+
+IF (TD_DARWIN)
+ TARGET_LINK_LIBRARIES(query m)
+ ADD_SUBDIRECTORY(tests)
+ENDIF ()
diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c
index 63b2f3ea158fc90a05ed9c7ea818dfbf674989d3..6e1945407cc0e7682a884a99ea0095bdc27c7b2c 100644
--- a/src/query/src/qExecutor.c
+++ b/src/query/src/qExecutor.c
@@ -1398,13 +1398,13 @@ static int32_t doTSJoinFilter(SQueryRuntimeEnv *pRuntimeEnv, int32_t offset) {
if (key < elem.ts) {
return TS_JOIN_TS_NOT_EQUALS;
} else if (key > elem.ts) {
- assert(false);
+ longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_INCONSISTAN);
}
} else {
if (key > elem.ts) {
return TS_JOIN_TS_NOT_EQUALS;
} else if (key < elem.ts) {
- assert(false);
+ longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_INCONSISTAN);
}
}
@@ -3828,6 +3828,11 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
setQueryStatus(pQuery, QUERY_NOT_COMPLETED);
pRuntimeEnv->scanFlag = REPEAT_SCAN;
+ if (pRuntimeEnv->pTsBuf) {
+ bool ret = tsBufNextPos(pRuntimeEnv->pTsBuf);
+ assert(ret);
+ }
+
qDebug("QInfo:%p start to repeat scan data blocks due to query func required, qrange:%"PRId64"-%"PRId64, pQInfo,
cond.twindow.skey, cond.twindow.ekey);
}
@@ -6424,6 +6429,11 @@ static int32_t convertQueryMsg(SQueryTableMsg *pQueryMsg, SArray **pTableIdList,
pMsg += pQueryMsg->tbnameCondLen;
}
+ //skip ts buf
+ if ((pQueryMsg->tsOffset + pQueryMsg->tsLen) > 0) {
+ pMsg = (char *)pQueryMsg + pQueryMsg->tsOffset + pQueryMsg->tsLen;
+ }
+
*sql = strndup(pMsg, pQueryMsg->sqlstrLen);
if (!validateQuerySourceCols(pQueryMsg, *pExpr, *tagCols)) {
diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c
index acd81e94a40e5a0de4c45a70727d4955463029e1..4fe41b17099cadf37988716154f45c6dcccb3814 100644
--- a/src/rpc/src/rpcTcp.c
+++ b/src/rpc/src/rpcTcp.c
@@ -315,6 +315,7 @@ void *taosInitTcpClient(uint32_t ip, uint16_t port, char *label, int num, void *
pthread_attr_destroy(&thattr);
if (code != 0) {
EpollClose(pThreadObj->pollFd);
+ pThreadObj->pollFd = -1;
free(pThreadObj);
terrno = TAOS_SYSTEM_ERROR(errno);
tError("%s failed to create TCP read data thread(%s)", label, strerror(errno));
@@ -477,7 +478,10 @@ static void *taosProcessTcpData(void *param) {
SFdObj *pFdObj;
struct epoll_event events[maxEvents];
SRecvInfo recvInfo;
-
+
+#ifdef __APPLE__
+ taos_block_sigalrm();
+#endif // __APPLE__
while (1) {
int fdNum = epoll_wait(pThreadObj->pollFd, events, maxEvents, TAOS_EPOLL_WAIT_TIME);
if (pThreadObj->stop) {
@@ -519,7 +523,10 @@ static void *taosProcessTcpData(void *param) {
if (pThreadObj->stop) break;
}
- if (pThreadObj->pollFd >=0) EpollClose(pThreadObj->pollFd);
+ if (pThreadObj->pollFd >=0) {
+ EpollClose(pThreadObj->pollFd);
+ pThreadObj->pollFd = -1;
+ }
while (pThreadObj->pHead) {
SFdObj *pFdObj = pThreadObj->pHead;
diff --git a/src/rpc/test/CMakeLists.txt b/src/rpc/test/CMakeLists.txt
index 9a4bcc353d9bd1ad8ee8b6ef546f8e4a44f75559..e9231058600ce2135f669dd42a6c52cca81424cd 100644
--- a/src/rpc/test/CMakeLists.txt
+++ b/src/rpc/test/CMakeLists.txt
@@ -16,3 +16,17 @@ IF (TD_LINUX)
ADD_EXECUTABLE(rserver ${SERVER_SRC})
TARGET_LINK_LIBRARIES(rserver trpc)
ENDIF ()
+
+IF (TD_DARWIN)
+ LIST(APPEND CLIENT_SRC ./rclient.c)
+ ADD_EXECUTABLE(rclient ${CLIENT_SRC})
+ TARGET_LINK_LIBRARIES(rclient trpc)
+
+ LIST(APPEND SCLIENT_SRC ./rsclient.c)
+ ADD_EXECUTABLE(rsclient ${SCLIENT_SRC})
+ TARGET_LINK_LIBRARIES(rsclient trpc)
+
+ LIST(APPEND SERVER_SRC ./rserver.c)
+ ADD_EXECUTABLE(rserver ${SERVER_SRC})
+ TARGET_LINK_LIBRARIES(rserver trpc)
+ENDIF ()
diff --git a/src/sync/CMakeLists.txt b/src/sync/CMakeLists.txt
index e18312da3b672cb38073cffa947778a8fd8b0d34..cc86bf704c24223bcc0ff90e3633efa8d065ac96 100644
--- a/src/sync/CMakeLists.txt
+++ b/src/sync/CMakeLists.txt
@@ -3,16 +3,14 @@ PROJECT(TDengine)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-
-IF (TD_LINUX OR TD_WINDOWS)
- LIST(REMOVE_ITEM SRC src/syncArbitrator.c)
- ADD_LIBRARY(sync ${SRC})
- TARGET_LINK_LIBRARIES(sync tutil pthread common)
- LIST(APPEND BIN_SRC src/syncArbitrator.c)
- LIST(APPEND BIN_SRC src/syncTcp.c)
- ADD_EXECUTABLE(tarbitrator ${BIN_SRC})
- TARGET_LINK_LIBRARIES(tarbitrator sync common osdetail tutil)
+LIST(REMOVE_ITEM SRC src/syncArbitrator.c)
+ADD_LIBRARY(sync ${SRC})
+TARGET_LINK_LIBRARIES(sync tutil pthread common)
- #ADD_SUBDIRECTORY(test)
-ENDIF ()
+LIST(APPEND BIN_SRC src/syncArbitrator.c)
+LIST(APPEND BIN_SRC src/syncTcp.c)
+ADD_EXECUTABLE(tarbitrator ${BIN_SRC})
+TARGET_LINK_LIBRARIES(tarbitrator sync common osdetail tutil)
+
+#ADD_SUBDIRECTORY(test)
diff --git a/src/sync/src/syncTcp.c b/src/sync/src/syncTcp.c
index 50c52623f7be0920af1a266c31b75a3ae1ee0edb..22bdc7e74e2ba08b4ed297bd02901d4411835350 100644
--- a/src/sync/src/syncTcp.c
+++ b/src/sync/src/syncTcp.c
@@ -303,7 +303,7 @@ static SThreadObj *syncGetTcpThread(SPoolObj *pPool) {
pthread_attr_destroy(&thattr);
if (ret != 0) {
- taosCloseSocket(pThread->pollFd);
+ EpollClose(pThread->pollFd);
tfree(pThread);
return NULL;
}
diff --git a/src/sync/test/CMakeLists.txt b/src/sync/test/CMakeLists.txt
index 256e87580d9372f0ade7200591303211f0140952..ab2e6c307bd7f69f1faf2fc578b3dcf8d43c4c84 100644
--- a/src/sync/test/CMakeLists.txt
+++ b/src/sync/test/CMakeLists.txt
@@ -13,4 +13,3 @@ IF (TD_LINUX)
TARGET_LINK_LIBRARIES(syncServer sync trpc common)
ENDIF ()
-
diff --git a/src/tsdb/inc/tsdbMain.h b/src/tsdb/inc/tsdbMain.h
index 50679749036d7b38e124aad6980cdd44d40998a8..05335b45d5850033918c1af503f3d505af2813c0 100644
--- a/src/tsdb/inc/tsdbMain.h
+++ b/src/tsdb/inc/tsdbMain.h
@@ -233,7 +233,7 @@ typedef struct {
SMemTable* mem;
SMemTable* imem;
STsdbFileH* tsdbFileH;
- sem_t readyToCommit;
+ tsem_t readyToCommit;
pthread_mutex_t mutex;
bool repoLocked;
int32_t code; // Commit code
@@ -616,4 +616,4 @@ int tsdbScheduleCommit(STsdbRepo *pRepo);
}
#endif
-#endif
\ No newline at end of file
+#endif
diff --git a/src/tsdb/src/tsdbCommit.c b/src/tsdb/src/tsdbCommit.c
index 9e7b0cf108bc5c08f0a5b7bd791e4025c8b705a1..cd8358e5e39c0b876841423d7881c3ee5ca7913b 100644
--- a/src/tsdb/src/tsdbCommit.c
+++ b/src/tsdb/src/tsdbCommit.c
@@ -166,7 +166,7 @@ static void tsdbEndCommit(STsdbRepo *pRepo, int eno) {
pRepo->imem = NULL;
tsdbUnlockRepo(pRepo);
tsdbUnRefMemTable(pRepo, pIMem);
- sem_post(&(pRepo->readyToCommit));
+ tsem_post(&(pRepo->readyToCommit));
}
static int tsdbHasDataToCommit(SCommitIter *iters, int nIters, TSKEY minKey, TSKEY maxKey) {
diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c
index 3903f1dedc12fd5e0998798ae4f94f7d2255496a..cadbfa91cf51abac00bcb0d77605ac96346ec46c 100644
--- a/src/tsdb/src/tsdbMain.c
+++ b/src/tsdb/src/tsdbMain.c
@@ -146,7 +146,7 @@ int tsdbCloseRepo(TSDB_REPO_T *repo, int toCommit) {
if (toCommit) {
tsdbAsyncCommit(pRepo);
- sem_wait(&(pRepo->readyToCommit));
+ tsem_wait(&(pRepo->readyToCommit));
terrno = pRepo->code;
}
tsdbUnRefMemTable(pRepo, pRepo->mem);
@@ -643,8 +643,9 @@ static STsdbRepo *tsdbNewRepo(char *rootDir, STsdbAppH *pAppH, STsdbCfg *pCfg) {
goto _err;
}
- code = sem_init(&(pRepo->readyToCommit), 0, 1);
+ code = tsem_init(&(pRepo->readyToCommit), 0, 1);
if (code != 0) {
+ code = errno;
terrno = TAOS_SYSTEM_ERROR(code);
goto _err;
}
@@ -693,7 +694,7 @@ static void tsdbFreeRepo(STsdbRepo *pRepo) {
// tsdbFreeMemTable(pRepo->mem);
// tsdbFreeMemTable(pRepo->imem);
tfree(pRepo->rootDir);
- sem_destroy(&(pRepo->readyToCommit));
+ tsem_destroy(&(pRepo->readyToCommit));
pthread_mutex_destroy(&pRepo->mutex);
free(pRepo);
}
diff --git a/src/tsdb/src/tsdbMemTable.c b/src/tsdb/src/tsdbMemTable.c
index 07f001f68aecba589c68aa078fdb23dd071bbdd5..42bbebe5f7ae319e45cfd37bea6c1dd673be7904 100644
--- a/src/tsdb/src/tsdbMemTable.c
+++ b/src/tsdb/src/tsdbMemTable.c
@@ -207,7 +207,7 @@ void *tsdbAllocBytes(STsdbRepo *pRepo, int bytes) {
int tsdbAsyncCommit(STsdbRepo *pRepo) {
if (pRepo->mem == NULL) return 0;
- sem_wait(&(pRepo->readyToCommit));
+ tsem_wait(&(pRepo->readyToCommit));
ASSERT(pRepo->imem == NULL);
@@ -229,8 +229,8 @@ int tsdbSyncCommit(TSDB_REPO_T *repo) {
STsdbRepo *pRepo = (STsdbRepo *)repo;
tsdbAsyncCommit(pRepo);
- sem_wait(&(pRepo->readyToCommit));
- sem_post(&(pRepo->readyToCommit));
+ tsem_wait(&(pRepo->readyToCommit));
+ tsem_post(&(pRepo->readyToCommit));
if (pRepo->code != TSDB_CODE_SUCCESS) {
terrno = pRepo->code;
@@ -927,4 +927,4 @@ static int tsdbUpdateTableLatestInfo(STsdbRepo *pRepo, STable *pTable, SDataRow
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
index 48b4d7656105aed1a983fad59c20195f0d3fcb77..3606aea76b91c8bc272cf658065443f65fd3fd28 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -5,7 +5,7 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/rpc/inc)
AUX_SOURCE_DIRECTORY(src SRC)
ADD_LIBRARY(tutil ${SRC})
TARGET_LINK_LIBRARIES(tutil pthread osdetail lz4 z)
-
+
IF (TD_LINUX)
TARGET_LINK_LIBRARIES(tutil m rt)
# ADD_SUBDIRECTORY(tests)
@@ -28,5 +28,6 @@ IF (TD_LINUX)
ELSEIF (TD_WINDOWS)
TARGET_LINK_LIBRARIES(tutil iconv regex winmm IPHLPAPI ws2_32 wepoll)
ELSEIF(TD_DARWIN)
+ TARGET_LINK_LIBRARIES(tutil m)
TARGET_LINK_LIBRARIES(tutil iconv)
ENDIF()
diff --git a/src/util/src/tsocket.c b/src/util/src/tsocket.c
index 363669816277c00e9c43435f4032405380a70a45..57e262e5cf08bcadbfad6ea3f200ec690278d11f 100644
--- a/src/util/src/tsocket.c
+++ b/src/util/src/tsocket.c
@@ -354,6 +354,8 @@ int32_t taosKeepTcpAlive(SOCKET sockFd) {
return -1;
}
+#ifndef __APPLE__
+ // all fails on macosx
int32_t probes = 3;
if (taosSetSockOpt(sockFd, SOL_TCP, TCP_KEEPCNT, (void *)&probes, sizeof(probes)) < 0) {
uError("fd:%d setsockopt SO_KEEPCNT failed: %d (%s)", sockFd, errno, strerror(errno));
@@ -374,6 +376,7 @@ int32_t taosKeepTcpAlive(SOCKET sockFd) {
taosCloseSocket(sockFd);
return -1;
}
+#endif // __APPLE__
int32_t nodelay = 1;
if (taosSetSockOpt(sockFd, IPPROTO_TCP, TCP_NODELAY, (void *)&nodelay, sizeof(nodelay)) < 0) {
diff --git a/src/vnode/CMakeLists.txt b/src/vnode/CMakeLists.txt
index 202f11e03ec2d8b15bea4e96e3adbbcf23e1c338..5d77d48ebff8278a4f4ea2b0cea6f43bb65a97e9 100644
--- a/src/vnode/CMakeLists.txt
+++ b/src/vnode/CMakeLists.txt
@@ -10,7 +10,5 @@ INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(src SRC)
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_LIBRARY(vnode ${SRC})
- TARGET_LINK_LIBRARIES(vnode tsdb tcq)
-ENDIF ()
+ADD_LIBRARY(vnode ${SRC})
+TARGET_LINK_LIBRARIES(vnode tsdb tcq)
diff --git a/src/wal/CMakeLists.txt b/src/wal/CMakeLists.txt
index 1c5e98457cbf0be434d5382342db5078b24f0be6..6f35cb9ba7e1fc111bd1c2a5ddd797abf334eac6 100644
--- a/src/wal/CMakeLists.txt
+++ b/src/wal/CMakeLists.txt
@@ -4,8 +4,6 @@ PROJECT(TDengine)
INCLUDE_DIRECTORIES(inc)
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/src SRC)
-IF (TD_LINUX OR TD_WINDOWS)
- ADD_LIBRARY(twal ${SRC})
- TARGET_LINK_LIBRARIES(twal tutil common)
- ADD_SUBDIRECTORY(test)
-ENDIF ()
+ADD_LIBRARY(twal ${SRC})
+TARGET_LINK_LIBRARIES(twal tutil common)
+ADD_SUBDIRECTORY(test)
diff --git a/src/wal/test/CMakeLists.txt b/src/wal/test/CMakeLists.txt
index b8338b1738a840d43d6f073e5562f0e1ffacf851..aec0602ac00c6b943b4dd6c20c219d17223ee896 100644
--- a/src/wal/test/CMakeLists.txt
+++ b/src/wal/test/CMakeLists.txt
@@ -10,4 +10,12 @@ IF (TD_LINUX)
ENDIF ()
+IF (TD_DARWIN)
+ INCLUDE_DIRECTORIES(../inc)
+
+ LIST(APPEND WALTEST_SRC ./waltest.c)
+ ADD_EXECUTABLE(waltest ${WALTEST_SRC})
+ TARGET_LINK_LIBRARIES(waltest twal osdetail tutil)
+
+ENDIF ()
diff --git a/tests/comparisonTest/tdengine/CMakeLists.txt b/tests/comparisonTest/tdengine/CMakeLists.txt
index aaa18592ed29b6e39c97a55e68e4867684817bbf..a12e36ab6b9b40992c0231bd36567ab0df0d9d7c 100644
--- a/tests/comparisonTest/tdengine/CMakeLists.txt
+++ b/tests/comparisonTest/tdengine/CMakeLists.txt
@@ -5,3 +5,8 @@ IF (TD_LINUX)
add_executable(tdengineTest tdengineTest.c)
target_link_libraries(tdengineTest taos_static tutil common pthread)
ENDIF()
+
+IF (TD_DARWIN)
+ add_executable(tdengineTest tdengineTest.c)
+ target_link_libraries(tdengineTest taos_static tutil common pthread)
+ENDIF()
diff --git a/tests/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java b/tests/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java
index 880bcbfc6fcda29c7225090707d694b3d0f7d4ea..91639e85f3b488a5ded5e1253b429fa874b091e2 100644
--- a/tests/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java
+++ b/tests/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java
@@ -14,13 +14,14 @@ public class JdbcRestfulDemo {
String url = "jdbc:TAOS-RS://" + host + ":6041/?user=root&password=taosdata";
Properties properties = new Properties();
- properties.setProperty("charset", "UTF-8");
- properties.setProperty("locale", "en_US.UTF-8");
- properties.setProperty("timezone", "UTC-8");
+// properties.setProperty("charset", "UTF-8");
+// properties.setProperty("locale", "en_US.UTF-8");
+// properties.setProperty("timezone", "UTC-8");
Connection conn = DriverManager.getConnection(url, properties);
Statement stmt = conn.createStatement();
+ stmt.execute("drop database if exists restful_test");
stmt.execute("create database if not exists restful_test");
stmt.execute("use restful_test");
stmt.execute("create table restful_test.weather(ts timestamp, temperature float) tags(location nchar(64))");
@@ -34,6 +35,7 @@ public class JdbcRestfulDemo {
System.out.println();
}
+ rs.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
diff --git a/tests/examples/JDBC/connectionPools/pom.xml b/tests/examples/JDBC/connectionPools/pom.xml
index 2793f0a83ddc88711796c133802c82979ae14be5..fbee256067dcc3dec5e5888384d5ca36d3b66066 100644
--- a/tests/examples/JDBC/connectionPools/pom.xml
+++ b/tests/examples/JDBC/connectionPools/pom.xml
@@ -12,7 +12,7 @@
com.taosdata.jdbc
taos-jdbcdriver
- 2.0.11
+ 2.0.17
@@ -44,7 +44,6 @@
c3p0
0.9.5.4
-
log4j
diff --git a/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/DruidPoolBuilder.java b/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/DruidPoolBuilder.java
index e5dc14c6a5ef69c2a7059d5d78b621e25ff3d799..a03e9758b6cb62b0f16a80cbf569feab036508aa 100644
--- a/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/DruidPoolBuilder.java
+++ b/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/DruidPoolBuilder.java
@@ -10,20 +10,18 @@ public class DruidPoolBuilder {
final String url = "jdbc:TAOS://" + host + ":6030";
DruidDataSource dataSource = new DruidDataSource();
+ // jdbc properties
dataSource.setUrl(url);
dataSource.setDriverClassName("com.taosdata.jdbc.TSDBDriver");
dataSource.setUsername("root");
dataSource.setPassword("taosdata");
- //初始连接数,默认0
- dataSource.setInitialSize(poolSize);
- //最大连接数,默认8
- dataSource.setMaxActive(poolSize);
- //最小闲置数
- dataSource.setMinIdle(poolSize);
- //获取连接的最大等待时间,单位毫秒
- dataSource.setMaxWait(2000);
-
+ // pool configurations
+ dataSource.setInitialSize(poolSize);//初始连接数,默认0
+ dataSource.setMinIdle(poolSize);//最小闲置数
+ dataSource.setMaxActive(poolSize);//最大连接数,默认8
+ dataSource.setMaxWait(30000);//获取连接的最大等待时间,单位毫秒
+ dataSource.setValidationQuery("select server_status()");
return dataSource;
}
diff --git a/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/HikariCpBuilder.java b/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/HikariCpBuilder.java
index 87f1f4ad2cbba41a779f0247f2214ef2bf04a8ca..2e50dcacffc5f27c449f1e2a3a97284c85d86b99 100644
--- a/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/HikariCpBuilder.java
+++ b/tests/examples/JDBC/connectionPools/src/main/java/com/taosdata/demo/pool/HikariCpBuilder.java
@@ -9,13 +9,18 @@ public class HikariCpBuilder {
public static DataSource getDataSource(String host, int poolSize) {
HikariConfig config = new HikariConfig();
+ // jdbc properties
config.setDriverClassName("com.taosdata.jdbc.TSDBDriver");
config.setJdbcUrl("jdbc:TAOS://" + host + ":6030");
config.setUsername("root");
config.setPassword("taosdata");
+ // pool configurations
+ config.setMinimumIdle(3); //minimum number of idle connection
+ config.setMaximumPoolSize(10); //maximum number of connection in the pool
+ config.setConnectionTimeout(30000); //maximum wait milliseconds for get connection from pool
+ config.setIdleTimeout(0); // max idle time for recycle idle connection
+ config.setConnectionTestQuery("select server_status()"); //validation query
- config.setMaximumPoolSize(poolSize);
- config.setMinimumIdle(poolSize);
HikariDataSource ds = new HikariDataSource(config);
return ds;
}
diff --git a/tests/examples/c/CMakeLists.txt b/tests/examples/c/CMakeLists.txt
index 9e879d4c4c8fec6f2913c0b08e45a746782fe35f..954fe468b1b8fc88ce93fa2474e2f69a33415e6f 100644
--- a/tests/examples/c/CMakeLists.txt
+++ b/tests/examples/c/CMakeLists.txt
@@ -5,4 +5,14 @@ IF (TD_LINUX)
AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(demo apitest.c)
TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread )
+ ADD_EXECUTABLE(epoll epoll.c)
+ TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread )
+ENDIF ()
+IF (TD_DARWIN)
+ INCLUDE_DIRECTORIES(. ${TD_COMMUNITY_DIR}/src/inc ${TD_COMMUNITY_DIR}/src/client/inc ${TD_COMMUNITY_DIR}/inc)
+ AUX_SOURCE_DIRECTORY(. SRC)
+ ADD_EXECUTABLE(demo demo.c)
+ TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread )
+ ADD_EXECUTABLE(epoll epoll.c)
+ TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread )
ENDIF ()
diff --git a/tests/examples/c/demo.c b/tests/examples/c/demo.c
index 9cbcee45a24409f8fdacef79085eb4f9e7e4435f..45ec54680301fd2c941d22d8d67c867b8740c37b 100644
--- a/tests/examples/c/demo.c
+++ b/tests/examples/c/demo.c
@@ -86,7 +86,7 @@ void Test(TAOS *taos, char *qstr, int index) {
int i = 0;
for (i = 0; i < 10; ++i) {
- sprintf(qstr, "insert into m1 values (%" PRId64 ", %d, %d, %d, %d, %f, %lf, '%s')", 1546300800000 + i * 1000, i, i, i, i*10000000, i*1.0, i*2.0, "hello");
+ sprintf(qstr, "insert into m1 values (%" PRId64 ", %d, %d, %d, %d, %f, %lf, '%s')", (uint64_t)(1546300800000 + i * 1000), i, i, i, i*10000000, i*1.0, i*2.0, "hello");
printf("qstr: %s\n", qstr);
// note: how do you wanna do if taos_query returns non-NULL
diff --git a/tests/examples/c/epoll.c b/tests/examples/c/epoll.c
new file mode 100644
index 0000000000000000000000000000000000000000..20ab3951586d353909090cb1344fad10d0362ddf
--- /dev/null
+++ b/tests/examples/c/epoll.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+// how to use to do a pressure-test upon eok
+// tester: cat /dev/urandom | nc -c
+// testee: ./debug/build/bin/epoll -l > /dev/null
+// compare against: nc -l > /dev/null
+// monitor and compare : glances
+
+#ifdef __APPLE__
+#include "eok.h"
+#else // __APPLE__
+#include
+#endif // __APPLE__
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define D(fmt, ...) fprintf(stderr, "%s[%d]%s(): " fmt "\n", basename(__FILE__), __LINE__, __func__, ##__VA_ARGS__)
+#define A(statement, fmt, ...) do { \
+ if (statement) break; \
+ fprintf(stderr, "%s[%d]%s(): assert [%s] failed: %d[%s]: " fmt "\n", \
+ basename(__FILE__), __LINE__, __func__, \
+ #statement, errno, strerror(errno), \
+ ##__VA_ARGS__); \
+ abort(); \
+} while (0)
+
+#define E(fmt, ...) do { \
+ fprintf(stderr, "%s[%d]%s(): %d[%s]: " fmt "\n", \
+ basename(__FILE__), __LINE__, __func__, \
+ errno, strerror(errno), \
+ ##__VA_ARGS__); \
+} while (0)
+
+typedef struct ep_s ep_t;
+struct ep_s {
+ int ep;
+
+ pthread_mutex_t lock;
+ int sv[2]; // 0 for read, 1 for write;
+ pthread_t thread;
+
+ volatile unsigned int stopping:1;
+ volatile unsigned int waiting:1;
+ volatile unsigned int wakenup:1;
+};
+
+static int ep_dummy = 0;
+
+static ep_t* ep_create(void);
+static void ep_destroy(ep_t *ep);
+static void* routine(void* arg);
+static int open_listen(unsigned short port);
+
+typedef struct fde_s fde_t;
+struct fde_s {
+ int skt;
+ void (*on_event)(ep_t *ep, struct epoll_event *events, fde_t *client);
+};
+
+static void listen_event(ep_t *ep, struct epoll_event *ev, fde_t *client);
+static void null_event(ep_t *ep, struct epoll_event *ev, fde_t *client);
+
+#define usage(arg0, fmt, ...) do { \
+ if (fmt[0]) { \
+ fprintf(stderr, "" fmt "\n", ##__VA_ARGS__); \
+ } \
+ fprintf(stderr, "usage:\n"); \
+ fprintf(stderr, " %s -l : specify listenning port\n", arg0); \
+} while (0)
+
+int main(int argc, char *argv[]) {
+ char *prg = basename(argv[0]);
+ if (argc==1) {
+ usage(prg, "");
+ return 0;
+ }
+ ep_t* ep = ep_create();
+ A(ep, "failed");
+ for (int i=1; i=argc) {
+ usage(prg, "expecting after -l, but got nothing");
+ return 1; // confirmed potential leakage
+ }
+ arg = argv[i];
+ int port = atoi(arg);
+ int skt = open_listen(port);
+ if (skt==-1) continue;
+ fde_t *client = (fde_t*)calloc(1, sizeof(*client));
+ if (!client) {
+ E("out of memory");
+ close(skt);
+ continue;
+ }
+ client->skt = skt;
+ client->on_event = listen_event;
+ struct epoll_event ev = {0};
+ ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP;
+ ev.data.ptr = client;
+ A(0==epoll_ctl(ep->ep, EPOLL_CTL_ADD, skt, &ev), "");
+ continue;
+ }
+ usage(prg, "unknown argument: [%s]", arg);
+ return 1;
+ }
+ char *line = NULL;
+ size_t linecap = 0;
+ ssize_t linelen;
+ while ((linelen = getline(&line, &linecap, stdin)) > 0) {
+ line[strlen(line)-1] = '\0';
+ if (0==strcmp(line, "exit")) break;
+ if (0==strcmp(line, "quit")) break;
+ if (line==strstr(line, "close")) {
+ int fd = 0;
+ sscanf(line, "close %d", &fd);
+ if (fd<=2) {
+ fprintf(stderr, "fd [%d] invalid\n", fd);
+ continue;
+ }
+ A(0==epoll_ctl(ep->ep, EPOLL_CTL_DEL, fd, NULL), "");
+ continue;
+ }
+ if (strlen(line)==0) continue;
+ fprintf(stderr, "unknown cmd:[%s]\n", line);
+ }
+ ep_destroy(ep);
+ D("");
+ return 0;
+}
+
+ep_t* ep_create(void) {
+ ep_t *ep = (ep_t*)calloc(1, sizeof(*ep));
+ A(ep, "out of memory");
+ A(-1!=(ep->ep = epoll_create(1)), "");
+ ep->sv[0] = -1;
+ ep->sv[1] = -1;
+ A(0==socketpair(AF_LOCAL, SOCK_STREAM, 0, ep->sv), "");
+ A(0==pthread_mutex_init(&ep->lock, NULL), "");
+ A(0==pthread_mutex_lock(&ep->lock), "");
+ struct epoll_event ev = {0};
+ ev.events = EPOLLIN;
+ ev.data.ptr = &ep_dummy;
+ A(0==epoll_ctl(ep->ep, EPOLL_CTL_ADD, ep->sv[0], &ev), "");
+ A(0==pthread_create(&ep->thread, NULL, routine, ep), "");
+ A(0==pthread_mutex_unlock(&ep->lock), "");
+ return ep;
+}
+
+static void ep_destroy(ep_t *ep) {
+ A(ep, "invalid argument");
+ ep->stopping = 1;
+ A(1==send(ep->sv[1], "1", 1, 0), "");
+ A(0==pthread_join(ep->thread, NULL), "");
+ A(0==pthread_mutex_destroy(&ep->lock), "");
+ A(0==close(ep->sv[0]), "");
+ A(0==close(ep->sv[1]), "");
+ A(0==close(ep->ep), "");
+ free(ep);
+}
+
+static void* routine(void* arg) {
+ A(arg, "invalid argument");
+ ep_t *ep = (ep_t*)arg;
+
+ while (!ep->stopping) {
+ struct epoll_event evs[10];
+ memset(evs, 0, sizeof(evs));
+
+ A(0==pthread_mutex_lock(&ep->lock), "");
+ A(ep->waiting==0, "internal logic error");
+ ep->waiting = 1;
+ A(0==pthread_mutex_unlock(&ep->lock), "");
+
+ int r = epoll_wait(ep->ep, evs, sizeof(evs)/sizeof(evs[0]), -1);
+ A(r>0, "indefinite epoll_wait shall not timeout:[%d]", r);
+
+ A(0==pthread_mutex_lock(&ep->lock), "");
+ A(ep->waiting==1, "internal logic error");
+ ep->waiting = 0;
+ A(0==pthread_mutex_unlock(&ep->lock), "");
+
+ for (int i=0; idata.ptr == &ep_dummy) {
+ char c = '\0';
+ A(1==recv(ep->sv[0], &c, 1, 0), "internal logic error");
+ A(0==pthread_mutex_lock(&ep->lock), "");
+ ep->wakenup = 0;
+ A(0==pthread_mutex_unlock(&ep->lock), "");
+ D("........");
+ continue;
+ }
+ A(ev->data.ptr, "internal logic error");
+ fde_t *client = (fde_t*)ev->data.ptr;
+ client->on_event(ep, ev, client);
+ continue;
+ }
+ }
+ return NULL;
+}
+
+static int open_listen(unsigned short port) {
+ int r = 0;
+ int skt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if (skt==-1) {
+ E("socket() failed");
+ return -1;
+ }
+ do {
+ struct sockaddr_in si = {0};
+ si.sin_family = AF_INET;
+ si.sin_addr.s_addr = inet_addr("0.0.0.0");
+ si.sin_port = htons(port);
+ r = bind(skt, (struct sockaddr*)&si, sizeof(si));
+ if (r) {
+ E("bind(%u) failed", port);
+ break;
+ }
+ r = listen(skt, 100);
+ if (r) {
+ E("listen() failed");
+ break;
+ }
+ memset(&si, 0, sizeof(si));
+ socklen_t len = sizeof(si);
+ r = getsockname(skt, (struct sockaddr *)&si, &len);
+ if (r) {
+ E("getsockname() failed");
+ }
+ A(len==sizeof(si), "internal logic error");
+ D("listenning at: %d", ntohs(si.sin_port));
+ return skt;
+ } while (0);
+ close(skt);
+ return -1;
+}
+
+static void listen_event(ep_t *ep, struct epoll_event *ev, fde_t *client) {
+ A(ev->events & EPOLLIN, "internal logic error");
+ struct sockaddr_in si = {0};
+ socklen_t silen = sizeof(si);
+ int skt = accept(client->skt, (struct sockaddr*)&si, &silen);
+ A(skt!=-1, "internal logic error");
+ fde_t *server = (fde_t*)calloc(1, sizeof(*server));
+ if (!server) {
+ close(skt);
+ return;
+ }
+ server->skt = skt;
+ server->on_event = null_event;
+ struct epoll_event ee = {0};
+ ee.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLRDHUP;
+ ee.data.ptr = server;
+ A(0==epoll_ctl(ep->ep, EPOLL_CTL_ADD, skt, &ee), "");
+}
+
+static void null_event(ep_t *ep, struct epoll_event *ev, fde_t *client) {
+ if (ev->events & EPOLLIN) {
+ char buf[8192];
+ int n = recv(client->skt, buf, sizeof(buf), 0);
+ A(n>=0 && n<=sizeof(buf), "internal logic error:[%d]", n);
+ A(n==fwrite(buf, 1, n, stdout), "internal logic error");
+ }
+ if (ev->events & (EPOLLERR | EPOLLHUP | EPOLLRDHUP)) {
+ A(0==pthread_mutex_lock(&ep->lock), "");
+ A(0==epoll_ctl(ep->ep, EPOLL_CTL_DEL, client->skt, NULL), "");
+ A(0==pthread_mutex_unlock(&ep->lock), "");
+ close(client->skt);
+ client->skt = -1;
+ client->on_event = NULL;
+ free(client);
+ }
+}
+
diff --git a/tests/pytest/insert/unsigenedTinyint.py b/tests/pytest/insert/unsigenedTinyint.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c0634b69a105c72030cdc5d15a31b8af656d48d
--- /dev/null
+++ b/tests/pytest/insert/unsigenedTinyint.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+
+import sys
+from util.log import *
+from util.cases import *
+from util.sql import *
+
+
+class TDTestCase:
+ def init(self, conn, logSql):
+ tdLog.debug("start to execute %s" % __file__)
+ tdSql.init(conn.cursor(), logSql)
+
+ def run(self):
+ tdSql.prepare()
+
+ tdLog.info('=============== step1')
+ tdLog.info('create table tb (ts timestamp, speed tinyint unsigned)')
+ tdSql.execute('create table tb (ts timestamp, speed tinyint unsigned)')
+ tdLog.info("insert into tb values (now, NULL)")
+ tdSql.execute("insert into tb values (now, NULL)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(1)')
+ tdSql.checkRows(1)
+ tdLog.info('tdSql.checkData(0, 1, null)')
+ tdSql.checkData(0, 1, None)
+ tdLog.info('=============== step2')
+ tdLog.info("insert into tb values (now+1m, -1) -x step2")
+ tdSql.error("insert into tb values (now+1m, -1) ")
+ tdLog.info("insert into tb values (now+1m, NULL)")
+ tdSql.execute("insert into tb values (now+1m, NULL)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(2)')
+ tdSql.checkRows(2)
+ tdLog.info('tdSql.checkData(0, 1, null)')
+ tdSql.checkData(0, 1, None)
+ tdLog.info('=============== step3')
+ tdLog.info("insert into tb values (now+2m, 254)")
+ tdSql.execute("insert into tb values (now+2m, 254)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(3)')
+ tdSql.checkRows(3)
+ tdLog.info('tdSql.checkData(0, 1, 254)')
+ tdSql.checkData(0, 1, 254)
+ tdLog.info('=============== step4')
+ tdLog.info("insert into tb values (now+3m, 255) -x step4")
+ tdSql.error("insert into tb values (now+3m, 255)")
+ tdLog.info("insert into tb values (now+3m, NULL)")
+ tdSql.execute("insert into tb values (now+3m, NULL)")
+ tdLog.info('select * from tb')
+ tdSql.query('select * from tb')
+ tdLog.info('tdSql.checkRow(4)')
+ tdSql.checkRows(4)
+ tdLog.info('tdSql.checkData(0, 1, null)')
+ tdSql.checkData(0, 1, None)
+ tdLog.info('=============== step5')
+ tdLog.info("insert into tb values (now+4m, a2)")
+ tdSql.error("insert into tb values (now+4m, a2)")
+ tdLog.info("insert into tb values (now+4m, 0)")
+ tdSql.execute("insert into tb values (now+4m, 0)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(5)')
+ tdSql.checkRows(5)
+ tdLog.info('tdSql.checkData(0, 1, 0)')
+ tdSql.checkData(0, 1, 0)
+ tdLog.info('=============== step6')
+ tdLog.info("insert into tb values (now+5m, 2a)")
+ tdSql.error("insert into tb values (now+5m, 2a)")
+ tdLog.info("insert into tb values (now+5m, 2)")
+ tdSql.execute("insert into tb values (now+5m, 2)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(6)')
+ tdSql.checkRows(6)
+ tdLog.info('tdSql.checkData(0, 1, 2)')
+ tdSql.checkData(0, 1, 2)
+ tdLog.info('=============== step7')
+ tdLog.info("insert into tb values (now+6m, 2a'1)")
+ tdSql.error("insert into tb values (now+6m, 2a'1)")
+ tdLog.info("insert into tb values (now+6m, 2)")
+ tdSql.execute("insert into tb values (now+6m, 2)")
+ tdLog.info('select * from tb order by ts desc')
+ tdSql.query('select * from tb order by ts desc')
+ tdLog.info('tdSql.checkRow(7)')
+ tdSql.checkRows(7)
+ tdLog.info('tdSql.checkData(0, 1, 2)')
+ tdSql.checkData(0, 1, 2)
+ tdLog.info('drop database db')
+ tdSql.execute('drop database db')
+ tdLog.info('show databases')
+ tdSql.query('show databases')
+ tdLog.info('tdSql.checkRow(0)')
+ tdSql.checkRows(0)
+# convert end
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success("%s successfully executed" % __file__)
+
+
+tdCases.addWindows(__file__, TDTestCase())
+tdCases.addLinux(__file__, TDTestCase())
diff --git a/tests/pytest/multilevel/fileDistributionSameLevel.py b/tests/pytest/multilevel/fileDistributionSameLevel.py
index e2880283b5b6a76942ac9ac5abba50f8c5bfda1e..88a7216b8e6a6388d8d65bf8bd6ca530e662327f 100644
--- a/tests/pytest/multilevel/fileDistributionSameLevel.py
+++ b/tests/pytest/multilevel/fileDistributionSameLevel.py
@@ -25,19 +25,19 @@ class TDTestCase:
tdSql.init(conn.cursor(), logSql)
def run(self):
- self.ntables = 10
- self.rowsPerTable = 10
+ self.ntables = 1000
self.ts = 1520000010000
tdDnodes.stop(1)
# Test1 1 dataDir
cfg={
'10' : 'maxVgroupsPerDb',
+ '100' : 'maxTablesPerVnode',
'/mnt/data00 0 1' : 'dataDir',
'/mnt/data01 0 0' : 'dataDir',
'/mnt/data02 0 0' : 'dataDir',
- '/mnt/data03 1 0' : 'dataDir',
- '/mnt/data04 1 0' : 'dataDir'
+ '/mnt/data03 0 0' : 'dataDir',
+ '/mnt/data04 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data00')
tdSql.createDir('/mnt/data01')
@@ -51,16 +51,17 @@ class TDTestCase:
tdSql.execute("create database test days 1")
tdSql.execute("use test")
- tdSql.execute("create table tb(ts timestamp, c int)")
+ tdSql.execute("create table stb(ts timestamp, c int) tags(t int)")
- for i in range(self.rowsPerTable):
- tdSql.execute("insert into tb values(%d, 1)" % (self.ts + i * 86400000))
+ for i in range(self.ntables):
+ tdSql.execute("create table tb%d using stb tags(%d)" %(i, i))
+ tdSql.execute("insert into tb%d values(%d, 1)" % (self.ts + int (i / 100) * 86400000))
tdDnodes.stop(1)
tdDnodes.start(1)
- tdSql.query("select * from test.tb")
- tdSql.checkRows(10)
+ tdSql.query("select * from test.stb")
+ tdSql.checkRows(1000)
def stop(self):
diff --git a/tests/pytest/multilevel/threeLevelMountPoint.py b/tests/pytest/multilevel/threeLevelMountPoint.py
index ccaf95f47d389e053c042a4a20cefad2c7d08776..d97602eb76889ab265f6bc673f5c7558be5d7fe3 100644
--- a/tests/pytest/multilevel/threeLevelMountPoint.py
+++ b/tests/pytest/multilevel/threeLevelMountPoint.py
@@ -56,6 +56,15 @@ class TDTestCase:
tdDnodes.startWithoutSleep(1)
tdSql.taosdStatus(1)
+ tdSql.haveFile('/mnt/data00',1)
+ tdSql.haveFile('/mnt/data01',1)
+ tdSql.haveFile('/mnt/data02',1)
+ tdSql.haveFile('/mnt/data10',1)
+ tdSql.haveFile('/mnt/data11',1)
+ tdSql.haveFile('/mnt/data12',1)
+ tdSql.haveFile('/mnt/data20',1)
+ tdSql.haveFile('/mnt/data21',1)
+ tdSql.haveFile('/mnt/data22',1)
def stop(self):
tdSql.close()
diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py
index 4f7607fc6c000d7ca55035e6973bfb5577a67964..16931cca333a3300b7d0d6831bbb51db0238b1d1 100644
--- a/tests/pytest/util/sql.py
+++ b/tests/pytest/util/sql.py
@@ -194,11 +194,16 @@ class TDSql:
pstate = 0
pl = psutil.pids()
for pid in pl:
- if psutil.Process(pid).name == 'taosd':
- pstate = 1
- break
- if pstate:
- tdLog.sleep(5)
+ try:
+ if psutil.Process(pid).name() == 'taosd':
+ print('have already started')
+ pstate = 1
+ break
+ except psutil.NoSuchProcess:
+ pass
+ if pstate == state :break
+ if state or pstate:
+ tdLog.sleep(1)
continue
pstate = 0
break
@@ -219,9 +224,9 @@ class TDSql:
tdLog.info("dir: %s is empty, expect: empty" %dir)
else:
if state :
- tdLog.info("dir: %s is empty, expect: not empty" %dir)
+ tdLog.info("dir: %s is not empty, expect: not empty" %dir)
else:
- tdLog.exit("dir: %s is empty, expect: empty" %dir)
+ tdLog.exit("dir: %s is not empty, expect: empty" %dir)
else:
tdLog.exit("dir: %s doesn't exist" %dir)
def createDir(self, dir):