Skip to content

Commit

Permalink
Merge pull request #168 from taosdata/main
Browse files Browse the repository at this point in the history
merge from main
  • Loading branch information
sheyanjie-qq committed Jul 1, 2024
2 parents b235d52 + 4815992 commit 5c1516d
Show file tree
Hide file tree
Showing 49 changed files with 1,159 additions and 880 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/version3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
strategy:
matrix:
# os: [ ubuntu-latest,macos-latest,windows-latest ]
os: [ Ubuntu-20.04 ]
os: [ Ubuntu-22.04 ]
java: [ 8 ]
maven: [ '3.6.3' ]
runs-on: ${{ matrix.os }}
Expand All @@ -39,7 +39,7 @@ jobs:
run: |
sudo apt-get install -y libgeos-dev
geos-config --version
- name: install TDengine
run: cd TDengine && mkdir debug && cd debug && cmake .. -DBUILD_JDBC=false -DBUILD_TOOLS=false -DBUILD_HTTP=false && make && sudo make install

Expand Down
4 changes: 3 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>3.2.11</version>
<version>3.3.0</version>
<packaging>jar</packaging>
<name>JDBCDriver</name>
<url>https://github.com/taosdata/taos-connector-jdbc</url>
Expand Down Expand Up @@ -65,6 +65,8 @@
<version>4.13.2</version>
<scope>test</scope>
</dependency>


</dependencies>

<build>
Expand Down
291 changes: 291 additions & 0 deletions src/main/java/com/taosdata/jdbc/BlockData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
package com.taosdata.jdbc;

import com.taosdata.jdbc.rs.RestfulResultSet;

import java.nio.ByteBuffer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

import static com.taosdata.jdbc.TSDBConstants.*;

