Skip to content

Commit 69fd0e5

Browse files
author
diego Dupin
committed
[misc] connection parser avoiding REGEX
1 parent 844df48 commit 69fd0e5

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

src/main/java/org/mariadb/jdbc/Configuration.java

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@
4949
*/
5050
public class Configuration {
5151

52-
private static final Pattern URL_PARAMETER =
53-
Pattern.compile("(/([^?]*))?(\\?(.+))*", Pattern.DOTALL);
54-
5552
// standard options
5653
private String user = null;
5754
private String password = null;
@@ -533,25 +530,31 @@ private static Configuration parseInternal(String url, Properties properties)
533530
}
534531

535532
if (additionalParameters != null) {
536-
//noinspection Annotator
537-
Matcher matcher = URL_PARAMETER.matcher(additionalParameters);
538-
matcher.find();
539-
String database = matcher.group(2);
540-
if (database != null && !database.isEmpty()) {
541-
builder.database(database);
542-
}
543-
String urlParameters = matcher.group(4);
544-
if (urlParameters != null && !urlParameters.isEmpty()) {
545-
String[] parameters = urlParameters.split("&");
546-
for (String parameter : parameters) {
547-
int pos = parameter.indexOf('=');
548-
if (pos == -1) {
549-
properties.setProperty(parameter, "");
550-
} else {
551-
properties.setProperty(parameter.substring(0, pos), parameter.substring(pos + 1));
533+
int optIndex = additionalParameters.indexOf("?");
534+
String database;
535+
if (optIndex < 0) {
536+
database = (additionalParameters.length() > 1) ? additionalParameters.substring(1) : null;
537+
} else {
538+
if (optIndex == 0) {
539+
database = null;
540+
} else {
541+
database = additionalParameters.substring(1, optIndex);
542+
if (database.isEmpty()) database = null;
543+
}
544+
String urlParameters = additionalParameters.substring(optIndex + 1);
545+
if (urlParameters != null && !urlParameters.isEmpty()) {
546+
String[] parameters = urlParameters.split("&");
547+
for (String parameter : parameters) {
548+
int pos = parameter.indexOf('=');
549+
if (pos == -1) {
550+
properties.setProperty(parameter, "");
551+
} else {
552+
properties.setProperty(parameter.substring(0, pos), parameter.substring(pos + 1));
553+
}
552554
}
553555
}
554556
}
557+
builder.database(database);
555558
} else {
556559
builder.database(null);
557560
}

src/test/java/org/mariadb/jdbc/unit/util/ConfigurationTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,19 @@ public void testJdbcParserWithoutDatabaseWithProperties() throws SQLException {
401401
assertEquals(HostAddress.from("slave2", 3308, true), conf.addresses().get(2));
402402
}
403403

404+
@Test
405+
public void testJdbcParserWithoutDatabase2WithProperties() throws SQLException {
406+
String url = "jdbc:mariadb://master:3306,slave1:3307,slave2:3308/?autoReconnect=true";
407+
Configuration conf = org.mariadb.jdbc.Configuration.parse(url);
408+
assertNull(conf.database());
409+
assertNull(conf.user());
410+
assertNull(conf.password());
411+
assertEquals(3, conf.addresses().size());
412+
assertEquals(HostAddress.from("master", 3306, true), conf.addresses().get(0));
413+
assertEquals(HostAddress.from("slave1", 3307, true), conf.addresses().get(1));
414+
assertEquals(HostAddress.from("slave2", 3308, true), conf.addresses().get(2));
415+
}
416+
404417
@Test
405418
public void testJdbcParserSimpleIpv4Properties() throws SQLException {
406419
String url = "jdbc:mariadb://master:3306,slave1:3307,slave2:3308/database?autoReconnect=true";

0 commit comments

Comments
 (0)