diff --git a/bindings/java/rs_src/turso_statement.rs b/bindings/java/rs_src/turso_statement.rs index 0f937f8fe..cb8f33def 100644 --- a/bindings/java/rs_src/turso_statement.rs +++ b/bindings/java/rs_src/turso_statement.rs @@ -318,6 +318,24 @@ pub extern "system" fn Java_tech_turso_core_TursoStatement_parameterCount<'local stmt.stmt.parameters_count() as jint } +#[no_mangle] +pub extern "system" fn Java_tech_turso_core_TursoStatement_reset<'local>( + mut env: JNIEnv<'local>, + obj: JObject<'local>, + stmt_ptr: jlong, +) -> jint { + let stmt = match to_turso_statement(stmt_ptr) { + Ok(stmt) => stmt, + Err(e) => { + set_err_msg_and_throw_exception(&mut env, obj, SQLITE_ERROR, e.to_string()); + return -1; + } + }; + + stmt.stmt.reset(); + 0 +} + /// Converts an optional `JObject` into Java's `TursoStepResult`. /// /// This function takes an optional `JObject` and converts it into a Java object diff --git a/bindings/java/src/main/java/tech/turso/core/TursoStatement.java b/bindings/java/src/main/java/tech/turso/core/TursoStatement.java index 9c9911623..585d86321 100644 --- a/bindings/java/src/main/java/tech/turso/core/TursoStatement.java +++ b/bindings/java/src/main/java/tech/turso/core/TursoStatement.java @@ -20,7 +20,7 @@ public final class TursoStatement { private final String sql; private final long statementPointer; - private final TursoResultSet resultSet; + private TursoResultSet resultSet; private boolean closed; @@ -290,6 +290,17 @@ public final class TursoStatement { private native int parameterCount(long statementPointer) throws SQLException; + /** Resets this statement so it's ready for re-execution */ + public void reset() throws SQLException { + final int result = reset(statementPointer); + if (result == -1) { + throw new SQLException("Exception while resetting statement"); + } + this.resultSet = TursoResultSet.of(this); + } + + private native int reset(long statementPointer) throws SQLException; + /** * Checks if the statement is closed. * diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java index 48c5491d2..c3f999070 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -22,7 +22,7 @@ import tech.turso.core.TursoResultSet; public final class JDBC4PreparedStatement extends JDBC4Statement implements PreparedStatement { private final String sql; - private JDBC4ResultSet resultSet; + private final JDBC4ResultSet resultSet; private final int paramCount; private Object[] currentBatchParams; @@ -44,11 +44,6 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep this.currentBatchParams = new Object[paramCount]; } - private void reprepareStatement() throws SQLException { - this.statement = connection.prepare(sql); - this.resultSet = new JDBC4ResultSet(this.statement.getResultSet()); - } - @Override public ResultSet executeQuery() throws SQLException { // TODO: check bindings etc @@ -362,8 +357,7 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep } for (int i = 0; i < batchQueryParams.size(); i++) { try { - // TODO: do this without creating a new statement because this has unnecessary overhead - reprepareStatement(); + statement.reset(); execute(batchQueryParams.get(i)); updateCounts[i] = getUpdateCount(); } catch (SQLException e) { diff --git a/core/lib.rs b/core/lib.rs index a32e5497b..3862756e3 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -2888,6 +2888,7 @@ impl Statement { &mut self.state.auto_txn_cleanup, ); self.state.reset(max_registers, max_cursors); + self.program.n_change.store(0, Ordering::SeqCst); self.busy = false; self.busy_timeout = None; }