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";

Reply via email to