From b796a972dc372d65f2e3fb734c06c34487c1fc94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 19:50:50 +0900 Subject: [PATCH 1/9] Fix LimboDB.load to be static method --- .../github/tursodatabase/core/LimboDB.java | 26 +++++++++---------- .../tursodatabase/core/LimboDBTest.java | 6 ++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java index f3001aead..accbad76b 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java @@ -30,6 +30,19 @@ public final class LimboDB extends AbstractDB { } } + /** + * Loads the SQLite interface backend. + */ + public static void load() { + if (isLoaded) return; + + try { + System.loadLibrary("_limbo_java"); + } finally { + isLoaded = true; + } + } + /** * @param url e.g. "jdbc:sqlite:fileName * @param fileName e.g. path to file @@ -43,19 +56,6 @@ public final class LimboDB extends AbstractDB { super(url, fileName); } - /** - * Loads the SQLite interface backend. - */ - public void load() { - if (isLoaded) return; - - try { - System.loadLibrary("_limbo_java"); - } finally { - isLoaded = true; - } - } - // WRAPPER FUNCTIONS //////////////////////////////////////////// // TODO: add support for JNI diff --git a/bindings/java/src/test/java/org/github/tursodatabase/core/LimboDBTest.java b/bindings/java/src/test/java/org/github/tursodatabase/core/LimboDBTest.java index feeeff060..66e842ea4 100644 --- a/bindings/java/src/test/java/org/github/tursodatabase/core/LimboDBTest.java +++ b/bindings/java/src/test/java/org/github/tursodatabase/core/LimboDBTest.java @@ -15,16 +15,16 @@ public class LimboDBTest { @Test void db_should_open_normally() throws Exception { String dbPath = TestUtils.createTempFile(); + LimboDB.load(); LimboDB db = LimboDB.create("jdbc:sqlite" + dbPath, dbPath); - db.load(); db.open(0); } @Test void should_throw_exception_when_opened_twice() throws Exception { String dbPath = TestUtils.createTempFile(); + LimboDB.load(); LimboDB db = LimboDB.create("jdbc:sqlite:" + dbPath, dbPath); - db.load(); db.open(0); assertThatThrownBy(() -> db.open(0)).isInstanceOf(SQLException.class); @@ -33,8 +33,8 @@ public class LimboDBTest { @Test void throwJavaException_should_throw_appropriate_java_exception() throws Exception { String dbPath = TestUtils.createTempFile(); + LimboDB.load(); LimboDB db = LimboDB.create("jdbc:sqlite:" + dbPath, dbPath); - db.load(); final int limboExceptionCode = LimboErrorCode.ETC.code; try { From 12bcfc399b7cc9e3d5f4d84f2527aff056bdb64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 19:55:54 +0900 Subject: [PATCH 2/9] Add LimboConnection.java --- .../github/tursodatabase/LimboConnection.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java diff --git a/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java b/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java new file mode 100644 index 000000000..5bb5e973f --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/LimboConnection.java @@ -0,0 +1,64 @@ +package org.github.tursodatabase; + +import org.github.tursodatabase.core.AbstractDB; +import org.github.tursodatabase.core.LimboDB; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Properties; + +public abstract class LimboConnection implements Connection { + + private final AbstractDB database; + + public LimboConnection(AbstractDB database) { + this.database = database; + } + + public LimboConnection(String url, String fileName) throws SQLException { + this(url, fileName, new Properties()); + } + + /** + * Creates a connection to limbo database. + * + * @param url e.g. "jdbc:sqlite:fileName" + * @param fileName path to file + */ + public LimboConnection(String url, String fileName, Properties properties) throws SQLException { + AbstractDB db = null; + + try { + db = open(url, fileName, properties); + } catch (Throwable t) { + try { + if (db != null) { + db.close(); + } + } catch (Throwable t2) { + t.addSuppressed(t2); + } + + throw t; + } + + this.database = db; + } + + private static AbstractDB open(String url, String fileName, Properties properties) throws SQLException { + if (fileName.isBlank()) { + throw new IllegalArgumentException("fileName should not be empty"); + } + + final AbstractDB database; + try { + LimboDB.load(); + database = LimboDB.create(url, fileName); + } catch (Exception e) { + throw new SQLException("Error opening connection", e); + } + + database.open(0); + return database; + } +} From d88204252f545411a13c2a302162a2e4ad2dbfa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 19:57:48 +0900 Subject: [PATCH 3/9] Add JDBC4Connection.java --- .../tursodatabase/jdbc4/JDBC4Connection.java | 285 ++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Connection.java 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 new file mode 100644 index 000000000..538e1bfb8 --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/jdbc4/JDBC4Connection.java @@ -0,0 +1,285 @@ +package org.github.tursodatabase.jdbc4; + +import org.github.tursodatabase.LimboConnection; + +import java.sql.*; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +public class JDBC4Connection extends LimboConnection { + + public JDBC4Connection(String url, String fileName, Properties properties) throws SQLException { + super(url, fileName, properties); + } + + @Override + public Statement createStatement() throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + return null; + } + + @Override + public String nativeSQL(String sql) throws SQLException { + return ""; + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + + } + + @Override + public boolean getAutoCommit() throws SQLException { + return false; + } + + @Override + public void commit() throws SQLException { + + } + + @Override + public void rollback() throws SQLException { + + } + + @Override + public void close() throws SQLException { + + } + + @Override + public boolean isClosed() throws SQLException { + return false; + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + return null; + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + + } + + @Override + public boolean isReadOnly() throws SQLException { + return false; + } + + @Override + public void setCatalog(String catalog) throws SQLException { + + } + + @Override + public String getCatalog() throws SQLException { + return ""; + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + + } + + @Override + public int getTransactionIsolation() throws SQLException { + return 0; + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return null; + } + + @Override + public void clearWarnings() throws SQLException { + + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return null; + } + + @Override + public Map> getTypeMap() throws SQLException { + return Map.of(); + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + + } + + @Override + public void setHoldability(int holdability) throws SQLException { + + } + + @Override + public int getHoldability() throws SQLException { + return 0; + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return null; + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return null; + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return null; + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return null; + } + + @Override + public Clob createClob() throws SQLException { + return null; + } + + @Override + public Blob createBlob() throws SQLException { + return null; + } + + @Override + public NClob createNClob() throws SQLException { + return null; + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return null; + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return false; + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + + } + + @Override + public String getClientInfo(String name) throws SQLException { + return ""; + } + + @Override + public Properties getClientInfo() throws SQLException { + return null; + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return null; + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return null; + } + + @Override + public void setSchema(String schema) throws SQLException { + + } + + @Override + public String getSchema() throws SQLException { + return ""; + } + + @Override + public void abort(Executor executor) throws SQLException { + + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + + } + + @Override + public int getNetworkTimeout() throws SQLException { + return 0; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } +} From e8e09cc745edd852359460254b3dc50f88841c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 20:03:32 +0900 Subject: [PATCH 4/9] Add JDBC.java --- .../java/org/github/tursodatabase/JDBC.java | 62 +++++++++++++++++++ .../org/github/tursodatabase/JDBCTest.java | 23 +++++++ 2 files changed, 85 insertions(+) create mode 100644 bindings/java/src/main/java/org/github/tursodatabase/JDBC.java create mode 100644 bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java diff --git a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java new file mode 100644 index 000000000..edf938e67 --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java @@ -0,0 +1,62 @@ +package org.github.tursodatabase; + +import org.github.tursodatabase.jdbc4.JDBC4Connection; + +import java.sql.*; +import java.util.Properties; +import java.util.logging.Logger; + +public class JDBC implements Driver { + + private static final String VALID_URL_PREFIX = "jdbc:limbo:"; + + public static LimboConnection createConnection(String url, Properties properties) throws SQLException { + if (!isValidURL(url)) return null; + + url = url.trim(); + return new JDBC4Connection(url, extractAddress(url), properties); + } + + private static boolean isValidURL(String url) { + return url != null && url.toLowerCase().startsWith(VALID_URL_PREFIX); + } + + private static String extractAddress(String url) { + return url.substring(VALID_URL_PREFIX.length()); + } + + @Override + public Connection connect(String url, Properties info) throws SQLException { + return null; + } + + @Override + public boolean acceptsURL(String url) throws SQLException { + return false; + } + + @Override + public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException { + return new DriverPropertyInfo[0]; + } + + @Override + public int getMajorVersion() { + return 0; + } + + @Override + public int getMinorVersion() { + return 0; + } + + @Override + public boolean jdbcCompliant() { + return false; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } +} diff --git a/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java b/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java new file mode 100644 index 000000000..137e5b0ce --- /dev/null +++ b/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java @@ -0,0 +1,23 @@ +package org.github.tursodatabase; + +import org.junit.jupiter.api.Test; + +import java.util.Properties; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class JDBCTest { + + @Test + void null_is_returned_when_invalid_url_is_passed() throws Exception { + LimboConnection connection = JDBC.createConnection("jdbc:invalid:xxx", new Properties()); + assertThat(connection).isNull(); + } + + @Test + void non_null_connection_is_returned_when_valid_url_is_passed() throws Exception { + String fileUrl = TestUtils.createTempFile(); + LimboConnection connection = JDBC.createConnection("jdbc:limbo:" + fileUrl, new Properties()); + assertThat(connection).isNotNull(); + } +} From bc9e9714f10b2ac81464cf2ecc7be4d8bbe053cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 20:10:38 +0900 Subject: [PATCH 5/9] Add LimboConfig.java --- .../org/github/tursodatabase/LimboConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java diff --git a/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java b/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java new file mode 100644 index 000000000..388419e60 --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java @@ -0,0 +1,20 @@ +package org.github.tursodatabase; + +import java.util.Properties; + +/** + * Limbo Configuration. + */ +public class LimboConfig { + private final Properties pragma; + + public LimboConfig(Properties properties) { + this.pragma = properties; + } + + public Properties toProperties() { + Properties copy = new Properties(); + copy.putAll(pragma); + return copy; + } +} From b360f0559f421ee0d2458dc14440490120c76c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 20:10:49 +0900 Subject: [PATCH 6/9] Add LimboDataSource.java --- .../github/tursodatabase/LimboDataSource.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java diff --git a/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java b/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java new file mode 100644 index 000000000..9748c219d --- /dev/null +++ b/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java @@ -0,0 +1,76 @@ +package org.github.tursodatabase; + +import javax.sql.DataSource; +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.SQLFeatureNotSupportedException; +import java.util.Properties; +import java.util.logging.Logger; + +/** + * Provides {@link DataSource} API for configuring Limbo database connection. + */ +public class LimboDataSource implements DataSource { + + private final LimboConfig limboConfig; + private final String url; + + /** + * Creates a datasource based on the provided configuration. + * + * @param limboConfig The configuration for the datasource. + */ + public LimboDataSource(LimboConfig limboConfig, String url) { + this.limboConfig = limboConfig; + this.url = url; + } + + @Override + public Connection getConnection() throws SQLException { + return getConnection(null, null); + } + + @Override + public Connection getConnection(String username, String password) throws SQLException { + Properties properties = limboConfig.toProperties(); + if (username != null) properties.put("user", username); + if (password != null) properties.put("pass", password); + return JDBC.createConnection(url, properties); + } + + @Override + public PrintWriter getLogWriter() throws SQLException { + return null; + } + + @Override + public void setLogWriter(PrintWriter out) throws SQLException { + + } + + @Override + public void setLoginTimeout(int seconds) throws SQLException { + + } + + @Override + public int getLoginTimeout() throws SQLException { + return 0; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } + + @Override + public T unwrap(Class iface) throws SQLException { + return null; + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return false; + } +} From da787edd99ced4498d26dcb59dbbc6c197e69bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 20:22:58 +0900 Subject: [PATCH 7/9] Implement JDBC so that DriverManager can detect limbo connection --- .../java/org/github/tursodatabase/JDBC.java | 18 ++++++++--- .../org/github/tursodatabase/LimboConfig.java | 31 +++++++++++++++++++ .../org/github/tursodatabase/JDBCTest.java | 10 ++++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java index edf938e67..87200ff5c 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java @@ -7,9 +7,16 @@ import java.util.Properties; import java.util.logging.Logger; public class JDBC implements Driver { - private static final String VALID_URL_PREFIX = "jdbc:limbo:"; + static { + try { + DriverManager.registerDriver(new JDBC()); + } catch (Exception e) { + // TODO: log + } + } + public static LimboConnection createConnection(String url, Properties properties) throws SQLException { if (!isValidURL(url)) return null; @@ -27,26 +34,28 @@ public class JDBC implements Driver { @Override public Connection connect(String url, Properties info) throws SQLException { - return null; + return createConnection(url, info); } @Override public boolean acceptsURL(String url) throws SQLException { - return false; + return isValidURL(url); } @Override public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException { - return new DriverPropertyInfo[0]; + return LimboConfig.getDriverPropertyInfo(); } @Override public int getMajorVersion() { + // TODO return 0; } @Override public int getMinorVersion() { + // TODO return 0; } @@ -57,6 +66,7 @@ public class JDBC implements Driver { @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { + // TODO return null; } } diff --git a/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java b/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java index 388419e60..7f2a2cdf0 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/LimboConfig.java @@ -1,5 +1,7 @@ package org.github.tursodatabase; +import java.sql.DriverPropertyInfo; +import java.util.Arrays; import java.util.Properties; /** @@ -12,9 +14,38 @@ public class LimboConfig { this.pragma = properties; } + public static DriverPropertyInfo[] getDriverPropertyInfo() { + return Arrays.stream(Pragma.values()) + .map(p -> { + DriverPropertyInfo info = new DriverPropertyInfo(p.pragmaName, null); + info.description = p.description; + info.choices = p.choices; + info.required = false; + return info; + }) + .toArray(DriverPropertyInfo[]::new); + } + public Properties toProperties() { Properties copy = new Properties(); copy.putAll(pragma); return copy; } + + public enum Pragma { + ; + private final String pragmaName; + private final String description; + private final String[] choices; + + Pragma(String pragmaName, String description, String[] choices) { + this.pragmaName = pragmaName; + this.description = description; + this.choices = choices; + } + + public String getPragmaName() { + return pragmaName; + } + } } diff --git a/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java b/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java index 137e5b0ce..ff629bacc 100644 --- a/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java +++ b/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java @@ -2,6 +2,9 @@ package org.github.tursodatabase; import org.junit.jupiter.api.Test; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; import java.util.Properties; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -20,4 +23,11 @@ class JDBCTest { LimboConnection connection = JDBC.createConnection("jdbc:limbo:" + fileUrl, new Properties()); assertThat(connection).isNotNull(); } + + @Test + void connection_can_be_retrieved_from_DriverManager() throws SQLException { + JDBC jdbc = new JDBC(); + Connection connection = DriverManager.getConnection("jdbc:limbo:sample.db"); + assertThat(connection).isNotNull(); + } } From 71c2bdf37b14626032dbf331d3e89e2d0f84a00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 20:26:41 +0900 Subject: [PATCH 8/9] Add TODO comments --- .../github/tursodatabase/LimboDataSource.java | 9 ++- .../tursodatabase/jdbc4/JDBC4Connection.java | 70 ++++++++++++++----- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java b/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java index 9748c219d..12a53c303 100644 --- a/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java +++ b/bindings/java/src/main/java/org/github/tursodatabase/LimboDataSource.java @@ -41,36 +41,41 @@ public class LimboDataSource implements DataSource { @Override public PrintWriter getLogWriter() throws SQLException { + // TODO return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { - + // TODO } @Override public void setLoginTimeout(int seconds) throws SQLException { - + // TODO } @Override public int getLoginTimeout() throws SQLException { + // TODO return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { + // TODO return null; } @Override public T unwrap(Class iface) throws SQLException { + // TODO return null; } @Override public boolean isWrapperFor(Class iface) throws SQLException { + // TODO return false; } } 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 538e1bfb8..04c83b6b9 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 @@ -15,127 +15,142 @@ public class JDBC4Connection extends LimboConnection { @Override public Statement createStatement() throws SQLException { + // TODO return null; } @Override public PreparedStatement prepareStatement(String sql) throws SQLException { + // TODO return null; } @Override public CallableStatement prepareCall(String sql) throws SQLException { + // TODO return null; } @Override public String nativeSQL(String sql) throws SQLException { + // TODO return ""; } @Override public void setAutoCommit(boolean autoCommit) throws SQLException { - + // TODO } @Override public boolean getAutoCommit() throws SQLException { + // TODO return false; } @Override public void commit() throws SQLException { - + // TODO } @Override public void rollback() throws SQLException { - + // TODO } @Override public void close() throws SQLException { - + // TODO } @Override public boolean isClosed() throws SQLException { + // TODO return false; } @Override public DatabaseMetaData getMetaData() throws SQLException { + // TODO return null; } @Override public void setReadOnly(boolean readOnly) throws SQLException { - + // TODO } @Override public boolean isReadOnly() throws SQLException { + // TODO return false; } @Override public void setCatalog(String catalog) throws SQLException { - + // TODO } @Override public String getCatalog() throws SQLException { + // TODO return ""; } @Override public void setTransactionIsolation(int level) throws SQLException { - + // TODO } @Override public int getTransactionIsolation() throws SQLException { + // TODO return 0; } @Override public SQLWarning getWarnings() throws SQLException { + // TODO return null; } @Override public void clearWarnings() throws SQLException { - + // TODO } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + // TODO return null; } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + // TODO return null; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + // TODO return null; } @Override public Map> getTypeMap() throws SQLException { + // TODO return Map.of(); } @Override public void setTypeMap(Map> map) throws SQLException { - + // TODO } @Override public void setHoldability(int holdability) throws SQLException { - + // TODO } @Override @@ -145,141 +160,162 @@ public class JDBC4Connection extends LimboConnection { @Override public Savepoint setSavepoint() throws SQLException { + // TODO return null; } @Override public Savepoint setSavepoint(String name) throws SQLException { + // TODO return null; } @Override public void rollback(Savepoint savepoint) throws SQLException { - + // TODO } @Override public void releaseSavepoint(Savepoint savepoint) throws SQLException { - + // TODO } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + // TODO return null; } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + // TODO return null; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + // TODO return null; } @Override public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + // TODO return null; } @Override public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + // TODO return null; } @Override public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + // TODO return null; } @Override public Clob createClob() throws SQLException { + // TODO return null; } @Override public Blob createBlob() throws SQLException { + // TODO return null; } @Override public NClob createNClob() throws SQLException { + // TODO return null; } @Override public SQLXML createSQLXML() throws SQLException { + // TODO return null; } @Override public boolean isValid(int timeout) throws SQLException { + // TODO return false; } @Override public void setClientInfo(String name, String value) throws SQLClientInfoException { - + // TODO } @Override public void setClientInfo(Properties properties) throws SQLClientInfoException { - + // TODO } @Override public String getClientInfo(String name) throws SQLException { + // TODO return ""; } @Override public Properties getClientInfo() throws SQLException { + // TODO return null; } @Override public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + // TODO return null; } @Override public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + // TODO return null; } @Override public void setSchema(String schema) throws SQLException { - + // TODO } @Override public String getSchema() throws SQLException { + // TODO return ""; } @Override public void abort(Executor executor) throws SQLException { - + // TODO } @Override public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { - + // TODO } @Override public int getNetworkTimeout() throws SQLException { + // TODO return 0; } @Override public T unwrap(Class iface) throws SQLException { + // TODO return null; } @Override public boolean isWrapperFor(Class iface) throws SQLException { + // TODO return false; } } From 59180599fd1179664cb9c6e4a046aa3ee1276498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Fri, 10 Jan 2025 20:41:49 +0900 Subject: [PATCH 9/9] Add java.sql.Driver to automatically detect JDBC --- .../src/main/resources/META-INF/services/java.sql.Driver | 1 + .../src/test/java/org/github/tursodatabase/JDBCTest.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 bindings/java/src/main/resources/META-INF/services/java.sql.Driver diff --git a/bindings/java/src/main/resources/META-INF/services/java.sql.Driver b/bindings/java/src/main/resources/META-INF/services/java.sql.Driver new file mode 100644 index 000000000..71922046d --- /dev/null +++ b/bindings/java/src/main/resources/META-INF/services/java.sql.Driver @@ -0,0 +1 @@ +org.github.tursodatabase.JDBC diff --git a/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java b/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java index ff629bacc..d0cdc4dc3 100644 --- a/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java +++ b/bindings/java/src/test/java/org/github/tursodatabase/JDBCTest.java @@ -26,8 +26,8 @@ class JDBCTest { @Test void connection_can_be_retrieved_from_DriverManager() throws SQLException { - JDBC jdbc = new JDBC(); - Connection connection = DriverManager.getConnection("jdbc:limbo:sample.db"); - assertThat(connection).isNotNull(); + try (Connection connection = DriverManager.getConnection("jdbc:limbo:sample.db")) { + assertThat(connection).isNotNull(); + } } }