commit
b694b2c378
|
@ -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.20-dist.jar DESTINATION connector/jdbc)
|
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/taos-jdbcdriver-2.0.21-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.20-dist.jar ${LIBRARY_OUTPUT_PATH}
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/target/taos-jdbcdriver-2.0.21-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.20</version>
|
<version>2.0.21</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>JDBCDriver</name>
|
<name>JDBCDriver</name>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.20</version>
|
<version>2.0.21</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>
|
||||||
|
|
|
@ -308,7 +308,7 @@ public class DatabaseMetaDataResultSet implements ResultSet {
|
||||||
return colMetaData.getColIndex() + 1;
|
return colMetaData.getColIndex() + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,16 +14,13 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Types;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public abstract class TSDBConstants {
|
public abstract class TSDBConstants {
|
||||||
|
|
||||||
public static final String STATEMENT_CLOSED = "statement is closed";
|
|
||||||
public static final String UNSUPPORTED_METHOD_EXCEPTION_MSG = "this operation is NOT supported currently!";
|
|
||||||
public static final String INVALID_VARIABLES = "invalid variables";
|
|
||||||
public static final String RESULT_SET_IS_CLOSED = "resultSet is closed";
|
|
||||||
|
|
||||||
public static final String DEFAULT_PORT = "6200";
|
public static final String DEFAULT_PORT = "6200";
|
||||||
public static Map<Integer, String> DATATYPE_MAP = null;
|
public static Map<Integer, String> DATATYPE_MAP = null;
|
||||||
|
|
||||||
|
@ -77,8 +74,65 @@ public abstract class TSDBConstants {
|
||||||
return WrapErrMsg("unkown error!");
|
return WrapErrMsg("unkown error!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int taosType2JdbcType(int taosType) throws SQLException {
|
||||||
|
switch (taosType) {
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_NULL:
|
||||||
|
return Types.NULL;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||||
|
return Types.BOOLEAN;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||||
|
return Types.TINYINT;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
return Types.SMALLINT;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_INT:
|
||||||
|
return Types.INTEGER;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_BIGINT:
|
||||||
|
return Types.BIGINT;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return Types.FLOAT;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
return Types.DOUBLE;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||||
|
return Types.BINARY;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
return Types.TIMESTAMP;
|
||||||
|
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||||
|
return Types.NCHAR;
|
||||||
|
}
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int jdbcType2TaosType(int jdbcType) throws SQLException {
|
||||||
|
switch (jdbcType){
|
||||||
|
case Types.NULL:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_NULL;
|
||||||
|
case Types.BOOLEAN:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_BOOL;
|
||||||
|
case Types.TINYINT:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_TINYINT;
|
||||||
|
case Types.SMALLINT:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_SMALLINT;
|
||||||
|
case Types.INTEGER:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_INT;
|
||||||
|
case Types.BIGINT:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_BIGINT;
|
||||||
|
case Types.FLOAT:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_FLOAT;
|
||||||
|
case Types.DOUBLE:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_DOUBLE;
|
||||||
|
case Types.BINARY:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_BINARY;
|
||||||
|
case Types.TIMESTAMP:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP;
|
||||||
|
case Types.NCHAR:
|
||||||
|
return TSDBConstants.TSDB_DATA_TYPE_NCHAR;
|
||||||
|
}
|
||||||
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE);
|
||||||
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
DATATYPE_MAP = new HashMap<>();
|
DATATYPE_MAP = new HashMap<>();
|
||||||
|
DATATYPE_MAP.put(0, "NULL");
|
||||||
DATATYPE_MAP.put(1, "BOOL");
|
DATATYPE_MAP.put(1, "BOOL");
|
||||||
DATATYPE_MAP.put(2, "TINYINT");
|
DATATYPE_MAP.put(2, "TINYINT");
|
||||||
DATATYPE_MAP.put(3, "SMALLINT");
|
DATATYPE_MAP.put(3, "SMALLINT");
|
||||||
|
@ -90,4 +144,8 @@ public abstract class TSDBConstants {
|
||||||
DATATYPE_MAP.put(9, "TIMESTAMP");
|
DATATYPE_MAP.put(9, "TIMESTAMP");
|
||||||
DATATYPE_MAP.put(10, "NCHAR");
|
DATATYPE_MAP.put(10, "NCHAR");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String jdbcType2TaosTypeName(int type) throws SQLException {
|
||||||
|
return DATATYPE_MAP.get(jdbcType2TaosType(type));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ public class TSDBErrorNumbers {
|
||||||
public static final int ERROR_INVALID_FOR_EXECUTE = 0x230c; //not a valid sql for execute: (SQL)
|
public static final int ERROR_INVALID_FOR_EXECUTE = 0x230c; //not a valid sql for execute: (SQL)
|
||||||
public static final int ERROR_PARAMETER_INDEX_OUT_RANGE = 0x230d; // parameter index out of range
|
public static final int ERROR_PARAMETER_INDEX_OUT_RANGE = 0x230d; // parameter index out of range
|
||||||
public static final int ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED = 0x230e; // connection already closed
|
public static final int ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED = 0x230e; // connection already closed
|
||||||
|
public static final int ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE = 0x230f; //unknown sql type in tdengine
|
||||||
|
|
||||||
public static final int ERROR_UNKNOWN = 0x2350; //unknown error
|
public static final int ERROR_UNKNOWN = 0x2350; //unknown error
|
||||||
|
|
||||||
|
@ -49,6 +50,7 @@ public class TSDBErrorNumbers {
|
||||||
errorNumbers.add(ERROR_INVALID_FOR_EXECUTE);
|
errorNumbers.add(ERROR_INVALID_FOR_EXECUTE);
|
||||||
errorNumbers.add(ERROR_PARAMETER_INDEX_OUT_RANGE);
|
errorNumbers.add(ERROR_PARAMETER_INDEX_OUT_RANGE);
|
||||||
errorNumbers.add(ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
errorNumbers.add(ERROR_SQLCLIENT_EXCEPTION_ON_CONNECTION_CLOSED);
|
||||||
|
errorNumbers.add(ERROR_UNKNOWN_SQL_TYPE_IN_TDENGINE);
|
||||||
|
|
||||||
/*****************************************************/
|
/*****************************************************/
|
||||||
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
errorNumbers.add(ERROR_SUBSCRIBE_FAILED);
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.sql.Timestamp;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TSDBResultSetMetaData implements ResultSetMetaData {
|
public class TSDBResultSetMetaData extends WrapperImpl implements ResultSetMetaData {
|
||||||
|
|
||||||
List<ColumnMetaData> colMetaDataList = null;
|
List<ColumnMetaData> colMetaDataList = null;
|
||||||
|
|
||||||
|
@ -28,14 +28,6 @@ public class TSDBResultSetMetaData implements ResultSetMetaData {
|
||||||
this.colMetaDataList = metaDataList;
|
this.colMetaDataList = metaDataList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> T unwrap(Class<T> iface) throws SQLException {
|
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isWrapperFor(Class<?> iface) throws SQLException {
|
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getColumnCount() throws SQLException {
|
public int getColumnCount() throws SQLException {
|
||||||
return colMetaDataList.size();
|
return colMetaDataList.size();
|
||||||
}
|
}
|
||||||
|
@ -94,7 +86,7 @@ public class TSDBResultSetMetaData implements ResultSetMetaData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSchemaName(int column) throws SQLException {
|
public String getSchemaName(int column) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPrecision(int column) throws SQLException {
|
public int getPrecision(int column) throws SQLException {
|
||||||
|
@ -125,18 +117,18 @@ public class TSDBResultSetMetaData implements ResultSetMetaData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTableName(int column) throws SQLException {
|
public String getTableName(int column) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCatalogName(int column) throws SQLException {
|
public String getCatalogName(int column) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getColumnType(int column) throws SQLException {
|
public int getColumnType(int column) throws SQLException {
|
||||||
ColumnMetaData meta = this.colMetaDataList.get(column - 1);
|
ColumnMetaData meta = this.colMetaDataList.get(column - 1);
|
||||||
switch (meta.getColType()) {
|
switch (meta.getColType()) {
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
case TSDBConstants.TSDB_DATA_TYPE_BOOL:
|
||||||
return java.sql.Types.BIT;
|
return Types.BOOLEAN;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
case TSDBConstants.TSDB_DATA_TYPE_TINYINT:
|
||||||
return java.sql.Types.TINYINT;
|
return java.sql.Types.TINYINT;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
case TSDBConstants.TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
@ -150,13 +142,13 @@ public class TSDBResultSetMetaData implements ResultSetMetaData {
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
case TSDBConstants.TSDB_DATA_TYPE_DOUBLE:
|
||||||
return java.sql.Types.DOUBLE;
|
return java.sql.Types.DOUBLE;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
case TSDBConstants.TSDB_DATA_TYPE_BINARY:
|
||||||
return java.sql.Types.CHAR;
|
return Types.BINARY;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
return java.sql.Types.BIGINT;
|
return java.sql.Types.TIMESTAMP;
|
||||||
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
case TSDBConstants.TSDB_DATA_TYPE_NCHAR:
|
||||||
return java.sql.Types.CHAR;
|
return Types.NCHAR;
|
||||||
}
|
}
|
||||||
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getColumnTypeName(int column) throws SQLException {
|
public String getColumnTypeName(int column) throws SQLException {
|
||||||
|
@ -173,7 +165,7 @@ public class TSDBResultSetMetaData implements ResultSetMetaData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDefinitelyWritable(int column) throws SQLException {
|
public boolean isDefinitelyWritable(int column) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getColumnClassName(int column) throws SQLException {
|
public String getColumnClassName(int column) throws SQLException {
|
||||||
|
|
|
@ -1153,11 +1153,11 @@ public class TSDBResultSetWrapper implements ResultSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
|
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
|
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
|
||||||
throw new SQLException(TSDBConstants.UNSUPPORTED_METHOD_EXCEPTION_MSG);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_METHOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,12 +14,11 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import javax.management.OperationsException;
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
public class TSDBSubscribe {
|
public class TSDBSubscribe {
|
||||||
private TSDBJNIConnector connecter = null;
|
private final TSDBJNIConnector connecter;
|
||||||
private long id = 0;
|
private final long id;
|
||||||
|
|
||||||
TSDBSubscribe(TSDBJNIConnector connecter, long id) throws SQLException {
|
TSDBSubscribe(TSDBJNIConnector connecter, long id) throws SQLException {
|
||||||
if (null != connecter) {
|
if (null != connecter) {
|
||||||
|
|
|
@ -18,10 +18,10 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
private final String database;
|
private final String database;
|
||||||
private final Statement statement;
|
private final Statement statement;
|
||||||
// data
|
// data
|
||||||
private ArrayList<ArrayList<Object>> resultSet = new ArrayList<>();
|
private ArrayList<ArrayList<Object>> resultSet;
|
||||||
// meta
|
// meta
|
||||||
private ArrayList<String> columnNames = new ArrayList<>();
|
private ArrayList<String> columnNames;
|
||||||
private ArrayList<Field> columns = new ArrayList<>();
|
private ArrayList<Field> columns;
|
||||||
private RestfulResultSetMetaData metaData;
|
private RestfulResultSetMetaData metaData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,11 +29,36 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
*
|
*
|
||||||
* @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
* @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
||||||
***/
|
***/
|
||||||
public RestfulResultSet(String database, Statement statement, JSONObject resultJson) {
|
public RestfulResultSet(String database, Statement statement, JSONObject resultJson) throws SQLException {
|
||||||
this.database = database;
|
this.database = database;
|
||||||
this.statement = statement;
|
this.statement = statement;
|
||||||
|
// column metadata
|
||||||
|
JSONArray columnMeta = resultJson.getJSONArray("column_meta");
|
||||||
|
columnNames = new ArrayList<>();
|
||||||
|
columns = new ArrayList<>();
|
||||||
|
for (int colIndex = 0; colIndex < columnMeta.size(); colIndex++) {
|
||||||
|
JSONArray col = columnMeta.getJSONArray(colIndex);
|
||||||
|
String col_name = col.getString(0);
|
||||||
|
int col_type = TSDBConstants.taosType2JdbcType(col.getInteger(1));
|
||||||
|
int col_length = col.getInteger(2);
|
||||||
|
columnNames.add(col_name);
|
||||||
|
columns.add(new Field(col_name, col_type, col_length, ""));
|
||||||
|
}
|
||||||
|
this.metaData = new RestfulResultSetMetaData(this.database, columns, this);
|
||||||
|
|
||||||
// row data
|
// row data
|
||||||
JSONArray data = resultJson.getJSONArray("data");
|
JSONArray data = resultJson.getJSONArray("data");
|
||||||
|
resultSet = new ArrayList<>();
|
||||||
|
for (int rowIndex = 0; rowIndex < data.size(); rowIndex++) {
|
||||||
|
ArrayList row = new ArrayList();
|
||||||
|
JSONArray jsonRow = data.getJSONArray(rowIndex);
|
||||||
|
for (int colIndex = 0; colIndex < jsonRow.size(); colIndex++) {
|
||||||
|
row.add(parseColumnData(jsonRow, colIndex, columns.get(colIndex).type));
|
||||||
|
}
|
||||||
|
resultSet.add(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
int columnIndex = 0;
|
int columnIndex = 0;
|
||||||
for (; columnIndex < data.size(); columnIndex++) {
|
for (; columnIndex < data.size(); columnIndex++) {
|
||||||
ArrayList oneRow = new ArrayList<>();
|
ArrayList oneRow = new ArrayList<>();
|
||||||
|
@ -52,50 +77,77 @@ public class RestfulResultSet extends AbstractResultSet implements ResultSet {
|
||||||
columns.add(new Field(name, "", 0, ""));
|
columns.add(new Field(name, "", 0, ""));
|
||||||
}
|
}
|
||||||
this.metaData = new RestfulResultSetMetaData(this.database, columns, this);
|
this.metaData = new RestfulResultSetMetaData(this.database, columns, this);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private Object parseColumnData(JSONArray row, int colIndex, int sqlType) {
|
||||||
* 由多个resultSet的JSON构造结果集
|
switch (sqlType) {
|
||||||
*
|
case Types.NULL:
|
||||||
* @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
return null;
|
||||||
* @param fieldJson: 包含多个(最多2个)meta信息的结果集,有describe xxx
|
case Types.BOOLEAN:
|
||||||
**/
|
return row.getBoolean(colIndex);
|
||||||
public RestfulResultSet(String database, Statement statement, JSONObject resultJson, List<JSONObject> fieldJson) {
|
case Types.TINYINT:
|
||||||
this(database, statement, resultJson);
|
case Types.SMALLINT:
|
||||||
ArrayList<Field> newColumns = new ArrayList<>();
|
return row.getShort(colIndex);
|
||||||
|
case Types.INTEGER:
|
||||||
for (Field column : columns) {
|
return row.getInteger(colIndex);
|
||||||
Field field = findField(column.name, fieldJson);
|
case Types.BIGINT:
|
||||||
if (field != null) {
|
return row.getBigInteger(colIndex);
|
||||||
newColumns.add(field);
|
case Types.FLOAT:
|
||||||
} else {
|
return row.getFloat(colIndex);
|
||||||
newColumns.add(column);
|
case Types.DOUBLE:
|
||||||
}
|
return row.getDouble(colIndex);
|
||||||
|
case Types.TIMESTAMP:
|
||||||
|
return new Timestamp(row.getDate(colIndex).getTime());
|
||||||
|
case Types.BINARY:
|
||||||
|
case Types.NCHAR:
|
||||||
|
default:
|
||||||
|
return row.getString(colIndex);
|
||||||
}
|
}
|
||||||
this.columns = newColumns;
|
|
||||||
this.metaData = new RestfulResultSetMetaData(this.database, this.columns, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Field findField(String columnName, List<JSONObject> fieldJsonList) {
|
// /**
|
||||||
for (JSONObject fieldJSON : fieldJsonList) {
|
// * 由多个resultSet的JSON构造结果集
|
||||||
JSONArray fieldDataJson = fieldJSON.getJSONArray("data");
|
// *
|
||||||
for (int i = 0; i < fieldDataJson.size(); i++) {
|
// * @param resultJson: 包含data信息的结果集,有sql返回的结果集
|
||||||
JSONArray field = fieldDataJson.getJSONArray(i);
|
// * @param fieldJson: 包含多个(最多2个)meta信息的结果集,有describe xxx
|
||||||
if (columnName.equalsIgnoreCase(field.getString(0))) {
|
// **/
|
||||||
return new Field(field.getString(0), field.getString(1), field.getInteger(2), field.getString(3));
|
// public RestfulResultSet(String database, Statement statement, JSONObject resultJson, List<JSONObject> fieldJson) throws SQLException {
|
||||||
}
|
// this(database, statement, resultJson);
|
||||||
}
|
// ArrayList<Field> newColumns = new ArrayList<>();
|
||||||
}
|
//
|
||||||
return null;
|
// for (Field column : columns) {
|
||||||
}
|
// Field field = findField(column.name, fieldJson);
|
||||||
|
// if (field != null) {
|
||||||
|
// newColumns.add(field);
|
||||||
|
// } else {
|
||||||
|
// newColumns.add(column);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// this.columns = newColumns;
|
||||||
|
// this.metaData = new RestfulResultSetMetaData(this.database, this.columns, this);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public Field findField(String columnName, List<JSONObject> fieldJsonList) {
|
||||||
|
// for (JSONObject fieldJSON : fieldJsonList) {
|
||||||
|
// JSONArray fieldDataJson = fieldJSON.getJSONArray("data");
|
||||||
|
// for (int i = 0; i < fieldDataJson.size(); i++) {
|
||||||
|
// JSONArray field = fieldDataJson.getJSONArray(i);
|
||||||
|
// if (columnName.equalsIgnoreCase(field.getString(0))) {
|
||||||
|
// return new Field(field.getString(0), field.getString(1), field.getInteger(2), field.getString(3));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
|
||||||
public class Field {
|
public class Field {
|
||||||
String name;
|
String name;
|
||||||
String type;
|
int type;
|
||||||
int length;
|
int length;
|
||||||
String note;
|
String note;
|
||||||
|
|
||||||
public Field(String name, String type, int length, String note) {
|
public Field(String name, int type, int length, String note) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.length = length;
|
this.length = length;
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.taosdata.jdbc.TSDBConstants;
|
||||||
import java.sql.ResultSetMetaData;
|
import java.sql.ResultSetMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
import java.sql.Types;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class RestfulResultSetMetaData implements ResultSetMetaData {
|
public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||||
|
@ -53,14 +54,14 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSigned(int column) throws SQLException {
|
public boolean isSigned(int column) throws SQLException {
|
||||||
String type = this.fields.get(column - 1).type.toUpperCase();
|
int type = this.fields.get(column - 1).type;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "TINYINT":
|
case Types.TINYINT:
|
||||||
case "SMALLINT":
|
case Types.SMALLINT:
|
||||||
case "INT":
|
case Types.INTEGER:
|
||||||
case "BIGINT":
|
case Types.BIGINT:
|
||||||
case "FLOAT":
|
case Types.FLOAT:
|
||||||
case "DOUBLE":
|
case Types.DOUBLE:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@ -89,14 +90,14 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getPrecision(int column) throws SQLException {
|
public int getPrecision(int column) throws SQLException {
|
||||||
String type = this.fields.get(column - 1).type.toUpperCase();
|
int type = this.fields.get(column - 1).type;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "FLOAT":
|
case Types.FLOAT:
|
||||||
return 5;
|
return 5;
|
||||||
case "DOUBLE":
|
case Types.DOUBLE:
|
||||||
return 9;
|
return 9;
|
||||||
case "BINARY":
|
case Types.BINARY:
|
||||||
case "NCHAR":
|
case Types.NCHAR:
|
||||||
return this.fields.get(column - 1).length;
|
return this.fields.get(column - 1).length;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -105,11 +106,11 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getScale(int column) throws SQLException {
|
public int getScale(int column) throws SQLException {
|
||||||
String type = this.fields.get(column - 1).type.toUpperCase();
|
int type = this.fields.get(column - 1).type;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "FLOAT":
|
case Types.FLOAT:
|
||||||
return 5;
|
return 5;
|
||||||
case "DOUBLE":
|
case Types.DOUBLE:
|
||||||
return 9;
|
return 9;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -128,36 +129,13 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getColumnType(int column) throws SQLException {
|
public int getColumnType(int column) throws SQLException {
|
||||||
String type = this.fields.get(column - 1).type.toUpperCase();
|
return this.fields.get(column - 1).type;
|
||||||
switch (type) {
|
|
||||||
case "BOOL":
|
|
||||||
return java.sql.Types.BOOLEAN;
|
|
||||||
case "TINYINT":
|
|
||||||
return java.sql.Types.TINYINT;
|
|
||||||
case "SMALLINT":
|
|
||||||
return java.sql.Types.SMALLINT;
|
|
||||||
case "INT":
|
|
||||||
return java.sql.Types.INTEGER;
|
|
||||||
case "BIGINT":
|
|
||||||
return java.sql.Types.BIGINT;
|
|
||||||
case "FLOAT":
|
|
||||||
return java.sql.Types.FLOAT;
|
|
||||||
case "DOUBLE":
|
|
||||||
return java.sql.Types.DOUBLE;
|
|
||||||
case "BINARY":
|
|
||||||
return java.sql.Types.BINARY;
|
|
||||||
case "TIMESTAMP":
|
|
||||||
return java.sql.Types.TIMESTAMP;
|
|
||||||
case "NCHAR":
|
|
||||||
return java.sql.Types.NCHAR;
|
|
||||||
}
|
|
||||||
throw new SQLException(TSDBConstants.INVALID_VARIABLES);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getColumnTypeName(int column) throws SQLException {
|
public String getColumnTypeName(int column) throws SQLException {
|
||||||
String type = fields.get(column - 1).type;
|
int type = fields.get(column - 1).type;
|
||||||
return type.toUpperCase();
|
return TSDBConstants.jdbcType2TaosTypeName(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -177,26 +155,26 @@ public class RestfulResultSetMetaData implements ResultSetMetaData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getColumnClassName(int column) throws SQLException {
|
public String getColumnClassName(int column) throws SQLException {
|
||||||
String type = this.fields.get(column - 1).type;
|
int type = this.fields.get(column - 1).type;
|
||||||
String columnClassName = "";
|
String columnClassName = "";
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "BOOL":
|
case Types.BOOLEAN:
|
||||||
return Boolean.class.getName();
|
return Boolean.class.getName();
|
||||||
case "TINYINT":
|
case Types.TINYINT:
|
||||||
case "SMALLINT":
|
case Types.SMALLINT:
|
||||||
return Short.class.getName();
|
return Short.class.getName();
|
||||||
case "INT":
|
case Types.INTEGER:
|
||||||
return Integer.class.getName();
|
return Integer.class.getName();
|
||||||
case "BIGINT":
|
case Types.BIGINT:
|
||||||
return Long.class.getName();
|
return Long.class.getName();
|
||||||
case "FLOAT":
|
case Types.FLOAT:
|
||||||
return Float.class.getName();
|
return Float.class.getName();
|
||||||
case "DOUBLE":
|
case Types.DOUBLE:
|
||||||
return Double.class.getName();
|
return Double.class.getName();
|
||||||
case "TIMESTAMP":
|
case Types.TIMESTAMP:
|
||||||
return Timestamp.class.getName();
|
return Timestamp.class.getName();
|
||||||
case "BINARY":
|
case Types.BINARY:
|
||||||
case "NCHAR":
|
case Types.NCHAR:
|
||||||
return String.class.getName();
|
return String.class.getName();
|
||||||
}
|
}
|
||||||
return columnClassName;
|
return columnClassName;
|
||||||
|
|
|
@ -151,22 +151,21 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
|
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + resultJson.getString("desc") + "\n" + "error code: " + resultJson.getString("code")));
|
||||||
}
|
}
|
||||||
// parse table name from sql
|
// parse table name from sql
|
||||||
String[] tableIdentifiers = parseTableIdentifier(sql);
|
// String[] tableIdentifiers = parseTableIdentifier(sql);
|
||||||
if (tableIdentifiers != null) {
|
// if (tableIdentifiers != null) {
|
||||||
List<JSONObject> fieldJsonList = new ArrayList<>();
|
// List<JSONObject> fieldJsonList = new ArrayList<>();
|
||||||
for (String tableIdentifier : tableIdentifiers) {
|
// for (String tableIdentifier : tableIdentifiers) {
|
||||||
// field meta
|
// String fields = HttpClientPoolUtil.execute(url, "DESCRIBE " + tableIdentifier);
|
||||||
String fields = HttpClientPoolUtil.execute(url, "DESCRIBE " + tableIdentifier);
|
// JSONObject fieldJson = JSON.parseObject(fields);
|
||||||
JSONObject fieldJson = JSON.parseObject(fields);
|
// if (fieldJson.getString("status").equals("error")) {
|
||||||
if (fieldJson.getString("status").equals("error")) {
|
// throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + fieldJson.getString("desc") + "\n" + "error code: " + fieldJson.getString("code")));
|
||||||
throw new SQLException(TSDBConstants.WrapErrMsg("SQL execution error: " + fieldJson.getString("desc") + "\n" + "error code: " + fieldJson.getString("code")));
|
// }
|
||||||
}
|
// fieldJsonList.add(fieldJson);
|
||||||
fieldJsonList.add(fieldJson);
|
// }
|
||||||
}
|
// this.resultSet = new RestfulResultSet(database, this, resultJson, fieldJsonList);
|
||||||
this.resultSet = new RestfulResultSet(database, this, resultJson, fieldJsonList);
|
// } else {
|
||||||
} else {
|
this.resultSet = new RestfulResultSet(database, this, resultJson);
|
||||||
this.resultSet = new RestfulResultSet(database, this, resultJson);
|
// }
|
||||||
}
|
|
||||||
this.affectedRows = 0;
|
this.affectedRows = 0;
|
||||||
return resultSet;
|
return resultSet;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +200,7 @@ public class RestfulStatement extends AbstractStatement {
|
||||||
@Override
|
@Override
|
||||||
public ResultSet getResultSet() throws SQLException {
|
public ResultSet getResultSet() throws SQLException {
|
||||||
if (isClosed())
|
if (isClosed())
|
||||||
throw new SQLException(TSDBConstants.STATEMENT_CLOSED);
|
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_STATEMENT_CLOSED);
|
||||||
return resultSet;
|
return resultSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@ import java.util.HashMap;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
public class ResultSetTest {
|
public class ResultSetTest {
|
||||||
static Connection connection;
|
static Connection connection;
|
||||||
|
|
|
@ -48,29 +48,28 @@ public class SubscribeTest {
|
||||||
@Test
|
@Test
|
||||||
public void subscribe() {
|
public void subscribe() {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
String rawSql = "select * from " + dbName + "." + tName + ";";
|
String rawSql = "select * from " + dbName + "." + tName + ";";
|
||||||
System.out.println(rawSql);
|
System.out.println(rawSql);
|
||||||
TSDBSubscribe subscribe = ((TSDBConnection) connection).subscribe(topic, rawSql, false);
|
// TSDBSubscribe subscribe = ((TSDBConnection) connection).subscribe(topic, rawSql, false);
|
||||||
|
|
||||||
int a = 0;
|
// int a = 0;
|
||||||
while (true) {
|
// while (true) {
|
||||||
TimeUnit.MILLISECONDS.sleep(1000);
|
// TimeUnit.MILLISECONDS.sleep(1000);
|
||||||
TSDBResultSet resSet = subscribe.consume();
|
// TSDBResultSet resSet = subscribe.consume();
|
||||||
while (resSet.next()) {
|
// while (resSet.next()) {
|
||||||
for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) {
|
// for (int i = 1; i <= resSet.getMetaData().getColumnCount(); i++) {
|
||||||
System.out.printf(i + ": " + resSet.getString(i) + "\t");
|
// System.out.printf(i + ": " + resSet.getString(i) + "\t");
|
||||||
}
|
// }
|
||||||
System.out.println("\n======" + a + "==========");
|
// System.out.println("\n======" + a + "==========");
|
||||||
}
|
// }
|
||||||
a++;
|
// a++;
|
||||||
if (a >= 2) {
|
// if (a >= 2) {
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
// resSet.close();
|
// resSet.close();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
subscribe.close(true);
|
// subscribe.close(true);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ import java.util.Random;
|
||||||
public class RestfulJDBCTest {
|
public class RestfulJDBCTest {
|
||||||
|
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
// private static final String host = "master";
|
// private static final String host = "master";
|
||||||
private static Connection connection;
|
private static Connection connection;
|
||||||
private Random random = new Random(System.currentTimeMillis());
|
private Random random = new Random(System.currentTimeMillis());
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import java.sql.*;
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
public class SQLTest {
|
public class SQLTest {
|
||||||
private static final String host = "127.0.0.1";
|
private static final String host = "127.0.0.1";
|
||||||
// private static final String host = "master";
|
// private static final String host = "master";
|
||||||
private static Connection connection;
|
private static Connection connection;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -323,6 +323,18 @@ public class SQLTest {
|
||||||
SQLExecutor.executeQuery(connection, sql);
|
SQLExecutor.executeQuery(connection, sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase052() {
|
||||||
|
String sql = "select server_status()";
|
||||||
|
SQLExecutor.executeQuery(connection, sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCase053() {
|
||||||
|
String sql = "select avg(cpu_taosd), avg(cpu_system), max(cpu_cores), avg(mem_taosd), avg(mem_system), max(mem_total), avg(disk_used), max(disk_total), avg(band_speed), avg(io_read), avg(io_write), sum(req_http), sum(req_select), sum(req_insert) from log.dn1 where ts> now - 60m and ts<= now interval(1m) fill(value, 0)";
|
||||||
|
SQLExecutor.executeQuery(connection, sql);
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void before() throws ClassNotFoundException, SQLException {
|
public static void before() throws ClassNotFoundException, SQLException {
|
||||||
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
|
||||||
|
|
|
@ -63,7 +63,9 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.taosdata.jdbc</groupId>
|
<groupId>com.taosdata.jdbc</groupId>
|
||||||
<artifactId>taos-jdbcdriver</artifactId>
|
<artifactId>taos-jdbcdriver</artifactId>
|
||||||
<version>2.0.18</version>
|
<version>2.0.20</version>
|
||||||
|
<!-- <scope>system</scope>-->
|
||||||
|
<!-- <systemPath>${project.basedir}/src/main/resources/taos-jdbcdriver-2.0.20-dist.jar</systemPath>-->
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
@ -10,4 +10,4 @@ public class SpringbootdemoApplication {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(SpringbootdemoApplication.class, args);
|
SpringApplication.run(SpringbootdemoApplication.class, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@RequestMapping("/weather")
|
@RequestMapping("/weather")
|
||||||
@RestController
|
@RestController
|
||||||
|
@ -20,7 +21,7 @@ public class WeatherController {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/init")
|
@GetMapping("/init")
|
||||||
public boolean init() {
|
public int init() {
|
||||||
return weatherService.init();
|
return weatherService.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,19 +45,23 @@ public class WeatherController {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@PostMapping("/{temperature}/{humidity}")
|
@PostMapping("/{temperature}/{humidity}")
|
||||||
public int saveWeather(@PathVariable int temperature, @PathVariable float humidity) {
|
public int saveWeather(@PathVariable float temperature, @PathVariable int humidity) {
|
||||||
return weatherService.save(temperature, humidity);
|
return weatherService.save(temperature, humidity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@GetMapping("/count")
|
||||||
* upload multi weather info
|
public int count() {
|
||||||
*
|
return weatherService.count();
|
||||||
* @param weatherList
|
}
|
||||||
* @return
|
|
||||||
*/
|
@GetMapping("/subTables")
|
||||||
@PostMapping("/batch")
|
public List<String> getSubTables() {
|
||||||
public int batchSaveWeather(@RequestBody List<Weather> weatherList) {
|
return weatherService.getSubTables();
|
||||||
return weatherService.save(weatherList);
|
}
|
||||||
|
|
||||||
|
@GetMapping("/avg")
|
||||||
|
public List<Weather> avg() {
|
||||||
|
return weatherService.avg();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,16 +4,26 @@ import com.taosdata.example.springbootdemo.domain.Weather;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface WeatherMapper {
|
public interface WeatherMapper {
|
||||||
|
|
||||||
int insert(Weather weather);
|
void dropDB();
|
||||||
|
|
||||||
int batchInsert(List<Weather> weatherList);
|
|
||||||
|
|
||||||
List<Weather> select(@Param("limit") Long limit, @Param("offset")Long offset);
|
|
||||||
|
|
||||||
void createDB();
|
void createDB();
|
||||||
|
|
||||||
void createTable();
|
void createSuperTable();
|
||||||
|
|
||||||
|
void createTable(Weather weather);
|
||||||
|
|
||||||
|
List<Weather> select(@Param("limit") Long limit, @Param("offset") Long offset);
|
||||||
|
|
||||||
|
int insert(Weather weather);
|
||||||
|
|
||||||
|
int count();
|
||||||
|
|
||||||
|
List<String> getSubTables();
|
||||||
|
|
||||||
|
List<Weather> avg();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,28 +4,29 @@
|
||||||
<mapper namespace="com.taosdata.example.springbootdemo.dao.WeatherMapper">
|
<mapper namespace="com.taosdata.example.springbootdemo.dao.WeatherMapper">
|
||||||
|
|
||||||
<resultMap id="BaseResultMap" type="com.taosdata.example.springbootdemo.domain.Weather">
|
<resultMap id="BaseResultMap" type="com.taosdata.example.springbootdemo.domain.Weather">
|
||||||
<id column="ts" jdbcType="TIMESTAMP" property="ts" />
|
<id column="ts" jdbcType="TIMESTAMP" property="ts"/>
|
||||||
<result column="temperature" jdbcType="INTEGER" property="temperature" />
|
<result column="temperature" jdbcType="FLOAT" property="temperature"/>
|
||||||
<result column="humidity" jdbcType="FLOAT" property="humidity" />
|
<result column="humidity" jdbcType="FLOAT" property="humidity"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<update id="createDB" >
|
<update id="dropDB">
|
||||||
create database if not exists test;
|
drop database if exists test
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
<update id="createTable" >
|
<update id="createDB">
|
||||||
create table if not exists test.weather(ts timestamp, temperature int, humidity float);
|
create database if not exists test
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
<sql id="Base_Column_List">
|
<update id="createSuperTable">
|
||||||
ts, temperature, humidity
|
create table if not exists test.weather(ts timestamp, temperature float, humidity float) tags(location nchar(64), groupId int)
|
||||||
</sql>
|
</update>
|
||||||
|
|
||||||
|
<update id="createTable" parameterType="com.taosdata.example.springbootdemo.domain.Weather">
|
||||||
|
create table if not exists test.t#{groupId} using test.weather tags(#{location}, #{groupId})
|
||||||
|
</update>
|
||||||
|
|
||||||
<select id="select" resultMap="BaseResultMap">
|
<select id="select" resultMap="BaseResultMap">
|
||||||
select
|
select * from test.weather order by ts desc
|
||||||
<include refid="Base_Column_List" />
|
|
||||||
from test.weather
|
|
||||||
order by ts desc
|
|
||||||
<if test="limit != null">
|
<if test="limit != null">
|
||||||
limit #{limit,jdbcType=BIGINT}
|
limit #{limit,jdbcType=BIGINT}
|
||||||
</if>
|
</if>
|
||||||
|
@ -34,16 +35,26 @@
|
||||||
</if>
|
</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<insert id="insert" parameterType="com.taosdata.example.springbootdemo.domain.Weather" >
|
<insert id="insert" parameterType="com.taosdata.example.springbootdemo.domain.Weather">
|
||||||
insert into test.weather (ts, temperature, humidity) values (now, #{temperature,jdbcType=INTEGER}, #{humidity,jdbcType=FLOAT})
|
insert into test.t#{groupId} (ts, temperature, humidity) values (#{ts}, ${temperature}, ${humidity})
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<insert id="batchInsert" parameterType="java.util.List" >
|
<select id="getSubTables" resultType="String">
|
||||||
insert into test.weather (ts, temperature, humidity) values
|
select tbname from test.weather
|
||||||
<foreach separator=" " collection="list" item="weather" index="index" >
|
</select>
|
||||||
(now + #{index}a, #{weather.temperature}, #{weather.humidity})
|
|
||||||
</foreach>
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
|
<select id="count" resultType="int">
|
||||||
|
select count(*) from test.weather
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<resultMap id="avgResultSet" type="com.taosdata.example.springbootdemo.domain.Weather">
|
||||||
|
<id column="ts" jdbcType="TIMESTAMP" property="ts" />
|
||||||
|
<result column="avg(temperature)" jdbcType="FLOAT" property="temperature" />
|
||||||
|
<result column="avg(humidity)" jdbcType="FLOAT" property="humidity" />
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="avg" resultMap="avgResultSet">
|
||||||
|
select avg(temperature), avg(humidity)from test.weather interval(1m)
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
|
@ -6,12 +6,21 @@ import java.sql.Timestamp;
|
||||||
|
|
||||||
public class Weather {
|
public class Weather {
|
||||||
|
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS",timezone = "GMT+8")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS", timezone = "GMT+8")
|
||||||
private Timestamp ts;
|
private Timestamp ts;
|
||||||
|
private float temperature;
|
||||||
private int temperature;
|
|
||||||
|
|
||||||
private float humidity;
|
private float humidity;
|
||||||
|
private String location;
|
||||||
|
private int groupId;
|
||||||
|
|
||||||
|
public Weather() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Weather(Timestamp ts, float temperature, float humidity) {
|
||||||
|
this.ts = ts;
|
||||||
|
this.temperature = temperature;
|
||||||
|
this.humidity = humidity;
|
||||||
|
}
|
||||||
|
|
||||||
public Timestamp getTs() {
|
public Timestamp getTs() {
|
||||||
return ts;
|
return ts;
|
||||||
|
@ -21,11 +30,11 @@ public class Weather {
|
||||||
this.ts = ts;
|
this.ts = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTemperature() {
|
public float getTemperature() {
|
||||||
return temperature;
|
return temperature;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTemperature(int temperature) {
|
public void setTemperature(float temperature) {
|
||||||
this.temperature = temperature;
|
this.temperature = temperature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,4 +45,20 @@ public class Weather {
|
||||||
public void setHumidity(float humidity) {
|
public void setHumidity(float humidity) {
|
||||||
this.humidity = humidity;
|
this.humidity = humidity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocation(String location) {
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getGroupId() {
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId(int groupId) {
|
||||||
|
this.groupId = groupId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,25 +5,41 @@ import com.taosdata.example.springbootdemo.domain.Weather;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class WeatherService {
|
public class WeatherService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private WeatherMapper weatherMapper;
|
private WeatherMapper weatherMapper;
|
||||||
|
private Random random = new Random(System.currentTimeMillis());
|
||||||
|
private String[] locations = {"北京", "上海", "广州", "深圳", "天津"};
|
||||||
|
|
||||||
public boolean init() {
|
public int init() {
|
||||||
|
weatherMapper.dropDB();
|
||||||
weatherMapper.createDB();
|
weatherMapper.createDB();
|
||||||
weatherMapper.createTable();
|
weatherMapper.createSuperTable();
|
||||||
return true;
|
long ts = System.currentTimeMillis();
|
||||||
|
long thirtySec = 1000 * 30;
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
Weather weather = new Weather(new Timestamp(ts + (thirtySec * i)), 30 * random.nextFloat(), random.nextInt(100));
|
||||||
|
weather.setLocation(locations[random.nextInt(locations.length)]);
|
||||||
|
weather.setGroupId(i % locations.length);
|
||||||
|
weatherMapper.createTable(weather);
|
||||||
|
count += weatherMapper.insert(weather);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Weather> query(Long limit, Long offset) {
|
public List<Weather> query(Long limit, Long offset) {
|
||||||
return weatherMapper.select(limit, offset);
|
return weatherMapper.select(limit, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int save(int temperature, float humidity) {
|
public int save(float temperature, int humidity) {
|
||||||
Weather weather = new Weather();
|
Weather weather = new Weather();
|
||||||
weather.setTemperature(temperature);
|
weather.setTemperature(temperature);
|
||||||
weather.setHumidity(humidity);
|
weather.setHumidity(humidity);
|
||||||
|
@ -31,8 +47,15 @@ public class WeatherService {
|
||||||
return weatherMapper.insert(weather);
|
return weatherMapper.insert(weather);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int save(List<Weather> weatherList) {
|
public int count() {
|
||||||
return weatherMapper.batchInsert(weatherList);
|
return weatherMapper.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getSubTables() {
|
||||||
|
return weatherMapper.getSubTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Weather> avg() {
|
||||||
|
return weatherMapper.avg();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
# datasource config - JDBC-JNI
|
# datasource config - JDBC-JNI
|
||||||
spring.datasource.driver-class-name=com.taosdata.jdbc.TSDBDriver
|
#spring.datasource.driver-class-name=com.taosdata.jdbc.TSDBDriver
|
||||||
spring.datasource.url=jdbc:TAOS://127.0.0.1:6030/test?timezone=UTC-8&charset=UTF-8&locale=en_US.UTF-8
|
#spring.datasource.url=jdbc:TAOS://127.0.0.1:6030/test?timezone=UTC-8&charset=UTF-8&locale=en_US.UTF-8
|
||||||
spring.datasource.username=root
|
#spring.datasource.username=root
|
||||||
spring.datasource.password=taosdata
|
#spring.datasource.password=taosdata
|
||||||
|
|
||||||
# datasource config - JDBC-RESTful
|
# datasource config - JDBC-RESTful
|
||||||
#spring.datasource.driver-class-name=com.taosdata.jdbc.rs.RestfulDriver
|
spring.datasource.driver-class-name=com.taosdata.jdbc.rs.RestfulDriver
|
||||||
#spring.datasource.url=jdbc:TAOS-RS://master:6041/test?user=root&password=taosdata
|
spring.datasource.url=jdbc:TAOS-RS://master:6041/test?timezone=UTC-8&charset=UTF-8&locale=en_US.UTF-8
|
||||||
|
spring.datasource.username=root
|
||||||
|
spring.datasource.password=taosdata
|
||||||
|
|
||||||
spring.datasource.druid.initial-size=5
|
spring.datasource.druid.initial-size=5
|
||||||
spring.datasource.druid.min-idle=5
|
spring.datasource.druid.min-idle=5
|
||||||
|
|
|
@ -4,7 +4,7 @@ import com.taosdata.taosdemo.components.DataSourceFactory;
|
||||||
import com.taosdata.taosdemo.components.JdbcTaosdemoConfig;
|
import com.taosdata.taosdemo.components.JdbcTaosdemoConfig;
|
||||||
import com.taosdata.taosdemo.domain.SuperTableMeta;
|
import com.taosdata.taosdemo.domain.SuperTableMeta;
|
||||||
import com.taosdata.taosdemo.service.DatabaseService;
|
import com.taosdata.taosdemo.service.DatabaseService;
|
||||||
import com.taosdata.taosdemo.service.QueryService;
|
import com.taosdata.taosdemo.service.SqlExecuteTask;
|
||||||
import com.taosdata.taosdemo.service.SubTableService;
|
import com.taosdata.taosdemo.service.SubTableService;
|
||||||
import com.taosdata.taosdemo.service.SuperTableService;
|
import com.taosdata.taosdemo.service.SuperTableService;
|
||||||
import com.taosdata.taosdemo.service.data.SuperTableMetaGenerator;
|
import com.taosdata.taosdemo.service.data.SuperTableMetaGenerator;
|
||||||
|
@ -32,6 +32,17 @@ public class TaosDemoApplication {
|
||||||
}
|
}
|
||||||
// 初始化
|
// 初始化
|
||||||
final DataSource dataSource = DataSourceFactory.getInstance(config.host, config.port, config.user, config.password);
|
final DataSource dataSource = DataSourceFactory.getInstance(config.host, config.port, config.user, config.password);
|
||||||
|
if (config.executeSql != null && !config.executeSql.isEmpty() && !config.executeSql.replaceAll("\\s", "").isEmpty()) {
|
||||||
|
Thread task = new Thread(new SqlExecuteTask(dataSource, config.executeSql));
|
||||||
|
task.start();
|
||||||
|
try {
|
||||||
|
task.join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final DatabaseService databaseService = new DatabaseService(dataSource);
|
final DatabaseService databaseService = new DatabaseService(dataSource);
|
||||||
final SuperTableService superTableService = new SuperTableService(dataSource);
|
final SuperTableService superTableService = new SuperTableService(dataSource);
|
||||||
final SubTableService subTableService = new SubTableService(dataSource);
|
final SubTableService subTableService = new SubTableService(dataSource);
|
||||||
|
@ -96,7 +107,6 @@ public class TaosDemoApplication {
|
||||||
// 查询
|
// 查询
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************************/
|
/**********************************************************************************/
|
||||||
// 删除表
|
// 删除表
|
||||||
if (config.dropTable) {
|
if (config.dropTable) {
|
||||||
|
|
|
@ -42,7 +42,7 @@ public final class JdbcTaosdemoConfig {
|
||||||
public int rate = 10;
|
public int rate = 10;
|
||||||
public long range = 1000l;
|
public long range = 1000l;
|
||||||
// select task
|
// select task
|
||||||
|
public String executeSql;
|
||||||
// drop task
|
// drop task
|
||||||
public boolean dropTable = false;
|
public boolean dropTable = false;
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ public final class JdbcTaosdemoConfig {
|
||||||
System.out.println("-rate The proportion of data out of order. effective only if order is 1. min 0, max 100, default is 10");
|
System.out.println("-rate The proportion of data out of order. effective only if order is 1. min 0, max 100, default is 10");
|
||||||
System.out.println("-range The range of data out of order. effective only if order is 1. default is 1000 ms");
|
System.out.println("-range The range of data out of order. effective only if order is 1. default is 1000 ms");
|
||||||
// query task
|
// query task
|
||||||
// System.out.println("-sqlFile The select sql file");
|
System.out.println("-executeSql execute a specific sql.");
|
||||||
// drop task
|
// drop task
|
||||||
System.out.println("-dropTable Drop data before quit. Default is false");
|
System.out.println("-dropTable Drop data before quit. Default is false");
|
||||||
System.out.println("--help Give this help list");
|
System.out.println("--help Give this help list");
|
||||||
|
@ -207,6 +207,9 @@ public final class JdbcTaosdemoConfig {
|
||||||
range = Integer.parseInt(args[++i]);
|
range = Integer.parseInt(args[++i]);
|
||||||
}
|
}
|
||||||
// select task
|
// select task
|
||||||
|
if ("-executeSql".equals(args[i]) && i < args.length - 1) {
|
||||||
|
executeSql = args[++i];
|
||||||
|
}
|
||||||
|
|
||||||
// drop task
|
// drop task
|
||||||
if ("-dropTable".equals(args[i]) && i < args.length - 1) {
|
if ("-dropTable".equals(args[i]) && i < args.length - 1) {
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.taosdata.taosdemo.service;
|
||||||
|
|
||||||
|
import com.taosdata.taosdemo.utils.Printer;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
|
||||||
|
public class SqlExecuteTask implements Runnable {
|
||||||
|
private final DataSource dataSource;
|
||||||
|
private final String sql;
|
||||||
|
|
||||||
|
public SqlExecuteTask(DataSource dataSource, String sql) {
|
||||||
|
this.dataSource = dataSource;
|
||||||
|
this.sql = sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
boolean execute = stmt.execute(sql);
|
||||||
|
long end = System.currentTimeMillis();
|
||||||
|
if (execute) {
|
||||||
|
ResultSet rs = stmt.getResultSet();
|
||||||
|
Printer.printResult(rs);
|
||||||
|
} else {
|
||||||
|
Printer.printSql(sql, true, (end - start));
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.taosdata.taosdemo.utils;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.ResultSetMetaData;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public class Printer {
|
||||||
|
|
||||||
|
public static void printResult(ResultSet resultSet) throws SQLException {
|
||||||
|
ResultSetMetaData metaData = resultSet.getMetaData();
|
||||||
|
while (resultSet.next()) {
|
||||||
|
for (int i = 1; i <= metaData.getColumnCount(); i++) {
|
||||||
|
String columnLabel = metaData.getColumnLabel(i);
|
||||||
|
String value = resultSet.getString(i);
|
||||||
|
System.out.printf("%s: %s\t", columnLabel, value);
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void printSql(String sql, boolean succeed, long cost) {
|
||||||
|
System.out.println("[ " + (succeed ? "OK" : "ERROR!") + " ] time cost: " + cost + " ms, execute statement ====> " + sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Printer() {
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue