Skip to content

Commit bd1451f

Browse files
committed
feat: supports varchar as string on websocket connections
1 parent 2f56e61 commit bd1451f

18 files changed

Lines changed: 312 additions & 65 deletions

pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,18 @@
7070
<artifactId>netty-all</artifactId>
7171
<version>${netty-all.version}</version>
7272
</dependency>
73+
<dependency>
74+
<groupId>org.slf4j</groupId>
75+
<artifactId>slf4j-api</artifactId>
76+
<version>${slf4j.version}</version>
77+
</dependency>
78+
7379
<dependency>
7480
<groupId>junit</groupId>
7581
<artifactId>junit</artifactId>
7682
<version>${junit.version}</version>
7783
<scope>test</scope>
7884
</dependency>
79-
80-
<dependency>
81-
<groupId>org.slf4j</groupId>
82-
<artifactId>slf4j-api</artifactId>
83-
<version>${slf4j.version}</version>
84-
</dependency>
8585
</dependencies>
8686

8787
<build>

src/main/java/com/taosdata/jdbc/BlockData.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class BlockData {
2020
private List<List<Object>> data;
2121

2222
private int returnCode;
23+
private String errorMessage;
2324
private boolean isCompleted;
2425
private int numOfRows;
2526
private ByteBuf buffer;
@@ -29,12 +30,14 @@ public class BlockData {
2930

3031
public BlockData(List<List<Object>> data,
3132
int returnCode,
33+
String errorMessage,
3234
int numOfRows,
3335
ByteBuf buffer,
3436
List<RestfulResultSet.Field> fields,
3537
int precision) {
3638
this.data = data;
3739
this.returnCode = returnCode;
40+
this.errorMessage = errorMessage;
3841
this.numOfRows = numOfRows;
3942
this.buffer = buffer;
4043
this.fields = fields;
@@ -44,7 +47,7 @@ public BlockData(List<List<Object>> data,
4447
}
4548

4649
public static BlockData getEmptyBlockData(List<RestfulResultSet.Field> fields, int precision) {
47-
return new BlockData(null, 0, 0, null, fields, precision);
50+
return new BlockData(null, 0, "",0, null, fields, precision);
4851
}
4952

5053
public void handleData() {
@@ -298,7 +301,13 @@ public int getReturnCode() {
298301
public void setReturnCode(int returnCode) {
299302
this.returnCode = returnCode;
300303
}
304+
public String getErrorMessage() {
305+
return errorMessage;
306+
}
301307

308+
public void setErrorMessage(String errorMessage) {
309+
this.errorMessage = errorMessage;
310+
}
302311
public int getNumOfRows() {
303312
return numOfRows;
304313
}

src/main/java/com/taosdata/jdbc/TSDBDriver.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ public class TSDBDriver extends AbstractDriver {
109109
* connect mode
110110
*/
111111
public static final String PROPERTY_KEY_CONNECT_MODE = "conmode";
112+
/**
113+
* Specifies whether to treat VARCHAR as STRING type. Only effected in WebSocket connection mode.
114+
* This property can be used to control how VARCHAR data is handled.
115+
*/
116+
public static final String PROPERTY_KEY_VARCHAR_AS_STRING = "varcharAsString";
112117

113118

114119
public static final String PROPERTY_KEY_ENABLE_COMPRESSION = "enableCompression";

src/main/java/com/taosdata/jdbc/enums/DataType.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ public int getTaosTypeValue() {
6464
public int getJdbcTypeValue() {
6565
return jdbcTypeValue;
6666
}
67-
6867
public int getSize() {
6968
return size;
7069
}

src/main/java/com/taosdata/jdbc/rs/ConnectionParam.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import java.io.UnsupportedEncodingException;
1313
import java.net.URLDecoder;
14-
import java.nio.ByteBuffer;
1514
import java.nio.charset.StandardCharsets;
1615
import java.sql.SQLException;
1716
import java.time.DateTimeException;
@@ -33,6 +32,7 @@ public class ConnectionParam {
3332
private int connectTimeout;
3433
private int requestTimeout;
3534
private int connectMode;
35+
private boolean varcharAsString;
3636
private boolean enableCompression;
3737
private boolean enableAutoConnect;
3838

@@ -69,6 +69,7 @@ private ConnectionParam(Builder builder) {
6969
this.connectTimeout = builder.connectTimeout;
7070
this.requestTimeout = builder.requestTimeout;
7171
this.connectMode = builder.connectMode;
72+
this.varcharAsString = builder.varcharAsString;
7273
this.enableCompression = builder.enableCompression;
7374
this.slaveClusterHost = builder.slaveClusterHost;
7475
this.slaveClusterPort = builder.slaveClusterPort;
@@ -249,6 +250,9 @@ public int getRequestTimeout() {
249250
public int getConnectMode() {
250251
return connectMode;
251252
}
253+
public boolean isVarcharAsString() {
254+
return varcharAsString;
255+
}
252256
public boolean isEnableCompression() {
253257
return enableCompression;
254258
}
@@ -404,6 +408,8 @@ public static ConnectionParam getParam(Properties properties) throws SQLExceptio
404408
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_INVALID_VARIABLE, "unsupported connect mode");
405409
}
406410

411+
boolean varcharAsString = Boolean.parseBoolean(properties.getProperty(TSDBDriver.PROPERTY_KEY_VARCHAR_AS_STRING, "false"));
412+
407413
String slaveClusterHost = properties.getProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_HOST, "");
408414
String slaveClusterPort = properties.getProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_PORT, "");
409415

@@ -480,6 +486,7 @@ public static ConnectionParam getParam(Properties properties) throws SQLExceptio
480486
.setConnectionTimeout(connectTimeout)
481487
.setRequestTimeout(requestTimeout)
482488
.setConnectMode(connectMode)
489+
.setVarcharAsString(varcharAsString)
483490
.setEnableCompression(enableCompression)
484491
.setSlaveClusterHost(slaveClusterHost)
485492
.setSlaveClusterPort(slaveClusterPort)
@@ -513,6 +520,7 @@ public static class Builder {
513520
private int connectTimeout;
514521
private int requestTimeout;
515522
private int connectMode;
523+
private boolean varcharAsString;
516524

517525
private boolean enableCompression;
518526
private boolean enableAutoReconnect;
@@ -586,6 +594,10 @@ public Builder setConnectMode(int connectMode) {
586594
return this;
587595
}
588596

597+
public Builder setVarcharAsString(boolean varcharAsString) {
598+
this.varcharAsString = varcharAsString;
599+
return this;
600+
}
589601
public Builder setEnableCompression(boolean enableCompression) {
590602
this.enableCompression = enableCompression;
591603
return this;

src/main/java/com/taosdata/jdbc/rs/RestfulDriver.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
package com.taosdata.jdbc.rs;
22

33

4-
import com.fasterxml.jackson.core.JsonProcessingException;
5-
import com.fasterxml.jackson.databind.JsonNode;
6-
import com.fasterxml.jackson.databind.ObjectMapper;
7-
import com.fasterxml.jackson.databind.ObjectReader;
8-
import com.taosdata.jdbc.*;
9-
import com.taosdata.jdbc.enums.WSFunction;
4+
import com.taosdata.jdbc.AbstractDriver;
5+
import com.taosdata.jdbc.TSDBDriver;
6+
import com.taosdata.jdbc.TSDBError;
7+
import com.taosdata.jdbc.TSDBErrorNumbers;
108
import com.taosdata.jdbc.utils.HttpClientPoolUtil;
119
import com.taosdata.jdbc.utils.StringUtils;
12-
import com.taosdata.jdbc.ws.*;
13-
import com.taosdata.jdbc.ws.entity.*;
14-
import com.taosdata.jdbc.utils.JsonUtil;
1510
import org.slf4j.LoggerFactory;
1611

17-
import java.nio.ByteOrder;
1812
import java.nio.charset.StandardCharsets;
1913
import java.sql.*;
2014
import java.util.Base64;

src/main/java/com/taosdata/jdbc/rs/RestfulResultSet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public RestfulResultSet(String database, Statement statement, JsonNode resultJso
8282

8383
// parse column_meta
8484
parseColumnMeta_new(columnMeta);
85-
this.metaData = new RestfulResultSetMetaData(database, columns);
85+
this.metaData = new RestfulResultSetMetaData(database, columns, false);
8686

8787
if (data == null || !data.isArray() || data.size() == 0)
8888
return;

src/main/java/com/taosdata/jdbc/rs/RestfulResultSetMetaData.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.taosdata.jdbc.rs;
22

3+
import com.taosdata.jdbc.TSDBConstants;
4+
import com.taosdata.jdbc.TSDBDriver;
35
import com.taosdata.jdbc.WrapperImpl;
46
import com.taosdata.jdbc.enums.DataType;
57

@@ -15,16 +17,19 @@ public class RestfulResultSetMetaData extends WrapperImpl implements ResultSetMe
1517
private String tableName = "";
1618
private final String database;
1719
private final List<RestfulResultSet.Field> fields;
20+
private final boolean varcharAsString;
1821

19-
public RestfulResultSetMetaData(String database, List<RestfulResultSet.Field> fields) {
22+
public RestfulResultSetMetaData(String database, List<RestfulResultSet.Field> fields, boolean varcharAsString) {
2023
this.database = database;
2124
this.fields = fields == null ? Collections.emptyList() : fields;
25+
this.varcharAsString = varcharAsString;
2226
}
2327

24-
public RestfulResultSetMetaData(String database, List<RestfulResultSet.Field> fields, String tableName) {
28+
public RestfulResultSetMetaData(String database, List<RestfulResultSet.Field> fields, String tableName, boolean varcharAsString) {
2529
this.tableName = tableName;
2630
this.database = database;
2731
this.fields = fields == null ? Collections.emptyList() : fields;
32+
this.varcharAsString = varcharAsString;
2833
}
2934

3035
public List<RestfulResultSet.Field> getFields() {
@@ -138,6 +143,9 @@ public int getColumnType(int column) throws SQLException {
138143
@Override
139144
public String getColumnTypeName(int column) throws SQLException {
140145
int taosType = fields.get(column - 1).taos_type;
146+
if (taosType == TSDBConstants.TSDB_DATA_TYPE_BINARY && varcharAsString){
147+
return "VARCHAR";
148+
}
141149
return DataType.convertTaosType2DataType(taosType).getTypeName();
142150
}
143151

@@ -159,6 +167,9 @@ public boolean isDefinitelyWritable(int column) throws SQLException {
159167
@Override
160168
public String getColumnClassName(int column) throws SQLException {
161169
int type = this.fields.get(column - 1).taos_type;
170+
if (type == TSDBConstants.TSDB_DATA_TYPE_BINARY && varcharAsString) {
171+
return String.class.getName();
172+
}
162173
return DataType.convertTaosType2DataType(type).getClassName();
163174
}
164175

src/main/java/com/taosdata/jdbc/tmq/TMQConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class TMQConstants {
1212
private TMQConstants() {
1313
}
1414

15-
public static final Set<String> knownKeys = new HashSet<>();
15+
protected static final Set<String> knownKeys = new HashSet<>();
1616

1717
public static final String GROUP_ID = "group.id";
1818

src/main/java/com/taosdata/jdbc/utils/DataTypeConverUtil.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.io.UnsupportedEncodingException;
1212
import java.math.BigDecimal;
1313
import java.math.BigInteger;
14+
import java.nio.charset.StandardCharsets;
1415
import java.sql.*;
1516
import java.time.Instant;
1617
import java.time.ZoneId;
@@ -543,7 +544,7 @@ public static BigDecimal getBigDecimal(int taosType, Object value) {
543544
return new BigDecimal(0);
544545
}
545546

546-
static public Object parseValue(int type, Object source){
547+
static public Object parseValue(int type, Object source, boolean varcharAsString) throws SQLException {
547548
switch (type) {
548549
case TSDB_DATA_TYPE_BOOL: {
549550
byte val = (byte) source;
@@ -559,7 +560,6 @@ static public Object parseValue(int type, Object source){
559560
case TSDB_DATA_TYPE_BIGINT:
560561
case TSDB_DATA_TYPE_FLOAT:
561562
case TSDB_DATA_TYPE_DOUBLE:
562-
case TSDB_DATA_TYPE_BINARY:
563563
case TSDB_DATA_TYPE_JSON:
564564
case TSDB_DATA_TYPE_VARBINARY:
565565
case TSDB_DATA_TYPE_DECIMAL128:
@@ -568,6 +568,19 @@ static public Object parseValue(int type, Object source){
568568
case TSDB_DATA_TYPE_TIMESTAMP:{
569569
return source;
570570
}
571+
case TSDB_DATA_TYPE_BINARY:{
572+
if (varcharAsString){
573+
String charset = StandardCharsets.UTF_8.name();
574+
try {
575+
return new String((byte[]) source, charset);
576+
} catch (UnsupportedEncodingException e) {
577+
throw TSDBError.createSQLException(TSDBErrorNumbers.ERROR_UNSUPPORTED_ENCODING, "Unsupported encoding: " + charset);
578+
}
579+
} else {
580+
return source;
581+
}
582+
}
583+
571584
case TSDB_DATA_TYPE_USMALLINT: {
572585
short val = (short) source;
573586
return parseUSmallInt(val);

0 commit comments

Comments
 (0)