changeset 504:8aa70bd8d21f onclient

Register upload handler and download handler separately
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 19 Aug 2021 10:51:53 +0200 (2021-08-19)
parents 7e3987c16cde
children 8a014286dac2
files a.bin b.bin c.bin src/main/java/org/monetdb/jdbc/MonetConnection.java src/main/java/org/monetdb/jdbc/MonetFileTransfer.java src/main/java/org/monetdb/jdbc/MonetUploader.java src/main/java/org/monetdb/util/FileTransfer.java x.csv
diffstat 8 files changed, 70 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
index 0000000000000000000000000000000000000000..2c6aacdecdc212596c5e82ae940eaaa7de2f9437
GIT binary patch
literal 40
dc$@{nhXDW}2mm0gT>n2DK;YowAyH@y79Rq<04@Lk
new file mode 100644
index 0000000000000000000000000000000000000000..dd67d8d40c9f01d10b8b788b1d9b4dbc482a77c5
GIT binary patch
literal 40
ec$@{nfdK#z2mr9D2>&14wh%}ZHVzsW4<7>qm;g8c
new file mode 100644
index 0000000000000000000000000000000000000000..73bcaea4a0df193d7d57d9756c05396197d75906
GIT binary patch
literal 50
mc$~}3D=}cm%quYj5k?@w7(|$W2vZPY1|rNsgawGOWB>q%7!LdZ
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -10,8 +10,6 @@ package org.monetdb.jdbc;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
 import java.net.SocketException;
 import java.net.SocketTimeoutException;
 import java.sql.CallableStatement;
@@ -154,7 +152,7 @@ public class MonetConnection
 	private DatabaseMetaData dbmd;
 
 	/** A handler for ON CLIENT requests */
-	private MonetFileTransfer fileTransfer;
+	private MonetUploader uploader;
 
 	/**
 	 * Constructor of a Connection for MonetDB. At this moment the
@@ -1199,19 +1197,19 @@ public class MonetConnection
 	}
 
 	/**
-	 * Registers a MonetFileTransfer handler to support for example COPY ON CLIENT
+	 * Registers a MonetUploader to support for example COPY ON CLIENT
 	 *
-	 * @param fileTransfer the handler to register, or null to deregister
+	 * @param uploader the handler to register, or null to deregister
 	 */
-	public void setFileTransfer(MonetFileTransfer fileTransfer) {
-		this.fileTransfer = fileTransfer;
+	public void setUploader(MonetUploader uploader) {
+		this.uploader = uploader;
 	}
 
 	/**
-	 * Returns the currently registerered MonetFileTransfer handler, or null
+	 * Returns the currently registerered MonetUploader, or null
 	 */
-	public MonetFileTransfer setFileTransfer() {
-		return fileTransfer;
+	public MonetUploader getUploader() {
+		return uploader;
 	}
 
 	/**
@@ -3209,17 +3207,17 @@ public class MonetConnection
 	}
 
 	private String handleUpload(String path, boolean textMode, int offset) throws IOException {
-		if (fileTransfer == null) {
+		if (uploader == null) {
 			return "No file transfer handler has been registered";
 		}
 
 		MonetUploadHandle handle = new MonetUploadHandle(server);
 		boolean wasFaking = server.setInsertFakeFlushes(false);
 		try {
-			fileTransfer.handleUpload(handle, path, textMode, offset);
+			uploader.handleUpload(handle, path, textMode, offset);
 			if (!handle.hasBeenUsed()) {
 				String message = String.format("Call to %s.handleUpload for path '%s' sent neither data nor an error message",
-						fileTransfer.getClass().getCanonicalName(), path);
+						uploader.getClass().getCanonicalName(), path);
 				throw new IOException(message);
 			}
 			handle.close();
deleted file mode 100644
--- a/src/main/java/org/monetdb/jdbc/MonetFileTransfer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.monetdb.jdbc;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-public abstract class MonetFileTransfer {
-	public void handleUpload(MonetUploadHandle handle, String name, boolean textMode, int offset) throws IOException {
-		throw new UnsupportedOperationException("This client is not prepared to handle uploads");
-	}
-
-	public static class UploadFromDirectory extends MonetFileTransfer {
-		private final Path root;
-		private final boolean utf8Encoded;
-
-		public UploadFromDirectory(Path dir, boolean utf8Encoded) {
-			root = dir.toAbsolutePath().normalize();
-			this.utf8Encoded = utf8Encoded;
-		}
-
-		public UploadFromDirectory(String dir, boolean utf8Encoded) {
-			this(FileSystems.getDefault().getPath(dir), utf8Encoded);
-		}
-
-		@Override
-		public void handleUpload(MonetUploadHandle handle, String name, boolean textMode, int offset) throws IOException {
-			Path path = root.resolve(name).normalize();
-			if (!path.startsWith(root)) {
-				handle.sendError("File is not in upload directory");
-				return;
-			}
-			if (!Files.isReadable(path)) {
-				handle.sendError("Cannot read " + name);
-				return;
-			}
-			if (textMode && (offset > 1 || !utf8Encoded)) {
-				Charset encoding = utf8Encoded ? StandardCharsets.UTF_8 : Charset.defaultCharset();
-				BufferedReader reader = Files.newBufferedReader(path, encoding);
-				int toSkip = offset > 1 ? offset - 1 : 0;
-				for (int i = 0; i < toSkip; i++) {
-					reader.readLine();
-				}
-				handle.uploadFrom(reader);
-			} else {
-				handle.uploadFrom(Files.newInputStream(path));
-			}
-		}
-	}
-}
new file mode 100644
--- /dev/null
+++ b/src/main/java/org/monetdb/jdbc/MonetUploader.java
@@ -0,0 +1,7 @@
+package org.monetdb.jdbc;
+
+import java.io.IOException;
+
+public interface MonetUploader {
+	void handleUpload(MonetUploadHandle handle, String name, boolean textMode, int offset) throws IOException;
+}
new file mode 100644
--- /dev/null
+++ b/src/main/java/org/monetdb/util/FileTransfer.java
@@ -0,0 +1,49 @@
+package org.monetdb.util;
+
+import org.monetdb.jdbc.MonetUploader;
+import org.monetdb.jdbc.MonetUploadHandle;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class FileTransfer implements MonetUploader {
+	private final Path root;
+	private final boolean utf8Encoded;
+
+	public FileTransfer(Path dir, boolean utf8Encoded) {
+		root = dir.toAbsolutePath().normalize();
+		this.utf8Encoded = utf8Encoded;
+	}
+
+	public FileTransfer(String dir, boolean utf8Encoded) {
+		this(FileSystems.getDefault().getPath(dir), utf8Encoded);
+	}
+
+	public void handleUpload(MonetUploadHandle handle, String name, boolean textMode, int offset) throws IOException {
+		Path path = root.resolve(name).normalize();
+		if (!path.startsWith(root)) {
+			handle.sendError("File is not in upload directory");
+			return;
+		}
+		if (!Files.isReadable(path)) {
+			handle.sendError("Cannot read " + name);
+			return;
+		}
+		if (textMode && (offset > 1 || !utf8Encoded)) {
+			Charset encoding = utf8Encoded ? StandardCharsets.UTF_8 : Charset.defaultCharset();
+			BufferedReader reader = Files.newBufferedReader(path, encoding);
+			int toSkip = offset > 1 ? offset - 1 : 0;
+			for (int i = 0; i < toSkip; i++) {
+				reader.readLine();
+			}
+			handle.uploadFrom(reader);
+		} else {
+			handle.uploadFrom(Files.newInputStream(path));
+		}
+	}
+}
new file mode 100644
--- /dev/null
+++ b/x.csv
@@ -0,0 +1,3 @@
+1
+2
+3