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