Changeset: c6fe5dfecafc for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/c6fe5dfecafc
Modified Files:
src/main/java/org/monetdb/jdbc/MonetConnection.java
src/main/java/org/monetdb/mcl/net/HandshakeOptions.java
src/main/java/org/monetdb/mcl/net/MapiSocket.java
Branch: default
Log Message:
Refactor HandshakeOptions
diffs (230 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
@@ -37,6 +37,7 @@ import org.monetdb.mcl.io.BufferedMCLRea
import org.monetdb.mcl.io.BufferedMCLWriter;
import org.monetdb.mcl.io.LineType;
import org.monetdb.mcl.net.HandshakeOptions;
+import org.monetdb.mcl.net.HandshakeOptions.Setting;
import org.monetdb.mcl.net.MapiSocket;
import org.monetdb.mcl.parser.HeaderLineParser;
import org.monetdb.mcl.parser.MCLParseException;
@@ -287,8 +288,8 @@ public class MonetConnection
int offsetMillis = cal.get(Calendar.ZONE_OFFSET) +
cal.get(Calendar.DST_OFFSET);
int offsetSeconds = offsetMillis / 1000;
final HandshakeOptions handshakeOptions = new
HandshakeOptions();
- handshakeOptions.setTimeZone(offsetSeconds);
- handshakeOptions.setReplySize(defaultFetchSize);
+ handshakeOptions.set(Setting.TimeZone, offsetSeconds);
+ handshakeOptions.set(Setting.ReplySize, defaultFetchSize);
server.setHandshakeOptions(handshakeOptions);
// we're debugging here... uhm, should be off in real life
@@ -370,11 +371,18 @@ public class MonetConnection
lang = LANG_UNKNOWN;
}
- if (!handshakeOptions.mustSendReplySize()) {
- // Initially, it had to be sent. If it no more needs to
be sent now,
- // it must have been sent during the auth
challenge/response.
- // Record the value it was set to.
- this.curReplySize = handshakeOptions.getReplySize();
+ // The reply size is checked before every query and adjusted if
+ // necessary. Update our current belief of what the server is
set to.
+ if
(handshakeOptions.wasSentInHandshake(HandshakeOptions.Setting.ReplySize)) {
+ this.curReplySize =
handshakeOptions.get(HandshakeOptions.Setting.ReplySize);
+ }
+
+ for (Setting setting : new Setting[] { Setting.SizeHeader }) {
+ if (handshakeOptions.mustSend(setting)) {
+ Integer value = handshakeOptions.get(setting);
// guaranteed by mustSend to be non-null
+ String command = String.format("%s %d",
setting.getXCommand(), value);
+ sendControlCommand(command);
+ }
}
// the following initialisers are only valid when the language
is SQL...
@@ -383,10 +391,10 @@ public class MonetConnection
setAutoCommit(true);
// set our time zone on the server, if we haven't
already
- if (handshakeOptions.mustSendTimeZone()) {
+ if (handshakeOptions.mustSend(Setting.TimeZone)) {
final StringBuilder tz = new StringBuilder(64);
tz.append("SET TIME ZONE INTERVAL '");
- int offsetMinutes =
handshakeOptions.getTimeZone() / 60;
+ int offsetMinutes =
handshakeOptions.get(Setting.TimeZone) / 60;
if (offsetMinutes < 0) {
tz.append('-');
offsetMinutes = -offsetMinutes; // make
it positive
diff --git a/src/main/java/org/monetdb/mcl/net/HandshakeOptions.java
b/src/main/java/org/monetdb/mcl/net/HandshakeOptions.java
--- a/src/main/java/org/monetdb/mcl/net/HandshakeOptions.java
+++ b/src/main/java/org/monetdb/mcl/net/HandshakeOptions.java
@@ -8,98 +8,96 @@
package org.monetdb.mcl.net;
+import java.util.HashMap;
+import java.util.Map;
+
/** Keep track of MAPI handshake options.
*
* Recent server versions (from 2021) allow you to send configuration
information during
* the authentication handshake so no additional round trips are necessary
* when that has completed.
*
- * This class keeps track of the options to send, and whether they have already
- * been sent.
+ * This class keeps track of the values themselves, and also of whether or not
they should still be sent.
*/
final public class HandshakeOptions {
-
- // public Boolean autoCommit;
- int replySize;
- // public Integer ColumnarProtocol;
- int timeZone;
+ HashMap<Setting,Integer> options = new HashMap<>();
+ int handshakeLevel = 0;
- boolean mustSendReplySize;
- boolean mustSendTimeZone;
-
- public int getReplySize() {
- return replySize;
+ public void set(Setting setting, int value) {
+ options.put(setting, value);
}
- public void setReplySize(int replySize) {
- this.replySize = replySize;
- this.mustSendReplySize = true;
+ public Integer get(Setting setting) {
+ return options.get(setting);
}
- public boolean mustSendReplySize() {
- return mustSendReplySize;
+ public boolean wasSentInHandshake(Setting setting) {
+ return setting.isSupported(this.handshakeLevel);
}
- public void mustSendReplySize(boolean mustSendReplySize) {
- this.mustSendReplySize = mustSendReplySize;
- }
-
- public int getTimeZone() {
- return timeZone;
- }
-
- public void setTimeZone(int timeZone) {
- this.timeZone = timeZone;
- this.mustSendTimeZone = true;
+ public boolean mustSend(Setting setting) {
+ if (wasSentInHandshake(setting)) {
+ return false;
+ }
+ Integer value = options.get(setting);
+ return value != null && value != setting.defaultValue;
}
- public boolean mustSendTimeZone() {
- return mustSendTimeZone;
- }
-
- public void mustSendTimeZone(boolean mustSendTimeZone) {
- this.mustSendTimeZone = mustSendTimeZone;
- }
+ public String formatHandshakeResponse(int serverLevel) {
+ StringBuilder opts = new StringBuilder(100);
- public String formatResponse(int serverLevel) {
- StringBuilder opts = new StringBuilder(100);
- if (mustSendReplySize()) {
- formatOption(opts, Level.ReplySize, serverLevel,
replySize);
- mustSendReplySize(false);
+ for (Map.Entry<Setting, Integer> entry: options.entrySet()) {
+ Setting setting = entry.getKey();
+ Integer value = entry.getValue();
+ if (setting.isSupported(serverLevel)) {
+ if (opts.length() > 0) {
+ opts.append(",");
+ }
+ opts.append(setting.field);
+ opts.append("=");
+ opts.append(value);
+ }
}
- if (mustSendTimeZone()) {
- formatOption(opts, Level.TimeZone, serverLevel,
timeZone);
- mustSendTimeZone(false);
- }
+
+ this.handshakeLevel = serverLevel;
return opts.toString();
}
- private void formatOption(StringBuilder opts, Level level, int
serverLevel, int value) {
- if (!level.isSupported(serverLevel))
- return;
- if (opts.length() > 0) {
- opts.append(",");
- }
- opts.append(level.field);
- opts.append("=");
- opts.append(value);
- }
-
- public enum Level {
- ReplySize("reply_size", 2),
- TimeZone("time_zone", 5);
+ public enum Setting {
+ AutoCommit("auto_commit", 1, 1),
+ ReplySize("reply_size", 2, 100),
+ SizeHeader("size_header", "sizeheader", 3, 0),
+ // ColumnarProtocol("columnar_protocol", 4),
+ TimeZone("time_zone", 5, 0),
+ ;
private final int level;
private final String field;
+ private final String xcommand;
+ private final int defaultValue;
- Level(String field, int level) {
+ Setting(String field, int level, int defaultValue) {
+ this(field, field, level, defaultValue);
+ }
+
+ Setting(String field, String xcommand, int level, int
defaultValue) {
this.field = field;
+ this.xcommand = xcommand;
this.level = level;
+ this.defaultValue = defaultValue;
}
public boolean isSupported(int serverLevel) {
return this.level < serverLevel;
}
+
+ public String getXCommand() {
+ return xcommand;
+ }
+
+ public Integer getDefaultValue() {
+ return defaultValue;
+ }
}
}
diff --git a/src/main/java/org/monetdb/mcl/net/MapiSocket.java
b/src/main/java/org/monetdb/mcl/net/MapiSocket.java
--- a/src/main/java/org/monetdb/mcl/net/MapiSocket.java
+++ b/src/main/java/org/monetdb/mcl/net/MapiSocket.java
@@ -562,7 +562,7 @@ public class MapiSocket { /* cannot (yet
} catch
(NumberFormatException e) {
throw new
MCLParseException("Invalid handshake level: " + chaltok[6]);
}
- response +=
handshakeOptions.formatResponse(level);
+ response +=
handshakeOptions.formatHandshakeResponse(level);
break;
}
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]