diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java index 5c7f80c715c12d1d3831a4cfbfe5f4a326b569eb..633fdcd5ab7c9f077abbd725c2511bcc2251db44 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/ColumnMetaData.java @@ -16,10 +16,10 @@ package com.taosdata.jdbc; public class ColumnMetaData { - int colType = 0; - String colName = null; - int colSize = -1; - int colIndex = 0; + private int colType = 0; + private String colName = null; + private int colSize = -1; + private int colIndex = 0; public int getColSize() { return colSize; diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java index 8fb607483b74f4848e98976cddcb7f5c9b2a0244..4dc48c84b30f363c382a641cb705893c4aca8118 100755 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBDriver.java @@ -86,6 +86,11 @@ public class TSDBDriver extends AbstractTaosDriver { */ public static final String PROPERTY_KEY_CHARSET = "charset"; + /** + * fetch data from native function in a batch model + */ + public static final String PROPERTY_KEY_BATCH_LOAD = "batch"; + private TSDBDatabaseMetaData dbMetaData = null; static { @@ -172,26 +177,21 @@ public class TSDBDriver extends AbstractTaosDriver { url = url.substring(0, index); StringTokenizer queryParams = new StringTokenizer(paramString, "&"); while (queryParams.hasMoreElements()) { - String parameterValuePair = queryParams.nextToken(); - int indexOfEqual = parameterValuePair.indexOf("="); - String parameter = null; - String value = null; - if (indexOfEqual != -1) { - parameter = parameterValuePair.substring(0, indexOfEqual); - if (indexOfEqual + 1 < parameterValuePair.length()) { - value = parameterValuePair.substring(indexOfEqual + 1); - } - } - if ((value != null && value.length() > 0) && (parameter != null && parameter.length() > 0)) { - urlProps.setProperty(parameter, value); + String oneToken = queryParams.nextToken(); + String[] pair = oneToken.split("="); + + if ((pair[0] != null && pair[0].trim().length() > 0) && (pair[1] != null && pair[1].trim().length() > 0)) { + urlProps.setProperty(pair[0].trim(), pair[1].trim()); } } } + // parse Product Name String dbProductName = url.substring(0, beginningOfSlashes); dbProductName = dbProductName.substring(dbProductName.indexOf(":") + 1); dbProductName = dbProductName.substring(0, dbProductName.indexOf(":")); - // parse dbname + + // parse database name url = url.substring(beginningOfSlashes + 2); int indexOfSlash = url.indexOf("/"); if (indexOfSlash != -1) { @@ -200,6 +200,7 @@ public class TSDBDriver extends AbstractTaosDriver { } url = url.substring(0, indexOfSlash); } + // parse port int indexOfColon = url.indexOf(":"); if (indexOfColon != -1) { @@ -208,9 +209,11 @@ public class TSDBDriver extends AbstractTaosDriver { } url = url.substring(0, indexOfColon); } + if (url != null && url.length() > 0 && url.trim().length() > 0) { urlProps.setProperty(TSDBDriver.PROPERTY_KEY_HOST, url); } + this.dbMetaData = new TSDBDatabaseMetaData(dbProductName, urlForMeta, urlProps.getProperty(TSDBDriver.PROPERTY_KEY_USER)); return urlProps; } diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java index 56c1719ddb4f007601bdc107f74a2011904d3593..84a3f58f4692a99737af7d93c5578fc7a5a09c27 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSet.java @@ -49,7 +49,7 @@ public class TSDBResultSet implements ResultSet { private TSDBResultSetRowData rowData; private TSDBResultSetBlockData blockData; - private boolean blockwiseFetch = false; + private boolean batchFetch = false; private boolean lastWasNull = false; private final int COLUMN_INDEX_START_VALUE = 1; @@ -71,8 +71,12 @@ public class TSDBResultSet implements ResultSet { this.resultSetPointer = resultSetPointer; } - public void setBlockWiseFetch(boolean fetchBlock) { - this.blockwiseFetch = fetchBlock; + public void setBatchFetch(boolean batchFetch) { + this.batchFetch = batchFetch; + } + + public Boolean getBatchFetch() { + return this.batchFetch; } public List getColumnMetaDataList() { @@ -102,8 +106,8 @@ public class TSDBResultSet implements ResultSet { public TSDBResultSet() { } - public TSDBResultSet(TSDBJNIConnector connecter, long resultSetPointer) throws SQLException { - this.jniConnector = connecter; + public TSDBResultSet(TSDBJNIConnector connector, long resultSetPointer) throws SQLException { + this.jniConnector = connector; this.resultSetPointer = resultSetPointer; int code = this.jniConnector.getSchemaMetaData(this.resultSetPointer, this.columnMetaDataList); if (code == TSDBConstants.JNI_CONNECTION_NULL) { @@ -127,13 +131,13 @@ public class TSDBResultSet implements ResultSet { } public boolean next() throws SQLException { - if (this.blockwiseFetch) { + if (this.getBatchFetch()) { if (this.blockData.forward()) { return true; } int code = this.jniConnector.fetchBlock(this.resultSetPointer, this.blockData); - this.blockData.resetCursor(); + this.blockData.reset(); if (code == TSDBConstants.JNI_CONNECTION_NULL) { throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); @@ -185,7 +189,7 @@ public class TSDBResultSet implements ResultSet { String res = null; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getString(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -200,7 +204,7 @@ public class TSDBResultSet implements ResultSet { boolean res = false; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getBoolean(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -216,7 +220,7 @@ public class TSDBResultSet implements ResultSet { byte res = 0; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = (byte) this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -231,7 +235,7 @@ public class TSDBResultSet implements ResultSet { short res = 0; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = (short) this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -246,7 +250,7 @@ public class TSDBResultSet implements ResultSet { int res = 0; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getInt(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -262,7 +266,7 @@ public class TSDBResultSet implements ResultSet { long res = 0l; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getLong(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -277,7 +281,7 @@ public class TSDBResultSet implements ResultSet { float res = 0; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getFloat(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -292,7 +296,7 @@ public class TSDBResultSet implements ResultSet { double res = 0; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getDouble(colIndex, this.columnMetaDataList.get(colIndex).getColType()); @@ -334,7 +338,7 @@ public class TSDBResultSet implements ResultSet { Timestamp res = null; int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); if (!lastWasNull) { res = this.rowData.getTimestamp(colIndex); @@ -454,7 +458,7 @@ public class TSDBResultSet implements ResultSet { public Object getObject(int columnIndex) throws SQLException { int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); return this.rowData.get(colIndex); } else { @@ -491,7 +495,7 @@ public class TSDBResultSet implements ResultSet { public BigDecimal getBigDecimal(int columnIndex) throws SQLException { int colIndex = getTrueColumnIndex(columnIndex); - if (!this.blockwiseFetch) { + if (!this.getBatchFetch()) { this.lastWasNull = this.rowData.wasNull(colIndex); return new BigDecimal(this.rowData.getLong(colIndex, this.columnMetaDataList.get(colIndex).getColType())); } else { diff --git a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetBlockData.java b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetBlockData.java index 50ebe283e280e4c1a4a7a5095ef3b22aa22d359e..7373890428ae0e02e4ea621595333f13824072a3 100644 --- a/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetBlockData.java +++ b/src/connector/jdbc/src/main/java/com/taosdata/jdbc/TSDBResultSetBlockData.java @@ -56,13 +56,6 @@ public class TSDBResultSetBlockData { if (this.numOfCols == 0) { return; } - - this.colData = new ArrayList(numOfCols); - this.colData.addAll(Collections.nCopies(this.numOfCols, null)); - } - - public boolean wasNull(int col) { - return colData.get(col) == null; } public int getNumOfRows() { @@ -82,20 +75,19 @@ public class TSDBResultSetBlockData { this.clear(); } - public void setColumnData(int col, byte val) { - this.colData.set(col, val); - } - public boolean hasMore() { return this.rowIndex < this.numOfRows; } public boolean forward() { - this.rowIndex++; - return (this.rowIndex < this.numOfRows); + if (this.rowIndex > this.numOfRows) { + return false; + } + + return ((++this.rowIndex) < this.numOfRows); } - public void resetCursor() { + public void reset() { this.rowIndex = 0; } @@ -172,10 +164,58 @@ public class TSDBResultSetBlockData { } } - class NullType { + private static class NullType { + private static final byte NULL_BOOL_VAL = 0x2; + private static final String NULL_STR = "null"; + public String toString() { - return new String("null"); + return NullType.NULL_STR; + } + + public static boolean isBooleanNull(byte val) { + return val == NullType.NULL_BOOL_VAL; + } + + private static boolean isTinyIntNull(byte val) { + return val == Byte.MIN_VALUE; + } + + private static boolean isSmallIntNull(short val) { + return val == Short.MIN_VALUE; + } + + private static boolean isIntNull(int val) { + return val == Integer.MIN_VALUE; + } + + private static boolean isBigIntNull(long val) { + return val == Long.MIN_VALUE; + } + + private static boolean isFloatNull(float val) { + return Float.isNaN(val); + } + + private static boolean isDoubleNull(double val) { + return Double.isNaN(val); + } + + private static boolean isBinaryNull(byte[] val, int length) { + if (length != Byte.BYTES) { + return false; + } + + return val[0] == 0xFF; + } + + private static boolean isNcharNull(byte[] val, int length) { + if (length != Integer.BYTES) { + return false; + } + + return (val[0] & val[1] & val[2] & val[3]) == 0xFF; } + } /** @@ -195,50 +235,6 @@ public class TSDBResultSetBlockData { return obj.toString(); } - private boolean isBooleanNull(byte val) { - return val == 0x2; - } - - private boolean isTinyIntNull(byte val) { - return val == 0x80; - } - - private boolean isSmallIntNull(short val) { - return val == 0x8000; - } - - private boolean isIntNull(int val) { - return val == 0x80000000L; - } - - private boolean isBigIntNull(long val) { - return val == 0x8000000000000000L; - } - - private boolean isFloatNull(float val) { - return Float.isNaN(val); - } - - private boolean isDoubleNull(double val) { - return Double.isNaN(val); - } - - private boolean isBinaryNull(byte[] val, int length) { - if (length != 1) { - return false; - } - - return val[0] == 0xFF; - } - - private boolean isNcharNull(byte[] val, int length) { - if (length != 4) { - return false; - } - - return (val[0] & val[1] & val[2] & val[3]) == 0xFF ; - } - public int getInt(int col) { Object obj = get(col); if (obj == null) { @@ -284,16 +280,16 @@ public class TSDBResultSetBlockData { case TSDBConstants.TSDB_DATA_TYPE_TINYINT: case TSDBConstants.TSDB_DATA_TYPE_SMALLINT: case TSDBConstants.TSDB_DATA_TYPE_INT: { - return ((int) obj == 0L)? Boolean.FALSE:Boolean.TRUE; + return ((int) obj == 0L) ? Boolean.FALSE : Boolean.TRUE; } case TSDBConstants.TSDB_DATA_TYPE_BIGINT: case TSDBConstants.TSDB_DATA_TYPE_TIMESTAMP: { - return (((Long) obj) == 0L)? Boolean.FALSE:Boolean.TRUE; + return (((Long) obj) == 0L) ? Boolean.FALSE : Boolean.TRUE; } case TSDBConstants.TSDB_DATA_TYPE_FLOAT: case TSDBConstants.TSDB_DATA_TYPE_DOUBLE: { - return (((Double) obj) == 0)? Boolean.FALSE:Boolean.TRUE; + return (((Double) obj) == 0) ? Boolean.FALSE : Boolean.TRUE; } case TSDBConstants.TSDB_DATA_TYPE_NCHAR: @@ -395,7 +391,7 @@ public class TSDBResultSetBlockData { ByteBuffer bb = (ByteBuffer) this.colData.get(col); byte val = bb.get(this.rowIndex); - if (isBooleanNull(val)) { + if (NullType.isBooleanNull(val)) { return null; } @@ -406,7 +402,7 @@ public class TSDBResultSetBlockData { ByteBuffer bb = (ByteBuffer) this.colData.get(col); byte val = bb.get(this.rowIndex); - if (isTinyIntNull(val)) { + if (NullType.isTinyIntNull(val)) { return null; } @@ -416,7 +412,7 @@ public class TSDBResultSetBlockData { case TSDBConstants.TSDB_DATA_TYPE_SMALLINT: { ShortBuffer sb = (ShortBuffer) this.colData.get(col); short val = sb.get(this.rowIndex); - if (isSmallIntNull(val)) { + if (NullType.isSmallIntNull(val)) { return null; } @@ -426,7 +422,7 @@ public class TSDBResultSetBlockData { case TSDBConstants.TSDB_DATA_TYPE_INT: { IntBuffer ib = (IntBuffer) this.colData.get(col); int val = ib.get(this.rowIndex); - if (isIntNull(val)) { + if (NullType.isIntNull(val)) { return null; } @@ -437,7 +433,7 @@ public class TSDBResultSetBlockData { case TSDBConstants.TSDB_DATA_TYPE_BIGINT: { LongBuffer lb = (LongBuffer) this.colData.get(col); long val = lb.get(this.rowIndex); - if (isBigIntNull(val)) { + if (NullType.isBigIntNull(val)) { return null; } @@ -447,7 +443,7 @@ public class TSDBResultSetBlockData { case TSDBConstants.TSDB_DATA_TYPE_FLOAT: { FloatBuffer fb = (FloatBuffer) this.colData.get(col); float val = fb.get(this.rowIndex); - if (isFloatNull(val)) { + if (NullType.isFloatNull(val)) { return null; } @@ -457,7 +453,7 @@ public class TSDBResultSetBlockData { case TSDBConstants.TSDB_DATA_TYPE_DOUBLE: { DoubleBuffer lb = (DoubleBuffer) this.colData.get(col); double val = lb.get(this.rowIndex); - if (isDoubleNull(val)) { + if (NullType.isDoubleNull(val)) { return null; } @@ -472,7 +468,7 @@ public class TSDBResultSetBlockData { byte[] dest = new byte[length]; bb.get(dest, 0, length); - if (isBinaryNull(dest, length)) { + if (NullType.isBinaryNull(dest, length)) { return null; } @@ -487,7 +483,7 @@ public class TSDBResultSetBlockData { byte[] dest = new byte[length]; bb.get(dest, 0, length); - if (isNcharNull(dest, length)) { + if (NullType.isNcharNull(dest, length)) { return null; } 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 15a978a2fd80a8ba6ac7706d703d2726a5b52b7e..cdd88b825e2a8f6ba81c131bfd1214ffbe46f32c 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 @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; public class TSDBStatement implements Statement { - private TSDBJNIConnector connecter = null; + private TSDBJNIConnector connector = null; /** * To store batched commands @@ -45,9 +45,9 @@ public class TSDBStatement implements Statement { this.connection = connection; } - TSDBStatement(TSDBConnection connection, TSDBJNIConnector connecter) { + TSDBStatement(TSDBConnection connection, TSDBJNIConnector connector) { this.connection = connection; - this.connecter = connecter; + this.connector = connector; this.isClosed = false; } @@ -65,27 +65,27 @@ public class TSDBStatement implements Statement { } // TODO make sure it is not a update query - pSql = this.connecter.executeQuery(sql); + pSql = this.connector.executeQuery(sql); - long resultSetPointer = this.connecter.getResultSet(); + long resultSetPointer = this.connector.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { - this.connecter.freeResultSet(pSql); + this.connector.freeResultSet(pSql); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } // create/insert/update/delete/alter if (resultSetPointer == TSDBConstants.JNI_NULL_POINTER) { - this.connecter.freeResultSet(pSql); + this.connector.freeResultSet(pSql); return null; } - if (!this.connecter.isUpdateQuery(pSql)) { - TSDBResultSet res = new TSDBResultSet(this.connecter, resultSetPointer); - res.setBlockWiseFetch(true); + if (!this.connector.isUpdateQuery(pSql)) { + TSDBResultSet res = new TSDBResultSet(this.connector, resultSetPointer); + res.setBatchFetch(this.connection.getBatchFetch()); return res; } else { - this.connecter.freeResultSet(pSql); + this.connector.freeResultSet(pSql); return null; } @@ -97,28 +97,28 @@ public class TSDBStatement implements Statement { } // TODO check if current query is update query - pSql = this.connecter.executeQuery(sql); - long resultSetPointer = this.connecter.getResultSet(); + pSql = this.connector.executeQuery(sql); + long resultSetPointer = this.connector.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { - this.connecter.freeResultSet(pSql); + this.connector.freeResultSet(pSql); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } - this.affectedRows = this.connecter.getAffectedRows(pSql); - this.connecter.freeResultSet(pSql); + this.affectedRows = this.connector.getAffectedRows(pSql); + this.connector.freeResultSet(pSql); return this.affectedRows; } public String getErrorMsg(long pSql) { - return this.connecter.getErrMsg(pSql); + return this.connector.getErrMsg(pSql); } public void close() throws SQLException { if (!isClosed) { - if (!this.connecter.isResultsetClosed()) { - this.connecter.freeResultSet(); + if (!this.connector.isResultsetClosed()) { + this.connector.freeResultSet(); } isClosed = true; } @@ -174,15 +174,15 @@ public class TSDBStatement implements Statement { throw new SQLException("Invalid method call on a closed statement."); } boolean res = true; - pSql = this.connecter.executeQuery(sql); - long resultSetPointer = this.connecter.getResultSet(); + pSql = this.connector.executeQuery(sql); + long resultSetPointer = this.connector.getResultSet(); if (resultSetPointer == TSDBConstants.JNI_CONNECTION_NULL) { - this.connecter.freeResultSet(pSql); + this.connector.freeResultSet(pSql); throw new SQLException(TSDBConstants.FixErrMsg(TSDBConstants.JNI_CONNECTION_NULL)); } else if (resultSetPointer == TSDBConstants.JNI_NULL_POINTER) { // no result set is retrieved - this.connecter.freeResultSet(pSql); + this.connector.freeResultSet(pSql); res = false; } @@ -193,10 +193,10 @@ public class TSDBStatement implements Statement { if (isClosed) { throw new SQLException("Invalid method call on a closed statement."); } - long resultSetPointer = connecter.getResultSet(); + long resultSetPointer = connector.getResultSet(); TSDBResultSet resSet = null; if (resultSetPointer != TSDBConstants.JNI_NULL_POINTER) { - resSet = new TSDBResultSet(connecter, resultSetPointer); + resSet = new TSDBResultSet(connector, resultSetPointer); } return resSet; } @@ -269,7 +269,7 @@ public class TSDBStatement implements Statement { } public Connection getConnection() throws SQLException { - if (this.connecter != null) + if (this.connector != null) return this.connection; throw new SQLException(TSDBConstants.UNSUPPORT_METHOD_EXCEPTIONZ_MSG); }