Skip to content

Commit

Permalink
[misc] improving url parser performance
Browse files Browse the repository at this point in the history
  • Loading branch information
rusher committed Sep 15, 2017
1 parent a34d1a6 commit 2e9a6fd
Show file tree
Hide file tree
Showing 6 changed files with 371 additions and 143 deletions.
14 changes: 11 additions & 3 deletions src/main/java/org/mariadb/jdbc/HostAddress.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,20 +164,28 @@ private static HostAddress parseSimpleHostAddress(String str) {
int ind = str.indexOf(']');
result.host = str.substring(1, ind);
if (ind != (str.length() - 1) && str.charAt(ind + 1) == ':') {
result.port = Integer.parseInt(str.substring(ind + 2));
result.port = getPort(str.substring(ind + 2));
}
} else if (str.contains(":")) {
/* Parse host:port */
String[] hostPort = str.split(":");
result.host = hostPort[0];
result.port = Integer.parseInt(hostPort[1]);
result.port = getPort(hostPort[1]);
} else {
/* Just host name is given */
result.host = str;
}
return result;
}

private static int getPort(String portString) {
try {
return Integer.parseInt(portString);
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Incorrect port value : " + portString);
}
}

private static HostAddress parseParameterHostAddress(String str) {
HostAddress result = new HostAddress();
String[] array = str.split("(?=\\()|(?<=\\))");
Expand All @@ -191,7 +199,7 @@ private static HostAddress parseParameterHostAddress(String str) {
if ("host".equals(key)) {
result.host = value.replace("[", "").replace("]", "");
} else if ("port".equals(key)) {
result.port = Integer.parseInt(value);
result.port = getPort(value);
} else if ("type".equals(key)
&& (value.equals(ParameterConstant.TYPE_MASTER) || value.equals(ParameterConstant.TYPE_SLAVE))) {
result.type = value;
Expand Down
58 changes: 53 additions & 5 deletions src/main/java/org/mariadb/jdbc/UrlParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import org.mariadb.jdbc.internal.util.constant.ParameterConstant;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
Expand Down Expand Up @@ -92,7 +93,7 @@
* {@code jdbc:mariadb://address=(type=master)(host=master1),address=(port=3307)(type=slave)(host=slave1)/database?user=greg&password=pass}<br>
* </p>
*/
public class UrlParser {
public class UrlParser implements Cloneable {

private static final String DISABLE_MYSQL_URL = "disableMariaDbDriver";
private String database;
Expand Down Expand Up @@ -121,7 +122,34 @@ protected UrlParser(String database, List<HostAddress> addresses, Options option
}
}
}

DefaultOptions.optionCoherenceValidation(options);
StringBuilder sb = new StringBuilder();
sb.append("jdbc:mariadb:");
if (haMode != HaMode.NONE) {
sb.append(haMode).append(":");
}
sb.append("//");
boolean first = true;
for (HostAddress hostAddress : addresses) {
if (first) {
first = false;
} else {
sb.append(",");
}
sb.append("address=(host=").append(hostAddress.host).append(")")
.append("(port=").append(hostAddress.port).append(")");
if (hostAddress.type != null) {
sb.append("(type=").append(hostAddress.type).append(")");
}
}

sb.append("/");
if (database != null) sb.append(database);
DefaultOptions.propertyString(options, haMode, sb);
initialUrl = sb.toString();
multiMaster = loadMultiMasterValue();

}

/**
Expand Down Expand Up @@ -203,7 +231,7 @@ private static void parseInternal(UrlParser urlParser, String url, Properties pr
setDefaultHostAddressType(urlParser);

} catch (IllegalArgumentException i) {
throw new SQLException(i.getMessage());
throw new SQLException("error parsing url : " + i.getMessage(), i);
}
}

Expand All @@ -229,19 +257,22 @@ private static void defineUrlParserParameters(UrlParser urlParser, Properties pr

urlParser.database = matcher.group(2);
urlParser.options = DefaultOptions.parse(urlParser.haMode, matcher.group(4), properties, urlParser.options);
DefaultOptions.optionCoherenceValidation(urlParser.options);
if (urlParser.database != null && urlParser.database.isEmpty()) urlParser.database = null;

} else {

urlParser.database = null;
urlParser.options = DefaultOptions.parse(urlParser.haMode, "", properties, urlParser.options);
DefaultOptions.optionCoherenceValidation(urlParser.options);

}

} else {

urlParser.database = null;
urlParser.options = DefaultOptions.parse(urlParser.haMode, "", properties, urlParser.options);
DefaultOptions.optionCoherenceValidation(urlParser.options);

}

Expand Down Expand Up @@ -340,23 +371,23 @@ public String getUsername() {
return options.user;
}

protected void setUsername(String username) {
public void setUsername(String username) {
options.user = username;
}

public String getPassword() {
return options.password;
}

protected void setPassword(String password) {
public void setPassword(String password) {
options.password = password;
}

public String getDatabase() {
return database;
}

protected void setDatabase(String database) {
public void setDatabase(String database) {
this.database = database;
}

Expand Down Expand Up @@ -404,6 +435,14 @@ public boolean equals(Object parser) {
&& (getPassword() != null ? getPassword().equals(urlParser.getPassword()) : urlParser.getPassword() == null);
}

@Override
public int hashCode() {
int result = options.password != null ? options.password.hashCode() : 0;
result = 31 * result + (options.user != null ? options.user.hashCode() : 0);
result = 31 * result + initialUrl.hashCode();
return result;
}

private boolean loadMultiMasterValue() {
if (haMode == HaMode.SEQUENTIAL
|| haMode == HaMode.REPLICATION
Expand All @@ -425,4 +464,13 @@ private boolean loadMultiMasterValue() {
public boolean isMultiMaster() {
return multiMaster;
}

@Override
public Object clone() throws CloneNotSupportedException {
UrlParser tmpUrlParser = (UrlParser) super.clone();
tmpUrlParser.options = (Options) options.clone();
tmpUrlParser.addresses = new ArrayList<>();
tmpUrlParser.addresses.addAll(addresses);
return tmpUrlParser;
}
}
Loading

0 comments on commit 2e9a6fd

Please sign in to comment.