# HG changeset patch # User Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com> # Date 1702378743 -3600 # Node ID 6b7778153d235ebcf42b6feefe32129c9d7748a2 # Parent 9239a3ef0bbdc7811e6ecf87575a3b2eb4bd0191 Fully implement Target.buildURL diff --git a/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java b/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java --- a/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java +++ b/src/main/java/org/monetdb/mcl/net/MonetUrlParser.java @@ -4,6 +4,7 @@ import java.io.UnsupportedEncodingExcept import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; +import java.net.URLEncoder; public class MonetUrlParser { private final Target target; @@ -49,7 +50,7 @@ public class MonetUrlParser { target.barrier(); } - private static String percentDecode(String context, String text) throws URISyntaxException { + public static String percentDecode(String context, String text) throws URISyntaxException { try { return URLDecoder.decode(text, "UTF-8"); } catch (UnsupportedEncodingException e) { @@ -59,6 +60,14 @@ public class MonetUrlParser { } } + public static String percentEncode(String text) { + try { + return URLEncoder.encode(text, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + private void parseModern() throws URISyntaxException, ValidationError { clearBasic(); diff --git a/src/main/java/org/monetdb/mcl/net/Target.java b/src/main/java/org/monetdb/mcl/net/Target.java --- a/src/main/java/org/monetdb/mcl/net/Target.java +++ b/src/main/java/org/monetdb/mcl/net/Target.java @@ -409,11 +409,31 @@ public class Target { public String buildUrl() { final StringBuilder sb = new StringBuilder(128); - sb.append("jdbc:monetdb://").append(host) - .append(':').append(port) - .append('/').append(database); - if (!language.equals("sql")) - sb.append("?language=").append(language); + sb.append("jdbc:"); + sb.append(tls ? "monetdbs": "monetdb"); + sb.append("://"); + sb.append(packHost(host)); + if (!Parameter.PORT.getDefault().equals(port)) { + sb.append(':'); + sb.append(port); + } + sb.append('/').append(database); + String sep = "?"; + for (Parameter parm: Parameter.values()) { + if (parm.isCore || parm == Parameter.USER || parm == Parameter.PASSWORD) + continue; + Object defaultValue = parm.getDefault(); + if (defaultValue == null) + continue; + Object value = getObject(parm); + if (value.equals(defaultValue)) + continue; + sb.append(sep).append(parm.name).append('='); + String raw = getString(parm); + String encoded = MonetUrlParser.percentEncode(raw); + sb.append(encoded); + sep = "&"; + } return sb.toString(); }