Changeset: 72007c4f8f8a for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/72007c4f8f8a
Modified Files:
src/main/java/org/monetdb/jdbc/MonetConnection.java
src/main/java/org/monetdb/mcl/net/MapiSocket.java
Branch: onclient
Log Message:
Allow MonetUploadHandler to configure the chunk size
(every chunk_size bytes, the client suspends the upload and
asks the server whether to continue)
diffs (91 lines):
diff --git a/src/main/java/org/monetdb/jdbc/MonetConnection.java
b/src/main/java/org/monetdb/jdbc/MonetConnection.java
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -3267,6 +3267,7 @@ public class MonetConnection
private final MapiSocket server;
private PrintStream print = null;
private String error = null;
+ private int customChunkSize = -1;
Upload(MapiSocket server) {
this.server = server;
@@ -3279,13 +3280,17 @@ public class MonetConnection
error = errorMessage;
}
+ public void setChunkSize(int chunkSize) {
+ this.customChunkSize = chunkSize;
+ }
+
public PrintStream getStream() throws IOException {
if (error != null) {
throw new IOException("Cannot send data after
an error has been sent");
}
if (print == null) {
try {
- MapiSocket.UploadStream up =
server.uploadStream();
+ MapiSocket.UploadStream up =
customChunkSize >= 0 ? server.uploadStream(customChunkSize) :
server.uploadStream();
print = new PrintStream(up, false,
"UTF-8");
up.write('\n');
} catch (UnsupportedEncodingException e) {
diff --git a/src/main/java/org/monetdb/mcl/net/MapiSocket.java
b/src/main/java/org/monetdb/mcl/net/MapiSocket.java
--- a/src/main/java/org/monetdb/mcl/net/MapiSocket.java
+++ b/src/main/java/org/monetdb/mcl/net/MapiSocket.java
@@ -1164,6 +1164,9 @@ public class MapiSocket { /* cannot (yet
}
}
+ public UploadStream uploadStream(int chunkSize) {
+ return new UploadStream(chunkSize);
+ }
public UploadStream uploadStream() {
return new UploadStream();
@@ -1188,16 +1191,26 @@ public class MapiSocket { /* cannot (yet
}
public class UploadStream extends FilterOutputStream {
- private final int CHUNK_SIZE = 100;
+ public final static int DEFAULT_CHUNK_SIZE = 1024 * 1024;
+ private final int chunkSize;
private boolean closed = false;
- private int chunkLeft = CHUNK_SIZE;
+ private int chunkLeft;
private byte[] promptBuffer;
- UploadStream() {
+ UploadStream(int chunkSize) {
super(toMonet);
+ if (chunkSize <= 0) {
+ throw new IllegalArgumentException("chunk size
must be positive");
+ }
+ this.chunkSize = chunkSize;
assert LineType.MORE.bytes().length ==
LineType.FILETRANSFER.bytes().length;
int promptLen = LineType.MORE.bytes().length;
promptBuffer = new byte[promptLen + 1];
+ chunkLeft = this.chunkSize;
+ }
+
+ UploadStream() {
+ this(DEFAULT_CHUNK_SIZE);
}
@Override
@@ -1234,7 +1247,7 @@ public class MapiSocket { /* cannot (yet
if (closed) {
return;
}
- if (chunkLeft != CHUNK_SIZE) {
+ if (chunkLeft != chunkSize) {
// flush pending data
flushAndReadPrompt();
}
@@ -1259,7 +1272,7 @@ public class MapiSocket { /* cannot (yet
private void flushAndReadPrompt() throws IOException {
out.flush();
- chunkLeft = CHUNK_SIZE;
+ chunkLeft = chunkSize;
LineType lineType = readPrompt();
switch (lineType) {
case MORE:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list