public class BlockData {
private List<List<Object>> data;

private int returnCode;
private boolean isCompleted;
private int numOfRows;
private ByteBuffer buffer;
private List<RestfulResultSet.Field> fields;
Semaphore semaphore;

public BlockData(List<List<Object>> data, int returnCode, int numOfRows, ByteBuffer buffer, List<RestfulResultSet.Field> fields) {
this.data = data;
this.returnCode = returnCode;
this.numOfRows = numOfRows;
this.buffer = buffer;
this.fields = fields;
this.semaphore = new Semaphore(0);
this.isCompleted = false;
}

public static BlockData getEmptyBlockData(List<RestfulResultSet.Field> fields) {
return new BlockData(null, 0, 0, null, fields);
}

public void handleData() {

try {
int columns = fields.size();
List<List<Object>> list = new ArrayList<>();
if (buffer != null) {
buffer.getInt(); // buffer length
int pHeader = buffer.position() + 28 + columns * 5;
buffer.position(buffer.position() + 8);
this.numOfRows = buffer.getInt();

buffer.position(pHeader);
int bitMapOffset = BitmapLen(numOfRows);

List<Integer> lengths = new ArrayList<>(columns);
for (int i = 0; i < columns; i++) {
lengths.add(buffer.getInt());
}
pHeader = buffer.position();
int length = 0;
for (int i = 0; i < columns; i++) {
List<Object> col = new ArrayList<>(numOfRows);
int type = fields.get(i).getTaosType();
switch (type) {
case TSDB_DATA_TYPE_BOOL:
case TSDB_DATA_TYPE_TINYINT:
case TSDB_DATA_TYPE_UTINYINT: {
length = bitMapOffset;
byte[] tmp = new byte[bitMapOffset];
buffer.get(tmp);
for (int j = 0; j < numOfRows; j++) {
byte b = buffer.get();
if (isNull(tmp, j)) {
col.add(null);
} else {
col.add(b);
}
}
break;
}
case TSDB_DATA_TYPE_SMALLINT:
case TSDB_DATA_TYPE_USMALLINT: {
length = bitMapOffset;
byte[] tmp = new byte[bitMapOffset];
buffer.get(tmp);
for (int j = 0; j < numOfRows; j++) {
short s = buffer.getShort();
if (isNull(tmp, j)) {
col.add(null);
} else {
col.add(s);
}
}
break;
}
case TSDB_DATA_TYPE_INT:
case TSDB_DATA_TYPE_UINT: {
length = bitMapOffset;
byte[] tmp = new byte[bitMapOffset];
buffer.get(tmp);
for (int j = 0; j < numOfRows; j++) {
int in = buffer.getInt();
if (isNull(tmp, j)) {
col.add(null);
} else {
col.add(in);
}
}
break;
}
case TSDB_DATA_TYPE_BIGINT:
case TSDB_DATA_TYPE_UBIGINT:
case TSDB_DATA_TYPE_TIMESTAMP: {
length = bitMapOffset;
byte[] tmp = new byte[bitMapOffset];
buffer.get(tmp);
for (int j = 0; j < numOfRows; j++) {
long l = buffer.getLong();
if (isNull(tmp, j)) {
col.add(null);
} else {
col.add(l);
}
}
break;
}
case TSDB_DATA_TYPE_FLOAT: {
length = bitMapOffset;
byte[] tmp = new byte[bitMapOffset];
buffer.get(tmp);
for (int j = 0; j < numOfRows; j++) {
float f = buffer.getFloat();
if (isNull(tmp, j)) {
col.add(null);
} else {
col.add(f);
}
}
break;
}
case TSDB_DATA_TYPE_DOUBLE: {
length = bitMapOffset;
byte[] tmp = new byte[bitMapOffset];
buffer.get(tmp);
for (int j = 0; j < numOfRows; j++) {
double d = buffer.getDouble();
if (isNull(tmp, j)) {
col.add(null);
} else {
col.add(d);
}
}
break;
}
case TSDB_DATA_TYPE_BINARY:
case TSDB_DATA_TYPE_JSON:
case TSDB_DATA_TYPE_VARBINARY:
case TSDB_DATA_TYPE_GEOMETRY: {
length = numOfRows * 4;
List<Integer> offset = new ArrayList<>(numOfRows);
for (int m = 0; m < numOfRows; m++) {
offset.add(buffer.getInt());
}
int start = buffer.position();
for (int m = 0; m < numOfRows; m++) {
if (-1 == offset.get(m)) {
col.add(null);
continue;
}
buffer.position(start + offset.get(m));
int len = buffer.getShort() & 0xFFFF;
byte[] tmp = new byte[len];
buffer.get(tmp);
col.add(tmp);
}
break;
}
case TSDB_DATA_TYPE_NCHAR: {
length = numOfRows * 4;
List<Integer> offset = new ArrayList<>(numOfRows);
for (int m = 0; m < numOfRows; m++) {
offset.add(buffer.getInt());
}
int start = buffer.position();
for (int m = 0; m < numOfRows; m++) {
if (-1 == offset.get(m)) {
col.add(null);
continue;
}
buffer.position(start + offset.get(m));
int len = (buffer.getShort() & 0xFFFF) / 4;
int[] tmp = new int[len];
for (int n = 0; n < len; n++) {
tmp[n] = buffer.getInt();
}
col.add(tmp);
}
break;
}
default:
// unknown type, do nothing
col.add(null);
break;
}
pHeader += length + lengths.get(i);
buffer.position(pHeader);
list.add(col);
}
}
this.data = list;
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}

}

private int BitmapLen(int n) {
return (n + 0x7) >> 3;
}

private boolean isNull(byte[] c, int n) {
int position = n >>> 3;
int index = n & 0x7;
return (c[position] & (1 << (7 - index))) == (1 << (7 - index));
}

public void doneWithNoData(){
semaphore.release();
}

public void waitTillOK() throws SQLException {
try {
// must be ok When the CPU has idle time
if (!semaphore.tryAcquire(500, TimeUnit.SECONDS))
{
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNKNOWN, "FETCH DATA TIME OUT");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}




public List<List<Object>> getData() {
return data;
}

public void setData(List<List<Object>> data) {
this.data = data;
}

public int getReturnCode() {
return returnCode;
}

public void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}

public int getNumOfRows() {
return numOfRows;
}

public void setNumOfRows(int numOfRows) {
this.numOfRows = numOfRows;
}

public ByteBuffer getBuffer() {
return buffer;
}

public void setBuffer(ByteBuffer buffer) {
this.buffer = buffer;
}

public List<RestfulResultSet.Field> getFields() {
return fields;
}

public void setFields(List<RestfulResultSet.Field> fields) {
this.fields = fields;
}

public boolean isCompleted() {
return isCompleted;
}

public void setCompleted(boolean completed) {
isCompleted = completed;
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/taosdata/jdbc/SchemalessWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import com.taosdata.jdbc.ws.entity.Code;
import com.taosdata.jdbc.ws.entity.Request;
import com.taosdata.jdbc.ws.entity.Response;
import com.taosdata.jdbc.ws.schemaless.CommonResp;
import com.taosdata.jdbc.ws.entity.CommonResp;
import com.taosdata.jdbc.ws.schemaless.ConnReq;
import com.taosdata.jdbc.ws.schemaless.InsertReq;
import com.taosdata.jdbc.ws.schemaless.SchemalessAction;
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/taosdata/jdbc/TSDBDriver.java
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,13 @@ public class TSDBDriver extends AbstractDriver {
public static final String PROPERTY_KEY_SLAVE_CLUSTER_PORT = "slaveClusterPort";
public static final String PROPERTY_KEY_RECONNECT_INTERVAL_MS = "reconnectIntervalMs";
public static final String PROPERTY_KEY_RECONNECT_RETRY_COUNT = "reconnectRetryCount";

public static final String PROPERTY_KEY_DISABLE_SSL_CERT_VALIDATION = "disableSSLCertValidation";

/**
* max message number send to server concurrently
*/
public static final String PROPERTY_KEY_MAX_CONCURRENT_REQUEST = "maxConcurrentRequest";

/**
* max pool size
*/
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/taosdata/jdbc/TSDBResultSetMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class TSDBResultSetMetaData extends WrapperImpl implements ResultSetMetaD

private String tableName = "";
private String database = "";
List<ColumnMetaData> colMetaDataList;
private List<ColumnMetaData> colMetaDataList;

public TSDBResultSetMetaData(List<ColumnMetaData> metaDataList) {
this.colMetaDataList = metaDataList;
Expand Down
Loading

0 comments on commit 5c1516d

Please sign in to comment.