diff --git a/src/main/java/org/mariadb/jdbc/UrlParser.java b/src/main/java/org/mariadb/jdbc/UrlParser.java index b0f2b4827..6791b4bcd 100644 --- a/src/main/java/org/mariadb/jdbc/UrlParser.java +++ b/src/main/java/org/mariadb/jdbc/UrlParser.java @@ -208,7 +208,7 @@ private static void parseInternal(UrlParser urlParser, String url, Properties pr throw new IllegalArgumentException("url parsing error : '//' is not present in the url " + url); } - setHaMode(urlParser, url, separator); + urlParser.haMode = parseHaMode(url, separator); String urlSecondPart = url.substring(separator + 2); int dbIndex = urlSecondPart.indexOf("/"); @@ -327,18 +327,25 @@ public boolean isAurora() { return false; } - private static void setHaMode(UrlParser urlParser, String url, int separator) { - String[] baseTokens = url.substring(0, separator).split(":"); - //parse HA mode - urlParser.haMode = HaMode.NONE; - if (baseTokens.length > 2) { - try { - urlParser.haMode = HaMode.valueOf(baseTokens[2].toUpperCase()); - } catch (IllegalArgumentException i) { - throw new IllegalArgumentException("url parameter error '" + baseTokens[2] + "' is a unknown parameter in the url " + url); - } + private static HaMode parseHaMode(String url, int separator) { + //parser is sure to have at least 2 colon, since jdbc:[mysql|mariadb]: is tested. + int firstColonPos = url.indexOf(':'); + int secondColonPos = url.indexOf(':', firstColonPos + 1); + int thirdColonPos = url.indexOf(':', secondColonPos + 1); + + if (thirdColonPos > separator) return HaMode.NONE; + if (thirdColonPos == -1) { + if (secondColonPos == separator - 1) return HaMode.NONE; + thirdColonPos = separator; } + + try { + return HaMode.valueOf(url.substring(secondColonPos + 1, thirdColonPos).toUpperCase()); + } catch (IllegalArgumentException i) { + throw new IllegalArgumentException("wrong failover parameter format in connection String " + url); + } + } private static void setDefaultHostAddressType(UrlParser urlParser) { diff --git a/src/test/java/org/mariadb/jdbc/JdbcParserTest.java b/src/test/java/org/mariadb/jdbc/JdbcParserTest.java index b7bdd7c0b..210032a03 100644 --- a/src/test/java/org/mariadb/jdbc/JdbcParserTest.java +++ b/src/test/java/org/mariadb/jdbc/JdbcParserTest.java @@ -443,6 +443,30 @@ public void checkDisable() throws SQLException { assertTrue(jdbc == null); } + @Test + public void checkHaMode() throws SQLException { + checkHaMode("jdbc:mysql://localhost/test", HaMode.NONE); + checkHaMode("jdbc:mariadb://localhost/test", HaMode.NONE); + checkHaMode("jdbc:mariadb:replication://localhost/test", HaMode.REPLICATION); + checkHaMode("jdbc:mariadb:replication//localhost/test", HaMode.REPLICATION); + checkHaMode("jdbc:mariadb:aurora://localhost/test", HaMode.AURORA); + + try { + checkHaMode("jdbc:mariadb:replicati//localhost/test", HaMode.REPLICATION); + fail(); + } catch (SQLException sqle) { + assertTrue(sqle.getMessage().contains("wrong failover parameter format in connection String")); + } + + + } + + private void checkHaMode(String url, HaMode expectedHaMode) throws SQLException { + UrlParser jdbc = UrlParser.parse(url); + assertEquals(expectedHaMode, jdbc.getHaMode()); + + } + /** * CONJ-452 : correcting line break in connection url. *