Changeset: ca7f27763249 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/ca7f27763249
Branch: default
Log Message:

Merge 'monetdbs' into 'default'


diffs (truncated from 5708 to 300 lines):

diff --git a/src/main/java/org/monetdb/client/JdbcClient.java 
b/src/main/java/org/monetdb/client/JdbcClient.java
--- a/src/main/java/org/monetdb/client/JdbcClient.java
+++ b/src/main/java/org/monetdb/client/JdbcClient.java
@@ -43,6 +43,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
@@ -127,6 +128,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
@@ -194,6 +196,10 @@ public final class JdbcClient {
                                "statements read.  Batching can greatly speedup 
the " +
                                "process of restoring a database dump.");
 
+               copts.addIgnored("save_history");
+               copts.addIgnored("format");
+               copts.addIgnored("width");
+
                // we store user and password in separate variables in order to
                // be able to properly act on them like forgetting the password
                // from the user's file if the user supplies a username on the
@@ -287,19 +293,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
@@ -311,13 +322,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
@@ -329,11 +340,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");
 
-                       con = DriverManager.getConnection(
-                                       "jdbc:monetdb://" + host + "/" + 
database + attr,
-                                       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());
diff --git a/src/main/java/org/monetdb/jdbc/MonetConnection.java 
b/src/main/java/org/monetdb/jdbc/MonetConnection.java
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -35,12 +35,14 @@ import java.util.concurrent.Executor;
 import org.monetdb.mcl.io.BufferedMCLReader;
 import org.monetdb.mcl.io.BufferedMCLWriter;
 import org.monetdb.mcl.io.LineType;
-import org.monetdb.mcl.net.HandshakeOption;
 import org.monetdb.mcl.net.MapiSocket;
+import org.monetdb.mcl.net.Target;
 import org.monetdb.mcl.parser.HeaderLineParser;
 import org.monetdb.mcl.parser.MCLParseException;
 import org.monetdb.mcl.parser.StartOfHeaderParser;
 
+import javax.net.ssl.SSLException;
+
 /**
  *<pre>
  * A {@link Connection} suitable for the MonetDB database.
@@ -73,17 +75,8 @@ public class MonetConnection
        extends MonetWrapper
        implements Connection, AutoCloseable
 {
-       /** The hostname to connect to */
-       private final String hostname;
-       /** The port to connect on the host to */
-       private int port;
-       /** The database to use (currently not used) */
-       private final String database;
-       /** The username to use when authenticating */
-       private final String username;
-       /** The password to use when authenticating */
-       private final String password;
-
+       /* All connection parameters */
+       Target target;
        /** A connection to mserver5 using a TCP socket */
        private final MapiSocket server;
        /** The Reader from the server */
@@ -136,11 +129,6 @@ public class MonetConnection
        /** The language which is used */
        private final int lang;
 
-       /** Whether or not BLOB is mapped to Types.VARBINARY instead of 
Types.BLOB within this connection */
-       private boolean treatBlobAsVarBinary = true;    // turned on by default 
for optimal performance (from JDBC Driver release 3.0 onwards)
-       /** Whether or not CLOB is mapped to Types.VARCHAR instead of 
Types.CLOB within this connection */
-       private boolean treatClobAsVarChar = true;      // turned on by default 
for optimal performance (from JDBC Driver release 3.0 onwards)
-
        /** The last set query timeout on the server as used by Statement, 
PreparedStatement and CallableStatement */
        protected int lastSetQueryTimeout = 0;  // 0 means no timeout, which is 
the default on the server
 
@@ -148,143 +136,27 @@ public class MonetConnection
        private DatabaseMetaData dbmd;
 
        /**
-        * Constructor of a Connection for MonetDB. At this moment the
-        * current implementation limits itself to storing the given host,
-        * database, username and password for later use by the
-        * createStatement() call.  This constructor is only accessible to
+        * Constructor of a Connection for MonetDB.
+        * This constructor is only accessible to
         * classes from the jdbc package.
         *
-        * @param props a Property hashtable holding the properties needed for 
connecting
+        * @param target a {@link Target} object containing all connection 
parameters
         * @throws SQLException if a database error occurs
         * @throws IllegalArgumentException is one of the arguments is null or 
empty
         */
