commit
b2aadbb896
|
@ -32,7 +32,7 @@ ELSEIF (TD_WINDOWS)
|
||||||
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
|
#INSTALL(TARGETS taos RUNTIME DESTINATION driver)
|
||||||
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
|
#INSTALL(TARGETS shell RUNTIME DESTINATION .)
|
||||||
IF (TD_MVN_INSTALLED)
|
IF (TD_MVN_INSTALLED)
|
||||||
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.8-dist.jar DESTINATION connector/jdbc)
|
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.13-dist.jar DESTINATION connector/jdbc)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
ELSEIF (TD_DARWIN)
|
ELSEIF (TD_DARWIN)
|
||||||
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
|
SET(TD_MAKE_INSTALL_SH "${TD_COMMUNITY_DIR}/packaging/tools/make_install.sh")
|
||||||
|
|
|
@ -8,7 +8,7 @@ IF (TD_MVN_INSTALLED)
|
||||||
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
ADD_CUSTOM_COMMAND(OUTPUT ${JDBC_CMD_NAME}
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
COMMAND mvn -Dmaven.test.skip=true install -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.8-dist.jar ${LIBRARY_OUTPUT_PATH}
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.13-dist.jar ${LIBRARY_OUTPUT_PATH}
|
||||||
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
COMMAND mvn -Dmaven.test.skip=true clean -f ${CMAKE_CURRENT_SOURCE_DIR}/pom.xml
|
||||||
COMMENT "build jdbc driver")
|
COMMENT "build jdbc driver")
|
||||||
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
ADD_CUSTOM_TARGET(${JDBC_TARGET_NAME} ALL WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} DEPENDS ${JDBC_CMD_NAME})
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.10</version>
|
<version>2.0.13</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
|
@ -49,17 +49,29 @@
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
<artifactId>commons-lang3</artifactId>
|
|
||||||
<version>3.5</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.13</version>
|
<version>4.13</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- for restful -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>4.5.8</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.9</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>fastjson</artifactId>
|
||||||
|
<version>1.2.58</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.8</version>
|
<version>2.0.13</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
<url>https://github.com/taosdata/TDengine/tree/master/src/connector/jdbc</url>
|
||||||
|
@ -112,6 +112,13 @@
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.12.4</version>
|
<version>2.12.4</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<includes>
|
||||||
|
<include>**/*Test.java</include>
|
||||||
|
</includes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/BatchInsertTest.java</exclude>
|
||||||
|
<exclude>**/FailOverTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
<testFailureIgnore>true</testFailureIgnore>
|
<testFailureIgnore>true</testFailureIgnore>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -15,7 +15,6 @@ public class RestfulConnection implements Connection {
|
||||||
private final String database;
|
private final String database;
|
||||||
private final String url;
|
private final String url;
|
||||||
|
|
||||||
|
|
||||||
public RestfulConnection(String host, String port, Properties props, String database, String url) {
|
public RestfulConnection(String host, String port, Properties props, String database, String url) {
|
||||||
this.host = host;
|
this.host = host;
|
||||||
this.port = Integer.parseInt(port);
|
this.port = Integer.parseInt(port);
|
||||||
|
@ -28,7 +27,7 @@ public class RestfulConnection implements Connection {
|
||||||
public Statement createStatement() throws SQLException {
|
public Statement createStatement() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg("restful TDengine connection is closed."));
|
throw new SQLException(TSDBConstants.WrapErrMsg("restful TDengine connection is closed."));
|
||||||
return new RestfulStatement(this, this.database);
|
return new RestfulStatement(this, database);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -104,22 +103,28 @@ public class RestfulConnection implements Connection {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTransactionIsolation(int level) throws SQLException {
|
public void setTransactionIsolation(int level) throws SQLException {
|
||||||
|
//transaction is not supported
|
||||||
|
throw new SQLFeatureNotSupportedException("transactions are not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int getTransactionIsolation() throws SQLException {
|
public int getTransactionIsolation() throws SQLException {
|
||||||
return 0;
|
//Connection.TRANSACTION_NONE specifies that transactions are not supported.
|
||||||
|
return Connection.TRANSACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SQLWarning getWarnings() throws SQLException {
|
public SQLWarning getWarnings() throws SQLException {
|
||||||
|
//TODO: getWarnings not implemented
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearWarnings() throws SQLException {
|
public void clearWarnings() throws SQLException {
|
||||||
|
throw new SQLFeatureNotSupportedException("clearWarnings not supported.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -209,22 +214,26 @@ public class RestfulConnection implements Connection {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Clob createClob() throws SQLException {
|
public Clob createClob() throws SQLException {
|
||||||
return null;
|
//TODO: not supported
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Blob createBlob() throws SQLException {
|
public Blob createBlob() throws SQLException {
|
||||||
return null;
|
//TODO: not supported
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NClob createNClob() throws SQLException {
|
public NClob createNClob() throws SQLException {
|
||||||
return null;
|
//TODO: not supported
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SQLXML createSQLXML() throws SQLException {
|
public SQLXML createSQLXML() throws SQLException {
|
||||||
return null;
|
//TODO: not supported
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -254,12 +263,14 @@ public class RestfulConnection implements Connection {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
|
public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
|
||||||
return null;
|
//TODO: not supported
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
|
public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
|
||||||
return null;
|
//TODO: not supported
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -289,12 +300,16 @@ public class RestfulConnection implements Connection {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T unwrap(Class<T> iface) throws SQLException {
|
public <T> T unwrap(Class<T> iface) throws SQLException {
|
||||||
return null;
|
try {
|
||||||
|
return iface.cast(this);
|
||||||
|
} catch (ClassCastException cce) {
|
||||||
|
throw new SQLException("Unable to unwrap to " + iface.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isWrapperFor(Class<?> iface) throws SQLException {
|
public boolean isWrapperFor(Class<?> iface) throws SQLException {
|
||||||
return false;
|
return iface.isInstance(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getHost() {
|
public String getHost() {
|
||||||
|
|
|
@ -35,7 +35,7 @@ public class RestfulDriver extends AbstractTaosDriver {
|
||||||
Properties props = parseURL(url, info);
|
Properties props = parseURL(url, info);
|
||||||
String host = props.getProperty(TSDBDriver.PROPERTY_KEY_HOST, "localhost");
|
String host = props.getProperty(TSDBDriver.PROPERTY_KEY_HOST, "localhost");
|
||||||
String port = props.getProperty(TSDBDriver.PROPERTY_KEY_PORT, "6041");
|
String port = props.getProperty(TSDBDriver.PROPERTY_KEY_PORT, "6041");
|
||||||
String database = props.getProperty(TSDBDriver.PROPERTY_KEY_DBNAME);
|
String database = props.containsKey(TSDBDriver.PROPERTY_KEY_DBNAME) ? props.getProperty(TSDBDriver.PROPERTY_KEY_DBNAME) : null;
|
||||||
|
|
||||||
String loginUrl = "http://" + props.getProperty(TSDBDriver.PROPERTY_KEY_HOST) + ":"
|
String loginUrl = "http://" + props.getProperty(TSDBDriver.PROPERTY_KEY_HOST) + ":"
|
||||||
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/"
|
+ props.getProperty(TSDBDriver.PROPERTY_KEY_PORT) + "/rest/login/"
|
||||||
|
@ -86,6 +86,7 @@ public class RestfulDriver extends AbstractTaosDriver {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
|
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
|
||||||
return null;
|
//TODO SQLFeatureNotSupportedException
|
||||||
|
throw new SQLFeatureNotSupportedException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.taosdata.jdbc.TSDBConstants;
|
import com.taosdata.jdbc.TSDBConstants;
|
||||||
import com.taosdata.jdbc.rs.util.HttpClientPoolUtil;
|
import com.taosdata.jdbc.rs.util.HttpClientPoolUtil;
|
||||||
|
import com.taosdata.jdbc.utils.SqlSyntaxValidator;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -11,19 +12,23 @@ import java.util.List;
|
||||||
|
|
||||||
public class RestfulStatement implements Statement {
|
public class RestfulStatement implements Statement {
|
||||||
|
|
||||||
private final String catalog;
|
private boolean closed;
|
||||||
|
private String database;
|
||||||
private final RestfulConnection conn;
|
private final RestfulConnection conn;
|
||||||
|
|
||||||
public RestfulStatement(RestfulConnection c, String catalog) {
|
public RestfulStatement(RestfulConnection c, String database) {
|
||||||
this.conn = c;
|
this.conn = c;
|
||||||
this.catalog = catalog;
|
this.database = database;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultSet executeQuery(String sql) throws SQLException {
|
public ResultSet executeQuery(String sql) throws SQLException {
|
||||||
|
if (isClosed())
|
||||||
|
throw new SQLException("statement already closed");
|
||||||
|
if (!SqlSyntaxValidator.isSelectSql(sql))
|
||||||
|
throw new SQLException("not a select sql for executeQuery: " + sql);
|
||||||
|
|
||||||
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||||
|
|
||||||
String result = HttpClientPoolUtil.execute(url, sql);
|
String result = HttpClientPoolUtil.execute(url, sql);
|
||||||
String fields = "";
|
String fields = "";
|
||||||
List<String> words = Arrays.asList(sql.split(" "));
|
List<String> words = Arrays.asList(sql.split(" "));
|
||||||
|
@ -65,12 +70,29 @@ public class RestfulStatement implements Statement {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int executeUpdate(String sql) throws SQLException {
|
public int executeUpdate(String sql) throws SQLException {
|
||||||
return 0;
|
if (isClosed())
|
||||||
|
throw new SQLException("statement already closed");
|
||||||
|
if (!SqlSyntaxValidator.isValidForExecuteUpdate(sql))
|
||||||
|
throw new SQLException("not a valid sql for executeUpdate: " + sql);
|
||||||
|
|
||||||
|
if (this.database == null)
|
||||||
|
throw new SQLException("Database not specified or available");
|
||||||
|
|
||||||
|
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||||
|
HttpClientPoolUtil.execute(url, "use " + conn.getDatabase());
|
||||||
|
String result = HttpClientPoolUtil.execute(url, sql);
|
||||||
|
JSONObject jsonObject = JSON.parseObject(result);
|
||||||
|
if (jsonObject.getString("status").equals("error")) {
|
||||||
|
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " +
|
||||||
|
jsonObject.getString("desc") + "\n" +
|
||||||
|
"error code: " + jsonObject.getString("code")));
|
||||||
|
}
|
||||||
|
return Integer.parseInt(jsonObject.getString("rows"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws SQLException {
|
public void close() throws SQLException {
|
||||||
|
this.closed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -115,6 +137,7 @@ public class RestfulStatement implements Statement {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SQLWarning getWarnings() throws SQLException {
|
public SQLWarning getWarnings() throws SQLException {
|
||||||
|
//TODO: getWarnings not Implemented
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +153,29 @@ public class RestfulStatement implements Statement {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean execute(String sql) throws SQLException {
|
public boolean execute(String sql) throws SQLException {
|
||||||
return false;
|
if (isClosed()) {
|
||||||
|
throw new SQLException("Invalid method call on a closed statement.");
|
||||||
|
}
|
||||||
|
//如果执行了use操作应该将当前Statement的catalog设置为新的database
|
||||||
|
if (SqlSyntaxValidator.isUseSql(sql)) {
|
||||||
|
this.database = sql.trim().replace("use", "").trim();
|
||||||
|
}
|
||||||
|
if (this.database == null)
|
||||||
|
throw new SQLException("Database not specified or available");
|
||||||
|
|
||||||
|
final String url = "http://" + conn.getHost() + ":" + conn.getPort() + "/rest/sql";
|
||||||
|
// use database
|
||||||
|
HttpClientPoolUtil.execute(url, "use " + conn.getDatabase());
|
||||||
|
// execute sql
|
||||||
|
String result = HttpClientPoolUtil.execute(url, sql);
|
||||||
|
// parse result
|
||||||
|
JSONObject jsonObject = JSON.parseObject(result);
|
||||||
|
if (jsonObject.getString("status").equals("error")) {
|
||||||
|
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " +
|
||||||
|
jsonObject.getString("desc") + "\n" +
|
||||||
|
"error code: " + jsonObject.getString("code")));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -245,7 +290,7 @@ public class RestfulStatement implements Statement {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isClosed() throws SQLException {
|
public boolean isClosed() throws SQLException {
|
||||||
return false;
|
return closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -270,11 +315,15 @@ public class RestfulStatement implements Statement {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T unwrap(Class<T> iface) throws SQLException {
|
public <T> T unwrap(Class<T> iface) throws SQLException {
|
||||||
return null;
|
try {
|
||||||
|
return iface.cast(this);
|
||||||
|
} catch (ClassCastException cce) {
|
||||||
|
throw new SQLException("Unable to unwrap to " + iface.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isWrapperFor(Class<?> iface) throws SQLException {
|
public boolean isWrapperFor(Class<?> iface) throws SQLException {
|
||||||
return false;
|
return iface.isInstance(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,9 @@ import java.sql.SQLException;
|
||||||
|
|
||||||
public class SqlSyntaxValidator {
|
public class SqlSyntaxValidator {
|
||||||
|
|
||||||
|
private static final String[] updateSQL = {"insert", "update", "delete", "create", "alter", "drop", "show", "describe", "use"};
|
||||||
|
private static final String[] querySQL = {"select"};
|
||||||
|
|
||||||
private TSDBConnection tsdbConnection;
|
private TSDBConnection tsdbConnection;
|
||||||
|
|
||||||
public SqlSyntaxValidator(Connection connection) {
|
public SqlSyntaxValidator(Connection connection) {
|
||||||
|
@ -43,4 +46,28 @@ public class SqlSyntaxValidator {
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isValidForExecuteUpdate(String sql) {
|
||||||
|
for (String prefix : updateSQL) {
|
||||||
|
if (sql.trim().toLowerCase().startsWith(prefix))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isUseSql(String sql) {
|
||||||
|
return sql.trim().toLowerCase().startsWith(updateSQL[8]) || sql.trim().toLowerCase().matches("create\\s*database.*") || sql.toLowerCase().toLowerCase().matches("drop\\s*database.*");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isUpdateSql(String sql) {
|
||||||
|
return sql.trim().toLowerCase().startsWith(updateSQL[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isInsertSql(String sql) {
|
||||||
|
return sql.trim().toLowerCase().startsWith(updateSQL[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSelectSql(String sql) {
|
||||||
|
return sql.trim().toLowerCase().startsWith(querySQL[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,33 +8,43 @@ import java.sql.*;
|
||||||
public class RestfulDriverTest {
|
public class RestfulDriverTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCase001() {
|
public void connect() {
|
||||||
try {
|
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
|
||||||
Connection connection = DriverManager.getConnection("jdbc:TAOS-RS://master:6041/?user=root&password=taosdata");
|
|
||||||
Statement statement = connection.createStatement();
|
|
||||||
ResultSet resultSet = statement.executeQuery("select * from log.log");
|
|
||||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
|
||||||
while (resultSet.next()) {
|
|
||||||
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
|
||||||
String column = metaData.getColumnLabel(i);
|
|
||||||
String value = resultSet.getString(i);
|
|
||||||
System.out.print(column + ":" + value + "\t");
|
|
||||||
}
|
|
||||||
System.out.println();
|
|
||||||
}
|
|
||||||
statement.close();
|
|
||||||
connection.close();
|
|
||||||
} catch (SQLException | ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAcceptUrl() throws SQLException {
|
public void acceptsURL() throws SQLException {
|
||||||
Driver driver = new RestfulDriver();
|
Driver driver = new RestfulDriver();
|
||||||
boolean isAccept = driver.acceptsURL("jdbc:TAOS-RS://master:6041");
|
boolean isAccept = driver.acceptsURL("jdbc:TAOS-RS://master:6041");
|
||||||
Assert.assertTrue(isAccept);
|
Assert.assertTrue(isAccept);
|
||||||
|
isAccept = driver.acceptsURL("jdbc:TAOS://master:6041");
|
||||||
|
Assert.assertFalse(isAccept);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPropertyInfo() throws SQLException {
|
||||||
|
Driver driver = new RestfulDriver();
|
||||||
|
final String url = "";
|
||||||
|
DriverPropertyInfo[] propertyInfo = driver.getPropertyInfo(url, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMajorVersion() {
|
||||||
|
Assert.assertEquals(2, new RestfulDriver().getMajorVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMinorVersion() {
|
||||||
|
Assert.assertEquals(0, new RestfulDriver().getMinorVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void jdbcCompliant() {
|
||||||
|
Assert.assertFalse(new RestfulDriver().jdbcCompliant());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = SQLFeatureNotSupportedException.class)
|
||||||
|
public void getParentLogger() throws SQLFeatureNotSupportedException {
|
||||||
|
new RestfulDriver().getParentLogger();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
package com.taosdata.jdbc.rs;
|
||||||
|
|
||||||
|
import org.junit.*;
|
||||||
|
import org.junit.runners.MethodSorters;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
|
public class RestfulJDBCTest {
|
||||||
|
|
||||||
|
private Connection connection;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() throws ClassNotFoundException, SQLException {
|
||||||
|
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||||
|
connection = DriverManager.getConnection("jdbc:TAOS-RS://master:6041/restful_test?user=root&password=taosdata");
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() throws SQLException {
|
||||||
|
if (connection != null)
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询所有log.log
|
||||||
|
**/
|
||||||
|
@Test
|
||||||
|
public void testCase001() {
|
||||||
|
try {
|
||||||
|
Statement statement = connection.createStatement();
|
||||||
|
ResultSet resultSet = statement.executeQuery("select * from log.log");
|
||||||
|
ResultSetMetaData metaData = resultSet.getMetaData();
|
||||||
|
while (resultSet.next()) {
|
||||||
|
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||||
|
String column = metaData.getColumnLabel(i);
|
||||||
|
String value = resultSet.getString(i);
|
||||||
|
System.out.print(column + ":" + value + "\t");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
statement.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create database
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testCase002() {
|
||||||
|
try (Statement stmt = connection.createStatement()) {
|
||||||
|
stmt.execute("drop database if exists restful_test");
|
||||||
|
stmt.execute("create database if not exists restful_test");
|
||||||
|
stmt.execute("use restful_test");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create super table
|
||||||
|
***/
|
||||||
|
@Test
|
||||||
|
public void testCase003() {
|
||||||
|
try (Statement stmt = connection.createStatement()) {
|
||||||
|
stmt.execute("create table weather(ts timestamp, temperature float, humidity int) tags(location nchar(64), groupId int)");
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase004() {
|
||||||
|
try (Statement stmt = connection.createStatement()) {
|
||||||
|
for (int i = 1; i <= 100; i++) {
|
||||||
|
stmt.execute("create table t" + i + " using weather tags('beijing', '" + i + "')");
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Random random = new Random(System.currentTimeMillis());
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase005() {
|
||||||
|
try (Statement stmt = connection.createStatement()) {
|
||||||
|
int rows = 0;
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
for (int j = 1; j <= 100; j++) {
|
||||||
|
long currentTimeMillis = System.currentTimeMillis();
|
||||||
|
int affectRows = stmt.executeUpdate("insert into t" + j + " values(" + currentTimeMillis + "," + (random.nextFloat() * 50) + "," + random.nextInt(100) + ")");
|
||||||
|
Assert.assertEquals(1, affectRows);
|
||||||
|
rows += affectRows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Assert.assertEquals(1000, rows);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.taosdata.jdbc.utils;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class SqlSyntaxValidatorTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateSqlSyntax() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isSelectSQL() {
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isSelectSql("select * from test.weather"));
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isSelectSql(" select * from test.weather"));
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isSelectSql(" select * from test.weather "));
|
||||||
|
Assert.assertFalse(SqlSyntaxValidator.isSelectSql("insert into test.weather values(now, 1.1, 2)"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isUseSQL() {
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isUseSql("use database test"));
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isUseSql("create database test"));
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isUseSql("create database if not exist test"));
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isUseSql("drop database test"));
|
||||||
|
Assert.assertTrue(SqlSyntaxValidator.isUseSql("drop database if exist test"));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue