From fd61ddbd214f9e30c08fc47398e46410b339854a Mon Sep 17 00:00:00 2001 From: kimminseok Date: Tue, 7 Oct 2025 14:15:10 +0900 Subject: [PATCH] feat(java): implement isBeforeFirst(), isAfterLast() in JDBC4ResultSet --- .../java/tech/turso/core/TursoResultSet.java | 10 +++++ .../java/tech/turso/jdbc4/JDBC4ResultSet.java | 4 +- .../tech/turso/jdbc4/JDBC4ResultSetTest.java | 44 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/bindings/java/src/main/java/tech/turso/core/TursoResultSet.java b/bindings/java/src/main/java/tech/turso/core/TursoResultSet.java index fe9d72067..e880ae6b4 100644 --- a/bindings/java/src/main/java/tech/turso/core/TursoResultSet.java +++ b/bindings/java/src/main/java/tech/turso/core/TursoResultSet.java @@ -99,6 +99,16 @@ public final class TursoResultSet { return lastStepResult != null && lastStepResult.isRow(); } + /** Checks whether the cursor is positioned after the last row. */ + public boolean isPastLastRow() { + return pastLastRow; + } + + /** Gets the current row number (0-based, 0 means before first row). */ + public int getRow() { + return row; + } + /** * Checks the status of the result set. * diff --git a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java index 471351073..a094abe37 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java @@ -413,12 +413,12 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { @Override public boolean isBeforeFirst() throws SQLException { - throw new UnsupportedOperationException("not implemented"); + return resultSet.isOpen() && resultSet.getRow() == 0 && !resultSet.isPastLastRow(); } @Override public boolean isAfterLast() throws SQLException { - throw new UnsupportedOperationException("not implemented"); + return resultSet.isOpen() && resultSet.isPastLastRow(); } @Override diff --git a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ResultSetTest.java b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ResultSetTest.java index 1e4ab80f1..1d634ada7 100644 --- a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ResultSetTest.java +++ b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4ResultSetTest.java @@ -642,4 +642,48 @@ class JDBC4ResultSetTest { assertEquals(BigDecimal.valueOf(12345.67), resultSet.getBigDecimal("amount")); } + + @Test + void test_isBeforeFirst_and_isAfterLast() throws Exception { + stmt.executeUpdate("CREATE TABLE test_position (id INTEGER);"); + stmt.executeUpdate("INSERT INTO test_position VALUES (1);"); + stmt.executeUpdate("INSERT INTO test_position VALUES (2);"); + + ResultSet resultSet = stmt.executeQuery("SELECT * FROM test_position"); + + // Before first row + assertTrue(resultSet.isBeforeFirst()); + assertFalse(resultSet.isAfterLast()); + + // First row + resultSet.next(); + assertFalse(resultSet.isBeforeFirst()); + assertFalse(resultSet.isAfterLast()); + + // Second row + resultSet.next(); + assertFalse(resultSet.isBeforeFirst()); + assertFalse(resultSet.isAfterLast()); + + // After last row + resultSet.next(); + assertFalse(resultSet.isBeforeFirst()); + assertTrue(resultSet.isAfterLast()); + } + + @Test + void test_isBeforeFirst_with_empty_resultSet() throws Exception { + stmt.executeUpdate("CREATE TABLE test_empty (id INTEGER);"); + + ResultSet resultSet = stmt.executeQuery("SELECT * FROM test_empty"); + + // Before calling next() + assertTrue(resultSet.isBeforeFirst()); + assertFalse(resultSet.isAfterLast()); + + // After calling next() on empty ResultSet + assertFalse(resultSet.next()); + assertFalse(resultSet.isBeforeFirst()); + assertTrue(resultSet.isAfterLast()); + } }