-       MonetConnection(final Properties props)
+       MonetConnection(Target target)
                throws SQLException, IllegalArgumentException
        {
-               HandshakeOption.AutoCommit autoCommitSetting = new 
HandshakeOption.AutoCommit(true);
-               HandshakeOption.ReplySize replySizeSetting = new 
HandshakeOption.ReplySize(DEF_FETCHSIZE);
-               HandshakeOption.SizeHeader sizeHeaderSetting = new 
HandshakeOption.SizeHeader(true);
-               HandshakeOption.TimeZone timeZoneSetting = new 
HandshakeOption.TimeZone(0);
-
-               // for debug: System.out.println("New connection object. 
Received properties are: " + props.toString());
-               // get supported property values from the props argument.
-               this.hostname = props.getProperty("host");
-
-               final String port_prop = props.getProperty("port");
-               if (port_prop != null) {
-                       try {
-                               this.port = Integer.parseInt(port_prop);
-                       } catch (NumberFormatException e) {
-                               addWarning("Unable to parse port number from: " 
+ port_prop, "M1M05");
-                       }
-               }
-
-               this.database = props.getProperty("database");
-               this.username = props.getProperty("user");
-               this.password = props.getProperty("password");
-               String language = props.getProperty("language");
-
-               boolean debug = false;
-               String debug_prop = props.getProperty("debug");
-               if (debug_prop != null) {
-                       debug = Boolean.parseBoolean(debug_prop);
-               }
-
-               final String hash = props.getProperty("hash");
-
-               String autocommit_prop = props.getProperty("autocommit");
-               if (autocommit_prop != null) {
-                       boolean ac = Boolean.parseBoolean(autocommit_prop);
-                       autoCommitSetting.set(ac);
-               }
-
-               final String fetchsize_prop = props.getProperty("fetchsize");
-               if (fetchsize_prop != null) {
-                       try {
-                               int fetchsize = 
Integer.parseInt(fetchsize_prop);
-                               if (fetchsize > 0 || fetchsize == -1) {
-                                       replySizeSetting.set(fetchsize);
-                               } else {
-                                       addWarning("Fetch size must either be 
positive or -1. Value " + fetchsize + " ignored", "M1M05");
-                               }
-                       } catch (NumberFormatException e) {
-                               addWarning("Unable to parse fetch size number 
from: " + fetchsize_prop, "M1M05");
-                       }
-               }
-
-               final String treatBlobAsVarBinary_prop = 
props.getProperty("treat_blob_as_binary");
-               if (treatBlobAsVarBinary_prop != null) {
-                       treatBlobAsVarBinary = 
Boolean.parseBoolean(treatBlobAsVarBinary_prop);
-                       if (treatBlobAsVarBinary)
-                               typeMap.put("blob", Byte[].class);
-               }
-
-               final String treatClobAsVarChar_prop = 
props.getProperty("treat_clob_as_varchar");
-               if (treatClobAsVarChar_prop != null) {
-                       treatClobAsVarChar = 
Boolean.parseBoolean(treatClobAsVarChar_prop);
-                       if (treatClobAsVarChar)
-                               typeMap.put("clob", String.class);
-               }
-
-               int sockTimeout = 0;
-               final String so_timeout_prop = props.getProperty("so_timeout");
-               if (so_timeout_prop != null) {
-                       try {
-                               sockTimeout = Integer.parseInt(so_timeout_prop);
-                               if (sockTimeout < 0) {
-                                       addWarning("Negative socket timeout not 
allowed. Value ignored", "M1M05");
-                                       sockTimeout = 0;
-                               }
-                       } catch (NumberFormatException e) {
-                               addWarning("Unable to parse socket timeout 
number from: " + so_timeout_prop, "M1M05");
-                       }
-               }
-
-               // check mandatory input arguments
-               if (hostname == null || hostname.isEmpty())
-                       throw new IllegalArgumentException("Missing or empty 
host name");
-               if (port <= 0 || port > 65535)
-                       throw new IllegalArgumentException("Invalid port 
number: " + port
-                                       + ". It should not be " + (port < 0 ? 
"negative" : (port > 65535 ? "larger than 65535" : "0")));
-               if (username == null || username.isEmpty())
-                       throw new IllegalArgumentException("Missing or empty 
user name");
-               if (password == null || password.isEmpty())
-                       throw new IllegalArgumentException("Missing or empty 
password");
-               if (language == null || language.isEmpty()) {
-                       // fallback to default language: sql
-                       language = "sql";
-                       addWarning("No language specified, defaulting to 
'sql'", "M1M05");
-               }
-
-               // warn about unrecognized property names
-               for (Entry<Object,Object> e: props.entrySet()) {
-                       checkValidProperty(e.getKey().toString(), 
"MonetConnection");
-               }
-
+               this.target = target;
                server = new MapiSocket();
-               if (hash != null)
-                       server.setHash(hash);
-               if (database != null)
-                       server.setDatabase(database);
-               server.setLanguage(language);
-
-               // calculate our time zone offset
-               final Calendar cal = Calendar.getInstance();
-               final int offsetMillis = cal.get(Calendar.ZONE_OFFSET) + 
cal.get(Calendar.DST_OFFSET);
-               final int offsetSeconds = offsetMillis / 1000;
-               timeZoneSetting.set(offsetSeconds);
-
-               server.setHandshakeOptions(new HandshakeOption<?>[] {
-                               autoCommitSetting,
-                               replySizeSetting,
-                               sizeHeaderSetting,
-                               timeZoneSetting,
-               });
 
                // we're debugging here... uhm, should be off in real life
-               if (debug) {
+               if (target.isDebug()) {
                        try {
-                               final String fname = 
props.getProperty("logfile", "monet_" + System.currentTimeMillis() + ".log");
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to