changeset 579:72f4437de9be onclient

Reencode downloads if necessary
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 14 Oct 2021 16:11:52 +0200 (2021-10-14)
parents 687034945b3f
children 13134a44dfc8
files src/main/java/org/monetdb/jdbc/MonetConnection.java src/main/java/org/monetdb/util/FileTransferHandler.java
diffstat 2 files changed, 41 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -3524,6 +3524,22 @@ public class MonetConnection
 		}
 
 		/**
+		 * Write the textual data from the server to the given {@link Writer}
+		 * @param writer
+		 */
+		public void downloadTo(final Writer writer) throws IOException {
+			final InputStream s = getStream();
+			final InputStreamReader r = new InputStreamReader(s, StandardCharsets.UTF_8);
+			final char[] buffer = new char[65536];
+			while (true) {
+				final int nread = r.read(buffer);
+				if (nread < 0)
+					break;
+				writer.write(buffer, 0, nread);
+			}
+		}
+
+		/**
 		 * @return  true if data has been received or an error has been sent.
 		 */
 		public boolean hasBeenUsed() {
--- a/src/main/java/org/monetdb/util/FileTransferHandler.java
+++ b/src/main/java/org/monetdb/util/FileTransferHandler.java
@@ -11,7 +11,9 @@ package org.monetdb.util;
 import org.monetdb.jdbc.MonetConnection;
 
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystems;
@@ -60,11 +62,16 @@ public class FileTransferHandler impleme
 			handle.sendError("Cannot read " + name);
 			return;
 		}
-		if (textMode && (linesToSkip > 0 || !isUtf8Encoded())) {
+		if (!textMode) {
+			// must upload as a byte stream
+			handle.uploadFrom(Files.newInputStream(path));
+		} else if (linesToSkip == 0 && utf8Encoded()) {
+			// more efficient to upload as a byte stream
+			handle.uploadFrom(Files.newInputStream(path));
+		} else {
+			// cannot upload as a byte stream, must deal with encoding
 			final BufferedReader reader = Files.newBufferedReader(path, encoding);
 			handle.uploadFrom(reader, linesToSkip);
-		} else {
-			handle.uploadFrom(Files.newInputStream(path));
 		}
 	}
 
@@ -78,10 +85,23 @@ public class FileTransferHandler impleme
 			handle.sendError("File already exists: " + name);
 			return;
 		}
-		handle.downloadTo(Files.newOutputStream(path, StandardOpenOption.CREATE_NEW));
+		if (!textMode) {
+			// must download as a byte stream
+			final OutputStream outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW);
+			handle.downloadTo(outputStream);
+		} else if (utf8Encoded()) {
+			// more efficient to download as a byte stream
+			final OutputStream outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW);
+			handle.downloadTo(outputStream);
+		} else {
+			// cannot download as a byte stream, must deal with encoding
+			final BufferedWriter writer = Files.newBufferedWriter(path, encoding, StandardOpenOption.CREATE_NEW);
+			handle.downloadTo(writer);
+			writer.close();
+		}
 	}
 
-	public boolean isUtf8Encoded() {
+	public boolean utf8Encoded() {
 		return encoding.equals(StandardCharsets.UTF_8);
 	}
 }