diff src/main/java/org/monetdb/jdbc/MonetConnection.java @ 557:ce2b616ed22e onclient

Add a cancellation callback to UploadHandler
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Thu, 16 Sep 2021 15:12:26 +0200 (2021-09-16)
parents 87feb93330a6
children 7f10d662a788
line wrap: on
line diff
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -3236,7 +3236,7 @@ public class MonetConnection
 		}
 
 		long linesToSkip = offset >= 1 ? offset - 1 : 0;
-		Upload handle = new Upload(server);
+		Upload handle = new Upload(server, uploadHandler::uploadCancelled);
 		boolean wasFaking = server.setInsertFakePrompts(false);
 		try {
 			uploadHandler.handleUpload(handle, path, textMode, linesToSkip);
@@ -3290,6 +3290,13 @@ public class MonetConnection
 		 *                    where both 0 and 1 mean 'upload everything'
 		 */
 		void handleUpload(Upload handle, String name, boolean textMode, long linesToSkip) throws IOException;
+
+		/**
+		 * Called when the upload is cancelled halfway by the server.
+		 *
+		 * The default implementation does nothing.
+		 */
+		default void uploadCancelled() {}
 	}
 
 	/**
@@ -3316,12 +3323,14 @@ public class MonetConnection
 	 */
 	public static class Upload {
 		private final MapiSocket server;
+		private final Runnable cancellationCallback;
 		private PrintStream print = null;
 		private String error = null;
 		private int customChunkSize = -1;
 
-		Upload(MapiSocket server) {
+		Upload(MapiSocket server, Runnable cancellationCallback) {
 			this.server = server;
+			this.cancellationCallback = cancellationCallback;
 		}
 
 		/**
@@ -3362,6 +3371,7 @@ public class MonetConnection
 			if (print == null) {
 				try {
 					MapiSocket.UploadStream up = customChunkSize >= 0 ? server.uploadStream(customChunkSize) : server.uploadStream();
+					up.setCancellationCallback(cancellationCallback);
 					print = new PrintStream(up, false, "UTF-8");
 					up.write('\n');
 				} catch (UnsupportedEncodingException e) {