changeset 83:724a0061db63 embedded

Only some rare data types mapping is missing on the JDBC embedded connection. I will now be testing extensively, then adding these mappings to finish the JDBC embedded connection.
author Pedro Ferreira <pedro.ferreira@monetdbsolutions.com>
date Wed, 28 Dec 2016 17:50:04 +0000 (2016-12-28)
parents 4231a7f5cdc3
children d82bf33bf8a6
files src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java src/main/java/nl/cwi/monetdb/mcl/connection/embedded/EmbeddedConnection.java src/main/java/nl/cwi/monetdb/mcl/connection/embedded/EmbeddedLanguage.java src/main/java/nl/cwi/monetdb/mcl/connection/embedded/JDBCEmbeddedConnection.java src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java src/main/java/nl/cwi/monetdb/mcl/connection/mapi/OldMapiSocket.java src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java src/main/java/nl/cwi/monetdb/mcl/responses/UpdateResponse.java
diffstat 9 files changed, 35 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java
@@ -131,6 +131,10 @@ public abstract class MonetConnection ex
         return ourSavior;
     }
 
+    public AbstractProtocol getProtocol() {
+        return this.protocol;
+    }
+
     /**
      * Connects to the given host and port, logging in as the given user. If followRedirect is false, a
      * RedirectionException is thrown when a redirect is encountered.
@@ -154,15 +158,10 @@ public abstract class MonetConnection ex
 
     public abstract String getJDBCURL();
 
-    public AbstractProtocol getProtocol() {
-        return this.protocol;
-    }
-
     public abstract void sendControlCommand(ControlCommands con, int data) throws SQLException;
 
-    public abstract ResponseList createResponseList(int fetchSize, int maxRows, int resultSetType, int resultSetConcurrency) throws SQLException;
-
-    public abstract void setServerMaxRows(int maxRows) throws SQLException;
+    public abstract ResponseList createResponseList(int fetchSize, int maxRows, int resultSetType,
+                                                    int resultSetConcurrency) throws SQLException;
 
     /**
      * Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be
@@ -1494,7 +1493,7 @@ public abstract class MonetConnection ex
                 // don't do work if it's not needed
                 if (language == MapiLanguage.LANG_SQL && size != curReplySize &&
                         !Arrays.deepEquals(templ, language.getCommandTemplates())) {
-                    setServerMaxRows(size);
+                    sendControlCommand(ControlCommands.REPLY_SIZE, size);
                     // store the reply size after a successful change
                     curReplySize = size;
                 }
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java
@@ -668,12 +668,12 @@ public class MonetStatement extends Mone
 		jdbcTypes[0] = MonetDriver.getJavaType(types[0]);
 
 		if (header instanceof UpdateResponse) {
-			String lastid = ((UpdateResponse)header).getLastid();
-			if (lastid.equals("-1")) {
+			int lastid = ((UpdateResponse)header).getLastid();
+			if (lastid ==-1) {
 				results = new String[1][1];
 			} else {
 				results = new String[1][1];
-				results[0][0] = lastid;
+				results[0][0] = Integer.toString(lastid);
 			}
 		} else {
 			results = new String[1][1];
@@ -869,7 +869,7 @@ public class MonetStatement extends Mone
 	public int getUpdateCount() throws SQLException {
 		int ret = -1;
 		if (header instanceof UpdateResponse) {
-			ret = ((UpdateResponse)header).getCount();
+			ret =  ((UpdateResponse)header).getCount();
 		} else if (header instanceof SchemaResponse) {
 			ret = ((SchemaResponse)header).getState();
 		}
--- a/src/main/java/nl/cwi/monetdb/mcl/connection/embedded/EmbeddedConnection.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/connection/embedded/EmbeddedConnection.java
@@ -85,7 +85,6 @@ public final class EmbeddedConnection ex
 
     @Override
     public void sendControlCommand(ControlCommands con, int data) throws SQLException {
-        try {
             switch (con) {
                 case AUTO_COMMIT:
                     ((EmbeddedProtocol)protocol).getEmbeddedConnection().sendAutocommitCommand(data);
@@ -95,16 +94,13 @@ public final class EmbeddedConnection ex
                     break;
                 case CLOSE:
                     ((EmbeddedProtocol)protocol).getEmbeddedConnection().sendCloseCommand(data);
+                    break;
                 case REPLY_SIZE:
-                    throw new SQLException("Cannot set reply size on a Embedded connection!", "M1M05");
+                    ((EmbeddedProtocol)protocol).getEmbeddedConnection().sendReplySizeCommand(data);
             }
-            protocol.waitUntilPrompt();
             if (protocol.getCurrentServerResponseHeader() == ServerResponses.ERROR) {
                 throw new SQLException(protocol.getRemainingStringLine(0));
             }
-        } catch (IOException ex) {
-            throw new SQLException(ex);
-        }
     }
 
     @Override
@@ -112,8 +108,4 @@ public final class EmbeddedConnection ex
         return new MonetConnection.ResponseList(this.getDefFetchsize(), maxRows, resultSetType, resultSetConcurrency);
     }
 
-    @Override
-    public void setServerMaxRows(int maxRows) throws SQLException {
-        ((EmbeddedProtocol)protocol).getEmbeddedConnection().setMaxRows(maxRows);
-    }
 }
--- a/src/main/java/nl/cwi/monetdb/mcl/connection/embedded/EmbeddedLanguage.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/connection/embedded/EmbeddedLanguage.java
@@ -8,9 +8,9 @@ import nl.cwi.monetdb.mcl.connection.IMo
 public enum EmbeddedLanguage implements IMonetDBLanguage {
 
     /** the SQL language */
