This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new cb283d658a [IOTDB-3604] Refactor the time zone setter by using the
setClientInfo method of JDBC (#6384)
cb283d658a is described below
commit cb283d658ad8677f9d8bff30faa1d290529043d0
Author: Junqing WANG <[email protected]>
AuthorDate: Thu Jun 23 16:29:07 2022 +0800
[IOTDB-3604] Refactor the time zone setter by using the setClientInfo
method of JDBC (#6384)
Co-authored-by: wangjunqing <[email protected]>
---
.../iotdb/db/integration/IoTDBTimeZoneIT.java | 9 ++++-----
.../main/java/org/apache/iotdb/jdbc/Config.java | 3 +++
.../org/apache/iotdb/jdbc/IoTDBConnection.java | 23 +++++++++++++++++-----
.../apache/iotdb/jdbc/IoTDBConnectionParams.java | 12 +++++++++++
.../src/main/java/org/apache/iotdb/jdbc/Utils.java | 14 +++++++++++++
.../org/apache/iotdb/jdbc/IoTDBConnectionTest.java | 12 +++++++++++
6 files changed, 63 insertions(+), 10 deletions(-)
diff --git
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTimeZoneIT.java
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTimeZoneIT.java
index bab02ccaf8..4eb52ff9f6 100644
---
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTimeZoneIT.java
+++
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTimeZoneIT.java
@@ -22,7 +22,6 @@ import org.apache.iotdb.integration.env.EnvFactory;
import org.apache.iotdb.itbase.category.ClusterTest;
import org.apache.iotdb.itbase.category.LocalStandaloneTest;
import org.apache.iotdb.itbase.category.RemoteTest;
-import org.apache.iotdb.jdbc.IoTDBConnection;
import org.apache.thrift.TException;
import org.junit.After;
@@ -100,11 +99,11 @@ public class IoTDBTimeZoneIT {
*/
@Test
public void timezoneTest() throws SQLException, TException {
- try (IoTDBConnection connection = (IoTDBConnection)
EnvFactory.getEnv().getConnection();
+ try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
String insertSQLTemplate = "insert into root.timezone(timestamp,tz1)
values(%s,%s)";
- connection.setTimeZone("+08:00");
+ connection.setClientInfo("time_zone", "+08:00");
// 1514779200000 = 2018-1-1T12:00:00+08:00
statement.execute(String.format(insertSQLTemplate, "1514779200000",
"1"));
statement.execute(String.format(insertSQLTemplate, "2018-1-1T12:00:01",
"2"));
@@ -112,14 +111,14 @@ public class IoTDBTimeZoneIT {
statement.execute(String.format(insertSQLTemplate,
"2018-1-1T12:00:03+09:00", "4"));
statement.execute(String.format(insertSQLTemplate,
"2018-1-1T12:00:04+07:00", "5"));
- connection.setTimeZone("+09:00");
+ connection.setClientInfo("time_zone", "+09:00");
statement.execute(String.format(insertSQLTemplate, "1514789200000",
"6"));
statement.execute(String.format(insertSQLTemplate, "2018-1-1T14:00:05",
"7"));
statement.execute(String.format(insertSQLTemplate,
"2018-1-1T12:00:03+08:00", "8"));
statement.execute(String.format(insertSQLTemplate,
"2018-1-1T12:00:06+07:00", "9"));
// Asia/Almaty +06:00
- connection.setTimeZone("Asia/Almaty");
+ connection.setClientInfo("time_zone", "Asia/Almaty");
statement.execute(String.format(insertSQLTemplate, "1514782807000",
"10"));
statement.execute(String.format(insertSQLTemplate, "2018-1-1T11:00:08",
"11"));
statement.execute(String.format(insertSQLTemplate,
"2018-1-1T13:00:09+08:00", "12"));
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/Config.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/Config.java
index 46b4d11c8b..83da38be83 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/Config.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/Config.java
@@ -59,4 +59,7 @@ public class Config {
/** key of underlying transport socketTimeout and connectionTimeout */
public static final String NETWORK_TIMEOUT = "network_timeout";
+
+ /** key of connection's time zone */
+ public static final String TIME_ZONE = "time_zone";
}
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
index a637c6dd09..a40b1f77b8 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
+import java.sql.ClientInfoStatus;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -55,6 +56,7 @@ import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.time.ZoneId;
+import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
@@ -106,6 +108,7 @@ public class IoTDBConnection implements Connection {
this.url = url;
this.userName = info.get("user").toString();
this.networkTimeout = params.getNetworkTimeout();
+ this.zoneId = ZoneId.of(params.getTimeZone());
openTransport();
if (Config.rpcThriftCompressionEnable) {
setClient(new TSIService.Client(new TCompactProtocol(transport)));
@@ -411,8 +414,18 @@ public class IoTDBConnection implements Connection {
}
@Override
- public void setClientInfo(String arg0, String arg1) throws
SQLClientInfoException {
- throw new SQLClientInfoException("Does not support setClientInfo", null);
+ public void setClientInfo(String name, String value) throws
SQLClientInfoException {
+ if (name.equalsIgnoreCase("time_zone")) {
+ try {
+ setTimeZone(value);
+ } catch (TException | IoTDBSQLException e) {
+ throw new SQLClientInfoException("Set time_zone error: ", null, e);
+ }
+ } else {
+ HashMap<String, ClientInfoStatus> hashMap = new HashMap<>();
+ hashMap.put(name, ClientInfoStatus.REASON_UNKNOWN_PROPERTY);
+ throw new SQLClientInfoException("Does not support this type of client
info: ", hashMap);
+ }
}
@Override
@@ -551,15 +564,15 @@ public class IoTDBConnection implements Connection {
return zoneId.toString();
}
- public void setTimeZone(String zoneId) throws TException, IoTDBSQLException {
- TSSetTimeZoneReq req = new TSSetTimeZoneReq(sessionId, zoneId);
+ public void setTimeZone(String timeZone) throws TException,
IoTDBSQLException {
+ TSSetTimeZoneReq req = new TSSetTimeZoneReq(sessionId, timeZone);
TSStatus resp = getClient().setTimeZone(req);
try {
RpcUtils.verifySuccess(resp);
} catch (StatementExecutionException e) {
throw new IoTDBSQLException(e.getMessage(), resp);
}
- this.zoneId = ZoneId.of(zoneId);
+ this.zoneId = ZoneId.of(timeZone);
}
public ServerProperties getServerProperties() throws TException {
diff --git
a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
index 9eec1ea665..8f7b6d551f 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnectionParams.java
@@ -20,6 +20,8 @@ package org.apache.iotdb.jdbc;
import org.apache.iotdb.rpc.RpcUtils;
+import java.time.ZoneId;
+
public class IoTDBConnectionParams {
private String host = Config.IOTDB_DEFAULT_HOST;
@@ -36,6 +38,8 @@ public class IoTDBConnectionParams {
private int thriftMaxFrameSize = RpcUtils.THRIFT_FRAME_MAX_SIZE;
private int networkTimeout = Config.DEFAULT_CONNECTION_TIMEOUT_MS;
+ private String timeZone = ZoneId.systemDefault().toString();
+
public IoTDBConnectionParams(String url) {
this.jdbcUriString = url;
}
@@ -123,4 +127,12 @@ public class IoTDBConnectionParams {
public int getNetworkTimeout() {
return this.networkTimeout;
}
+
+ public void setTimeZone(String timeZone) {
+ this.timeZone = timeZone;
+ }
+
+ public String getTimeZone() {
+ return this.timeZone;
+ }
}
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
index 6aa5a7e843..ce2e2d11f2 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java
@@ -18,6 +18,8 @@
*/
package org.apache.iotdb.jdbc;
+import java.time.DateTimeException;
+import java.time.ZoneId;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -77,6 +79,9 @@ public class Utils {
if (info.containsKey(Config.NETWORK_TIMEOUT)) {
params.setNetworkTimeout(Integer.parseInt(info.getProperty(Config.NETWORK_TIMEOUT)));
}
+ if (info.containsKey(Config.TIME_ZONE)) {
+ params.setTimeZone(info.getProperty(Config.TIME_ZONE));
+ }
return params;
}
@@ -114,6 +119,15 @@ public class Utils {
case Config.NETWORK_TIMEOUT:
info.put(key, value);
break;
+ case Config.TIME_ZONE:
+ try {
+ // Check the validity of the time zone string.
+ ZoneId.of(value);
+ } catch (DateTimeException e) {
+ return false;
+ }
+ info.put(key, value);
+ break;
default:
return false;
}
diff --git a/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBConnectionTest.java
b/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBConnectionTest.java
index 9ed6f89471..876876b700 100644
--- a/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBConnectionTest.java
+++ b/jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBConnectionTest.java
@@ -33,12 +33,14 @@ import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
@@ -76,6 +78,16 @@ public class IoTDBConnectionTest {
assertEquals(connection.getTimeZone(), timeZone);
}
+ @Test
+ public void testSetTimeZoneByClientInfo() throws TException,
SQLClientInfoException {
+ String timeZone = "+07:00";
+ assertNotEquals(connection.getTimeZone(), timeZone);
+ when(client.setTimeZone(any(TSSetTimeZoneReq.class))).thenReturn(new
TSStatus(successStatus));
+ connection.setClient(client);
+ connection.setClientInfo("time_zone", timeZone);
+ assertEquals(connection.getTimeZone(), timeZone);
+ }
+
@Test
public void testGetServerProperties() throws TException {
final String version = "v0.1";