From a61ad217f111974b6eb80c954daf1def3c271432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Thu, 28 Aug 2025 14:20:40 +0900 Subject: [PATCH 1/5] Implement setDate --- .../turso/jdbc4/JDBC4PreparedStatement.java | 10 +++++-- .../jdbc4/JDBC4PreparedStatementTest.java | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) 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 60b5316fe..4ac5dff2b 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -121,7 +121,13 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public void setDate(int parameterIndex, Date x) throws SQLException { - // TODO + requireNonNull(this.statement); + if (x == null) { + this.statement.bindNull(parameterIndex); + } else { + String dateStr = x.toString(); + this.statement.bindBlob(parameterIndex, dateStr.getBytes()); + } } @Override @@ -212,7 +218,7 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { - // TODO + setDate(parameterIndex, x); } @Override diff --git a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java index 866a56bda..41f4da369 100644 --- a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java +++ b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.math.BigDecimal; +import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -225,6 +226,32 @@ class JDBC4PreparedStatementTest { assertArrayEquals(new byte[] {7, 8, 9}, rs.getBytes(1)); } + @Test + void testSetDate() throws SQLException { + connection.prepareStatement("CREATE TABLE test (col BLOB)").execute(); + PreparedStatement stmt = + connection.prepareStatement("INSERT INTO test (col) VALUES (?), (?), (?)"); + + Date date1 = new Date(1000000000000L); + Date date2 = new Date(1500000000000L); + Date date3 = new Date(2000000000000L); + + stmt.setDate(1, date1); + stmt.setDate(2, date2); + stmt.setDate(3, date3); + stmt.execute(); + + PreparedStatement stmt2 = connection.prepareStatement("SELECT * FROM test;"); + ResultSet rs = stmt2.executeQuery(); + + assertTrue(rs.next()); + assertArrayEquals(date1.toString().getBytes(), rs.getBytes(1)); + assertTrue(rs.next()); + assertArrayEquals(date2.toString().getBytes(), rs.getBytes(1)); + assertTrue(rs.next()); + assertArrayEquals(date3.toString().getBytes(), rs.getBytes(1)); + } + @Test void testInsertMultipleTypes() throws SQLException { connection From a9ae58815911aa1fa1e1c5a4606db22c453d16c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Thu, 28 Aug 2025 14:35:01 +0900 Subject: [PATCH 2/5] Implement setTime --- .../turso/jdbc4/JDBC4PreparedStatement.java | 15 +++-- .../java/tech/turso/jdbc4/JDBC4ResultSet.java | 60 +++++++++++++++++-- .../jdbc4/JDBC4PreparedStatementTest.java | 35 +++++++++-- 3 files changed, 97 insertions(+), 13 deletions(-) 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 4ac5dff2b..926e6ca38 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; import java.net.URL; +import java.nio.ByteBuffer; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; @@ -125,14 +126,20 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep if (x == null) { this.statement.bindNull(parameterIndex); } else { - String dateStr = x.toString(); - this.statement.bindBlob(parameterIndex, dateStr.getBytes()); + long time = x.getTime(); + this.statement.bindBlob(parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); } } @Override public void setTime(int parameterIndex, Time x) throws SQLException { - // TODO + requireNonNull(this.statement); + if (x == null) { + this.statement.bindNull(parameterIndex); + } else { + long time = x.getTime(); + this.statement.bindBlob(parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); + } } @Override @@ -223,7 +230,7 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { - // TODO + setTime(parameterIndex, x); } @Override 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 c2cc31a0a..0d7c40988 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java @@ -5,6 +5,7 @@ import java.io.Reader; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URL; +import java.nio.ByteBuffer; import java.sql.Array; import java.sql.Blob; import java.sql.Clob; @@ -146,15 +147,47 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { } @Override - @SkipNullableCheck + @Nullable public Date getDate(int columnIndex) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + final Object result = resultSet.get(columnIndex); + if (result == null) { + return null; + } + return wrapTypeConversion(() -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Date(time); + } + } + if (result instanceof String) { + return Date.valueOf((String) result); + } + throw new SQLException("Cannot convert value to Date: " + result.getClass()); + }); } @Override @SkipNullableCheck public Time getTime(int columnIndex) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + final Object result = resultSet.get(columnIndex); + if (result == null) { + return null; + } + return wrapTypeConversion(() -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Time(time); + } + } + if (result instanceof String) { + return Time.valueOf((String) result); + } + throw new SQLException("Cannot convert value to Date: " + result.getClass()); + }); } @Override @@ -238,9 +271,26 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { } @Override - @SkipNullableCheck + @Nullable public Date getDate(String columnLabel) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + final Object result = resultSet.get(columnLabel); + if (result == null) { + return null; + } + return wrapTypeConversion(() -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Date(time); + } + } + // Try to parse as string if it's stored as TEXT + if (result instanceof String) { + return Date.valueOf((String) result); + } + throw new SQLException("Cannot convert value to Date: " + result.getClass()); + }); } @Override diff --git a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java index 41f4da369..fdf70bf3f 100644 --- a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java +++ b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java @@ -10,6 +10,7 @@ import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Time; import java.util.Properties; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -242,14 +243,40 @@ class JDBC4PreparedStatementTest { stmt.execute(); PreparedStatement stmt2 = connection.prepareStatement("SELECT * FROM test;"); - ResultSet rs = stmt2.executeQuery(); + JDBC4ResultSet rs = (JDBC4ResultSet) stmt2.executeQuery(); + + assertTrue(rs.next()); + assertEquals(date1, rs.getDate(1)); + assertTrue(rs.next()); + assertEquals(date2, rs.getDate(1)); + assertTrue(rs.next()); + assertEquals(date3, rs.getDate(1)); + } + + @Test + void testSetTime() throws SQLException { + connection.prepareStatement("CREATE TABLE test (col BLOB)").execute(); + PreparedStatement stmt = + connection.prepareStatement("INSERT INTO test (col) VALUES (?), (?), (?)"); + + Time time1 = new Time(1000000000000L); + Time time2 = new Time(1500000000000L); + Time time3 = new Time(2000000000000L); + + stmt.setTime(1, time1); + stmt.setTime(2, time2); + stmt.setTime(3, time3); + stmt.execute(); + + PreparedStatement stmt2 = connection.prepareStatement("SELECT * FROM test;"); + JDBC4ResultSet rs = (JDBC4ResultSet) stmt2.executeQuery(); assertTrue(rs.next()); - assertArrayEquals(date1.toString().getBytes(), rs.getBytes(1)); + assertEquals(time1, rs.getTime(1)); assertTrue(rs.next()); - assertArrayEquals(date2.toString().getBytes(), rs.getBytes(1)); + assertEquals(time2, rs.getTime(1)); assertTrue(rs.next()); - assertArrayEquals(date3.toString().getBytes(), rs.getBytes(1)); + assertEquals(time3, rs.getTime(1)); } @Test From 6c93d783945b2f8f085b00e25d7b71cf03831aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Thu, 28 Aug 2025 14:38:13 +0900 Subject: [PATCH 3/5] Add TODOs --- .../java/tech/turso/jdbc4/JDBC4ResultSet.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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 0d7c40988..aa94e028a 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java @@ -788,27 +788,31 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { } @Override - @SkipNullableCheck + @Nullable public Date getDate(int columnIndex, Calendar cal) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + // TODO: Properly handle timezone conversion with Calendar + return getDate(columnIndex); } @Override - @SkipNullableCheck + @Nullable public Date getDate(String columnLabel, Calendar cal) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + // TODO: Properly handle timezone conversion with Calendar + return getDate(columnLabel); } @Override @SkipNullableCheck public Time getTime(int columnIndex, Calendar cal) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + // TODO: Properly handle timezone conversion with Calendar + return getTime(columnIndex); } @Override @SkipNullableCheck public Time getTime(String columnLabel, Calendar cal) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + // TODO: Properly handle timezone conversion with Calendar + return getTime(columnLabel); } @Override From b50011d96b5f3e7ad52ed4abaf1d29875cac2f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Thu, 28 Aug 2025 14:49:16 +0900 Subject: [PATCH 4/5] Implement setTimestamp --- .../turso/jdbc4/JDBC4PreparedStatement.java | 11 +++++-- .../java/tech/turso/jdbc4/JDBC4ResultSet.java | 29 ++++++++++++------- .../jdbc4/JDBC4PreparedStatementTest.java | 27 +++++++++++++++++ 3 files changed, 55 insertions(+), 12 deletions(-) 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 926e6ca38..16f8f33c4 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -144,7 +144,13 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { - // TODO + requireNonNull(this.statement); + if (x == null) { + this.statement.bindNull(parameterIndex); + } else { + long time = x.getTime(); + this.statement.bindBlob(parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); + } } @Override @@ -235,7 +241,8 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep @Override public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { - // TODO + // TODO: Apply calendar timezone conversion + setTimestamp(parameterIndex, x); } @Override 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 aa94e028a..0d77007ff 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java @@ -161,9 +161,6 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { return new Date(time); } } - if (result instanceof String) { - return Date.valueOf((String) result); - } throw new SQLException("Cannot convert value to Date: " + result.getClass()); }); } @@ -183,9 +180,6 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { return new Time(time); } } - if (result instanceof String) { - return Time.valueOf((String) result); - } throw new SQLException("Cannot convert value to Date: " + result.getClass()); }); } @@ -193,7 +187,20 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { @Override @SkipNullableCheck public Timestamp getTimestamp(int columnIndex) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + final Object result = resultSet.get(columnIndex); + if (result == null) { + return null; + } + return wrapTypeConversion(() -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Timestamp(time); + } + } + throw new SQLException("Cannot convert value to Timestamp: " + result.getClass()); + }); } @Override @@ -302,7 +309,7 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { @Override @SkipNullableCheck public Timestamp getTimestamp(String columnLabel) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + return getTimestamp(findColumn(columnLabel)); } @Override @@ -818,13 +825,15 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { @Override @SkipNullableCheck public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + // TODO: Apply calendar timezone conversion + return getTimestamp(columnIndex); } @Override @SkipNullableCheck public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { - throw new UnsupportedOperationException("not implemented"); + // TODO: Apply calendar timezone conversion + return getTimestamp(findColumn(columnLabel)); } @Override diff --git a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java index fdf70bf3f..857c1f74d 100644 --- a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java +++ b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java @@ -11,6 +11,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; +import java.sql.Timestamp; import java.util.Properties; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -279,6 +280,32 @@ class JDBC4PreparedStatementTest { assertEquals(time3, rs.getTime(1)); } + @Test + void testSetTimestamp() throws SQLException { + connection.prepareStatement("CREATE TABLE test (col BLOB)").execute(); + PreparedStatement stmt = + connection.prepareStatement("INSERT INTO test (col) VALUES (?), (?), (?)"); + + Timestamp timestamp1 = new Timestamp(1000000000000L); + Timestamp timestamp2 = new Timestamp(1500000000000L); + Timestamp timestamp3 = new Timestamp(2000000000000L); + + stmt.setTimestamp(1, timestamp1); + stmt.setTimestamp(2, timestamp2); + stmt.setTimestamp(3, timestamp3); + stmt.execute(); + + PreparedStatement stmt2 = connection.prepareStatement("SELECT * FROM test;"); + JDBC4ResultSet rs = (JDBC4ResultSet) stmt2.executeQuery(); + + assertTrue(rs.next()); + assertEquals(timestamp1, rs.getTimestamp(1)); + assertTrue(rs.next()); + assertEquals(timestamp2, rs.getTimestamp(1)); + assertTrue(rs.next()); + assertEquals(timestamp3, rs.getTimestamp(1)); + } + @Test void testInsertMultipleTypes() throws SQLException { connection From 424275b60b3f59dc68daa9842372b9d2db10168c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=A0=EC=9A=B0?= Date: Sun, 31 Aug 2025 16:15:37 +0900 Subject: [PATCH 5/5] Apply lint --- .../turso/jdbc4/JDBC4PreparedStatement.java | 9 +- .../java/tech/turso/jdbc4/JDBC4ResultSet.java | 92 ++++++++++--------- .../jdbc4/JDBC4PreparedStatementTest.java | 28 +++--- 3 files changed, 68 insertions(+), 61 deletions(-) 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 16f8f33c4..a260d1ef2 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4PreparedStatement.java @@ -127,7 +127,8 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep this.statement.bindNull(parameterIndex); } else { long time = x.getTime(); - this.statement.bindBlob(parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); + this.statement.bindBlob( + parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); } } @@ -138,7 +139,8 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep this.statement.bindNull(parameterIndex); } else { long time = x.getTime(); - this.statement.bindBlob(parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); + this.statement.bindBlob( + parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); } } @@ -149,7 +151,8 @@ public final class JDBC4PreparedStatement extends JDBC4Statement implements Prep this.statement.bindNull(parameterIndex); } else { long time = x.getTime(); - this.statement.bindBlob(parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); + this.statement.bindBlob( + parameterIndex, ByteBuffer.allocate(Long.BYTES).putLong(time).array()); } } 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 0d77007ff..5d9156b88 100644 --- a/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java +++ b/bindings/java/src/main/java/tech/turso/jdbc4/JDBC4ResultSet.java @@ -153,16 +153,17 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { if (result == null) { return null; } - return wrapTypeConversion(() -> { - if (result instanceof byte[]) { - byte[] bytes = (byte[]) result; - if (bytes.length == Long.BYTES) { - long time = ByteBuffer.wrap(bytes).getLong(); - return new Date(time); - } - } - throw new SQLException("Cannot convert value to Date: " + result.getClass()); - }); + return wrapTypeConversion( + () -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Date(time); + } + } + throw new SQLException("Cannot convert value to Date: " + result.getClass()); + }); } @Override @@ -172,16 +173,17 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { if (result == null) { return null; } - return wrapTypeConversion(() -> { - if (result instanceof byte[]) { - byte[] bytes = (byte[]) result; - if (bytes.length == Long.BYTES) { - long time = ByteBuffer.wrap(bytes).getLong(); - return new Time(time); - } - } - throw new SQLException("Cannot convert value to Date: " + result.getClass()); - }); + return wrapTypeConversion( + () -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Time(time); + } + } + throw new SQLException("Cannot convert value to Date: " + result.getClass()); + }); } @Override @@ -191,16 +193,17 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { if (result == null) { return null; } - return wrapTypeConversion(() -> { - if (result instanceof byte[]) { - byte[] bytes = (byte[]) result; - if (bytes.length == Long.BYTES) { - long time = ByteBuffer.wrap(bytes).getLong(); - return new Timestamp(time); - } - } - throw new SQLException("Cannot convert value to Timestamp: " + result.getClass()); - }); + return wrapTypeConversion( + () -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Timestamp(time); + } + } + throw new SQLException("Cannot convert value to Timestamp: " + result.getClass()); + }); } @Override @@ -284,20 +287,21 @@ public final class JDBC4ResultSet implements ResultSet, ResultSetMetaData { if (result == null) { return null; } - return wrapTypeConversion(() -> { - if (result instanceof byte[]) { - byte[] bytes = (byte[]) result; - if (bytes.length == Long.BYTES) { - long time = ByteBuffer.wrap(bytes).getLong(); - return new Date(time); - } - } - // Try to parse as string if it's stored as TEXT - if (result instanceof String) { - return Date.valueOf((String) result); - } - throw new SQLException("Cannot convert value to Date: " + result.getClass()); - }); + return wrapTypeConversion( + () -> { + if (result instanceof byte[]) { + byte[] bytes = (byte[]) result; + if (bytes.length == Long.BYTES) { + long time = ByteBuffer.wrap(bytes).getLong(); + return new Date(time); + } + } + // Try to parse as string if it's stored as TEXT + if (result instanceof String) { + return Date.valueOf((String) result); + } + throw new SQLException("Cannot convert value to Date: " + result.getClass()); + }); } @Override diff --git a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java index 857c1f74d..7d2f0274b 100644 --- a/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java +++ b/bindings/java/src/test/java/tech/turso/jdbc4/JDBC4PreparedStatementTest.java @@ -233,11 +233,11 @@ class JDBC4PreparedStatementTest { connection.prepareStatement("CREATE TABLE test (col BLOB)").execute(); PreparedStatement stmt = connection.prepareStatement("INSERT INTO test (col) VALUES (?), (?), (?)"); - - Date date1 = new Date(1000000000000L); + + Date date1 = new Date(1000000000000L); Date date2 = new Date(1500000000000L); - Date date3 = new Date(2000000000000L); - + Date date3 = new Date(2000000000000L); + stmt.setDate(1, date1); stmt.setDate(2, date2); stmt.setDate(3, date3); @@ -259,11 +259,11 @@ class JDBC4PreparedStatementTest { connection.prepareStatement("CREATE TABLE test (col BLOB)").execute(); PreparedStatement stmt = connection.prepareStatement("INSERT INTO test (col) VALUES (?), (?), (?)"); - - Time time1 = new Time(1000000000000L); + + Time time1 = new Time(1000000000000L); Time time2 = new Time(1500000000000L); - Time time3 = new Time(2000000000000L); - + Time time3 = new Time(2000000000000L); + stmt.setTime(1, time1); stmt.setTime(2, time2); stmt.setTime(3, time3); @@ -271,7 +271,7 @@ class JDBC4PreparedStatementTest { PreparedStatement stmt2 = connection.prepareStatement("SELECT * FROM test;"); JDBC4ResultSet rs = (JDBC4ResultSet) stmt2.executeQuery(); - + assertTrue(rs.next()); assertEquals(time1, rs.getTime(1)); assertTrue(rs.next()); @@ -285,11 +285,11 @@ class JDBC4PreparedStatementTest { connection.prepareStatement("CREATE TABLE test (col BLOB)").execute(); PreparedStatement stmt = connection.prepareStatement("INSERT INTO test (col) VALUES (?), (?), (?)"); - - Timestamp timestamp1 = new Timestamp(1000000000000L); + + Timestamp timestamp1 = new Timestamp(1000000000000L); Timestamp timestamp2 = new Timestamp(1500000000000L); - Timestamp timestamp3 = new Timestamp(2000000000000L); - + Timestamp timestamp3 = new Timestamp(2000000000000L); + stmt.setTimestamp(1, timestamp1); stmt.setTimestamp(2, timestamp2); stmt.setTimestamp(3, timestamp3); @@ -297,7 +297,7 @@ class JDBC4PreparedStatementTest { PreparedStatement stmt2 = connection.prepareStatement("SELECT * FROM test;"); JDBC4ResultSet rs = (JDBC4ResultSet) stmt2.executeQuery(); - + assertTrue(rs.next()); assertEquals(timestamp1, rs.getTimestamp(1)); assertTrue(rs.next());