Skip to content

Commit

Permalink
[misc] faster failover parsing in connection String
Browse files Browse the repository at this point in the history
  • Loading branch information
rusher committed Sep 25, 2017
1 parent fd1dad0 commit 03180d8
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 11 deletions.
29 changes: 18 additions & 11 deletions src/main/java/org/mariadb/jdbc/UrlParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -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("/");
Expand Down Expand Up @@ -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) {
Expand Down
24 changes: 24 additions & 0 deletions src/test/java/org/mariadb/jdbc/JdbcParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down

0 comments on commit 03180d8

Please sign in to comment.