comparison 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
comparison
equal deleted inserted replaced
502:83354bd21320 503:7e3987c16cde
151 protected int lastSetQueryTimeout; // 0 means no timeout, which is the default on the server 151 protected int lastSetQueryTimeout; // 0 means no timeout, which is the default on the server
152 152
153 /** A cache to reduce the number of DatabaseMetaData objects created by getMetaData() to maximum 1 per connection */ 153 /** A cache to reduce the number of DatabaseMetaData objects created by getMetaData() to maximum 1 per connection */
154 private DatabaseMetaData dbmd; 154 private DatabaseMetaData dbmd;
155 155
156 /** A handler for ON CLIENT requests */
157 private MonetFileTransfer fileTransfer;
156 158
157 /** 159 /**
158 * Constructor of a Connection for MonetDB. At this moment the 160 * Constructor of a Connection for MonetDB. At this moment the
159 * current implementation limits itself to storing the given host, 161 * current implementation limits itself to storing the given host,
160 * database, username and password for later use by the 162 * database, username and password for later use by the
1192 * this Connection object's default type map 1194 * this Connection object's default type map
1193 */ 1195 */
1194 @Override 1196 @Override
1195 public void setTypeMap(final Map<String, Class<?>> map) { 1197 public void setTypeMap(final Map<String, Class<?>> map) {
1196 typeMap = map; 1198 typeMap = map;
1199 }
1200
1201 /**
1202 * Registers a MonetFileTransfer handler to support for example COPY ON CLIENT
1203 *
1204 * @param fileTransfer the handler to register, or null to deregister
1205 */
1206 public void setFileTransfer(MonetFileTransfer fileTransfer) {
1207 this.fileTransfer = fileTransfer;
1208 }
1209
1210 /**
1211 * Returns the currently registerered MonetFileTransfer handler, or null
1212 */
1213 public MonetFileTransfer setFileTransfer() {
1214 return fileTransfer;
1197 } 1215 }
1198 1216
1199 /** 1217 /**
1200 * Returns a string identifying this Connection to the MonetDB server. 1218 * Returns a string identifying this Connection to the MonetDB server.
1201 * 1219 *
3172 } 3190 }
3173 } 3191 }
3174 // }}} 3192 // }}}
3175 3193
3176 private String handleTransfer(String transferCommand) throws IOException { 3194 private String handleTransfer(String transferCommand) throws IOException {
3177 String[] parts = transferCommand.split(" " , 3); 3195 String[] parts = transferCommand.split(" ", 3);
3178 if (parts.length == 3) { 3196 if (transferCommand.startsWith("r ") && parts.length == 3) {
3179 if (parts[0].equals("r")) { 3197 final int offset;
3180 int offset; 3198 try {
3181 try { 3199 offset = Integer.parseInt(parts[1]);
3182 offset = Integer.parseInt(parts[1]); 3200 } catch (NumberFormatException e) {
3183 } catch (NumberFormatException e) { 3201 return e.toString();
3184 return e.toString(); 3202 }
3185 } 3203 return handleUpload(parts[2], true, offset);
3186 return handleUpload(parts[2], true, offset); 3204 } else if (transferCommand.startsWith("rb ")) {
3187 } 3205 return handleUpload(transferCommand.substring(3), false, 0);
3188 if (parts[0].equals("r")) { 3206 } else {
3189 int offset; 3207 return "JDBC does not support this file transfer yet: " + transferCommand;
3190 try { 3208 }
3191 offset = Integer.parseInt(parts[1]);
3192 } catch (NumberFormatException e) {
3193 return e.toString();
3194 }
3195 return handleUpload(parts[2], false, offset);
3196 }
3197 } else if (parts.length == 2) {
3198 if (parts[0].equals("w")) {
3199 return handleDownload(parts[1]);
3200 }
3201 }
3202 return "JDBC does not support this file transfer yet: " + transferCommand;
3203 } 3209 }
3204 3210
3205 private String handleUpload(String path, boolean textMode, int offset) throws IOException { 3211 private String handleUpload(String path, boolean textMode, int offset) throws IOException {
3212 if (fileTransfer == null) {
3213 return "No file transfer handler has been registered";
3214 }
3215
3216 MonetUploadHandle handle = new MonetUploadHandle(server);
3206 boolean wasFaking = server.setInsertFakeFlushes(false); 3217 boolean wasFaking = server.setInsertFakeFlushes(false);
3207 try { 3218 try {
3208 MapiSocket.UploadStream us = server.uploadStream(); 3219 fileTransfer.handleUpload(handle, path, textMode, offset);
3209 us.write('\n'); 3220 if (!handle.hasBeenUsed()) {
3210 PrintStream ps = null; 3221 String message = String.format("Call to %s.handleUpload for path '%s' sent neither data nor an error message",
3211 try { 3222 fileTransfer.getClass().getCanonicalName(), path);
3212 ps = new PrintStream(us, false, "UTF-8"); 3223 throw new IOException(message);
3213 } catch (UnsupportedEncodingException e) { 3224 }
3214 return e.toString(); 3225 handle.close();
3215 }
3216 for (int i = 0; i < 1200; i++) {
3217 ps.println("banana " + i);
3218 }
3219 ps.close();
3220 return null;
3221 } finally { 3226 } finally {
3222 server.setInsertFakeFlushes(wasFaking); 3227 server.setInsertFakeFlushes(wasFaking);
3223 } 3228 }
3229 return handle.getError();
3224 } 3230 }
3225 3231
3226 private String handleDownload(String path) { 3232 private String handleDownload(String path) {
3227 return "JDBC driver does not support downloads yet"; 3233 return "JDBC driver does not support downloads yet";
3228 } 3234 }