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