This is an automated email from the ASF dual-hosted git repository. lta pushed a commit to branch check_path_in_session in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit 6932147a9d7c1a1a60d61d64d73240dc02777585 Author: lta <[email protected]> AuthorDate: Mon Oct 21 21:36:17 2019 +0800 add check path validity --- .../main/java/org/apache/iotdb/session/Config.java | 6 +++ .../java/org/apache/iotdb/session/Session.java | 19 ++++++++ .../org/apache/iotdb/session/IoTDBSessionIT.java | 55 ++++++++++++++++++++++ .../tsfile/common/constant/TsFileConstant.java | 1 + 4 files changed, 81 insertions(+) diff --git a/session/src/main/java/org/apache/iotdb/session/Config.java b/session/src/main/java/org/apache/iotdb/session/Config.java index 3bc2344..147dea6 100644 --- a/session/src/main/java/org/apache/iotdb/session/Config.java +++ b/session/src/main/java/org/apache/iotdb/session/Config.java @@ -18,9 +18,15 @@ */ package org.apache.iotdb.session; +import static org.apache.iotdb.tsfile.common.constant.TsFileConstant.PATH_ROOT; +import static org.apache.iotdb.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR; + public class Config { public static final String DEFAULT_USER = "user"; public static final String DEFAULT_PASSWORD = "password"; + public static final String PATH_MATCHER = + PATH_ROOT + "([" + PATH_SEPARATOR + "](([a-zA-Z_][a-zA-Z0-9_-]*)|([+-]?[0-9]+)))+"; + } diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java b/session/src/main/java/org/apache/iotdb/session/Session.java index 4817c67..32d7fa0 100644 --- a/session/src/main/java/org/apache/iotdb/session/Session.java +++ b/session/src/main/java/org/apache/iotdb/session/Session.java @@ -18,11 +18,14 @@ */ package org.apache.iotdb.session; +import static org.apache.iotdb.session.Config.PATH_MATCHER; + import java.sql.SQLException; import java.time.ZoneId; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import java.util.regex.Pattern; import org.apache.iotdb.rpc.IoTDBRPCException; import org.apache.iotdb.rpc.RpcUtils; import org.apache.iotdb.rpc.TSStatusCode; @@ -257,6 +260,7 @@ public class Session { } public synchronized TSStatus setStorageGroup(String storageGroupId) throws IoTDBSessionException { + checkPathValidity(storageGroupId); try { return checkAndReturn(client.setStorageGroup(storageGroupId)); } catch (TException e) { @@ -283,6 +287,7 @@ public class Session { public synchronized TSStatus createTimeseries(String path, TSDataType dataType, TSEncoding encoding, CompressionType compressor) throws IoTDBSessionException { + checkPathValidity(path); TSCreateTimeseriesReq request = new TSCreateTimeseriesReq(); request.setPath(path); request.setDataType(dataType.ordinal()); @@ -376,4 +381,18 @@ public class Session { RpcUtils.verifySuccess(execResp.getStatus()); } + + private void checkPathValidity(String path) throws IoTDBSessionException { + if (!Pattern.matches(PATH_MATCHER, path)) { + throw new IoTDBSessionException(String.format("Path %s is invalid", path)); + } + } + + + public static void main(String[] args) { + System.out.println( + Pattern.matches("root([.](([a-zA-Z_][a-zA-Z0-9_-]*)|([+-]?[0-9]+)))+", "root.\tvehicle")); + } + + } diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java index 435ffa7..d460369 100644 --- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java +++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java @@ -280,4 +280,59 @@ public class IoTDBSessionIT { session.executeNonQueryStatement( "insert into root.sg1.d1(timestamp,s1, s2, s3) values(100, 1,2,3)"); } + + @Test + public void checkPathTest() + throws ClassNotFoundException, SQLException, IoTDBSessionException, TException, IoTDBRPCException { + session = new Session("127.0.0.1", 6667, "root", "root"); + session.open(); + + //test set sg + checkSetSG(session, "root.vehicle", true); + checkSetSG(session, "root.123456", true); + checkSetSG(session, "root._1234", true); + checkSetSG(session, "root._vehicle", true); + checkSetSG(session, "root.\tvehicle", false); + checkSetSG(session, "root.\nvehicle", false); + checkSetSG(session, "root..vehicle", false); + checkSetSG(session, "root.1234a4", false); + checkSetSG(session, "root.+12345", true); + checkSetSG(session, "root.-12345", true); + checkSetSG(session, "root.%12345", false); + checkSetSG(session, "root.a{12345}", false); + + //test create timeseries + checkCreateTimeseries(session, "root.vehicle.d0.s0", true); + checkCreateTimeseries(session, "root.vehicle.1110.s0", true); + checkCreateTimeseries(session, "root.vehicle.d0.1220", true); + checkCreateTimeseries(session, "root.vehicle._1234.s0", true); + checkCreateTimeseries(session, "root.vehicle.+1245.-1256", true); + checkCreateTimeseries(session, "root.vehicle./d0.s0", false); + checkCreateTimeseries(session, "root.vehicle.d\t0.s0", false); + checkCreateTimeseries(session, "root.vehicle.!d\t0.s0", false); + checkCreateTimeseries(session, "root.vehicle.d{dfewrew0}.s0", false); + + session.close(); + } + + private void checkSetSG(Session session, String sg, boolean correctStatus){ + boolean status = true; + try { + session.setStorageGroup(sg); + } catch (IoTDBSessionException e) { + status = false; + } + assertEquals(status, correctStatus); + } + + private void checkCreateTimeseries(Session session, String timeseris, boolean correctStatus){ + boolean status = true; + try { + session.createTimeseries(timeseris, TSDataType.INT64, TSEncoding.RLE, + CompressionType.SNAPPY); + } catch (IoTDBSessionException e) { + status = false; + } + assertEquals(status, correctStatus); + } } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/TsFileConstant.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/TsFileConstant.java index 594a613..479bd8e 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/TsFileConstant.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/TsFileConstant.java @@ -23,6 +23,7 @@ public class TsFileConstant { public static final String TSFILE_SUFFIX = ".tsfile"; public static final String TSFILE_HOME = "TSFILE_HOME"; public static final String TSFILE_CONF = "TSFILE_CONF"; + public static final String PATH_ROOT = "root"; public static final String PATH_SEPARATOR = "."; public static final String PATH_SEPARATER_NO_REGEX = "\\."; public static final String DEFAULT_DELTA_TYPE = "default_delta_type";
