Changeset: e6dc6196f470 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=e6dc6196f470 Modified Files: src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java Branch: embedded Log Message:
Move batch processing definition in order to support it properly in a embedded connection diffs (175 lines): diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java @@ -200,13 +200,26 @@ public abstract class MonetConnection ex /** * Sends a control command to the server. * - * @param commandID the command identifier according to {@link ControlCommands} listing + * @param commandID The command identifier according to {@link ControlCommands} listing * @param data The integer to send according to the control command * @throws SQLException if an IO exception or a database error occurs */ public abstract void sendControlCommand(int commandID, int data) throws SQLException; /** + * Execute a batch of SQL query statements. + * + * @param statement The original MonetStatement where the batch comes from + * @param batch The list of queries to execute + * @param counts The return of the update statement of each input query + * @param e An exception to be thrown if an error occurs + * @return If all queries in the batch executed successfully or not + * @throws SQLException if an IO exception or a database error occurs + */ + protected abstract boolean executeNextQueryBatch(MonetStatement statement, List<String> batch, int[] counts, + BatchUpdateException e) throws SQLException; + + /** * Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be * automatically released. All Statements created from this Connection will be closed when this method is called. * diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetStatement.java @@ -186,43 +186,9 @@ public class MonetStatement extends Mone return new int[0]; int[] counts = new int[batch.size()]; - int offset = 0; - boolean first = true; - boolean error = false; - BatchUpdateException e = new BatchUpdateException("Error(s) occurred while executing the batch, see next SQLExceptions for details", "22000", counts); - int builderSize = connection.initialStringBuilderSize(); - StringBuilder tmpBatch = new StringBuilder(builderSize); - String sep = connection.getLanguage().getQueryTemplateIndex(2); - for (int i = 0; i < batch.size(); i++) { - String tmp = batch.get(i); - if (sep.length() + tmp.length() > builderSize) { - // The thing is too big. Way too big. Since it won't be optimal anyway, just add it to whatever we - // have and continue. - if (!first) { - tmpBatch.append(sep); - } - tmpBatch.append(tmp); - // send and receive - error |= internalBatch(tmpBatch.toString(), counts, offset, i + 1, e); - offset = i; - tmpBatch.delete(0, tmpBatch.length()); - first = true; - continue; - } - if (tmpBatch.length() + sep.length() + tmp.length() >= builderSize) { - // send and receive - error |= internalBatch(tmpBatch.toString(), counts, offset, i + 1, e); - offset = i; - tmpBatch.delete(0, tmpBatch.length()); - first = true; - } - if (!first) tmpBatch.append(sep); - first = false; - tmpBatch.append(tmp); - } - // send and receive - error |= internalBatch(tmpBatch.toString(), counts, offset, counts.length, e); + MonetConnection con = (MonetConnection) this.getConnection(); + boolean error = con.executeNextQueryBatch(this, this.batch, counts, e); // throw BatchUpdateException if it contains something if (error) @@ -234,7 +200,18 @@ public class MonetStatement extends Mone } } - private boolean internalBatch(String batch, int[] counts, int offset, int max, BatchUpdateException e) + /** + * Please don't use this method!! It is just for internal use only!!! + * + * @param batch The next batch to execute + * @param counts The array of results of each batch + * @param offset The offset in the array of results + * @param max The max capacity in the array of results + * @param e An exception to be thrown if an error occurs + * @return If all queries in the batch executed successfully or not + * @throws BatchUpdateException if an IO exception or a database error occurs + */ + public boolean internalBatch(String batch, int[] counts, int offset, int max, BatchUpdateException e) throws BatchUpdateException { try { boolean type = internalExecute(batch); diff --git a/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java b/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java --- a/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java +++ b/src/main/java/nl/cwi/monetdb/mcl/connection/mapi/MapiConnection.java @@ -9,6 +9,7 @@ package nl.cwi.monetdb.mcl.connection.mapi; import nl.cwi.monetdb.jdbc.MonetConnection; +import nl.cwi.monetdb.jdbc.MonetStatement; import nl.cwi.monetdb.mcl.connection.ControlCommands; import nl.cwi.monetdb.mcl.connection.MCLException; import nl.cwi.monetdb.mcl.connection.helpers.ChannelSecurity; @@ -22,6 +23,7 @@ import java.net.SocketTimeoutException; import java.net.URI; import java.net.URISyntaxException; import java.nio.ByteOrder; +import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLNonTransientConnectionException; @@ -252,6 +254,55 @@ public class MapiConnection extends Mone } /** + * Execute a batch query in a MAPI connection. + * + * @param statement The original MonetStatement where the batch comes from + * @param batch The list of queries to execute + * @param counts The return of the update statement of each input query + * @param e An exception to be thrown if an error occurs + * @return If all queries in the batch executed successfully or not + * @throws SQLException if an IO exception or a database error occurs + */ + @Override + protected boolean executeNextQueryBatch(MonetStatement statement, List<String> batch, int[] counts, BatchUpdateException e) throws SQLException { + int offset = 0; + boolean first = true, error = false; + int builderSize = this.initialStringBuilderSize(); + StringBuilder tmpBatch = new StringBuilder(builderSize); + String sep = this.getLanguage().getQueryTemplateIndex(2); + for (int i = 0; i < batch.size(); i++) { + String tmp = batch.get(i); + if (sep.length() + tmp.length() > builderSize) { + // The thing is too big. Way too big. Since it won't be optimal anyway, just add it to whatever we + // have and continue. + if (!first) { + tmpBatch.append(sep); + } + tmpBatch.append(tmp); + // send and receive + error |= statement.internalBatch(tmpBatch.toString(), counts, offset, i + 1, e); + offset = i; + tmpBatch.delete(0, tmpBatch.length()); + first = true; + continue; + } + if (tmpBatch.length() + sep.length() + tmp.length() >= builderSize) { + // send and receive + error |= statement.internalBatch(tmpBatch.toString(), counts, offset, i + 1, e); + offset = i; + tmpBatch.delete(0, tmpBatch.length()); + first = true; + } + if (!first) tmpBatch.append(sep); + first = false; + tmpBatch.append(tmp); + } + // send and receive + error |= statement.internalBatch(tmpBatch.toString(), counts, offset, counts.length, e); + return error; + } + + /** * Connects to the given host and port, logging in as the given user. If followRedirect is false, a * RedirectionException is thrown when a redirect is encountered. * _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list