-    LANG_SQL(null, "sql"),
+    LANG_SQL(new String[]{null, null, null}, "sql"),
     /** an unknown language */
-    LANG_UNKNOWN(null, "unknown");
+    LANG_UNKNOWN(new String[]{null, null, null}, "unknown");
 
     EmbeddedLanguage(String[] queryTemplates, String representation) {
         this.queryTemplates = queryTemplates;
@@ -23,7 +23,7 @@ public enum EmbeddedLanguage implements 
 
     @Override
     public String getQueryTemplateIndex(int index) {
-        return queryTemplates[index];
+        return this.queryTemplates[index];
     }
 
     @Override
@@ -33,7 +33,7 @@ public enum EmbeddedLanguage implements 
 
     @Override
     public String[] getQueryTemplates() {
-        return queryTemplates;
+        return this.queryTemplates;
     }
 
     @Override
--- a/src/main/java/nl/cwi/monetdb/mcl/connection/embedded/JDBCEmbeddedConnection.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/connection/embedded/JDBCEmbeddedConnection.java
@@ -11,8 +11,6 @@ import nl.cwi.monetdb.mcl.responses.IRes
  */
 public class JDBCEmbeddedConnection extends MonetDBEmbeddedConnection {
 
-    private int maxRows = Integer.MAX_VALUE;
-
     private long lastResultSetPointer;
 
     private final ServerResponses[] lineResponse = new ServerResponses[4];
@@ -31,10 +29,6 @@ public class JDBCEmbeddedConnection exte
         super(connectionPointer);
     }
 
-    void setMaxRows(int maxRows) {
-        this.maxRows = maxRows;
-    }
-
     public ServerResponses getNextServerResponse() {
         return lineResponse[currentLineResponseState++];
     }
@@ -85,6 +79,10 @@ public class JDBCEmbeddedConnection exte
         this.sendCloseCommandInternal(this.connectionPointer, commandId);
     }
 
+    void sendReplySizeCommand(int size) {
+        this.sendReplySizeCommandInternal(this.connectionPointer, size);
+    }
+
     private native void getNextTableHeaderInternal(long resultSetPointer, String[] columnNames, int[] columnLengths,
                                                    String[] types, String[] tableNames);
 
@@ -98,4 +96,6 @@ public class JDBCEmbeddedConnection exte
     private native void sendReleaseCommandInternal(long connectionPointer, int commandId);
 
     private native void sendCloseCommandInternal(long connectionPointer, int commandId);
