From bd22f9418feded9abf654d508a2ad334f04f0802 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Sat, 6 Jun 2020 14:03:16 +0800 Subject: [PATCH 01/11] refactor: remove TSDBError --- .../java/com/taosdata/jdbc/TSDBError.java | 223 ------------------ .../java/com/taosdata/jdbc/TSDBStatement.java | 1 + .../src/test/java/TestPreparedStatement.java | 3 + 3 files changed, 4 insertions(+), 223 deletions(-) delete mode 100644 src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java deleted file mode 100644 index bb1b2afd07..0000000000 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBError.java +++ /dev/null @@ -1,223 +0,0 @@ -/*************************************************************************** - * 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 . - *****************************************************************************/ -package com.taosdata.jdbc; - -import java.util.HashMap; -import java.util.Map; - -/** - * - * TDengine error code and error message enumeration. - * - */ -public enum TSDBError { - - TSDB_CODE_SUCCESS(0, "success"), - TSDB_CODE_ACTION_IN_PROGRESS(1, "in progress"), - TSDB_CODE_LAST_SESSION_NOT_FINISHED(5, "last session not finished"), - TSDB_CODE_INVALID_SESSION_ID(6, "invalid session ID"), - TSDB_CODE_INVALID_TRAN_ID(7, "invalid tran ID"), - TSDB_CODE_INVALID_MSG_TYPE(8, "invalid msg type"), - TSDB_CODE_ALREADY_PROCESSED(9, "alredy processed"), - TSDB_CODE_AUTH_FAILURE(10, "authentication failure"), - TSDB_CODE_WRONG_MSG_SIZE(11, "wrong msg size"), - TSDB_CODE_UNEXPECTED_RESPONSE(12, "unexpected response"), - TSDB_CODE_INVALID_RESPONSE_TYPE(13, "invalid response type"), - TSDB_CODE_NO_RESOURCE(14, "no resource"), - TSDB_CODE_INVALID_TIME_STAMP(15, "invalid time stamp"), - TSDB_CODE_MISMATCHED_METER_ID(16, "mismatched meter ID"), - TSDB_CODE_ACTION_TRANS_NOT_FINISHED(17, "transcation not finished"), - TSDB_CODE_ACTION_NOT_ONLINE(18, "not online"), - TSDB_CODE_ACTION_SEND_FAILD(19, "send failed"), - TSDB_CODE_NOT_ACTIVE_SESSION(20, "not active session"), - TSDB_CODE_INSERT_FAILED(21, "insert failed"), - TSDB_CODE_APP_ERROR(22, "App error"), - TSDB_CODE_INVALID_IE(23, "invalid IE"), - TSDB_CODE_INVALID_VALUE(24, "invalid value"), - TSDB_CODE_REDIRECT(25, "service not available"), - TSDB_CODE_ALREADY_THERE(26, "already there"), - TSDB_CODE_INVALID_TABLE_ID(27, "invalid meter ID"), - TSDB_CODE_INVALID_SQL(28, "invalid SQL"), // this message often comes with additional info which will vary based on the specific error situation - TSDB_CODE_NETWORK_UNAVAIL(29, "failed to connect to server"), - TSDB_CODE_INVALID_MSG_LEN(30, "invalid msg len"), - TSDB_CODE_INVALID_DB(31, "invalid DB"), - TSDB_CODE_INVALID_TABLE(32, "invalid table"), - TSDB_CODE_DB_ALREADY_EXIST(33, "DB already there"), - TSDB_CODE_TABLE_ALREADY_EXIST(34, "table already there"), - TSDB_CODE_INVALID_USER(35, "invalid user name"), - TSDB_CODE_INVALID_ACCT(36, "invalid acct name"), - TSDB_CODE_INVALID_PASS(37, "invalid password"), - TSDB_CODE_DB_NOT_SELECTED(38, "DB not selected"), - TSDB_CODE_MEMORY_CORRUPTED(39, "memory corrupted"), - TSDB_CODE_USER_ALREADY_EXIST(40, "user name exists"), - TSDB_CODE_NO_RIGHTS(41, "not authorized"), - TSDB_CODE_DISCONNECTED(42, "login disconnected), login again"), - TSDB_CODE_NO_MASTER(43, "mgmt master node not available"), - TSDB_CODE_NOT_CONFIGURED(44, "not configured"), - TSDB_CODE_INVALID_OPTION(45, "invalid option"), - TSDB_CODE_NODE_OFFLINE(46, "node offline"), - TSDB_CODE_SYNC_REQUIRED(47, "sync required"), - TSDB_CODE_NO_ENOUGH_DNODES(48, "more dnodes are needed"), - TSDB_CODE_UNSYNCED(49, "node in unsynced state"), - TSDB_CODE_TOO_SLOW(50, "too slow"), - TSDB_CODE_OTHERS(51, "others"), - TSDB_CODE_NO_REMOVE_MASTER(52, "can't remove dnode which is master"), - TSDB_CODE_WRONG_SCHEMA(53, "wrong schema"), - TSDB_CODE_NO_RESULT(54, "no results"), - TSDB_CODE_TOO_MANY_USERS(55, "num of users execeed maxUsers"), - TSDB_CODE_TOO_MANY_DATABSES(56, "num of databases execeed maxDbs"), - TSDB_CODE_TOO_MANY_TABLES(57, "num of tables execeed maxTables"), - TSDB_CODE_TOO_MANY_DNODES(58, "num of dnodes execeed maxDnodes"), - TSDB_CODE_TOO_MANY_ACCTS(59, "num of accounts execeed maxAccts"), - TSDB_CODE_ACCT_ALREADY_EXIST(60, "accout name exists"), - TSDB_CODE_DNODE_ALREADY_EXIST(61, "dnode ip exists"), - TSDB_CODE_SDB_ERROR(62, "sdb error"), - TSDB_CODE_METRICMETA_EXPIRED(63, "metric meta expired"), // local cached metric-meta expired causes error in metric query - TSDB_CODE_NOT_READY(64, "not ready"), // peer is not ready to process data - TSDB_CODE_MAX_SESSIONS(65, "too many sessions on server"), // too many sessions - TSDB_CODE_MAX_CONNECTIONS(66, "too many sessions from app"), // too many connections - TSDB_CODE_SESSION_ALREADY_EXIST(67, "session to dest is already there"), - TSDB_CODE_NO_QSUMMARY(68, "query list not there), please show again"), - TSDB_CODE_SERV_OUT_OF_MEMORY(69, "server out of memory"), - TSDB_CODE_INVALID_QHANDLE(70, "invalid query handle"), - TSDB_CODE_RELATED_TABLES_EXIST(71, "tables related to metric exist"), - TSDB_CODE_MONITOR_DB_FORBEIDDEN(72, "can't drop monitor database or tables"), - TSDB_CODE_VG_COMMITLOG_INIT_FAILED(73, "commit log init failed"), - TSDB_CODE_VG_INIT_FAILED(74, "vgroup init failed"), - TSDB_CODE_DATA_ALREADY_IMPORTED(75, "data is already imported"), - TSDB_CODE_OPS_NOT_SUPPORT(76, "not supported operation"), - TSDB_CODE_INVALID_QUERY_ID(77, "invalid query id string"), - TSDB_CODE_INVALID_STREAM_ID(78, "invalid stream id string"), - TSDB_CODE_INVALID_CONNECTION(79, "invalid connection string"), - TSDB_CODE_ACTION_NOT_BALANCED(80, "dnode not balanced"), - TSDB_CODE_CLI_OUT_OF_MEMORY(81, "client out of memory"), - TSDB_CODE_DATA_OVERFLOW(82, "data value overflow"), - TSDB_CODE_QUERY_CANCELLED(83, "query cancelled"), - TSDB_CODE_GRANT_POINT_LIMITED(84, "grant points limited"), - TSDB_CODE_GRANT_EXPIRED(85, "grant expired"), - TSDB_CODE_CLI_NO_DISKSPACE(86, "client no disk space"), - TSDB_CODE_FILE_CORRUPTED(87, "DB file corrupted"), - TSDB_CODE_INVALID_CLIENT_VERSION(88, "version of client and server not match"); - - private long errCode; - private String errMessage; - private static Map errorCodeMap = new HashMap<>(86); - static { - errorCodeMap.put(0, "success"); - errorCodeMap.put(1, "in progress"); - errorCodeMap.put(5, "last session not finished"); - errorCodeMap.put(6, "invalid session ID"); - errorCodeMap.put(7, "invalid tran ID"); - errorCodeMap.put(8, "invalid msg type"); - errorCodeMap.put(9, "alredy processed"); - errorCodeMap.put(10, "authentication failure"); - errorCodeMap.put(11, "wrong msg size"); - errorCodeMap.put(12, "unexpected response"); - errorCodeMap.put(13, "invalid response type"); - errorCodeMap.put(14, "no resource"); - errorCodeMap.put(15, "invalid time stamp"); - errorCodeMap.put(16, "mismatched meter ID"); - errorCodeMap.put(17, "transcation not finished"); - errorCodeMap.put(18, "not online"); - errorCodeMap.put(19, "send failed"); - errorCodeMap.put(20, "not active session"); - errorCodeMap.put(21, "insert failed"); - errorCodeMap.put(22, "App error"); - errorCodeMap.put(23, "invalid IE"); - errorCodeMap.put(24, "invalid value"); - errorCodeMap.put(25, "service not available"); - errorCodeMap.put(26, "already there"); - errorCodeMap.put(27, "invalid meter ID"); - errorCodeMap.put(28, "invalid SQL"); // this message often comes with additional info which will vary based on the specific error situation - errorCodeMap.put(29, "failed to connect to server"); - errorCodeMap.put(30, "invalid msg len"); - errorCodeMap.put(31, "invalid DB"); - errorCodeMap.put(32, "invalid table"); - errorCodeMap.put(33, "DB already there"); - errorCodeMap.put(34, "table already there"); - errorCodeMap.put(35, "invalid user name"); - errorCodeMap.put(36, "invalid acct name"); - errorCodeMap.put(37, "invalid password"); - errorCodeMap.put(38, "DB not selected"); - errorCodeMap.put(39, "memory corrupted"); - errorCodeMap.put(40, "user name exists"); - errorCodeMap.put(41, "not authorized"); - errorCodeMap.put(42, "login disconnected); login again"); - errorCodeMap.put(43, "mgmt master node not available"); - errorCodeMap.put(44, "not configured"); - errorCodeMap.put(45, "invalid option"); - errorCodeMap.put(46, "node offline"); - errorCodeMap.put(47, "sync required"); - errorCodeMap.put(48, "more dnodes are needed"); - errorCodeMap.put(49, "node in unsynced state"); - errorCodeMap.put(50, "too slow"); - errorCodeMap.put(51, "others"); - errorCodeMap.put(52, "can't remove dnode which is master"); - errorCodeMap.put(53, "wrong schema"); - errorCodeMap.put(54, "no results"); - errorCodeMap.put(55, "num of users execeed maxUsers"); - errorCodeMap.put(56, "num of databases execeed maxDbs"); - errorCodeMap.put(57, "num of tables execeed maxTables"); - errorCodeMap.put(58, "num of dnodes execeed maxDnodes"); - errorCodeMap.put(59, "num of accounts execeed maxAccts"); - errorCodeMap.put(60, "accout name exists"); - errorCodeMap.put(61, "dnode ip exists"); - errorCodeMap.put(62, "sdb error"); - errorCodeMap.put(63, "metric meta expired"); // local cached metric-meta expired causes error in metric query - errorCodeMap.put(64, "not ready"); // peer is not ready to process data - errorCodeMap.put(65, "too many sessions on server"); // too many sessions - errorCodeMap.put(66, "too many sessions from app"); // too many connections - errorCodeMap.put(67, "session to dest is already there"); - errorCodeMap.put(68, "query list not there); please show again"); - errorCodeMap.put(69, "server out of memory"); - errorCodeMap.put(70, "invalid query handle"); - errorCodeMap.put(71, "tables related to metric exist"); - errorCodeMap.put(72, "can't drop monitor database or tables"); - errorCodeMap.put(73, "commit log init failed"); - errorCodeMap.put(74, "vgroup init failed"); - errorCodeMap.put(75, "data is already imported"); - errorCodeMap.put(76, "not supported operation"); - errorCodeMap.put(77, "invalid query id string"); - errorCodeMap.put(78, "invalid stream id string"); - errorCodeMap.put(79, "invalid connection string"); - errorCodeMap.put(80, "dnode not balanced"); - errorCodeMap.put(81, "client out of memory"); - errorCodeMap.put(82, "data value overflow"); - errorCodeMap.put(83, "query cancelled"); - errorCodeMap.put(84, "grant points limited"); - errorCodeMap.put(85, "grant expired"); - errorCodeMap.put(86, "client no disk space"); - errorCodeMap.put(87, "DB file corrupted"); - errorCodeMap.put(88, "version of client and server not match"); - } - - TSDBError(long code, String message) { - this.errCode = code; - this.errMessage = message; - } - - public long getErrCode() { - return this.errCode; - } - - public String getErrMessage() { - return this.errMessage; - } - - public static String getErrMessageByCode(long errCode) { - return errorCodeMap.get(errCode); - } - -} 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 dbe1e41e6b..c3756aff34 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 @@ -79,6 +79,7 @@ public class TSDBStatement implements Statement { throw new SQLException("The executed SQL is not a DML or a DDL"); } else { int num = this.connecter.getAffectedRows(res); + this.connecter.freeResultSet(res); return num; } } diff --git a/src/connector/jdbc/src/test/java/TestPreparedStatement.java b/src/connector/jdbc/src/test/java/TestPreparedStatement.java index 3b84645b5b..9d7f1cf760 100644 --- a/src/connector/jdbc/src/test/java/TestPreparedStatement.java +++ b/src/connector/jdbc/src/test/java/TestPreparedStatement.java @@ -21,9 +21,12 @@ public class TestPreparedStatement { System.out.printf("%d: %s\n", i, resSet.getString(i)); } } + resSet.close(); + connection.close(); } catch (Exception e) { e.printStackTrace(); + } } } From 75686a8ef027b05d8b07f38030df3fd17e19a5a2 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Tue, 9 Jun 2020 12:03:59 +0800 Subject: [PATCH 02/11] fix: affectRows --- src/client/src/TSDBJNIConnector.c | 2 +- src/connector/jdbc/pom.xml | 14 +++ .../com/taosdata/jdbc/TSDBJNIConnector.java | 13 +-- .../taosdata/jdbc/TSDBAsyncSubscribeTest.java | 96 +++++++++++++++++++ .../com/taosdata/jdbc/TSDBImportTest.java | 77 +++++++++++++++ .../com/taosdata/jdbc/TSDBSubscribeTest.java | 90 +++++++++++++++++ 6 files changed, 282 insertions(+), 10 deletions(-) create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java diff --git a/src/client/src/TSDBJNIConnector.c b/src/client/src/TSDBJNIConnector.c index cec4737226..de39e62420 100644 --- a/src/client/src/TSDBJNIConnector.c +++ b/src/client/src/TSDBJNIConnector.c @@ -344,7 +344,7 @@ JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getResultSetImp( STscObj *pObj = pSql->pTscObj; if (tscIsUpdateQuery(pSql)) { - taos_free_result(pSql); // free result here + // taos_free_result(pSql); // free result here jniTrace("jobj:%p, conn:%p, no resultset, %p", jobj, pObj, (void *)tres); return 0; } else { diff --git a/src/connector/jdbc/pom.xml b/src/connector/jdbc/pom.xml index 36f1a1010c..0f441d097e 100755 --- a/src/connector/jdbc/pom.xml +++ b/src/connector/jdbc/pom.xml @@ -62,6 +62,12 @@ commons-lang3 ${commons-lang3.version} + + junit + junit + 4.8.2 + test + @@ -98,6 +104,14 @@ true + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java index 8bb7084604..46158210b1 100755 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java @@ -51,8 +51,6 @@ public class TSDBJNIConnector { /** * Returns the status of last result set in current connection - * - * @return */ public boolean isResultsetClosed() { return this.isResultsetClosed; @@ -112,7 +110,7 @@ public class TSDBJNIConnector { * * @throws SQLException */ - public int executeQuery(String sql) throws SQLException { + public long executeQuery(String sql) throws SQLException { if (!this.isResultsetClosed) { freeResultSet(taosResultSetPointer); } @@ -127,7 +125,6 @@ public class TSDBJNIConnector { } int code = this.getErrCode(pSql); - affectedRows = code; if (code < 0) { affectedRows = -1; if (code == TSDBConstants.JNI_TDENGINE_ERROR) { @@ -146,7 +143,7 @@ public class TSDBJNIConnector { if (taosResultSetPointer != TSDBConstants.JNI_NULL_POINTER) { isResultsetClosed = false; } - return code; + return pSql; } private native long executeQueryImp(byte[] sqlBytes, long connection); @@ -199,8 +196,6 @@ public class TSDBJNIConnector { /** * Close the open result set which is associated to the current connection. If the result set is already * closed, return 0 for success. - * - * @return */ public int freeResultSet() { int resCode = TSDBConstants.JNI_SUCCESS; @@ -217,7 +212,7 @@ public class TSDBJNIConnector { /** * Get affected rows count */ - public int getAffectedRows(Long pSql) { + public int getAffectedRows(long pSql) { int affectedRows = this.affectedRows; if (affectedRows < 0) { affectedRows = this.getAffectedRowsImp(this.taos, pSql); @@ -225,7 +220,7 @@ public class TSDBJNIConnector { return affectedRows; } - private native int getAffectedRowsImp(long connection, Long pSql); + private native int getAffectedRowsImp(long connection, long pSql); /** * Get schema metadata diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java new file mode 100644 index 0000000000..530b47d277 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java @@ -0,0 +1,96 @@ +package com.taosdata.jdbc; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import static org.junit.Assert.assertTrue; + +public class TSDBAsyncSubscribeTest { + Connection connection = null; + Statement statement = null; + String dbName = "test"; + String tName = "t0"; + String host = "localhost"; + String topic = "test"; + long subscribId = 0; + +// @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_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , 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 < 5; i++) { + ts += i; + statement.executeUpdate("insert into \" + dbName + \".\" + tName + \" values (" + ts + ", " + (100 + i) + ", " + i + ")"); + } + } + +// @Test + public void subscribe() throws Exception { + TSDBSubscribe subscribe = null; + try { + String rawSql = "select * from " + dbName + "." + tName + ";"; + System.out.println(rawSql); + subscribe = ((TSDBConnection) connection).createSubscribe(); + subscribId = subscribe.subscribe(topic, rawSql, false, 1000, new CallBack("first")); + + assertTrue(subscribId > 0); + } catch (Exception e) { + e.printStackTrace(); + } + + Thread.sleep(2000); + subscribe.unsubscribe(subscribId, true); + } + + private static class CallBack implements TSDBSubscribeCallBack { + private String name = ""; + + public CallBack(String name) { + this.name = name; + } + + @Override + public void invoke(TSDBResultSet resultSet) { + System.out.println("resultSet"); + try { + while (null != resultSet && resultSet.next()) { + System.out.print("callback_" + name + ": "); + for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) { + System.out.printf(i + ": " + resultSet.getString(i) + "\t"); + } + System.out.println(); + } + resultSet.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +// @After + public void close() throws Exception { + statement.executeQuery("drop database test"); + statement.close(); + connection.close(); + } +} \ No newline at end of file diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java new file mode 100644 index 0000000000..1fd15b2dfd --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java @@ -0,0 +1,77 @@ +package com.taosdata.jdbc; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +public class TSDBImportTest { + Connection connection = null; + Statement statement = null; + String dbName = "test"; + String tName = "t0"; + String host = "localhost"; + + @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_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , 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, k int, v int)"); + + } + + @Test + public void insertInto() throws Exception { + long ts = System.currentTimeMillis(); + + for (int i = 0; i < 50; i++) { + ts += i; + int row = statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")"); + System.out.println("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")" + "\t" + row); + assertEquals(1, row); + } + } + + @Test + public void importInto() throws Exception { + // 避免时间重复 + long ts = System.currentTimeMillis() + 1000; + + StringBuilder sqlBuilder = new StringBuilder("insert into ").append(dbName).append(".").append(tName).append(" values "); + + for (int i = 0; i < 50; i++) { + int a = i / 5; + long t = ts + a; + sqlBuilder.append("(").append(t).append(",").append((100 + i)).append(",").append(i).append(") "); + } + System.out.println(sqlBuilder.toString()); + int rows = statement.executeUpdate(sqlBuilder.toString()); + System.out.println(rows); + assertEquals(10, rows); + } + + @After + public void close() throws Exception { + statement.executeQuery("drop database " + dbName); + statement.close(); + connection.close(); + } +} diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java new file mode 100644 index 0000000000..b7c6313587 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java @@ -0,0 +1,90 @@ +package com.taosdata.jdbc; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import static org.junit.Assert.assertTrue; + +public class TSDBSubscribeTest { + Connection connection = null; + Statement statement = null; + String dbName = "test"; + String tName = "t0"; + String host = "localhost"; + String topic = "test"; + +// @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_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , 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 < 5; i++) { + ts += i; + statement.executeUpdate("insert into \" + dbName + \".\" + tName + \" values (" + ts + ", " + (100 + i) + ", " + i + ")"); + } + } + +// @Test + public void subscribe() throws Exception { + TSDBSubscribe subscribe = null; + long subscribId = 0; + try { + + String rawSql = "select * from " + dbName + "." + tName + ";"; + System.out.println(rawSql); + subscribe = ((TSDBConnection) connection).createSubscribe(); + subscribId = subscribe.subscribe(topic, rawSql, false, 1000); + + assertTrue(subscribId > 0); + + int a = 0; + while (true) { + Thread.sleep(900); + TSDBResultSet resSet = subscribe.consume(subscribId); + + while (resSet.next()) { + for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) { + System.out.printf(i + ": " + resSet.getString(i) + "\t"); + } + System.out.println("\n======" + a + "=========="); + } + resSet.close(); + a++; + if (a >= 3) { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != subscribe && 0 != subscribId) { + subscribe.unsubscribe(subscribId, true); + } + } + } + +// @After + public void close() throws Exception { + statement.executeQuery("drop database " + dbName); + statement.close(); + connection.close(); + } +} \ No newline at end of file From 2bb969a9fb0b96c2f26967068e705053e106b273 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Tue, 9 Jun 2020 18:08:31 +0800 Subject: [PATCH 03/11] tests:add import --- .../java/com/taosdata/jdbc/TSDBStatement.java | 6 +++- .../taosdata/jdbc/TSDBAsyncSubscribeTest.java | 7 ++--- .../com/taosdata/jdbc/TSDBImportTest.java | 30 ++++++++++++------- .../com/taosdata/jdbc/TSDBSubscribeTest.java | 6 ++-- 4 files changed, 31 insertions(+), 18 deletions(-) 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 c3756aff34..c856c03a83 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 @@ -51,13 +51,17 @@ public class TSDBStatement implements Statement { if (isClosed) { throw new SQLException("Invalid method call on a closed statement."); } - this.connecter.executeQuery(sql); + System.out.println(sql); + long res = this.connecter.executeQuery(sql); long resultSetPointer = this.connecter.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { + this.connecter.freeResultSet(res); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } else if (resultSetPointer == TSDBConstants.JNI_NULL_POINTER) { +// create/insert/update/del/alter + this.connecter.freeResultSet(res); return null; } else { return new TSDBResultSet(this.connecter, resultSetPointer); diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java index 530b47d277..245ababae1 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java @@ -21,7 +21,7 @@ public class TSDBAsyncSubscribeTest { String topic = "test"; long subscribId = 0; -// @Before + @Before public void createDatabase() throws SQLException { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); @@ -43,7 +43,7 @@ public class TSDBAsyncSubscribeTest { } } -// @Test + @Test public void subscribe() throws Exception { TSDBSubscribe subscribe = null; try { @@ -70,7 +70,6 @@ public class TSDBAsyncSubscribeTest { @Override public void invoke(TSDBResultSet resultSet) { - System.out.println("resultSet"); try { while (null != resultSet && resultSet.next()) { System.out.print("callback_" + name + ": "); @@ -87,7 +86,7 @@ public class TSDBAsyncSubscribeTest { } } -// @After + @After public void close() throws Exception { statement.executeQuery("drop database test"); statement.close(); diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java index 1fd15b2dfd..8b3c9f3141 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java @@ -4,10 +4,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; +import java.sql.*; import java.util.Properties; import static org.junit.Assert.assertEquals; @@ -40,20 +37,33 @@ public class TSDBImportTest { @Test public void insertInto() throws Exception { - long ts = System.currentTimeMillis(); + long ts = 1496732686000l; for (int i = 0; i < 50; i++) { - ts += i; + ts ++; int row = statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")"); - System.out.println("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")" + "\t" + row); + System.out.println("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")\t" + row); assertEquals(1, row); } } + @Test + public void selectData() throws Exception { + String sql = "select * from test.t0"; + ResultSet resSet = statement.executeQuery(sql); + + while (resSet.next()) { + for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) { + System.out.printf(i + ": " + resSet.getString(i) + "\t"); + } + } + resSet.close(); + } + @Test public void importInto() throws Exception { // 避免时间重复 - long ts = System.currentTimeMillis() + 1000; + long ts = 1496732686000l; StringBuilder sqlBuilder = new StringBuilder("insert into ").append(dbName).append(".").append(tName).append(" values "); @@ -68,9 +78,9 @@ public class TSDBImportTest { assertEquals(10, rows); } - @After +// @After public void close() throws Exception { - statement.executeQuery("drop database " + dbName); + statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); } diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java index b7c6313587..11698ea299 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java @@ -20,7 +20,7 @@ public class TSDBSubscribeTest { String host = "localhost"; String topic = "test"; -// @Before + @Before public void createDatabase() throws SQLException { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); @@ -42,7 +42,7 @@ public class TSDBSubscribeTest { } } -// @Test + @Test public void subscribe() throws Exception { TSDBSubscribe subscribe = null; long subscribId = 0; @@ -81,7 +81,7 @@ public class TSDBSubscribeTest { } } -// @After + @After public void close() throws Exception { statement.executeQuery("drop database " + dbName); statement.close(); From f732250271b28aaf785f7a54b184031e44e1ef18 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Tue, 9 Jun 2020 22:41:13 +0800 Subject: [PATCH 04/11] tests: add test --- src/connector/jdbc/pom.xml | 251 ++++++++++-------- .../src/test/java/TestPreparedStatement.java | 1 + ...cribeTest.java => AsyncSubscribeTest.java} | 2 +- .../{TSDBImportTest.java => ImportTest.java} | 9 +- .../java/com/taosdata/jdbc/SelectTest.java | 65 +++++ .../java/com/taosdata/jdbc/StableTest.java | 4 + ...BSubscribeTest.java => SubscribeTest.java} | 2 +- 7 files changed, 211 insertions(+), 123 deletions(-) rename src/connector/jdbc/src/test/java/com/taosdata/jdbc/{TSDBAsyncSubscribeTest.java => AsyncSubscribeTest.java} (98%) rename src/connector/jdbc/src/test/java/com/taosdata/jdbc/{TSDBImportTest.java => ImportTest.java} (94%) create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/StableTest.java rename src/connector/jdbc/src/test/java/com/taosdata/jdbc/{TSDBSubscribeTest.java => SubscribeTest.java} (98%) diff --git a/src/connector/jdbc/pom.xml b/src/connector/jdbc/pom.xml index 0f441d097e..456c9e6423 100755 --- a/src/connector/jdbc/pom.xml +++ b/src/connector/jdbc/pom.xml @@ -1,119 +1,136 @@ - 4.0.0 - - com.taosdata.jdbc - taos-jdbcdriver - 1.0.3 - jar - - JDBCDriver - https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc - TDengine JDBC Driver - - - - GNU AFFERO GENERAL PUBLIC LICENSE Version 3 - https://github.com/taosdata/TDengine/blob/master/LICENSE - repo - - - - - scm:git:git://github.com/taosdata/TDengine.git - scm:git:git@github.com:taosdata/TDengine.git - https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc - HEAD - - - - - taosdata - support@taosdata.com - https://www.taosdata.com/ - https://www.taosdata.com/ - - - - - UTF-8 - 1.8 - - 3.6.0 - - 1.1.2 - 3.5 - - - - - commons-logging - commons-logging - ${commons-logging.version} - - - * - * - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - junit - junit - 4.8.2 - test - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.0.0 - - - - src/main/assembly/assembly-jar.xml - - - - - make-assembly - package - - single - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - UTF-8 - ${java.version} - ${java.version} - true - true - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.12.4 - - true - - - - - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.taosdata.jdbc + taos-jdbcdriver + 1.0.3 + jar + JDBCDriver + https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc + TDengine JDBC Driver + + + GNU AFFERO GENERAL PUBLIC LICENSE Version 3 + https://github.com/taosdata/TDengine/blob/master/LICENSE + repo + + + + scm:git:git://github.com/taosdata/TDengine.git + scm:git:git@github.com:taosdata/TDengine.git + https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc + HEAD + + + + taosdata + support@taosdata.com + https://www.taosdata.com/ + https://www.taosdata.com/ + + + + UTF-8 + 1.8 + 3.6.0 + 1.1.2 + 3.5 + + + + commons-logging + commons-logging + ${commons-logging.version} + + + * + * + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + junit + junit + 4.8.2 + test + + + org.jacoco + jacoco-maven-plugin + 0.8.3 + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.0.0 + + + src/main/assembly/assembly-jar.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + UTF-8 + ${java.version} + ${java.version} + true + true + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + org.jacoco + jacoco-maven-plugin + 0.8.3 + + + com/**/* + + + + + pre-test + + prepare-agent + + + + post-test + test + + report + + + + + + diff --git a/src/connector/jdbc/src/test/java/TestPreparedStatement.java b/src/connector/jdbc/src/test/java/TestPreparedStatement.java index 9d7f1cf760..aabc34549b 100644 --- a/src/connector/jdbc/src/test/java/TestPreparedStatement.java +++ b/src/connector/jdbc/src/test/java/TestPreparedStatement.java @@ -22,6 +22,7 @@ public class TestPreparedStatement { } } resSet.close(); + pstmt.close(); connection.close(); } catch (Exception e) { diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java similarity index 98% rename from src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java rename to src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java index 245ababae1..a7b6848f1e 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBAsyncSubscribeTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java @@ -12,7 +12,7 @@ import java.util.Properties; import static org.junit.Assert.assertTrue; -public class TSDBAsyncSubscribeTest { +public class AsyncSubscribeTest { Connection connection = null; Statement statement = null; String dbName = "test"; diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java similarity index 94% rename from src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java rename to src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java index 8b3c9f3141..063046bc74 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBImportTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java @@ -9,7 +9,7 @@ import java.util.Properties; import static org.junit.Assert.assertEquals; -public class TSDBImportTest { +public class ImportTest { Connection connection = null; Statement statement = null; String dbName = "test"; @@ -36,7 +36,7 @@ public class TSDBImportTest { } @Test - public void insertInto() throws Exception { + public void insertData() throws Exception { long ts = 1496732686000l; for (int i = 0; i < 50; i++) { @@ -49,6 +49,7 @@ public class TSDBImportTest { @Test public void selectData() throws Exception { + insertData(); String sql = "select * from test.t0"; ResultSet resSet = statement.executeQuery(sql); @@ -61,7 +62,7 @@ public class TSDBImportTest { } @Test - public void importInto() throws Exception { + public void importData() throws Exception { // 避免时间重复 long ts = 1496732686000l; @@ -78,7 +79,7 @@ public class TSDBImportTest { assertEquals(10, rows); } -// @After + @After public void close() throws Exception { statement.executeUpdate("drop database " + dbName); statement.close(); diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java new file mode 100644 index 0000000000..4b57131178 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java @@ -0,0 +1,65 @@ +package com.taosdata.jdbc; + +import org.junit.Before; +import org.junit.Test; + +import java.sql.*; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +public class SelectTest { + Connection connection = null; + Statement statement = null; + String dbName = "test"; + String tName = "t0"; + String host = "localhost"; + + @Before + public void createDatabaseAndTable() throws SQLException { + try { + Class.forName("com.taosdata.jdbc.TSDBDriver"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , 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, k int, v int)"); + + } + + @Test + public void selectData() throws SQLException { + long ts = 1496732686000l; + + for (int i = 0; i < 50; i++) { + ts++; + int row = statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")"); + System.out.println("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")\t" + row); + assertEquals(1, row); + } + + String sql = "select * from " + dbName + "." + tName; + ResultSet resSet = statement.executeQuery(sql); + + int num = 0; + while (resSet.next()) { + num++; + } + resSet.close(); + + assertEquals(num, 50); + } + + public void close() throws SQLException { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + } +} 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 new file mode 100644 index 0000000000..cf44a78b97 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StableTest.java @@ -0,0 +1,4 @@ +package com.taosdata.jdbc; + +public class StableTest { +} diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java similarity index 98% rename from src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java rename to src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java index 11698ea299..fd18d85476 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/TSDBSubscribeTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SubscribeTest.java @@ -12,7 +12,7 @@ import java.util.Properties; import static org.junit.Assert.assertTrue; -public class TSDBSubscribeTest { +public class SubscribeTest { Connection connection = null; Statement statement = null; String dbName = "test"; From 029fb0269d4f472ef321b3e279fdbe03d578a5a7 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Thu, 11 Jun 2020 13:48:46 +0800 Subject: [PATCH 05/11] feat: add connectiontest --- .../com/taosdata/jdbc/ConnectionTest.java | 56 +++++++++ .../java/com/taosdata/jdbc/StableTest.java | 107 ++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java new file mode 100644 index 0000000000..ca38765ec5 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java @@ -0,0 +1,56 @@ +package com.taosdata.jdbc; + +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Properties; + +import static org.junit.Assert.assertTrue; + +public class ConnectionTest { + static Connection connection = null; + static Statement statement = null; + static String dbName = "test"; + static String stbName = "st"; + static String host = "localhost"; + + @Test + public static void createConnection() throws SQLException { + try { + Class.forName("com.taosdata.jdbc.TSDBDriver"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , properties); + + assertTrue(null != connection); + } + + @Test + public void createDatabase() { + try { + statement.executeUpdate("create database if not exists " + dbName); + } catch (SQLException e) { + assert false : "create database error: " + e.getMessage(); + } + } + + @Test + public void close() { + try { + if (!statement.isClosed()) { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + } + } catch (SQLException e) { + assert false : "close connection error: " + e.getMessage(); + } + } +} 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 cf44a78b97..b0c5862dec 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 @@ -1,4 +1,111 @@ package com.taosdata.jdbc; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.sql.*; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + public class StableTest { + static Connection connection = null; + static Statement statement = null; + static String dbName = "test"; + static String stbName = "st"; + static String host = "localhost"; + + @BeforeClass + public static void createDatabase() throws SQLException { + try { + Class.forName("com.taosdata.jdbc.TSDBDriver"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , properties); + + statement = connection.createStatement(); + statement.executeUpdate("create database if not exists " + dbName); + statement.executeQuery("use " + dbName); + } + + @Test + public void createStable() { + String sql = "create table " + stbName + " (ts timestamp, v1 int, v2 int) tags (tg nchar(20)) "; + + try { + statement.executeUpdate(sql); + } catch (SQLException e) { + assert false : "error create stable" + e.getMessage(); + } + } + + @Test + public void createTable() { + String sql = "create table t1 using " + stbName + " tags (\"beijing\")"; + + try { + statement.executeUpdate(sql); + } catch (SQLException e) { + assert false : "error create table" + e.getMessage(); + } + } + + @Test + public void describeSTable() { + String sql = "describe " + stbName; + int num = 0; + System.out.println("describe stable"); + try { + ResultSet res = statement.executeQuery(sql); + while (res.next()) { + for (int i = 1; i <= res.getMetaData().getColumnCount(); i++) { + System.out.printf("%d: %s\n", i, res.getString(i)); + } + num++; + } + assertEquals(4, num); + } catch (SQLException e) { + assert false : "error describe stable" + e.getMessage(); + } + } + + @Test + public void describeTable() { + String sql = "describe t1"; + int num = 0; + System.out.println("describe table"); + try { + ResultSet res = statement.executeQuery(sql); + while (res.next()) { + for (int i = 1; i <= res.getMetaData().getColumnCount(); i++) { + System.out.printf("%d: %s\n", i, res.getString(i)); + } + num++; + } + assertEquals(4, num); + } catch (SQLException e) { + assert false : "error describe stable" + e.getMessage(); + } + } + + @Test + public void validCreateSql() { + String sql = "create table t2 using " + stbName + " tags (\"beijing\")"; + boolean valid = ((TSDBConnection)connection).getConnection().validateCreateTableSql(sql); + assertEquals(true, valid); + } + + @AfterClass + public static void close() throws Exception { + if (!statement.isClosed()) { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + } + } } From 35c92cc80ef700485d5dea8a67d494b6195c8617 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Thu, 11 Jun 2020 19:12:39 +0800 Subject: [PATCH 06/11] tests: add test --- .../java/com/taosdata/jdbc/TSDBStatement.java | 22 +-- .../com/taosdata/jdbc/ConnectionTest.java | 24 +-- .../java/com/taosdata/jdbc/ResultSetTest.java | 129 +++++++++++++++ .../java/com/taosdata/jdbc/SelectTest.java | 2 + .../java/com/taosdata/jdbc/StatementTest.java | 155 ++++++++++++++++++ .../java/com/taosdata/jdbc/SubscribeTest.java | 6 +- 6 files changed, 314 insertions(+), 24 deletions(-) create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/ResultSetTest.java create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/StatementTest.java 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 c856c03a83..1cf024f30e 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 @@ -51,17 +51,16 @@ public class TSDBStatement implements Statement { if (isClosed) { throw new SQLException("Invalid method call on a closed statement."); } - System.out.println(sql); - long res = this.connecter.executeQuery(sql); + pSql = this.connecter.executeQuery(sql); long resultSetPointer = this.connecter.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { - this.connecter.freeResultSet(res); + this.connecter.freeResultSet(pSql); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } else if (resultSetPointer == TSDBConstants.JNI_NULL_POINTER) { // create/insert/update/del/alter - this.connecter.freeResultSet(res); + this.connecter.freeResultSet(pSql); return null; } else { return new TSDBResultSet(this.connecter, resultSetPointer); @@ -72,18 +71,18 @@ public class TSDBStatement implements Statement { if (isClosed) { throw new SQLException("Invalid method call on a closed statement."); } - long res = this.connecter.executeQuery(sql); + pSql = this.connecter.executeQuery(sql); long resultSetPointer = this.connecter.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { - this.connecter.freeResultSet(res); + this.connecter.freeResultSet(pSql); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } else if (resultSetPointer != TSDBConstants.JNI_NULL_POINTER) { this.connecter.freeResultSet(); throw new SQLException("The executed SQL is not a DML or a DDL"); } else { - int num = this.connecter.getAffectedRows(res); - this.connecter.freeResultSet(res); + int num = this.connecter.getAffectedRows(pSql); + this.connecter.freeResultSet(pSql); return num; } } @@ -151,16 +150,19 @@ public class TSDBStatement implements Statement { throw new SQLException("Invalid method call on a closed statement."); } boolean res = true; - this.connecter.executeQuery(sql); + pSql = this.connecter.executeQuery(sql); long resultSetPointer = this.connecter.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { + this.connecter.freeResultSet(pSql); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } else if (resultSetPointer == TSDBConstants.JNI_NULL_POINTER) { // no result set is retrieved res = false; } - return res; + this.connecter.freeResultSet(pSql); + + return res; } public ResultSet getResultSet() throws SQLException { diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java index ca38765ec5..a932f28113 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java @@ -18,7 +18,7 @@ public class ConnectionTest { static String host = "localhost"; @Test - public static void createConnection() throws SQLException { + public void testConnection() throws SQLException { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); } catch (ClassNotFoundException e) { @@ -30,23 +30,25 @@ public class ConnectionTest { , properties); assertTrue(null != connection); - } + statement = connection.createStatement(); + assertTrue(null != statement); + + // try reconnect + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , properties); - @Test - public void createDatabase() { try { - statement.executeUpdate("create database if not exists " + dbName); + statement.execute("create database if not exists " + dbName); } catch (SQLException e) { assert false : "create database error: " + e.getMessage(); } - } - @Test - public void close() { try { - if (!statement.isClosed()) { - statement.executeUpdate("drop database " + dbName); - statement.close(); + if (!connection.isClosed()) { + if (!statement.isClosed()) { + statement.executeUpdate("drop database " + dbName); + statement.close(); + } connection.close(); } } catch (SQLException e) { 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 new file mode 100644 index 0000000000..a92d8900d7 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ResultSetTest.java @@ -0,0 +1,129 @@ +package com.taosdata.jdbc; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.sql.*; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; + +public class ResultSetTest { + static Connection connection = null; + static Statement statement = null; + static String dbName = "test"; + static String tName = "t0"; + static String host = "localhost"; + static ResultSet resSet = null; + + @BeforeClass + public static void createDatabaseAndTable() throws SQLException { + try { + Class.forName("com.taosdata.jdbc.TSDBDriver"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , 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; + long ts = 1496732686000l; + int v1 = 2147483600; + long v2 = ts + 1000; + float v3 = 3.1415926f; + double v4 = 3.1415926535897; + String v5 = "涛思数据,强~!"; + short v6 = 12; + boolean v7 = false; + String v8 = "TDengine is powerful"; + + sql = "insert into " + dbName + "." + tName + " values (" + ts + "," + v1 + "," + v2 + "," + v3 + "," + v4 + + ",\"" + v5 + "\"," + v6 + "," + v7 + ",\"" + v8 + "\")"; +// System.out.println(sql); + + try { + statement.executeUpdate(sql); + assertEquals(1, statement.getUpdateCount()); + } catch (SQLException e) { + assert false : "insert error " + e.getMessage(); + } + + try { + statement.executeQuery("select * from " + dbName + "." + tName); + resSet = statement.getResultSet(); + System.out.println(((TSDBResultSet) resSet).getRowData()); + while (resSet.next()) { + assertEquals(ts, resSet.getLong(1)); + assertEquals(ts, resSet.getLong("ts")); + + System.out.println(resSet.getTimestamp(1)); + + assertEquals(v1, resSet.getInt(2)); + assertEquals(v1, resSet.getInt("k1")); + + assertEquals(v2, resSet.getLong(3)); + assertEquals(v2, resSet.getLong("k2")); + + assertEquals(v3, resSet.getFloat(4), 7); + assertEquals(v3, resSet.getFloat("k3"), 7); + + assertEquals(v4, resSet.getDouble(5), 13); + assertEquals(v4, resSet.getDouble("k4"), 13); + + assertEquals(v5, resSet.getString(6)); + assertEquals(v5, resSet.getString("k5")); + + assertEquals(v6, resSet.getShort(7)); + assertEquals(v6, resSet.getShort("k6")); + + assertEquals(v7, resSet.getBoolean(8)); + assertEquals(v7, resSet.getBoolean("k7")); + + assertEquals(v8, resSet.getString(9)); + assertEquals(v8, resSet.getString("k8")); + + resSet.getBytes(9); + resSet.getObject(6); + resSet.getObject("k8"); + } + resSet.close(); + } catch (SQLException e) { + assert false : "insert error " + e.getMessage(); + } + } + + @Test + public void testBatch() throws SQLException { + String[] sqls = new String[]{"insert into test.t0 values (1496732686001,2147483600,1496732687000,3.1415925,3.1415926\n" + + "535897,\"涛思数据,强~!\",12,12,\"TDengine is powerful\")", "insert into test.t0 values (1496732686002,2147483600,1496732687000,3.1415925,3.1415926\n" + + "535897,\"涛思数据,强~!\",12,12,\"TDengine is powerful\")"}; + for (String sql : sqls) { + statement.addBatch(sql); + } + int[] res = statement.executeBatch(); + assertEquals(res.length, 2); + statement.clearBatch(); + } + + @AfterClass + public static void close() throws SQLException { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + } + +} diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java index 4b57131178..077f95318b 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java @@ -1,5 +1,6 @@ package com.taosdata.jdbc; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -57,6 +58,7 @@ public class SelectTest { assertEquals(num, 50); } + @After public void close() throws SQLException { statement.executeUpdate("drop database " + 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 new file mode 100644 index 0000000000..f5e2bcba20 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/StatementTest.java @@ -0,0 +1,155 @@ +package com.taosdata.jdbc; + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.sql.*; +import java.util.Properties; + +import static org.junit.Assert.assertTrue; + +public class StatementTest { + static Connection connection = null; + static Statement statement = null; + 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"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , properties); + + statement = connection.createStatement(); + statement.executeUpdate("drop database if exists " + dbName); + + } + + @Test + public void createTableAndQuery() throws SQLException { + long ts = System.currentTimeMillis(); + + statement.executeUpdate("create database if not exists " + dbName); + statement.executeUpdate("create table if not exists " + dbName + "." + tName + "(ts timestamp, k1 int)"); + statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", 1)"); + statement.executeQuery("select * from " + dbName + "." + tName); + ResultSet resultSet = statement.getResultSet(); + assertTrue(null != resultSet); + } + + @Test + public void testUnsupport() { +// if(null == resSet) { +// return; +// } + 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) { + } + } +} 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 fd18d85476..792ae5f671 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 @@ -20,7 +20,7 @@ public class SubscribeTest { String host = "localhost"; String topic = "test"; - @Before +// @Before public void createDatabase() throws SQLException { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); @@ -42,7 +42,7 @@ public class SubscribeTest { } } - @Test +// @Test public void subscribe() throws Exception { TSDBSubscribe subscribe = null; long subscribId = 0; @@ -81,7 +81,7 @@ public class SubscribeTest { } } - @After +// @After public void close() throws Exception { statement.executeQuery("drop database " + dbName); statement.close(); From 25f54f60ac9d23173887a1723296c31f9c6a9c78 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Fri, 12 Jun 2020 18:55:14 +0800 Subject: [PATCH 07/11] tests --- .../taosdata/jdbc/PreparedStatementTest.java | 161 ++++ .../java/com/taosdata/jdbc/ResultSetTest.java | 697 +++++++++++++++++- .../java/com/taosdata/jdbc/StatementTest.java | 4 + 3 files changed, 860 insertions(+), 2 deletions(-) create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/PreparedStatementTest.java 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 new file mode 100644 index 0000000000..d9aac70bdc --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/PreparedStatementTest.java @@ -0,0 +1,161 @@ +package com.taosdata.jdbc; + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.sql.*; +import java.util.Properties; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class PreparedStatementTest { + static Connection connection = null; + static PreparedStatement statement = null; + 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"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" + , properties); + + String sql = "drop database if exists " + dbName; + statement = (TSDBPreparedStatement) connection.prepareStatement(sql); + + } + + @Test + public void createTableAndQuery() throws SQLException { + long ts = System.currentTimeMillis(); + + statement.executeUpdate("create database if not exists " + dbName); + statement.executeUpdate("create table if not exists " + dbName + "." + tName + "(ts timestamp, k1 int)"); + statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", 1)"); + + PreparedStatement selectStatement = connection.prepareStatement("select * from " + dbName + "." + tName); + + ResultSet resultSet = selectStatement.executeQuery(); + assertTrue(null != resultSet); + + boolean isClosed = statement.isClosed(); + assertEquals(false, isClosed); + } + + @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) { + } + 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) { + } + } +} 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 a92d8900d7..9d5f5451f2 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 @@ -4,10 +4,14 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import javax.sql.rowset.serial.SerialBlob; +import javax.sql.rowset.serial.SerialClob; import java.sql.*; +import java.util.HashMap; import java.util.Properties; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class ResultSetTest { static Connection connection = null; @@ -53,7 +57,6 @@ public class ResultSetTest { sql = "insert into " + dbName + "." + tName + " values (" + ts + "," + v1 + "," + v2 + "," + v3 + "," + v4 + ",\"" + v5 + "\"," + v6 + "," + v7 + ",\"" + v8 + "\")"; -// System.out.println(sql); try { statement.executeUpdate(sql); @@ -100,12 +103,702 @@ public class ResultSetTest { resSet.getObject(6); resSet.getObject("k8"); } - resSet.close(); + if (!resSet.isClosed()) { + resSet.close(); + } } catch (SQLException e) { assert false : "insert error " + e.getMessage(); } } + @Test + 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!")); + } + try { + resSet.getAsciiStream(0); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getUnicodeStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getBinaryStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getAsciiStream(""); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getUnicodeStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getBinaryStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getWarnings(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.clearWarnings(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getCursorName(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getCharacterStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getCharacterStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.isBeforeFirst(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.isAfterLast(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.isFirst(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.isLast(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.beforeFirst(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.afterLast(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.first(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.last(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.absolute(1); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.relative(1); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.previous(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.setFetchDirection(0); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getFetchDirection(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.setFetchSize(0); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getFetchSize(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getConcurrency(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.rowUpdated(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.rowInserted(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.rowDeleted(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNull(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBoolean(0, true); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateByte(0, (byte) 2); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateShort(0, (short) 1); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateInt(0, 0); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateLong(0, 0l); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateFloat(0, 3.14f); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateDouble(0, 3.1415); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBigDecimal(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateString(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBytes(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateDate(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateTime(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateTimestamp(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateAsciiStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBinaryStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateObject(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateObject(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNull(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBoolean("", false); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateByte("", (byte) 1); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateShort("", (short) 1); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateInt("", 0); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateLong("", 0l); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateFloat("", 3.14f); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateDouble("", 3.1415); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBigDecimal(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateString(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBytes(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateDate(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateTime(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateTimestamp(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateAsciiStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBinaryStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateObject(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateObject(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.insertRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.deleteRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.refreshRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.cancelRowUpdates(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.moveToInsertRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.moveToCurrentRow(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getStatement(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getObject(0, new HashMap<>()); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getRef(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getBlob(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getClob(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getArray(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getObject("", new HashMap<>()); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getRef(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getBlob(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getClob(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getArray(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getDate(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getDate(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getTime(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getTime(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getTimestamp(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getTimestamp(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getURL(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getURL(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateRef(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateRef(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBlob(0, new SerialBlob("".getBytes("UTF8"))); + } catch (Exception e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBlob("", new SerialBlob("".getBytes("UTF8"))); + } catch (Exception e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateClob("", new SerialClob("".toCharArray())); + } catch (Exception e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateClob(0, new SerialClob("".toCharArray())); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateArray(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateArray(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getRowId(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getRowId(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateRowId(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateRowId(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getHoldability(); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNString(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNString(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + + try { + resSet.getNClob(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getNClob(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getSQLXML(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getSQLXML(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateSQLXML(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateSQLXML(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getNCharacterStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.getNCharacterStream(null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateAsciiStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBinaryStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateAsciiStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBinaryStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + + try { + resSet.updateNCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateNCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateAsciiStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBinaryStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateAsciiStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateBinaryStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + try { + resSet.updateCharacterStream(null, null); + } catch (SQLException e) { + assertTrue(e.getMessage().contains("this operation is NOT supported currently!")); + } + } + @Test public void testBatch() throws SQLException { String[] sqls = new String[]{"insert into test.t0 values (1496732686001,2147483600,1496732687000,3.1415925,3.1415926\n" + 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 f5e2bcba20..5141e87405 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 @@ -6,6 +6,7 @@ import org.junit.Test; import java.sql.*; import java.util.Properties; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class StatementTest { @@ -43,6 +44,9 @@ public class StatementTest { statement.executeQuery("select * from " + dbName + "." + tName); ResultSet resultSet = statement.getResultSet(); assertTrue(null != resultSet); + + boolean isClosed = statement.isClosed(); + assertEquals(false, isClosed); } @Test From 1ff6e7c7dd955c8e90d583eaee85a821019c1bc4 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Mon, 15 Jun 2020 11:13:17 +0800 Subject: [PATCH 08/11] update --- .../org.eclipse.core.resources.prefs | 5 - .../jdbc/.settings/org.eclipse.jdt.core.prefs | 13 - .../jdbc/.settings/org.eclipse.m2e.core.prefs | 4 - .../taosdata/jdbc/DatabaseMetaDataTest.java | 231 ++++++++++++++++++ .../taosdata/jdbc/PreparedStatementTest.java | 47 +++- 5 files changed, 271 insertions(+), 29 deletions(-) delete mode 100755 src/connector/jdbc/.settings/org.eclipse.core.resources.prefs delete mode 100755 src/connector/jdbc/.settings/org.eclipse.jdt.core.prefs delete mode 100755 src/connector/jdbc/.settings/org.eclipse.m2e.core.prefs create mode 100644 src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java diff --git a/src/connector/jdbc/.settings/org.eclipse.core.resources.prefs b/src/connector/jdbc/.settings/org.eclipse.core.resources.prefs deleted file mode 100755 index 1935ba2ee4..0000000000 --- a/src/connector/jdbc/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=GBK -encoding//src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java=UTF-8 -encoding//src/main/resources=UTF-8 -encoding/=UTF-8 diff --git a/src/connector/jdbc/.settings/org.eclipse.jdt.core.prefs b/src/connector/jdbc/.settings/org.eclipse.jdt.core.prefs deleted file mode 100755 index 5ce4518899..0000000000 --- a/src/connector/jdbc/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/src/connector/jdbc/.settings/org.eclipse.m2e.core.prefs b/src/connector/jdbc/.settings/org.eclipse.m2e.core.prefs deleted file mode 100755 index f897a7f1cb..0000000000 --- a/src/connector/jdbc/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java new file mode 100644 index 0000000000..2154079e23 --- /dev/null +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java @@ -0,0 +1,231 @@ +package com.taosdata.jdbc; + +import org.junit.BeforeClass; +import org.junit.Test; + +import java.sql.*; +import java.util.Properties; + +public class DatabaseMetaDataTest { + static Connection connection = null; + static PreparedStatement statement = null; + static String dbName = "test"; + static String tName = "t0"; + static String host = "localhost"; + + @BeforeClass + public static void createConnection() throws SQLException { + try { + Class.forName("com.taosdata.jdbc.TSDBDriver"); + } catch (ClassNotFoundException e) { + return; + } + Properties properties = new Properties(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata", + properties); + + String sql = "drop database if exists " + dbName; + statement = (TSDBPreparedStatement) connection.prepareStatement(sql); + statement.executeUpdate("create database if not exists " + dbName); + statement.executeUpdate("create table if not exists " + dbName + "." + tName + " (ts timestamp, k int, v int)"); + } + + @Test + public void testMetaDataTest() throws SQLException { + + DatabaseMetaData databaseMetaData = connection.getMetaData(); + ResultSet resultSet = databaseMetaData.getTables(dbName, "t*", "t*", new String[]{"t"}); + while (resultSet.next()) { + for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) { + System.out.printf("%d: %s\n", i, resultSet.getString(i)); + } + } + databaseMetaData.isWrapperFor(null); + databaseMetaData.allProceduresAreCallable(); + databaseMetaData.allTablesAreSelectable(); + databaseMetaData.getURL(); + databaseMetaData.getUserName(); + databaseMetaData.isReadOnly(); + databaseMetaData.nullsAreSortedHigh(); + databaseMetaData.nullsAreSortedLow(); + databaseMetaData.nullsAreSortedAtStart(); + databaseMetaData.nullsAreSortedAtEnd(); + databaseMetaData.getDatabaseProductName(); + databaseMetaData.getDatabaseProductVersion(); + databaseMetaData.getDriverName(); + databaseMetaData.getDriverVersion(); + databaseMetaData.getDriverMajorVersion(); + databaseMetaData.getDriverMinorVersion(); + databaseMetaData.usesLocalFiles(); + databaseMetaData.usesLocalFilePerTable(); + databaseMetaData.supportsMixedCaseIdentifiers(); + databaseMetaData.storesUpperCaseIdentifiers(); + databaseMetaData.storesLowerCaseIdentifiers(); + databaseMetaData.storesMixedCaseIdentifiers(); + databaseMetaData.supportsMixedCaseQuotedIdentifiers(); + databaseMetaData.storesUpperCaseQuotedIdentifiers(); + databaseMetaData.storesLowerCaseQuotedIdentifiers(); + databaseMetaData.storesMixedCaseQuotedIdentifiers(); + databaseMetaData.getIdentifierQuoteString(); + databaseMetaData.getSQLKeywords(); + databaseMetaData.getNumericFunctions(); + databaseMetaData.getStringFunctions(); + databaseMetaData.getSystemFunctions(); + databaseMetaData.getTimeDateFunctions(); + databaseMetaData.getSearchStringEscape(); + databaseMetaData.getExtraNameCharacters(); + databaseMetaData.supportsAlterTableWithAddColumn(); + databaseMetaData.supportsAlterTableWithDropColumn(); + databaseMetaData.supportsColumnAliasing(); + databaseMetaData.nullPlusNonNullIsNull(); + databaseMetaData.supportsConvert(); + databaseMetaData.supportsConvert(0, 0); + databaseMetaData.supportsTableCorrelationNames(); + databaseMetaData.supportsDifferentTableCorrelationNames(); + databaseMetaData.supportsExpressionsInOrderBy(); + databaseMetaData.supportsOrderByUnrelated(); + databaseMetaData.supportsGroupBy(); + databaseMetaData.supportsGroupByUnrelated(); + databaseMetaData.supportsGroupByBeyondSelect(); + databaseMetaData.supportsLikeEscapeClause(); + databaseMetaData.supportsMultipleResultSets(); + databaseMetaData.supportsMultipleTransactions(); + databaseMetaData.supportsNonNullableColumns(); + databaseMetaData.supportsMinimumSQLGrammar(); + databaseMetaData.supportsCoreSQLGrammar(); + databaseMetaData.supportsExtendedSQLGrammar(); + databaseMetaData.supportsANSI92EntryLevelSQL(); + databaseMetaData.supportsANSI92IntermediateSQL(); + databaseMetaData.supportsANSI92FullSQL(); + databaseMetaData.supportsIntegrityEnhancementFacility(); + databaseMetaData.supportsOuterJoins(); + databaseMetaData.supportsFullOuterJoins(); + databaseMetaData.supportsLimitedOuterJoins(); + databaseMetaData.getSchemaTerm(); + databaseMetaData.getProcedureTerm(); + databaseMetaData.getCatalogTerm(); + databaseMetaData.isCatalogAtStart(); + databaseMetaData.getCatalogSeparator(); + databaseMetaData.supportsSchemasInDataManipulation(); + databaseMetaData.supportsSchemasInProcedureCalls(); + databaseMetaData.supportsSchemasInTableDefinitions(); + databaseMetaData.supportsSchemasInIndexDefinitions(); + databaseMetaData.supportsSchemasInPrivilegeDefinitions(); + databaseMetaData.supportsCatalogsInDataManipulation(); + databaseMetaData.supportsCatalogsInProcedureCalls(); + databaseMetaData.supportsCatalogsInTableDefinitions(); + databaseMetaData.supportsCatalogsInIndexDefinitions(); + databaseMetaData.supportsCatalogsInPrivilegeDefinitions(); + databaseMetaData.supportsPositionedDelete(); + databaseMetaData.supportsPositionedUpdate(); + databaseMetaData.supportsSelectForUpdate(); + databaseMetaData.supportsStoredProcedures(); + databaseMetaData.supportsSubqueriesInComparisons(); + databaseMetaData.supportsSubqueriesInExists(); + databaseMetaData.supportsSubqueriesInIns(); + databaseMetaData.supportsSubqueriesInQuantifieds(); + databaseMetaData.supportsCorrelatedSubqueries(); + databaseMetaData.supportsUnion(); + databaseMetaData.supportsUnionAll(); + databaseMetaData.supportsOpenCursorsAcrossCommit(); + databaseMetaData.supportsOpenCursorsAcrossRollback(); + databaseMetaData.supportsOpenStatementsAcrossCommit(); + databaseMetaData.supportsOpenStatementsAcrossRollback(); + databaseMetaData.getMaxBinaryLiteralLength(); + databaseMetaData.getMaxCharLiteralLength(); + databaseMetaData.getMaxColumnNameLength(); + databaseMetaData.getMaxColumnsInGroupBy(); + databaseMetaData.getMaxColumnsInIndex(); + databaseMetaData.getMaxColumnsInOrderBy(); + databaseMetaData.getMaxColumnsInSelect(); + databaseMetaData.getMaxColumnsInTable(); + databaseMetaData.getMaxConnections(); + databaseMetaData.getMaxCursorNameLength(); + databaseMetaData.getMaxIndexLength(); + databaseMetaData.getMaxSchemaNameLength(); + databaseMetaData.getMaxProcedureNameLength(); + databaseMetaData.getMaxCatalogNameLength(); + databaseMetaData.getMaxRowSize(); + databaseMetaData.doesMaxRowSizeIncludeBlobs(); + databaseMetaData.getMaxStatementLength(); + databaseMetaData.getMaxStatements(); + databaseMetaData.getMaxTableNameLength(); + databaseMetaData.getMaxTablesInSelect(); + databaseMetaData.getMaxUserNameLength(); + databaseMetaData.getDefaultTransactionIsolation(); + databaseMetaData.supportsTransactions(); + databaseMetaData.supportsTransactionIsolationLevel(0); + databaseMetaData.supportsDataDefinitionAndDataManipulationTransactions(); + databaseMetaData.supportsDataManipulationTransactionsOnly(); + databaseMetaData.dataDefinitionCausesTransactionCommit(); + databaseMetaData.dataDefinitionIgnoredInTransactions(); + try { + databaseMetaData.getProcedures("", "", ""); + } catch (Exception e) { + } + try { + databaseMetaData.getProcedureColumns("", "", "", ""); + } catch (Exception e) { + } + try { + databaseMetaData.getTables("", "", "", new String[]{""}); + } catch (Exception e) { + } + databaseMetaData.getSchemas(); + databaseMetaData.getCatalogs(); +// databaseMetaData.getTableTypes(); + + databaseMetaData.getColumns("", "", "", ""); + databaseMetaData.getColumnPrivileges("", "", "", ""); + databaseMetaData.getTablePrivileges("", "", ""); + databaseMetaData.getBestRowIdentifier("", "", "", 0, false); + databaseMetaData.getVersionColumns("", "", ""); + databaseMetaData.getPrimaryKeys("", "", ""); + databaseMetaData.getImportedKeys("", "", ""); + databaseMetaData.getExportedKeys("", "", ""); + databaseMetaData.getCrossReference("", "", "", "", "", ""); + databaseMetaData.getTypeInfo(); + databaseMetaData.getIndexInfo("", "", "", false, false); + databaseMetaData.supportsResultSetType(0); + databaseMetaData.supportsResultSetConcurrency(0, 0); + databaseMetaData.ownUpdatesAreVisible(0); + databaseMetaData.ownDeletesAreVisible(0); + databaseMetaData.ownInsertsAreVisible(0); + databaseMetaData.othersUpdatesAreVisible(0); + databaseMetaData.othersDeletesAreVisible(0); + databaseMetaData.othersInsertsAreVisible(0); + databaseMetaData.updatesAreDetected(0); + databaseMetaData.deletesAreDetected(0); + databaseMetaData.insertsAreDetected(0); + databaseMetaData.supportsBatchUpdates(); + databaseMetaData.getUDTs("", "", "", new int[]{0}); + databaseMetaData.getConnection(); + databaseMetaData.supportsSavepoints(); + databaseMetaData.supportsNamedParameters(); + databaseMetaData.supportsMultipleOpenResults(); + databaseMetaData.supportsGetGeneratedKeys(); + databaseMetaData.getSuperTypes("", "", ""); + databaseMetaData.getSuperTables("", "", ""); + databaseMetaData.getAttributes("", "", "", ""); + databaseMetaData.supportsResultSetHoldability(0); + databaseMetaData.getResultSetHoldability(); + databaseMetaData.getDatabaseMajorVersion(); + databaseMetaData.getDatabaseMinorVersion(); + databaseMetaData.getJDBCMajorVersion(); + databaseMetaData.getJDBCMinorVersion(); + databaseMetaData.getSQLStateType(); + databaseMetaData.locatorsUpdateCopy(); + databaseMetaData.supportsStatementPooling(); + databaseMetaData.getRowIdLifetime(); + databaseMetaData.getSchemas("", ""); + databaseMetaData.supportsStoredFunctionsUsingCallSyntax(); + databaseMetaData.autoCommitFailureClosesAllResultSets(); + databaseMetaData.getClientInfoProperties(); + databaseMetaData.getFunctions("", "", ""); + databaseMetaData.getFunctionColumns("", "", "", ""); + databaseMetaData.getPseudoColumns("", "", "", ""); + databaseMetaData.generatedKeyAlwaysReturned(); + + } +} 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 d9aac70bdc..dc26f7d9df 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,11 @@ package com.taosdata.jdbc; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.sql.*; +import java.util.ArrayList; import java.util.Properties; import static org.junit.Assert.assertEquals; @@ -26,8 +28,8 @@ public class PreparedStatementTest { } Properties properties = new Properties(); properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); - connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata" - , properties); + connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + "?user=root&password=taosdata", + properties); String sql = "drop database if exists " + dbName; statement = (TSDBPreparedStatement) connection.prepareStatement(sql); @@ -51,11 +53,34 @@ public class PreparedStatementTest { assertEquals(false, isClosed); } + @Test + public void testPreparedStatement() throws SQLException { + long ts = System.currentTimeMillis(); + PreparedStatement saveStatement = connection + .prepareStatement("insert into " + dbName + "." + tName + " values (" + ts + ", 1)"); + + int affectedRows = saveStatement.executeUpdate(); + assertTrue(1 == affectedRows); + } + + @Test + public void testSavedPreparedStatement() throws SQLException { + long ts = System.currentTimeMillis(); + + TSDBPreparedStatement saveStatement = (TSDBPreparedStatement) connection + .prepareStatement("insert into " + dbName + "." + tName + " values (?, ?)"); + + saveStatement.setObject(1, ts + 100); + saveStatement.setObject(2, 3); + int rows = saveStatement.executeUpdate(); + assertEquals(1, rows); + } + @Test public void testUnsupport() { -// if(null == resSet) { -// return; -// } + // if(null == resSet) { + // return; + // } TSDBPreparedStatement tsdbStatement = (TSDBPreparedStatement) statement; try { tsdbStatement.unwrap(null); @@ -130,11 +155,11 @@ public class PreparedStatementTest { } catch (SQLException e) { } try { - tsdbStatement.executeUpdate(null, new int[]{0}); + tsdbStatement.executeUpdate(null, new int[] { 0 }); } catch (SQLException e) { } try { - tsdbStatement.executeUpdate(null, new String[]{"str1", "str2"}); + tsdbStatement.executeUpdate(null, new String[] { "str1", "str2" }); } catch (SQLException e) { } try { @@ -158,4 +183,12 @@ public class PreparedStatementTest { } catch (SQLException e) { } } + + @AfterClass + public static void close() throws SQLException { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + } + } From bfe2a9aac128b6376da3c97f94060fa6b3f04bab Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Mon, 15 Jun 2020 16:57:04 +0800 Subject: [PATCH 09/11] fix: scan3 bug --- .../taosdata/jdbc/TSDBDatabaseMetaData.java | 5 +++-- .../com/taosdata/jdbc/TSDBJNIConnector.java | 2 +- .../java/com/taosdata/jdbc/TSDBSubscribe.java | 3 +-- .../src/test/java/TestAsyncTSDBSubscribe.java | 9 +++++--- .../src/test/java/TestPreparedStatement.java | 11 ++++++---- .../test/java/TestTSDBDatabaseMetaData.java | 22 +++++++++++-------- .../jdbc/src/test/java/TestTSDBSubscribe.java | 3 ++- .../com/taosdata/jdbc/AsyncSubscribeTest.java | 2 +- .../taosdata/jdbc/DatabaseMetaDataTest.java | 9 ++++++++ .../taosdata/jdbc/PreparedStatementTest.java | 4 ++-- .../java/com/taosdata/jdbc/SubscribeTest.java | 10 ++++----- 11 files changed, 50 insertions(+), 30 deletions(-) diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDatabaseMetaData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDatabaseMetaData.java index 6cb3263e56..804e09c6b3 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDatabaseMetaData.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDatabaseMetaData.java @@ -527,8 +527,9 @@ public class TSDBDatabaseMetaData implements java.sql.DatabaseMetaData { public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException { - if (conn != null && !conn.isClosed()) { - Statement stmt = conn.createStatement(); + Statement stmt = null; + if (null != conn && !conn.isClosed()) { + stmt = conn.createStatement(); if (catalog == null || catalog.length() < 1) { catalog = conn.getCatalog(); } diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java index 46158210b1..e9acffe0e3 100755 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBJNIConnector.java @@ -19,7 +19,7 @@ import java.sql.SQLWarning; import java.util.List; public class TSDBJNIConnector { - static volatile Boolean isInitialized = false; + private static volatile Boolean isInitialized = false; static { System.loadLibrary("taos"); diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBSubscribe.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBSubscribe.java index 3b479aafc3..e20c6a815c 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBSubscribe.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBSubscribe.java @@ -171,8 +171,7 @@ public class TSDBSubscribe { state = 1; try { - TSDBResultSet resultSet = consume(subscription); - callBack.invoke(resultSet); + callBack.invoke(consume(subscription)); } catch (Exception e) { this.cancel(); throw new RuntimeException(e); diff --git a/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java b/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java index 5b2b6367ec..6e7cd19888 100644 --- a/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java +++ b/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java @@ -3,10 +3,11 @@ import org.apache.commons.lang3.StringUtils; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.SQLException; import java.util.Properties; public class TestAsyncTSDBSubscribe { - public static void main(String[] args) { + public static void main(String[] args) throws SQLException { String usage = "java -cp taos-jdbcdriver-1.0.3_dev-dist.jar com.taosdata.jdbc.TSDBSubscribe -db dbName -topic topicName " + "-tname tableName -h host"; if (args.length < 2) { @@ -38,7 +39,6 @@ public class TestAsyncTSDBSubscribe { } Connection connection = null; - TSDBSubscribe subscribe = null; long subscribId = 0; try { Class.forName("com.taosdata.jdbc.TSDBDriver"); @@ -46,7 +46,7 @@ public class TestAsyncTSDBSubscribe { properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); connection = DriverManager.getConnection("jdbc:TAOS://" + host + ":0/" + dbName + "?user=root&password=taosdata", properties); String rawSql = "select * from " + tName + ";"; - subscribe = ((TSDBConnection) connection).createSubscribe(); + TSDBSubscribe subscribe = ((TSDBConnection) connection).createSubscribe(); subscribId = subscribe.subscribe(topic, rawSql, false, 1000, new CallBack("first")); long subscribId2 = subscribe.subscribe("test", rawSql, false, 1000, new CallBack("second")); int a = 0; @@ -55,6 +55,9 @@ public class TestAsyncTSDBSubscribe { System.err.println("cancel subscribe"); } catch (Exception e) { e.printStackTrace(); + if (null != connection && !connection.isClosed()) { + connection.close(); + } } } diff --git a/src/connector/jdbc/src/test/java/TestPreparedStatement.java b/src/connector/jdbc/src/test/java/TestPreparedStatement.java index aabc34549b..2e387206a4 100644 --- a/src/connector/jdbc/src/test/java/TestPreparedStatement.java +++ b/src/connector/jdbc/src/test/java/TestPreparedStatement.java @@ -6,19 +6,20 @@ import java.util.Properties; public class TestPreparedStatement { - public static void main(String[] args) { + public static void main(String[] args) throws SQLException { + Connection connection = null; try { Class.forName("com.taosdata.jdbc.TSDBDriver"); Properties properties = new Properties(); properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, "localhost"); - Connection connection = DriverManager.getConnection("jdbc:TAOS://localhost:0/?user=root&password=taosdata", properties); + connection = DriverManager.getConnection("jdbc:TAOS://localhost:0/?user=root&password=taosdata", properties); String rawSql = "select * from test.log0601"; // String[] params = new String[]{"ts", "c1"}; PreparedStatement pstmt = (TSDBPreparedStatement) connection.prepareStatement(rawSql); ResultSet resSet = pstmt.executeQuery(); while(resSet.next()) { for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) { - System.out.printf("%d: %s\n", i, resSet.getString(i)); + System.out.printf("%d: %s \n", i, resSet.getString(i)); } } resSet.close(); @@ -27,7 +28,9 @@ public class TestPreparedStatement { } catch (Exception e) { e.printStackTrace(); - + if (null != connection) { + connection.close(); + } } } } diff --git a/src/connector/jdbc/src/test/java/TestTSDBDatabaseMetaData.java b/src/connector/jdbc/src/test/java/TestTSDBDatabaseMetaData.java index 519d7c6ab1..f7e0e78441 100644 --- a/src/connector/jdbc/src/test/java/TestTSDBDatabaseMetaData.java +++ b/src/connector/jdbc/src/test/java/TestTSDBDatabaseMetaData.java @@ -1,29 +1,33 @@ import com.taosdata.jdbc.TSDBDriver; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.DriverManager; -import java.sql.ResultSet; +import java.sql.*; import java.util.Properties; public class TestTSDBDatabaseMetaData { - public static void main(String[] args) { + public static void main(String[] args) throws SQLException { + Connection connection = null; + DatabaseMetaData dbMetaData = null; + ResultSet resSet = null; try { Class.forName("com.taosdata.jdbc.TSDBDriver"); Properties properties = new Properties(); - properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, "192.168.1.114"); - Connection connection = DriverManager.getConnection("jdbc:TAOS://192.168.1.114:0/?user=root&password=taosdata", properties); - DatabaseMetaData dbMetaData = connection.getMetaData(); - ResultSet resSet = dbMetaData.getCatalogs(); + properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, "localhost"); + connection = DriverManager.getConnection("jdbc:TAOS://localhost:0/?user=root&password=taosdata", properties); + dbMetaData = connection.getMetaData(); + resSet = dbMetaData.getCatalogs(); while(resSet.next()) { for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) { System.out.printf("dbMetaData.getCatalogs(%d) = %s\n", i, resSet.getString(i)); } } + resSet.close(); } catch (Exception e) { e.printStackTrace(); + if (null != connection) { + connection.close(); + } } } } diff --git a/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java b/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java index f12924c8a6..a30339eb53 100644 --- a/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java +++ b/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java @@ -53,9 +53,10 @@ public class TestTSDBSubscribe { subscribe = ((TSDBConnection) connection).createSubscribe(); subscribId = subscribe.subscribe(topic, rawSql, false, 1000); int a = 0; + TSDBResultSet resSet = null; while (true) { Thread.sleep(900); - TSDBResultSet resSet = subscribe.consume(subscribId); + resSet = subscribe.consume(subscribId); while (resSet.next()) { for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) { diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java index a7b6848f1e..b613cd4867 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java @@ -37,7 +37,7 @@ public class AsyncSubscribeTest { 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 < 5; i++) { + for (int i = 0; i < 2; i++) { ts += i; statement.executeUpdate("insert into \" + dbName + \".\" + tName + \" values (" + ts + ", " + (100 + i) + ", " + i + ")"); } diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java index 2154079e23..064279404b 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java @@ -1,5 +1,6 @@ package com.taosdata.jdbc; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -41,6 +42,7 @@ public class DatabaseMetaDataTest { System.out.printf("%d: %s\n", i, resultSet.getString(i)); } } + resultSet.close(); databaseMetaData.isWrapperFor(null); databaseMetaData.allProceduresAreCallable(); databaseMetaData.allTablesAreSelectable(); @@ -228,4 +230,11 @@ public class DatabaseMetaDataTest { databaseMetaData.generatedKeyAlwaysReturned(); } + + @AfterClass + public static void close() throws SQLException { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + } } 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 dc26f7d9df..36b8731175 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 @@ -55,7 +55,7 @@ public class PreparedStatementTest { @Test public void testPreparedStatement() throws SQLException { - long ts = System.currentTimeMillis(); + long ts = System.currentTimeMillis() + 20000; PreparedStatement saveStatement = connection .prepareStatement("insert into " + dbName + "." + tName + " values (" + ts + ", 1)"); @@ -70,7 +70,7 @@ public class PreparedStatementTest { TSDBPreparedStatement saveStatement = (TSDBPreparedStatement) connection .prepareStatement("insert into " + dbName + "." + tName + " values (?, ?)"); - saveStatement.setObject(1, ts + 100); + saveStatement.setObject(1, ts + 10000); saveStatement.setObject(2, 3); int rows = saveStatement.executeUpdate(); assertEquals(1, rows); 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 792ae5f671..35999ea59a 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 @@ -20,7 +20,7 @@ public class SubscribeTest { String host = "localhost"; String topic = "test"; -// @Before + @Before public void createDatabase() throws SQLException { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); @@ -36,13 +36,13 @@ public class SubscribeTest { 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 < 5; i++) { + for (int i = 0; i < 2; i++) { ts += i; statement.executeUpdate("insert into \" + dbName + \".\" + tName + \" values (" + ts + ", " + (100 + i) + ", " + i + ")"); } } -// @Test + @Test public void subscribe() throws Exception { TSDBSubscribe subscribe = null; long subscribId = 0; @@ -68,7 +68,7 @@ public class SubscribeTest { } resSet.close(); a++; - if (a >= 3) { + if (a >= 2) { break; } } @@ -81,7 +81,7 @@ public class SubscribeTest { } } -// @After + @After public void close() throws Exception { statement.executeQuery("drop database " + dbName); statement.close(); From 367c5a8e7b427c752904cd3b50451b482cc754d8 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Thu, 18 Jun 2020 00:10:23 +0800 Subject: [PATCH 10/11] fix: coverity's bug --- src/client/src/TSDBJNIConnector.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/client/src/TSDBJNIConnector.c b/src/client/src/TSDBJNIConnector.c index fec239ef9c..459b180881 100644 --- a/src/client/src/TSDBJNIConnector.c +++ b/src/client/src/TSDBJNIConnector.c @@ -192,7 +192,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_setOptions(JNIEnv const char *tz1 = (*env)->GetStringUTFChars(env, optionValue, NULL); if (tz1 && strlen(tz1) != 0) { res = taos_options(TSDB_OPTION_TIMEZONE, tz1); - jniTrace("set timezone to %s, result:%d", timezone, res); + jniTrace("set timezone to %s, result:%d", tz1, res); } else { jniTrace("input timezone is empty"); } @@ -385,7 +385,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getAffectedRowsIm } jint ret = taos_affected_rows((SSqlObj *)res); - jniTrace("jobj:%p, conn:%p, sql:%p, affect rows:%d", jobj, tscon, (void *)con, res, ret); + jniTrace("jobj:%p, conn:%p, sql:%p, res: %p, affect rows:%d", jobj, tscon, (void *)con, (void *)res, ret); return ret; } @@ -411,10 +411,10 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_getSchemaMetaData // jobject arrayListObj = (*env)->NewObject(env, g_arrayListClass, g_arrayListConstructFp, ""); if (num_fields == 0) { - jniError("jobj:%p, conn:%p, resultset:%p, fields size is %d", jobj, tscon, res, num_fields); + jniError("jobj:%p, conn:%p, resultset:%p, fields size is %d", jobj, tscon, (void *)res, num_fields); return JNI_NUM_OF_FIELDS_0; } else { - jniTrace("jobj:%p, conn:%p, resultset:%p, fields size is %d", jobj, tscon, res, num_fields); + jniTrace("jobj:%p, conn:%p, resultset:%p, fields size is %d", jobj, tscon, (void *)res, num_fields); for (int i = 0; i < num_fields; ++i) { jobject metadataObj = (*env)->NewObject(env, g_metadataClass, g_metadataConstructFp); (*env)->SetIntField(env, metadataObj, g_metadataColtypeField, fields[i].type); @@ -465,7 +465,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn int num_fields = taos_num_fields(result); if (num_fields == 0) { - jniError("jobj:%p, conn:%p, resultset:%p, fields size is %d", jobj, tscon, res, num_fields); + jniError("jobj:%p, conn:%p, resultset:%p, fields size is %d", jobj, tscon, (void *)res, num_fields); return JNI_NUM_OF_FIELDS_0; } @@ -473,7 +473,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_TSDBJNIConnector_fetchRowImp(JNIEn if (row == NULL) { int tserrno = taos_errno(result); if (tserrno == 0) { - jniTrace("jobj:%p, conn:%p, resultset:%p, fields size is %d, fetch row to the end", jobj, tscon, res, num_fields); + jniTrace("jobj:%p, conn:%p, resultset:%p, fields size is %d, fetch row to the end", jobj, tscon, (void *)res, num_fields); return JNI_FETCH_END; } else { jniTrace("jobj:%p, conn:%p, interruptted query", jobj, tscon); From 4819a63ea8cb949bc4d5057dd498c16fb28553a4 Mon Sep 17 00:00:00 2001 From: Shuaiqiang Chang Date: Fri, 19 Jun 2020 13:54:28 +0800 Subject: [PATCH 11/11] refactor: fix test order --- src/connector/jdbc/.classpath | 49 ++++++++++++++ src/connector/jdbc/.project | 23 +++++++ src/connector/jdbc/pom.xml | 12 ++-- .../src/test/java/TestAsyncTSDBSubscribe.java | 6 +- .../jdbc/src/test/java/TestTSDBSubscribe.java | 5 +- .../com/taosdata/jdbc/AsyncSubscribeTest.java | 4 ++ .../com/taosdata/jdbc/ConnectionTest.java | 6 +- .../taosdata/jdbc/DatabaseMetaDataTest.java | 7 +- .../java/com/taosdata/jdbc/ImportTest.java | 7 +- .../taosdata/jdbc/PreparedStatementTest.java | 15 +++-- .../java/com/taosdata/jdbc/ResultSetTest.java | 9 ++- .../java/com/taosdata/jdbc/SelectTest.java | 7 +- .../java/com/taosdata/jdbc/StableTest.java | 20 ++++-- .../java/com/taosdata/jdbc/StatementTest.java | 15 +++++ .../java/com/taosdata/jdbc/SubscribeTest.java | 4 ++ src/kit/taosnetwork/client.c | 48 ++++++++++++-- src/kit/taosnetwork/server.c | 58 +++++++++++++--- src/kit/taosnetwork/taosnetwork_client.c | 66 ------------------- src/kit/taosnetwork/taosnetwork_server.c | 57 ---------------- src/kit/taosnetwork/test_client.c | 50 -------------- src/kit/taosnetwork/test_server.c | 63 ------------------ 21 files changed, 258 insertions(+), 273 deletions(-) create mode 100644 src/connector/jdbc/.classpath create mode 100644 src/connector/jdbc/.project delete mode 100644 src/kit/taosnetwork/taosnetwork_client.c delete mode 100644 src/kit/taosnetwork/taosnetwork_server.c delete mode 100644 src/kit/taosnetwork/test_client.c delete mode 100644 src/kit/taosnetwork/test_server.c diff --git a/src/connector/jdbc/.classpath b/src/connector/jdbc/.classpath new file mode 100644 index 0000000000..39abf1c5e9 --- /dev/null +++ b/src/connector/jdbc/.classpath @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/connector/jdbc/.project b/src/connector/jdbc/.project new file mode 100644 index 0000000000..656ab58d20 --- /dev/null +++ b/src/connector/jdbc/.project @@ -0,0 +1,23 @@ + + + taos-jdbcdriver + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/src/connector/jdbc/pom.xml b/src/connector/jdbc/pom.xml index 456c9e6423..5aa4f6a2e3 100755 --- a/src/connector/jdbc/pom.xml +++ b/src/connector/jdbc/pom.xml @@ -53,17 +53,17 @@ commons-lang3 ${commons-lang3.version} - - junit - junit - 4.8.2 - test - org.jacoco jacoco-maven-plugin 0.8.3 + + junit + junit + 4.13 + test + diff --git a/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java b/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java index 6e7cd19888..55ab2fdc52 100644 --- a/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java +++ b/src/connector/jdbc/src/test/java/TestAsyncTSDBSubscribe.java @@ -43,7 +43,11 @@ public class TestAsyncTSDBSubscribe { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); Properties properties = new Properties(); - properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + 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/" + dbName + "?user=root&password=taosdata", properties); String rawSql = "select * from " + tName + ";"; TSDBSubscribe subscribe = ((TSDBConnection) connection).createSubscribe(); diff --git a/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java b/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java index a30339eb53..f628f3cada 100644 --- a/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java +++ b/src/connector/jdbc/src/test/java/TestTSDBSubscribe.java @@ -46,7 +46,10 @@ public class TestTSDBSubscribe { try { Class.forName("com.taosdata.jdbc.TSDBDriver"); Properties properties = new Properties(); - properties.setProperty(TSDBDriver.PROPERTY_KEY_HOST, host); + 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/" + dbName + "?user=root&password=taosdata" , properties); String rawSql = "select * from " + tName + ";"; diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java index b613cd4867..98b0d38b8d 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/AsyncSubscribeTest.java @@ -30,6 +30,9 @@ public class AsyncSubscribeTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -91,5 +94,6 @@ public class AsyncSubscribeTest { statement.executeQuery("drop database test"); statement.close(); connection.close(); + Thread.sleep(10); } } \ No newline at end of file diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java index a932f28113..5e5dabfe81 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ConnectionTest.java @@ -26,6 +26,9 @@ public class ConnectionTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -50,8 +53,9 @@ public class ConnectionTest { statement.close(); } connection.close(); + Thread.sleep(10); } - } catch (SQLException e) { + } catch (Exception e) { assert false : "close connection error: " + e.getMessage(); } } diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java index 064279404b..20ebc093ec 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/DatabaseMetaDataTest.java @@ -23,6 +23,9 @@ public class DatabaseMetaDataTest { } 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/" + "?user=root&password=taosdata", properties); @@ -232,9 +235,11 @@ public class DatabaseMetaDataTest { } @AfterClass - public static void close() throws SQLException { + public static void close() throws Exception { statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); + } } diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java index 063046bc74..b42d46aefe 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/ImportTest.java @@ -25,6 +25,9 @@ public class ImportTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -40,7 +43,7 @@ public class ImportTest { long ts = 1496732686000l; for (int i = 0; i < 50; i++) { - ts ++; + ts++; int row = statement.executeUpdate("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")"); System.out.println("insert into " + dbName + "." + tName + " values (" + ts + ", " + (100 + i) + ", " + i + ")\t" + row); assertEquals(1, row); @@ -84,5 +87,7 @@ public class ImportTest { statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); + } } 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 36b8731175..4c49727a7f 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 @@ -2,15 +2,17 @@ package com.taosdata.jdbc; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.FixMethodOrder; import org.junit.Test; +import org.junit.runners.MethodSorters; import java.sql.*; -import java.util.ArrayList; import java.util.Properties; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +@FixMethodOrder(MethodSorters.DEFAULT) public class PreparedStatementTest { static Connection connection = null; static PreparedStatement statement = null; @@ -28,6 +30,9 @@ public class PreparedStatementTest { } 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/" + "?user=root&password=taosdata", properties); @@ -155,11 +160,11 @@ public class PreparedStatementTest { } catch (SQLException e) { } try { - tsdbStatement.executeUpdate(null, new int[] { 0 }); + tsdbStatement.executeUpdate(null, new int[]{0}); } catch (SQLException e) { } try { - tsdbStatement.executeUpdate(null, new String[] { "str1", "str2" }); + tsdbStatement.executeUpdate(null, new String[]{"str1", "str2"}); } catch (SQLException e) { } try { @@ -185,10 +190,12 @@ public class PreparedStatementTest { } @AfterClass - public static void close() throws SQLException { + public static void close() throws Exception { statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); + } } 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 9d5f5451f2..2b74a98db2 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 @@ -30,6 +30,11 @@ public class ResultSetTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -813,10 +818,12 @@ public class ResultSetTest { } @AfterClass - public static void close() throws SQLException { + public static void close() throws Exception { statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); + } } diff --git a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java index 077f95318b..282ca6c1a7 100644 --- a/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java +++ b/src/connector/jdbc/src/test/java/com/taosdata/jdbc/SelectTest.java @@ -25,6 +25,9 @@ public class SelectTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -59,9 +62,11 @@ public class SelectTest { } @After - public void close() throws SQLException { + public void close() throws Exception { statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); + } } 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 b0c5862dec..b275112e18 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 @@ -2,13 +2,16 @@ package com.taosdata.jdbc; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.FixMethodOrder; import org.junit.Test; +import org.junit.runners.MethodSorters; import java.sql.*; import java.util.Properties; import static org.junit.Assert.assertEquals; +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class StableTest { static Connection connection = null; static Statement statement = null; @@ -25,6 +28,9 @@ public class StableTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -33,7 +39,7 @@ public class StableTest { statement.executeQuery("use " + dbName); } - @Test +// @Test public void createStable() { String sql = "create table " + stbName + " (ts timestamp, v1 int, v2 int) tags (tg nchar(20)) "; @@ -44,7 +50,7 @@ public class StableTest { } } - @Test +// @Test public void createTable() { String sql = "create table t1 using " + stbName + " tags (\"beijing\")"; @@ -57,6 +63,7 @@ public class StableTest { @Test public void describeSTable() { + createStable(); String sql = "describe " + stbName; int num = 0; System.out.println("describe stable"); @@ -68,6 +75,7 @@ public class StableTest { } num++; } + res.close(); assertEquals(4, num); } catch (SQLException e) { assert false : "error describe stable" + e.getMessage(); @@ -76,6 +84,7 @@ public class StableTest { @Test public void describeTable() { + createTable(); String sql = "describe t1"; int num = 0; System.out.println("describe table"); @@ -87,16 +96,17 @@ public class StableTest { } num++; } + res.close(); assertEquals(4, num); } catch (SQLException e) { assert false : "error describe stable" + e.getMessage(); } } - @Test + // @Test public void validCreateSql() { String sql = "create table t2 using " + stbName + " tags (\"beijing\")"; - boolean valid = ((TSDBConnection)connection).getConnection().validateCreateTableSql(sql); + boolean valid = ((TSDBConnection) connection).getConnection().validateCreateTableSql(sql); assertEquals(true, valid); } @@ -106,6 +116,8 @@ public class StableTest { statement.executeUpdate("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); + } } } 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 5141e87405..4be68519c5 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,5 +1,6 @@ package com.taosdata.jdbc; +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -26,6 +27,9 @@ public class StatementTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -156,4 +160,15 @@ public class StatementTest { } catch (SQLException e) { } } + + @AfterClass + public static void close() throws Exception { + if (!statement.isClosed()) { + statement.executeUpdate("drop database " + dbName); + statement.close(); + connection.close(); + Thread.sleep(10); + + } + } } 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 35999ea59a..25f7f7a285 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 @@ -29,6 +29,9 @@ public class SubscribeTest { } 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/" + "?user=root&password=taosdata" , properties); @@ -86,5 +89,6 @@ public class SubscribeTest { statement.executeQuery("drop database " + dbName); statement.close(); connection.close(); + Thread.sleep(10); } } \ No newline at end of file diff --git a/src/kit/taosnetwork/client.c b/src/kit/taosnetwork/client.c index 65b866a99b..b2c7f729b5 100644 --- a/src/kit/taosnetwork/client.c +++ b/src/kit/taosnetwork/client.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -34,6 +35,36 @@ typedef struct { char *host[15]; } info; +typedef struct Arguments { + char * host; + uint16_t port; + uint16_t max_port; +} SArguments; + +static struct argp_option options[] = { + {0, 'h', "host", 0, "The host to connect to TDEngine. Default is localhost.", 0}, + {0, 'p', "port", 0, "The TCP or UDP port number to use for the connection. Default is 6020.", 1}, + {0, 'm', "max port", 0, "The max TCP or UDP port number to use for the connection. Default is 6050.", 2}}; + +static error_t parse_opt(int key, char *arg, struct argp_state *state) { + + SArguments *arguments = state->input; + switch (key) { + case 'h': + arguments->host = arg; + break; + case 'p': + arguments->port = atoi(arg); + break; + case 'm': + arguments->max_port = atoi(arg); + break; + } + return 0; +} + +static struct argp argp = {options, parse_opt, 0, 0}; + void *checkPort(void *sarg) { info *pinfo = (info *)sarg; int port = pinfo->port; @@ -97,7 +128,7 @@ void *checkUPort(void *sarg) { sprintf(sendbuf, "send msg port_%d by udp", port); - socklen_t sin_size = sizeof(*(struct sockaddr*)&serverAddr); + socklen_t sin_size = sizeof(*(struct sockaddr *)&serverAddr); sendto(clientSocket, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&serverAddr, (int)sin_size); @@ -113,14 +144,19 @@ void *checkUPort(void *sarg) { return NULL; } -int main() { - int port = 6020; - char *host = "127.0.0.1"; +int main(int argc, char *argv[]) { + SArguments arguments = {"127.0.0.1", 6020, 6050}; + + argp_parse(&argp, argc, argv, 0, 0, &arguments); + + printf("host: %s\tport: %d\tmax_port: %d\n", arguments.host, arguments.port, arguments.max_port); + + int port = arguments.port; + char *host = arguments.host; info *tinfo = malloc(sizeof(info)); info *uinfo = malloc(sizeof(info)); - for (size_t i = 0; i < 30; i++) { - port++; + for (; port < arguments.max_port; port++) { printf("For test: %s:%d\n", host, port); *tinfo->host = host; diff --git a/src/kit/taosnetwork/server.c b/src/kit/taosnetwork/server.c index 7dcc9cbeda..c967828f0b 100644 --- a/src/kit/taosnetwork/server.c +++ b/src/kit/taosnetwork/server.c @@ -13,6 +13,7 @@ * along with this program. If not, see . */ +#include #include #include #include @@ -34,6 +35,36 @@ typedef struct { int type; // 0: tcp, 1: udo, default: 0 } info; +typedef struct Arguments { + char * host; + uint16_t port; + uint16_t max_port; +} SArguments; + +static struct argp_option options[] = { + {0, 'h', "host", 0, "The host to connect to TDEngine. Default is localhost.", 0}, + {0, 'p', "port", 0, "The TCP or UDP port number to use for the connection. Default is 6020.", 1}, + {0, 'm', "max port", 0, "The max TCP or UDP port number to use for the connection. Default is 6050.", 2}}; + +static error_t parse_opt(int key, char *arg, struct argp_state *state) { + + SArguments *arguments = state->input; + switch (key) { + case 'h': + arguments->host = arg; + break; + case 'p': + arguments->port = atoi(arg); + break; + case 'm': + arguments->max_port = atoi(arg); + break; + } + return 0; +} + +static struct argp argp = {options, parse_opt, 0, 0}; + static void *bindPort(void *sarg) { info *pinfo = (info *)sarg; int port = pinfo->port; @@ -170,15 +201,21 @@ static void *bindUPort(void *sarg) { } -int main() { - int port = 6020; - pthread_t *pids = malloc(60 * sizeof(pthread_t)); - info * infos = malloc(30 * sizeof(info)); - info * uinfos = malloc(30 * sizeof(info)); +int main(int argc, char *argv[]) { + SArguments arguments = {"127.0.0.1", 6020, 6050}; + argp_parse(&argp, argc, argv, 0, 0, &arguments); + int port = arguments.port; - for (size_t i = 0; i < 30; i++) { - port++; + int num = arguments.max_port - arguments.port; + if (num < 0) { + num = 1; + } + pthread_t *pids = malloc(2 * num * sizeof(pthread_t)); + info * infos = malloc(num * sizeof(info)); + info * uinfos = malloc(num * sizeof(info)); + + for (size_t i = 0; i < num; i++) { info *pinfo = infos++; pinfo->port = port; @@ -191,14 +228,15 @@ int main() { info *uinfo = uinfos++; uinfo->port = port; uinfo->type = 1; - if (pthread_create(pids + 30 + i, NULL, bindUPort, uinfo) != 0) //创建线程 + port++; + if (pthread_create(pids + num + i, NULL, bindUPort, uinfo) != 0) //创建线程 { //创建线程失败 printf("创建线程失败: %d.\n", port); exit(0); } } - for (int i = 0; i < 30; i++) { + for (int i = 0; i < num; i++) { pthread_join(pids[i], NULL); - pthread_join(pids[(10 + i)], NULL); + pthread_join(pids[(num + i)], NULL); } } diff --git a/src/kit/taosnetwork/taosnetwork_client.c b/src/kit/taosnetwork/taosnetwork_client.c deleted file mode 100644 index 072610a035..0000000000 --- a/src/kit/taosnetwork/taosnetwork_client.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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 . - */ - -#include -#include -#include -#include -#include -#include -#define SERVER_PORT 8000 -#define SIZE 200 - -int main() { - struct sockaddr_in servaddr, cliaddr; - socklen_t cliaddr_len; - int client_sockfd; - char buf[SIZE]; - char recvbuf[SIZE]; - - int i, n, flag = 0; - - int len, iDataNum; - - client_sockfd = socket(AF_INET, SOCK_STREAM, 0); - bzero(&servaddr, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - servaddr.sin_port = htons(SERVER_PORT); - - if (connect(client_sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - printf("Connected error..\n"); - return 0; - } - printf("Connected to server..\n"); - - /*循环的发送接收信息并打印接收信息(可以按需发送)--recv返回接收到的字节数,send返回发送的字节数*/ - while (1) { - printf("Enter string to send:"); - scanf("%s", buf); - if (!strcmp(buf, "quit")) { - break; - } - len = (sizeof buf); - - recvbuf[0] = '\0'; - - iDataNum = recv(client_sockfd, recvbuf, SIZE, 0); - - recvbuf[iDataNum] = '\0'; - - printf("%s\n", recvbuf); - } - return 0; -} diff --git a/src/kit/taosnetwork/taosnetwork_server.c b/src/kit/taosnetwork/taosnetwork_server.c deleted file mode 100644 index 1ec20716fa..0000000000 --- a/src/kit/taosnetwork/taosnetwork_server.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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 . - */ - -#include -#include -#include -#include -#include -#include -#define SERVER_PORT 8000 -#define SIZE 200 - -int main() { - struct sockaddr_in servaddr, cliaddr; - socklen_t cliaddr_len; - int listenfd, connfd; - char buf[BUFSIZ]; - int i, n, flag = 0; - - listenfd = socket(AF_INET, SOCK_STREAM, 0); - bzero(&servaddr, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - servaddr.sin_port = htons(SERVER_PORT); - bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); - listen(listenfd, 20); - - printf("Accepting connections..\n"); - while (1) { - cliaddr_len = sizeof(cliaddr); - connfd = accept(listenfd, (struct sockaddr *)&cliaddr, - &cliaddr_len); //如果得不到客户端发来的消息,将会被阻塞,一直等到消息到来 - n = read(connfd, buf, SIZE); //如果n<=0,表示客户端已断开 - while (1) { - if (n != 0) { - for (i = 0; i < n; i++) printf("%c", buf[i]); //输出客户端发来的信息 - } else { - printf("Client say close the connection..\n"); - break; - } - n = read(connfd, buf, SIZE); - } - close(connfd); - } -} diff --git a/src/kit/taosnetwork/test_client.c b/src/kit/taosnetwork/test_client.c deleted file mode 100644 index 0c863c6a99..0000000000 --- a/src/kit/taosnetwork/test_client.c +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include -#include -#include - -#define SERVER_PORT 8888 -#define BUFF_LEN 512 -#define SERVER_IP "172.0.5.182" - -void udp_msg_sender(int fd, struct sockaddr* dst) {} - -/* - client: - socket-->sendto-->revcfrom-->close -*/ - -int main(int argc, char* argv[]) { - int client_fd; - struct sockaddr_in ser_addr; - - client_fd = socket(AF_INET, SOCK_DGRAM, 0); - if (client_fd < 0) { - printf("create socket fail!\n"); - return -1; - } - - memset(&ser_addr, 0, sizeof(ser_addr)); - ser_addr.sin_family = AF_INET; - // ser_addr.sin_addr.s_addr = inet_addr(SERVER_IP); - ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); //注意网络序转换 - ser_addr.sin_port = htons(SERVER_PORT); //注意网络序转换 - - socklen_t len; - struct sockaddr_in src; - while (1) { - char buf[BUFF_LEN] = "TEST UDP MSG!\n"; - len = sizeof(*(struct sockaddr*)&ser_addr); - printf("client:%s\n", buf); //打印自己发送的信息 - sendto(client_fd, buf, BUFF_LEN, 0, (struct sockaddr*)&ser_addr, len); - memset(buf, 0, BUFF_LEN); - recvfrom(client_fd, buf, BUFF_LEN, 0, (struct sockaddr*)&src, &len); //接收来自server的信息 - printf("server:%s\n", buf); - sleep(1); //一秒发送一次消息 - } - - close(client_fd); - - return 0; -} \ No newline at end of file diff --git a/src/kit/taosnetwork/test_server.c b/src/kit/taosnetwork/test_server.c deleted file mode 100644 index 3bfbaa4f7c..0000000000 --- a/src/kit/taosnetwork/test_server.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include -#include -#include - -#define SERVER_PORT 8888 -#define BUFF_LEN 1024 - -void handle_udp_msg(int fd) { - char buf[BUFF_LEN]; //接收缓冲区,1024字节 - socklen_t len; - int count; - struct sockaddr_in clent_addr; // clent_addr用于记录发送方的地址信息 - while (1) { - memset(buf, 0, BUFF_LEN); - len = sizeof(clent_addr); - count = - recvfrom(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&clent_addr, &len); // recvfrom是拥塞函数,没有数据就一直拥塞 - if (count == -1) { - printf("recieve data fail!\n"); - return; - } - printf("client:%s\n", buf); //打印client发过来的信息 - memset(buf, 0, BUFF_LEN); - sprintf(buf, "I have recieved %d bytes data!\n", count); //回复client - printf("server:%s\n", buf); //打印自己发送的信息给 - sendto(fd, buf, BUFF_LEN, 0, (struct sockaddr*)&clent_addr, - len); //发送信息给client,注意使用了clent_addr结构体指针 - } -} - -/* - server: - socket-->bind-->recvfrom-->sendto-->close -*/ - -int main(int argc, char* argv[]) { - int server_fd, ret; - struct sockaddr_in ser_addr; - - server_fd = socket(AF_INET, SOCK_DGRAM, 0); // AF_INET:IPV4;SOCK_DGRAM:UDP - if (server_fd < 0) { - printf("create socket fail!\n"); - return -1; - } - - memset(&ser_addr, 0, sizeof(ser_addr)); - ser_addr.sin_family = AF_INET; - ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); // IP地址,需要进行网络序转换,INADDR_ANY:本地地址 - ser_addr.sin_port = htons(SERVER_PORT); //端口号,需要网络序转换 - - ret = bind(server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)); - if (ret < 0) { - printf("socket bind fail!\n"); - return -1; - } - - handle_udp_msg(server_fd); //处理接收到的数据 - - close(server_fd); - return 0; -} \ No newline at end of file