Repository: trafodion Updated Branches: refs/heads/master 9f70ab325 -> 3ee76e160
[TRAFODION-3221]support using ipv6 with jdbct4 to connect trafodion Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/17e5c287 Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/17e5c287 Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/17e5c287 Branch: refs/heads/master Commit: 17e5c2877f9f714a04ec86a962737d0e56c74c1c Parents: 5f230e2 Author: haolin.song <haolin.s...@esgyn.cn> Authored: Wed Oct 10 16:20:44 2018 +0000 Committer: haolin.song <haolin.s...@esgyn.cn> Committed: Wed Oct 10 16:31:55 2018 +0000 ---------------------------------------------------------------------- .../java/org/trafodion/jdbc/t4/T4Address.java | 72 ++++++++++++++++---- .../odbc/nsksrvr/Interface/Listener_srvr.cpp | 2 +- 2 files changed, 59 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafodion/blob/17e5c287/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Address.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Address.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Address.java index 2bc145c..7870d58 100644 --- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Address.java +++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Address.java @@ -32,6 +32,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.Locale; import java.util.Properties; +import java.util.regex.Pattern; final class T4Address extends Address { @@ -140,7 +141,10 @@ final class T4Address extends Address { // ---------------------------------------------------------- String getUrl() { - return urlPrefix + getIPorName() + ':' + getPort().toString() + "/:"; + if (isIPv6ForPureUrl(getIPorName())){ + return urlPrefix + '[' + getIPorName() + ']' + ':' + getPort().toString() + "/:"; + }else + return urlPrefix + getIPorName() + ':' + getPort().toString() + "/:"; } // end getProps() // ---------------------------------------------------------- @@ -167,7 +171,8 @@ final class T4Address extends Address { int hostStartIndex = urlPrefix.length(); int hostEndIndex = -1; if (isIPV6(url)) { - hostEndIndex = url.lastIndexOf(']', hostStartIndex); // IP6 + hostStartIndex = hostStartIndex + 1; + hostEndIndex = url.lastIndexOf(']'); // IP6 } else { hostEndIndex = url.indexOf(':', hostStartIndex); // IP4 @@ -201,12 +206,24 @@ final class T4Address extends Address { * @return port string */ private String extractPortFromUrl(String url) throws SQLException { - int portStartIndex = url.indexOf(':', urlPrefix.length()) + 1; - int portEndIndex = url.indexOf('/', portStartIndex); - if (portEndIndex < 0) { - portEndIndex = url.length(); - + int portStartIndex = 0; + int portEndIndex = 0; + if (isIPV6(url)){ + portStartIndex = url.indexOf(':', url.indexOf(']')) + 1; + portEndIndex = url.indexOf('/', portStartIndex); + if (portEndIndex < 0) { + portEndIndex = url.length(); + + } + }else{ + portStartIndex = url.indexOf(':', urlPrefix.length()) + 1; + portEndIndex = url.indexOf('/', portStartIndex); + if (portEndIndex < 0) { + portEndIndex = url.length(); + + } } + String port = url.substring(portStartIndex, portEndIndex); if (port.length() < 1) { throw new SQLException("Incorrect port value in the URL."); @@ -303,13 +320,40 @@ final class T4Address extends Address { * @return true if the address is a IP address */ private boolean isIPAddress(String IPorName) { - // Minimum length = 7; 1.1.1.1 - if (IPorName.length() < 7) + + return isIPv4(IPorName) || isIPv6ForPureUrl(IPorName); + } + + public boolean isIPv4(String str) { + if (!Pattern.matches("[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+", str)) return false; - // - // If first letter is a digit or ":" (i.e. IPv6), I'll assume it is an - // IP address - // - return (Character.isDigit(IPorName.charAt(0)) || (IPorName.charAt(1) == ':')); + else { + String[] arrays = str.split("\\."); + if (Integer.parseInt(arrays[0]) < 256 && arrays[0].length() <= 3 + && Integer.parseInt(arrays[1]) < 256 && arrays[1].length() <= 3 + && Integer.parseInt(arrays[2]) < 256 && arrays[2].length() <= 3 + && Integer.parseInt(arrays[3]) < 256 && arrays[3].length() <= 3) + return true; + else return false; + } } + + public boolean isIPv6ForPureUrl(String str) { + + return isIPV6Std(str) || isIPV6Compress(str); + } + + public boolean isIPV6Std(String str) { + if (!Pattern.matches("^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$", str)) + return false; + return true; + } + + public boolean isIPV6Compress(String str) { + if (!Pattern.matches( "^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)$", str)) + return false; + return true; + } + + } // end class Address http://git-wip-us.apache.org/repos/asf/trafodion/blob/17e5c287/core/conn/odbc/src/odbc/nsksrvr/Interface/Listener_srvr.cpp ---------------------------------------------------------------------- diff --git a/core/conn/odbc/src/odbc/nsksrvr/Interface/Listener_srvr.cpp b/core/conn/odbc/src/odbc/nsksrvr/Interface/Listener_srvr.cpp index a31b51b..29fc422 100644 --- a/core/conn/odbc/src/odbc/nsksrvr/Interface/Listener_srvr.cpp +++ b/core/conn/odbc/src/odbc/nsksrvr/Interface/Listener_srvr.cpp @@ -36,7 +36,7 @@ CNSKListenerSrvr::CNSKListenerSrvr() m_port = 0; m_TraceCount = 0; m_tcpip_operation = CURR_UNDEFINED; - m_bIPv4 = true; + m_bIPv4 = false; m_TcpProcessName[0] = 0; doingRequest = new SB_Thread::Errorcheck_Mutex(true); pipefd[0] = 0; //read fd