diff --git a/bindings/java/rs_src/limbo_statement.rs b/bindings/java/rs_src/limbo_statement.rs index 7de4b2c19..f8a9706e2 100644 --- a/bindings/java/rs_src/limbo_statement.rs +++ b/bindings/java/rs_src/limbo_statement.rs @@ -88,6 +88,15 @@ pub extern "system" fn Java_org_github_tursodatabase_core_LimboStatement_step<'l } } +#[no_mangle] +pub extern "system" fn Java_org_github_tursodatabase_core_LimboStatement__1close<'local>( + _env: JNIEnv<'local>, + _obj: JObject<'local>, + stmt_ptr: jlong +) { + LimboStatement::drop(stmt_ptr); +} + fn row_to_obj_array<'local>( env: &mut JNIEnv<'local>, row: &limbo_core::Row, diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java index c6cb8d00e..6633dbd33 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java @@ -50,7 +50,11 @@ public class LimboResultSet { * cursor can only move forward. */ public boolean next() throws SQLException { - if (!open || isEmptyResultSet || pastLastRow) { + if (!open) { + throw new SQLException("The resultSet is not open"); + } + + if (isEmptyResultSet || pastLastRow) { return false; // completed ResultSet } @@ -97,6 +101,11 @@ public class LimboResultSet { } } + public void close() throws SQLException { + this.statement.close(); + this.open = false; + } + @Override public String toString() { return "LimboResultSet{" diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java index c749e27cc..df82b71e3 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java @@ -67,6 +67,16 @@ public class LimboStatement { LimboExceptionUtils.throwLimboException(errorCode, errorMessageBytes); } + /** + * Closes the current statement and releases any resources associated with it. This method calls + * the native `_close` method to perform the actual closing operation. + */ + public void close() { + _close(statementPointer); + } + + private native void _close(long statementPointer); + @Override public String toString() { return "LimboStatement{" diff --git a/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4ResultSet.java b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4ResultSet.java index 867b2688e..092bf4d44 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4ResultSet.java @@ -25,7 +25,7 @@ public class JDBC4ResultSet implements ResultSet { @Override public void close() throws SQLException { - // TODO + resultSet.close(); } @Override @@ -866,8 +866,7 @@ public class JDBC4ResultSet implements ResultSet { @Override public boolean isClosed() throws SQLException { - // TODO - return false; + return !resultSet.isOpen(); } @Override diff --git a/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ResultSetTest.java b/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ResultSetTest.java index f764a9361..20f002733 100644 --- a/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ResultSetTest.java +++ b/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ResultSetTest.java @@ -57,4 +57,28 @@ class JDBC4ResultSetTest { // as well assertFalse(resultSet.next()); } + + @Test + void resultSet_close_test() throws Exception { + stmt.executeUpdate("CREATE TABLE users (id INT PRIMARY KEY, username TEXT);"); + stmt.executeUpdate("INSERT INTO users VALUES (2, 'seonwoo');"); + stmt.executeQuery("SELECT * FROM users"); + ResultSet resultSet = stmt.getResultSet(); + + assertFalse(resultSet.isClosed()); + resultSet.close(); + assertTrue(resultSet.isClosed()); + } + + @Test + void calling_methods_on_closed_resultSet_should_throw_exception() throws Exception { + stmt.executeUpdate("CREATE TABLE users (id INT PRIMARY KEY, username TEXT);"); + stmt.executeUpdate("INSERT INTO users VALUES (2, 'seonwoo');"); + stmt.executeQuery("SELECT * FROM users"); + ResultSet resultSet = stmt.getResultSet(); + resultSet.close(); + assertTrue(resultSet.isClosed()); + + resultSet.next(); + } }