diff --git a/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java b/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java
index 98f0ad04b..de1a5228e 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java
@@ -4,6 +4,7 @@ import org.github.tursodatabase.core.AbstractDB;
import org.github.tursodatabase.core.LimboDB;
import java.sql.Connection;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
@@ -61,4 +62,43 @@ public abstract class LimboConnection implements Connection {
database.open(0);
return database;
}
+
+ protected void checkOpen() throws SQLException {
+ if (isClosed()) throw new SQLException("database connection closed");
+ }
+
+ @Override
+ public void close() throws SQLException {
+ if (isClosed()) return;
+ database.close();
+ }
+
+ @Override
+ public boolean isClosed() throws SQLException {
+ return database.isClosed();
+ }
+
+ // TODO: check whether this is still valid for limbo
+ /**
+ * Checks whether the type, concurrency, and holdability settings for a {@link ResultSet} are
+ * supported by the SQLite interface. Supported settings are:
+ *
+ *
+ * - type: {@link ResultSet#TYPE_FORWARD_ONLY}
+ *
- concurrency: {@link ResultSet#CONCUR_READ_ONLY})
+ *
- holdability: {@link ResultSet#CLOSE_CURSORS_AT_COMMIT}
+ *
+ *
+ * @param resultSetType the type setting.
+ * @param resultSetConcurrency the concurrency setting.
+ * @param resultSetHoldability the holdability setting.
+ */
+ protected void checkCursor(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+ if (resultSetType != ResultSet.TYPE_FORWARD_ONLY)
+ throw new SQLException("SQLite only supports TYPE_FORWARD_ONLY cursors");
+ if (resultSetConcurrency != ResultSet.CONCUR_READ_ONLY)
+ throw new SQLException("SQLite only supports CONCUR_READ_ONLY cursors");
+ if (resultSetHoldability != ResultSet.CLOSE_CURSORS_AT_COMMIT)
+ throw new SQLException("SQLite only supports closing cursors at commit");
+ }
}
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Connection.java b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Connection.java
index 9e67ae501..5883f7487 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Connection.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Connection.java
@@ -16,10 +16,25 @@ public class JDBC4Connection extends LimboConnection {
}
@Override
- @SkipNullableCheck
public Statement createStatement() throws SQLException {
- // TODO
- return null;
+ return createStatement(
+ ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY,
+ ResultSet.CLOSE_CURSORS_AT_COMMIT
+ );
+ }
+
+ @Override
+ public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
+ return createStatement(resultSetType, resultSetConcurrency, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ }
+
+ @Override
+ public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+ checkOpen();
+ checkCursor(resultSetType, resultSetConcurrency, resultSetHoldability);
+
+ return new JDBC4Statement(this);
}
@Override
@@ -127,13 +142,6 @@ public class JDBC4Connection extends LimboConnection {
// TODO
}
- @Override
- @SkipNullableCheck
- public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
- // TODO
- return null;
- }
-
@Override
@SkipNullableCheck
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
@@ -193,13 +201,6 @@ public class JDBC4Connection extends LimboConnection {
// TODO
}
- @Override
- @SkipNullableCheck
- public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
- // TODO
- return null;
- }
-
@Override
@SkipNullableCheck
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Statement.java b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Statement.java
index d8ea925b4..f1fb14221 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Statement.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Statement.java
@@ -14,8 +14,19 @@ public class JDBC4Statement extends CoreStatement implements Statement {
private boolean closed;
private boolean closeOnCompletion;
+ private final int resultSetType;
+ private final int resultSetConcurrency;
+ private final int resultSetHoldability;
+
public JDBC4Statement(LimboConnection connection) {
+ this(connection, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ }
+
+ public JDBC4Statement(LimboConnection connection, int resultSetType, int resultSetConcurrency, int resultSetHoldability) {
super(connection);
+ this.resultSetType = resultSetType;
+ this.resultSetConcurrency = resultSetConcurrency;
+ this.resultSetHoldability = resultSetHoldability;
}
@Override
@@ -146,15 +157,13 @@ public class JDBC4Statement extends CoreStatement implements Statement {
}
@Override
- public int getResultSetConcurrency() throws SQLException {
- // TODO
- return 0;
+ public int getResultSetConcurrency() {
+ return resultSetConcurrency;
}
@Override
- public int getResultSetType() throws SQLException {
- // TODO
- return 0;
+ public int getResultSetType() {
+ return resultSetType;
}
@Override
@@ -230,9 +239,8 @@ public class JDBC4Statement extends CoreStatement implements Statement {
}
@Override
- public int getResultSetHoldability() throws SQLException {
- // TODO
- return 0;
+ public int getResultSetHoldability() {
+ return resultSetHoldability;
}
@Override
diff --git a/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ConnectionTest.java b/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ConnectionTest.java
new file mode 100644
index 000000000..bf2a20b88
--- /dev/null
+++ b/bindings/java/src/test/java/org/github/tursodatabase/jdbc4/JDBC4ConnectionTest.java
@@ -0,0 +1,58 @@
+package org.github.tursodatabase.jdbc4;
+
+import org.github.tursodatabase.TestUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class JDBC4ConnectionTest {
+
+ private JDBC4Connection connection;
+
+ @BeforeEach
+ void setUp() throws Exception {
+ String fileUrl = TestUtils.createTempFile();
+ String url = "jdbc:sqlite:" + fileUrl;
+ connection = new JDBC4Connection(url, fileUrl, new Properties());
+ }
+
+ @Test
+ void test_create_statement_valid() throws SQLException {
+ Statement stmt = connection.createStatement();
+ assertNotNull(stmt);
+ assertEquals(ResultSet.TYPE_FORWARD_ONLY, stmt.getResultSetType());
+ assertEquals(ResultSet.CONCUR_READ_ONLY, stmt.getResultSetConcurrency());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, stmt.getResultSetHoldability());
+ }
+
+ @Test
+ void test_create_statement_with_type_and_concurrency_valid() throws SQLException {
+ Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+ assertNotNull(stmt);
+ assertEquals(ResultSet.TYPE_FORWARD_ONLY, stmt.getResultSetType());
+ assertEquals(ResultSet.CONCUR_READ_ONLY, stmt.getResultSetConcurrency());
+ }
+
+ @Test
+ void test_create_statement_with_all_params_valid() throws SQLException {
+ Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ assertNotNull(stmt);
+ assertEquals(ResultSet.TYPE_FORWARD_ONLY, stmt.getResultSetType());
+ assertEquals(ResultSet.CONCUR_READ_ONLY, stmt.getResultSetConcurrency());
+ assertEquals(ResultSet.CLOSE_CURSORS_AT_COMMIT, stmt.getResultSetHoldability());
+ }
+
+ @Test
+ void test_create_statement_invalid() {
+ assertThrows(SQLException.class, () -> {
+ connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, -1);
+ });
+ }
+}