+
+    private native void sendReplySizeCommandInternal(long connectionPointer, int size);
 }
--- a/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java
@@ -222,11 +222,6 @@ public class MapiConnection extends Mone
     }
 
     @Override
-    public void setServerMaxRows(int maxRows) throws SQLException {
-        this.sendControlCommand(ControlCommands.REPLY_SIZE, maxRows);
-    }
-
-    @Override
     public List<String> connect(String user, String pass) throws IOException, ProtocolException, MCLException {
         // Wrap around the internal connect that needs to know if it should really make a TCP connection or not.
         List<String> res = connect(this.hostname, this.port, user, pass, true);
--- a/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/OldMapiSocket.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/OldMapiSocket.java
@@ -93,8 +93,7 @@ public class OldMapiSocket extends Abstr
             while (len > 0) {
                 s = inStream.read(b, off, len);
                 if (s == -1) {
-                    // if we have read something before, we should have been
-                    // able to read the whole, so make this fatal
+                    // if we have read something before, we should have been able to read the whole, so make this fatal
                     if (off > 0) {
                         throw new IOException("Read from " + connection.getHostname() + ":" +
                                 connection.getPort() + ": Incomplete block read from stream");
@@ -207,7 +206,7 @@ public class OldMapiSocket extends Abstr
 
         public long skip(long n) throws IOException {
             long skip = n;
-            int t = 0;
+            int t;
             while (skip > 0) {
                 t = available();
                 if (skip > t) {
@@ -248,9 +247,8 @@ public class OldMapiSocket extends Abstr
         }
 
         /**
-         * writeBlock puts the data in the block on the stream.  The
-         * boolean last controls whether the block is sent with an
-         * indicator to note it is the last block of a sequence or not.
+         * writeBlock puts the data in the block on the stream. The boolean last controls whether the block is sent with
+         * an indicator to note it is the last block of a sequence or not.
          *
          * @param last whether this is the last block
          * @throws IOException if writing to the stream failed
@@ -259,15 +257,13 @@ public class OldMapiSocket extends Abstr
             if (last) {
                 // always fits, because of BLOCK's size
                 blocksize = (short) writePos;
-                // this is the last block, so encode least
-                // significant bit in the first byte (little-endian)
+                // this is the last block, so encode least significant bit in the first byte (little-endian)
                 blklen[0] = (byte) (blocksize << 1 & 0xFF | 1);
                 blklen[1] = (byte) (blocksize >> 7);
             } else {
                 // always fits, because of BLOCK's size
                 blocksize = (short) BLOCK;
-                // another block will follow, encode least
-                // significant bit in the first byte (little-endian)
+                // another block will follow, encode least significant bit in the first byte (little-endian)
                 blklen[0] = (byte) (blocksize << 1 & 0xFF);
                 blklen[1] = (byte) (blocksize >> 7);
             }
--- a/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java
@@ -96,7 +96,7 @@ public class OldMapiProtocol extends Abs
     @Override
     public UpdateResponse getNextUpdateResponse() throws ProtocolException {
         int count = OldMapiStartOfHeaderParser.GetNextResponseDataAsInt(this); //The order cannot be switched!!
-        String lastId = OldMapiStartOfHeaderParser.GetNextResponseDataAsString(this);
+        int lastId = OldMapiStartOfHeaderParser.GetNextResponseDataAsInt(this); //TODO test this!!
         return new UpdateResponse(lastId, count);
     }
 
--- a/src/main/java/nl/cwi/monetdb/mcl/responses/UpdateResponse.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/responses/UpdateResponse.java
@@ -10,17 +10,17 @@ package nl.cwi.monetdb.mcl.responses;
  */
 public class UpdateResponse implements IResponse {
 
-    private final String lastid;
+    private final int lastid;
 
     private final int count;
 
-    public UpdateResponse(String id, int cnt) {
+    public UpdateResponse(int lastid, int count) {
         // fill the blank finals
-        this.lastid = id;
-        this.count = cnt;
+        this.lastid = lastid;
+        this.count = count;
     }
 
-    public String getLastid() {
+    public int getLastid() {
         return lastid;
     }