Changeset: 8a014286dac2 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/8a014286dac2
Added Files:
        src/main/java/org/monetdb/jdbc/MonetDownloadHandle.java
        src/main/java/org/monetdb/jdbc/MonetDownloader.java
Modified Files:
        src/main/java/org/monetdb/jdbc/MonetConnection.java
Branch: onclient
Log Message:

Add stub code for downloading


diffs (129 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
@@ -151,8 +151,9 @@ public class MonetConnection
        /** A cache to reduce the number of DatabaseMetaData objects created by 
getMetaData() to maximum 1 per connection */
        private DatabaseMetaData dbmd;
 
-       /** A handler for ON CLIENT requests */
+       /** Handlers for ON CLIENT requests */
        private MonetUploader uploader;
+       private MonetDownloader downloader;
 
        /**
         * Constructor of a Connection for MonetDB. At this moment the
@@ -1211,6 +1212,21 @@ public class MonetConnection
        public MonetUploader getUploader() {
                return uploader;
        }
+       /**
+        * Registers a MonetDownloader to support for example COPY ON CLIENT
+        *
+        * @param downloader the handler to register, or null to deregister
+        */
+       public void setDownloader(MonetDownloader downloader) {
+               this.downloader = downloader;
+       }
+
+       /**
+        * Returns the currently registerered MonetDownloadHandler handler, or 
null
+        */
+       public MonetDownloader getDownloader() {
+               return downloader;
+       }
 
        /**
         * Returns a string identifying this Connection to the MonetDB server.
@@ -3201,6 +3217,8 @@ public class MonetConnection
                        return handleUpload(parts[2], true, offset);
                } else if (transferCommand.startsWith("rb ")) {
                        return handleUpload(transferCommand.substring(3), 
false, 0);
+               } else if (transferCommand.startsWith("w ")) {
+                       return handleDownload(transferCommand.substring(2));
                } else {
                        return "JDBC does not support this file transfer yet: " 
+ transferCommand;
                }
@@ -3208,7 +3226,7 @@ public class MonetConnection
 
        private String handleUpload(String path, boolean textMode, int offset) 
throws IOException {
                if (uploader == null) {
-                       return "No file transfer handler has been registered";
+                       return "No file upload handler has been registered with 
the JDBC driver";
                }
 
                MonetUploadHandle handle = new MonetUploadHandle(server);
@@ -3227,7 +3245,23 @@ public class MonetConnection
                return handle.getError();
        }
 
-       private String handleDownload(String path) {
-               return "JDBC driver does not support downloads yet";
+       private String handleDownload(String path) throws IOException {
+               if (downloader == null) {
+                       return "No file download handler has been registered 
with the JDBC driver";
+               }
+
+               MonetDownloadHandle handle = new MonetDownloadHandle(server);
+               try {
+                       downloader.handleDownload(handle, path, true);
+                       if (!handle.hasBeenUsed()) {
+                               String message = String.format("Call to 
%s.handleDownload for path '%s' sent neither data nor an error message",
+                                               
downloader.getClass().getCanonicalName(), path);
+                               throw new IOException(message);
+                       }
+                       handle.close();
+               } finally {
+                       //
+               }
+               return handle.getError();
        }
 }
diff --git a/src/main/java/org/monetdb/jdbc/MonetDownloadHandle.java 
b/src/main/java/org/monetdb/jdbc/MonetDownloadHandle.java
new file mode 100644
--- /dev/null
+++ b/src/main/java/org/monetdb/jdbc/MonetDownloadHandle.java
@@ -0,0 +1,32 @@
+package org.monetdb.jdbc;
+
+import org.monetdb.mcl.net.MapiSocket;
+
+import java.io.*;
+
+public class MonetDownloadHandle {
+       private final MapiSocket server;
+       private String error = null;
+
+       MonetDownloadHandle(MapiSocket server) {
+               this.server = server;
+       }
+
+       public void sendError(String errorMessage) throws IOException {
+               if (error != null) {
+                       throw new IOException("another error has already been 
sent: " + error);
+               }
+               error = errorMessage;
+       }
+
+       public boolean hasBeenUsed() {
+               return error != null;
+       }
+
+       public String getError() {
+               return error;
+       }
+
+       public void close() {
+       }
+}
diff --git a/src/main/java/org/monetdb/jdbc/MonetDownloader.java 
b/src/main/java/org/monetdb/jdbc/MonetDownloader.java
new file mode 100644
--- /dev/null
+++ b/src/main/java/org/monetdb/jdbc/MonetDownloader.java
@@ -0,0 +1,7 @@
+package org.monetdb.jdbc;
+
+import java.io.IOException;
+
+public interface MonetDownloader {
+       void handleDownload(MonetDownloadHandle handle, String name, boolean 
textMode) throws IOException;
+}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to