changeset 796:d2f14f2b28b3 monetdbs

Allow to pass whole URL to jdbcclient not just separate parameters Pass all information using Properties rather than building a URL. If the 'database' parameter starts with jdbc:, use that as the URL. Otherwise, use a stub
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 07 Dec 2023 09:00:00 +0100 (16 months ago)
parents 04a27386789f
children 9f6fe96c0ead
files src/main/java/org/monetdb/client/JdbcClient.java
diffstat 1 files changed, 28 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/monetdb/client/JdbcClient.java
+++ b/src/main/java/org/monetdb/client/JdbcClient.java
@@ -39,6 +39,7 @@ import java.sql.SQLWarning;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Properties;
 
 /**
  * This program acts like an extended client program for MonetDB. Its
@@ -123,6 +124,7 @@ public final class JdbcClient {
 	 * @throws Exception if uncaught exception is thrown
 	 */
 	public final static void main(String[] args) throws Exception {
+		final Properties props = new Properties();
 		final CmdLineOpts copts = new CmdLineOpts();
 
 		// arguments which take exactly one argument
@@ -290,19 +292,24 @@ public final class JdbcClient {
 
 		user = copts.getOption("user").getArgument();
 
-		// build the hostname
+		// extract hostname and port
 		String host = copts.getOption("host").getArgument();
-		if (host.indexOf(':') == -1) {
-			host = host + ":" + copts.getOption("port").getArgument();
+		String port = copts.getOption("port").getArgument();
+		int hostColon = host.indexOf(':');
+		if (hostColon > 0) {
+			port = host.substring(hostColon + 1);
+			host = host.substring(0, hostColon);
 		}
+		props.setProperty("host", host);
+		props.setProperty("port", port);
 
-		// build the extra arguments of the JDBC connect string
 		// increase the fetchsize from the default 250 to 10000
-		String attr = "?fetchsize=10000&";
+		props.setProperty("fetchsize", "10000");
+
 		CmdLineOpts.OptionContainer oc = copts.getOption("language");
 		final String lang = oc.getArgument();
 		if (oc.isPresent())
-			attr += "language=" + lang + "&";
+			props.setProperty("language", lang);
 
 /* Xquery is no longer functional or supported
 		// set some behaviour based on the language XQuery
@@ -314,13 +321,13 @@ public final class JdbcClient {
 */
 		oc = copts.getOption("Xdebug");
 		if (oc.isPresent()) {
-			attr += "debug=true&";
+			props.setProperty("debug", "true");
 			if (oc.getArgumentCount() == 1)
-				attr += "logfile=" + oc.getArgument() + "&";
+				props.setProperty("logfile", "logfile=" + oc.getArgument());
 		}
 		oc = copts.getOption("Xhash");
 		if (oc.isPresent())
-			attr += "hash=" + oc.getArgument() + "&";
+			props.setProperty("hash", oc.getArgument());
 
 		// request a connection suitable for MonetDB from the driver
 		// manager note that the database specifier is only used when
@@ -332,9 +339,18 @@ public final class JdbcClient {
 			// make sure the driver class is loaded (and thus register itself with the DriverManager)
 			Class.forName("org.monetdb.jdbc.MonetDriver");
 
-			String url = "jdbc:monetdb://" + host + "/" + database + attr;
-			System.err.println(url);
-			con = DriverManager.getConnection(url, user, pass);
+			// If the database name is a full url, use that.
+			// Otherwise, construct something.
+			String url;
+			if (database.startsWith("jdbc:")) {
+				url = database;
+			} else {
+				url = "jdbc:monetdb:"; // special case
+				props.setProperty("database", database);
+			}
+			props.setProperty("user", user);
+			props.setProperty("password", pass);
+			con = DriverManager.getConnection(url, props);
 			SQLWarning warn = con.getWarnings();
 			while (warn != null) {
 				System.err.println("Connection warning: " + warn.getMessage());