Mercurial > hg > monetdb-java
diff src/main/java/org/monetdb/jdbc/MonetConnection.java @ 503:7e3987c16cde onclient
Succesful file uploading
author | Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com> |
---|---|
date | Wed, 18 Aug 2021 15:02:59 +0200 (2021-08-18) |
parents | 83354bd21320 |
children | 8aa70bd8d21f |
line wrap: on
line diff
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java +++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java @@ -153,6 +153,8 @@ 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 */ + private MonetFileTransfer fileTransfer; /** * Constructor of a Connection for MonetDB. At this moment the @@ -1197,6 +1199,22 @@ public class MonetConnection } /** + * Registers a MonetFileTransfer handler to support for example COPY ON CLIENT + * + * @param fileTransfer the handler to register, or null to deregister + */ + public void setFileTransfer(MonetFileTransfer fileTransfer) { + this.fileTransfer = fileTransfer; + } + + /** + * Returns the currently registerered MonetFileTransfer handler, or null + */ + public MonetFileTransfer setFileTransfer() { + return fileTransfer; + } + + /** * Returns a string identifying this Connection to the MonetDB server. * * @return a String representing this Object @@ -3174,53 +3192,41 @@ public class MonetConnection // }}} private String handleTransfer(String transferCommand) throws IOException { - String[] parts = transferCommand.split(" " , 3); - if (parts.length == 3) { - if (parts[0].equals("r")) { - int offset; - try { - offset = Integer.parseInt(parts[1]); - } catch (NumberFormatException e) { - return e.toString(); - } - return handleUpload(parts[2], true, offset); + String[] parts = transferCommand.split(" ", 3); + if (transferCommand.startsWith("r ") && parts.length == 3) { + final int offset; + try { + offset = Integer.parseInt(parts[1]); + } catch (NumberFormatException e) { + return e.toString(); } - if (parts[0].equals("r")) { - int offset; - try { - offset = Integer.parseInt(parts[1]); - } catch (NumberFormatException e) { - return e.toString(); - } - return handleUpload(parts[2], false, offset); - } - } else if (parts.length == 2) { - if (parts[0].equals("w")) { - return handleDownload(parts[1]); - } + return handleUpload(parts[2], true, offset); + } else if (transferCommand.startsWith("rb ")) { + return handleUpload(transferCommand.substring(3), false, 0); + } else { + return "JDBC does not support this file transfer yet: " + transferCommand; } - return "JDBC does not support this file transfer yet: " + transferCommand; } private String handleUpload(String path, boolean textMode, int offset) throws IOException { + if (fileTransfer == null) { + return "No file transfer handler has been registered"; + } + + MonetUploadHandle handle = new MonetUploadHandle(server); boolean wasFaking = server.setInsertFakeFlushes(false); try { - MapiSocket.UploadStream us = server.uploadStream(); - us.write('\n'); - PrintStream ps = null; - try { - ps = new PrintStream(us, false, "UTF-8"); - } catch (UnsupportedEncodingException e) { - return e.toString(); + fileTransfer.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); + throw new IOException(message); } - for (int i = 0; i < 1200; i++) { - ps.println("banana " + i); - } - ps.close(); - return null; + handle.close(); } finally { server.setInsertFakeFlushes(wasFaking); } + return handle.getError(); } private String handleDownload(String path) {