Changeset: 5bfe3357fb1c for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/5bfe3357fb1c
Modified Files:
src/main/java/org/monetdb/jdbc/MonetConnection.java
src/main/java/org/monetdb/jdbc/MonetDriver.java
src/main/java/org/monetdb/mcl/MCLException.java
src/main/java/org/monetdb/mcl/io/BufferedMCLReader.java
src/main/java/org/monetdb/mcl/net/MapiSocket.java
src/main/java/org/monetdb/mcl/net/MonetUrlParser.java
src/main/java/org/monetdb/mcl/net/Target.java
tests/tests.md
Branch: monetdbs
Log Message:
Use the new url parser
diffs (truncated from 1901 to 300 lines):
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
@@ -25,7 +25,6 @@ import java.sql.SQLWarning;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -36,8 +35,8 @@ 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;
@@ -74,17 +73,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 */
@@ -120,6 +110,9 @@ public class MonetConnection
/** The number of results we receive from the server at once */
private int curReplySize = 100; // server default
+ private boolean sizeHeaderEnabled = false; // used during handshake
+ private boolean timeZoneSet = false; // used during handshake
+
/** A template to apply to each query (like pre and post fixes), filled
in constructor */
// note: it is made public to the package as queryTempl[2] is used from
MonetStatement
@@ -137,11 +130,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
@@ -155,137 +143,23 @@ public class MonetConnection
* createStatement() call. 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 Target object holding the 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");
+ String fname = target.getLogfile();
+ if (fname == null)
+ fname = "monet_" +
System.currentTimeMillis() + ".log";
+
File f = new File(fname);
int ext = fname.lastIndexOf('.');
@@ -304,26 +178,45 @@ public class MonetConnection
}
}
+ SqlOptionsCallback callback = null;
+ switch (target.getLanguage()) {
+ case "sql":
+ lang = LANG_SQL;
+ queryTempl[0] = "s"; // pre
+ queryTempl[1] = "\n;"; // post
+ queryTempl[2] = "\n;\n"; // separator
+ commandTempl[0] = "X"; // pre
+ commandTempl[1] = ""; // post
+ callback = new SqlOptionsCallback();
+ break;
+ case "mal":
+ lang = LANG_MAL;
+ queryTempl[0] = ""; // pre
+ queryTempl[1] = ";\n"; // post
+ queryTempl[2] = ";\n"; // separator
+ commandTempl[0] = ""; // pre
+ commandTempl[1] = ""; // post
+ break;
+ default:
+ lang = LANG_UNKNOWN;
+ break;
+ }
+
try {
- final java.util.List<String> warnings =
server.connect(hostname, port, username, password);
+
+ final java.util.List<String> warnings =
server.connect(target, callback);
for (String warning : warnings) {
addWarning(warning, "01M02");
}
- // apply NetworkTimeout value from legacy (pre 4.1)
driver
- // so_timeout calls
- server.setSoTimeout(sockTimeout);
-
in = server.getReader();
out = server.getWriter();
final String error = in.discardRemainder();
if (error != null)
throw new
SQLNonTransientConnectionException((error.length() > 6) ? error.substring(6) :
error, "08001");
- } catch (java.net.UnknownHostException e) {
- throw new SQLNonTransientConnectionException("Unknown
Host (" + hostname + "): " + e.getMessage(), "08006");
} catch (IOException e) {
- throw new SQLNonTransientConnectionException("Unable to
connect (" + hostname + ":" + port + "): " + e.getMessage(), "08006");
+ throw new SQLNonTransientConnectionException("Cannot
connect: " + e.getMessage(), "08006");
} catch (MCLParseException e) {
throw new
SQLNonTransientConnectionException(e.getMessage(), "08001");
} catch (org.monetdb.mcl.MCLException e) {
@@ -335,53 +228,17 @@ public class MonetConnection
throw sqle;
}
- // we seem to have managed to log in, let's store the
- // language used and language specific query templates
- if ("sql".equals(language)) {
- lang = LANG_SQL;
-
- queryTempl[0] = "s"; // pre
- queryTempl[1] = "\n;"; // post
- queryTempl[2] = "\n;\n"; // separator
-
- commandTempl[0] = "X"; // pre
- commandTempl[1] = ""; // post
- //commandTempl[2] = "\nX"; // separator (is not
used)
- } else if ("mal".equals(language)) {
- lang = LANG_MAL;
-
- queryTempl[0] = ""; // pre
- queryTempl[1] = ";\n"; // post
- queryTempl[2] = ";\n"; // separator
-
- commandTempl[0] = ""; // pre
- commandTempl[1] = ""; // post
- //commandTempl[2] = ""; // separator (is not
used)
- } else {
- lang = LANG_UNKNOWN;
- }
-
// Now take care of any handshake options not handled during
the handshake
- if (replySizeSetting.isSent()) {
- this.curReplySize = replySizeSetting.get();
- }
- this.defaultFetchSize = replySizeSetting.get();
+ curReplySize = defaultFetchSize;
if (lang == LANG_SQL) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]