Mercurial > hg > monetdb-java
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; +}