changeset 505:8a014286dac2 onclient

Add stub code for downloading
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 19 Aug 2021 11:14:53 +0200 (2021-08-19)
parents 8aa70bd8d21f
children 2ae90050720c
files src/main/java/org/monetdb/jdbc/MonetConnection.java src/main/java/org/monetdb/jdbc/MonetDownloadHandle.java src/main/java/org/monetdb/jdbc/MonetDownloader.java
diffstat 3 files changed, 77 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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();
 	}
 }
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() {
+	}
+}
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;
+}