Mercurial > hg > monetdb-java
changeset 578:687034945b3f onclient
Pass expected encoding as a constructor parameter to FileTransferHandler
author | Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com> |
---|---|
date | Thu, 14 Oct 2021 15:25:31 +0200 (2021-10-14) |
parents | 6ab9168ef8e1 |
children | 72f4437de9be |
files | src/main/java/org/monetdb/client/JdbcClient.java src/main/java/org/monetdb/util/FileTransferHandler.java tests/OnClientTester.java |
diffstat | 3 files changed, 21 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/org/monetdb/client/JdbcClient.java +++ b/src/main/java/org/monetdb/client/JdbcClient.java @@ -27,6 +27,7 @@ import java.io.File; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.Charset; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; // this import is required as it will trigger loading the org.monetdb.jdbc.MonetDriver class @@ -353,7 +354,7 @@ public class JdbcClient { /* cannot (yet // check if provided csvdir is an existing dir // else a download of data into file will terminate the JDBC connection!! if (java.nio.file.Files.isDirectory(java.nio.file.Paths.get(csvdir))) { - final FileTransferHandler FThandler = new FileTransferHandler(csvdir, true); + final FileTransferHandler FThandler = new FileTransferHandler(csvdir, Charset.defaultCharset()); // register file data uploadHandler to allow support // for: COPY INTO mytable FROM 'data.csv' ON CLIENT;
--- a/src/main/java/org/monetdb/util/FileTransferHandler.java +++ b/src/main/java/org/monetdb/util/FileTransferHandler.java @@ -10,6 +10,7 @@ package org.monetdb.util; import org.monetdb.jdbc.MonetConnection; +import java.io.BufferedReader; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -27,17 +28,16 @@ import java.nio.file.StandardOpenOption; */ public class FileTransferHandler implements MonetConnection.UploadHandler, MonetConnection.DownloadHandler { private final Path root; - private final boolean utf8Encoded; + private final Charset encoding; /** * Create a new FileTransferHandler which serves the given directory. - * * @param dir directory to read and write files from - * @param utf8Encoded set this to true if all files in the directory are known to be utf-8 encoded. + * @param encoding set this to true if all files in the directory are known to be utf-8 encoded. */ - public FileTransferHandler(final Path dir, final boolean utf8Encoded) { - root = dir.toAbsolutePath().normalize(); - this.utf8Encoded = utf8Encoded; + public FileTransferHandler(final Path dir, final Charset encoding) { + this.root = dir.toAbsolutePath().normalize(); + this.encoding = encoding; } /** @@ -46,8 +46,8 @@ public class FileTransferHandler impleme * @param dir directory to read and write files from * @param utf8Encoded set this to true if all files in the directory are known to be utf-8 encoded. */ - public FileTransferHandler(final String dir, final boolean utf8Encoded) { - this(FileSystems.getDefault().getPath(dir), utf8Encoded); + public FileTransferHandler(final String dir, final Charset encoding) { + this(FileSystems.getDefault().getPath(dir), encoding); } public void handleUpload(final MonetConnection.Upload handle, final String name, final boolean textMode, final long linesToSkip) throws IOException { @@ -60,9 +60,9 @@ public class FileTransferHandler impleme handle.sendError("Cannot read " + name); return; } - if (textMode && (linesToSkip > 0 || !utf8Encoded)) { - final Charset encoding = utf8Encoded ? StandardCharsets.UTF_8 : Charset.defaultCharset(); - handle.uploadFrom(Files.newBufferedReader(path, encoding), linesToSkip); + if (textMode && (linesToSkip > 0 || !isUtf8Encoded())) { + final BufferedReader reader = Files.newBufferedReader(path, encoding); + handle.uploadFrom(reader, linesToSkip); } else { handle.uploadFrom(Files.newInputStream(path)); } @@ -80,4 +80,8 @@ public class FileTransferHandler impleme } handle.downloadTo(Files.newOutputStream(path, StandardOpenOption.CREATE_NEW)); } + + public boolean isUtf8Encoded() { + return encoding.equals(StandardCharsets.UTF_8); + } }
--- a/tests/OnClientTester.java +++ b/tests/OnClientTester.java @@ -365,7 +365,7 @@ public final class OnClientTester extend ps.println("2|two"); ps.println("3|three"); ps.close(); - conn.setUploadHandler(new FileTransferHandler(d, true)); + conn.setUploadHandler(new FileTransferHandler(d, StandardCharsets.UTF_8)); update("COPY INTO foo FROM 'data.txt' ON CLIENT"); assertQueryInt("SELECT SUM(i) FROM foo", 6); } @@ -382,7 +382,7 @@ public final class OnClientTester extend ps.close(); Path d2 = getTmpDir(currentTestName + "2"); - conn.setUploadHandler(new FileTransferHandler(d2, false)); + conn.setUploadHandler(new FileTransferHandler(d2, StandardCharsets.UTF_8)); String quoted = f.toAbsolutePath().toString().replaceAll("'", "''"); expectError("COPY INTO foo FROM R'"+ quoted + "' ON CLIENT", "not in upload directory"); // connection is still alive @@ -393,7 +393,7 @@ public final class OnClientTester extend prepare(); update("INSERT INTO foo VALUES (42, 'forty-two')"); Path d = getTmpDir(currentTestName); - conn.setDownloadHandler(new FileTransferHandler(d, false)); + conn.setDownloadHandler(new FileTransferHandler(d, StandardCharsets.UTF_8)); update("COPY SELECT * FROM foo INTO 'data.txt' ON CLIENT"); List<String> lines = Files.readAllLines(d.resolve("data.txt")); assertEq("lines written", lines.size(), 1); @@ -408,7 +408,7 @@ public final class OnClientTester extend update("INSERT INTO foo VALUES (42, 'forty-two')"); Path d = getTmpDir(currentTestName); Path d2 = getTmpDir(currentTestName + "2"); - conn.setDownloadHandler(new FileTransferHandler(d2, false)); + conn.setDownloadHandler(new FileTransferHandler(d2, StandardCharsets.UTF_8)); String quoted = d.resolve("data.txt").toAbsolutePath().toString().replaceAll("'", "''"); expectError("COPY SELECT * FROM foo INTO R'" + quoted + "' ON CLIENT", "not in download directory"); if (level.compareTo(BugFixLevel.CanRefuseDownload) >= 0) {