Mercurial > hg > monetdb-java
diff src/main/java/org/monetdb/mcl/net/HandshakeOptions.java @ 422:8368cbc670bf
Send reply size and time zone during initial handshake
author | Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com> |
---|---|
date | Tue, 02 Feb 2021 13:50:13 +0100 (2021-02-02) |
parents | |
children | b95d007e1dfa |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/main/java/org/monetdb/mcl/net/HandshakeOptions.java @@ -0,0 +1,98 @@ +package org.monetdb.mcl.net; + +/** Keep track of MAPI handshake options. + * + * Recent server versions 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. + */ +public class HandshakeOptions { + + // public Boolean autoCommit; + int replySize; + // public Integer replySize; + // public Integer ColumnarProtocol; + int timeZone; + + boolean mustSendReplySize; + boolean mustSendTimeZone; + + public int getReplySize() { + return replySize; + } + + public void setReplySize(int replySize) { + this.replySize = replySize; + this.mustSendReplySize = true; + } + + public boolean mustSendReplySize() { + return mustSendReplySize; + } + + 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 mustSendTimeZone() { + return mustSendTimeZone; + } + + public void mustSendTimeZone(boolean mustSendTimeZone) { + this.mustSendTimeZone = mustSendTimeZone; + } + + public String formatResponse(int serverLevel) { + StringBuilder opts = new StringBuilder(100); + if (mustSendReplySize()) { + formatOption(opts, Level.ReplySize, serverLevel, replySize); + mustSendReplySize(false); + } + if (mustSendTimeZone()) { + formatOption(opts, Level.TimeZone, serverLevel, timeZone); + mustSendTimeZone(false); + } + + 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); + + private final int level; + private final String field; + + Level(String field, int level) { + this.field = field; + this.level = level; + } + + public boolean isSupported(int serverLevel) { + return this.level < serverLevel; + } + } +}