Skip to content

Commit 3aa29ff

Browse files
marcvklihaoyi
andauthored
Adding support for java.util.Date (#24)
I've added support java.util.Date. I've added the same tests as for LocalDateTime and all tests pass successfully. Let me know if anything else is needed. --------- Co-authored-by: Li Haoyi <[email protected]>
1 parent 6dfae59 commit 3aa29ff

12 files changed

+68
-3
lines changed

docs/reference.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7371,6 +7371,29 @@ Expr("2023-11-12 03:22:41").cast[java.time.LocalDateTime]
73717371

73727372

73737373

7374+
### ExprOps.cast.utildate
7375+
7376+
7377+
7378+
```scala
7379+
Expr("2023-11-12 03:22:41").cast[java.util.Date]
7380+
```
7381+
7382+
7383+
*
7384+
```sql
7385+
SELECT CAST(? AS TIMESTAMP) AS res
7386+
```
7387+
7388+
7389+
7390+
*
7391+
```scala
7392+
new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2023-11-12 03:22:41")
7393+
```
7394+
7395+
7396+
73747397
### ExprOps.cast.instant
73757398

73767399

@@ -9201,6 +9224,7 @@ case class DataTypes[T[_]](
92019224
myLocalDate: T[LocalDate],
92029225
myLocalTime: T[LocalTime],
92039226
myLocalDateTime: T[LocalDateTime],
9227+
myUtilDate: T[Date],
92049228
myInstant: T[Instant],
92059229
myVarBinary: T[geny.Bytes],
92069230
myUUID: T[java.util.UUID],
@@ -9219,6 +9243,7 @@ val value = DataTypes[Sc](
92199243
myLocalDate = LocalDate.parse("2023-12-20"),
92209244
myLocalTime = LocalTime.parse("10:15:30"),
92219245
myLocalDateTime = LocalDateTime.parse("2011-12-03T10:15:30"),
9246+
myUtilDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").parse("2011-12-03T10:15:30.000"),
92229247
myInstant = Instant.parse("2011-12-03T10:15:30Z"),
92239248
myVarBinary = new geny.Bytes(Array[Byte](1, 2, 3, 4, 5, 6, 7, 8)),
92249249
myUUID = new java.util.UUID(1234567890L, 9876543210L),
@@ -9236,6 +9261,7 @@ db.run(
92369261
_.myLocalDate := value.myLocalDate,
92379262
_.myLocalTime := value.myLocalTime,
92389263
_.myLocalDateTime := value.myLocalDateTime,
9264+
_.myUtilDate := value.myUtilDate,
92399265
_.myInstant := value.myInstant,
92409266
_.myVarBinary := value.myVarBinary,
92419267
_.myUUID := value.myUUID,

scalasql/core/src/DialectTypeMappers.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ trait DialectTypeMappers extends DialectConfig {
2828
implicit def BooleanType: TypeMapper[Boolean]
2929
implicit def UuidType: TypeMapper[UUID]
3030
implicit def BytesType: TypeMapper[geny.Bytes]
31+
implicit def UtilDateType: TypeMapper[java.util.Date]
3132
implicit def LocalDateType: TypeMapper[LocalDate]
3233
implicit def LocalTimeType: TypeMapper[LocalTime]
3334

scalasql/core/src/TypeMapper.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ object TypeMapper {
8787
d.UuidType
8888
implicit def bytesFromDialectTypeMappers(implicit d: DialectTypeMappers): TypeMapper[geny.Bytes] =
8989
d.BytesType
90+
implicit def utilDateFromDialectTypeMappers(
91+
implicit d: DialectTypeMappers
92+
): TypeMapper[java.util.Date] = d.UtilDateType
9093
implicit def localDateFromDialectTypeMappers(
9194
implicit d: DialectTypeMappers
9295
): TypeMapper[LocalDate] = d.LocalDateType

scalasql/src/dialects/Dialect.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ trait Dialect extends DialectTypeMappers {
107107
def put(r: PreparedStatement, idx: Int, v: geny.Bytes) = r.setBytes(idx, v.array)
108108
}
109109

110+
implicit def UtilDateType: TypeMapper[java.util.Date] = new UtilDateType
111+
class UtilDateType extends TypeMapper[java.util.Date] {
112+
def jdbcType = JDBCType.TIMESTAMP
113+
def get(r: ResultSet, idx: Int) = new java.util.Date(r.getTimestamp(idx).getTime)
114+
def put(r: PreparedStatement, idx: Int, v: java.util.Date) =
115+
r.setTimestamp(idx, new java.sql.Timestamp(v.getTime))
116+
}
117+
110118
implicit def LocalDateType: TypeMapper[LocalDate] = new LocalDateType
111119
class LocalDateType extends TypeMapper[LocalDate] {
112120
def jdbcType = JDBCType.DATE

scalasql/src/dialects/MySqlDialect.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ trait MySqlDialect extends Dialect {
6767
override implicit def InstantType: TypeMapper[Instant] = new MySqlInstantType
6868
class MySqlInstantType extends InstantType { override def castTypeString = "DATETIME" }
6969

70+
override implicit def UtilDateType: TypeMapper[java.util.Date] = new MySqlUtilDateType
71+
class MySqlUtilDateType extends UtilDateType { override def castTypeString = "DATETIME" }
72+
7073
override implicit def UuidType: TypeMapper[UUID] = new MySqlUuidType
7174

7275
class MySqlUuidType extends UuidType {

scalasql/src/dialects/SqliteDialect.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ trait SqliteDialect extends Dialect with ReturningDialect with OnConflictOps {
3131
override implicit def InstantType: TypeMapper[Instant] = new SqliteInstantType
3232
class SqliteInstantType extends InstantType { override def castTypeString = "VARCHAR" }
3333

34+
override implicit def UtilDateType: TypeMapper[java.util.Date] = new SqliteUtilDateType
35+
class SqliteUtilDateType extends UtilDateType { override def castTypeString = "VARCHAR" }
36+
3437
override implicit def ExprStringOpsConv(v: Expr[String]): SqliteDialect.ExprStringOps[String] =
3538
new SqliteDialect.ExprStringOps(v)
3639

scalasql/test/resources/h2-customer-schema.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ CREATE TABLE data_types (
5050
my_local_date DATE,
5151
my_local_time TIME,
5252
my_local_date_time TIMESTAMP,
53+
my_util_date TIMESTAMP,
5354
my_instant TIMESTAMP WITH TIME ZONE,
5455
my_var_binary VARBINARY(256),
5556
my_uuid UUID,

scalasql/test/resources/mysql-customer-schema.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ CREATE TABLE data_types (
5050
my_local_date DATE,
5151
my_local_time TIME,
5252
my_local_date_time TIMESTAMP,
53+
my_util_date TIMESTAMP,
5354
my_instant DATETIME,
5455
my_var_binary VARBINARY(256),
5556
my_uuid CHAR(36),
@@ -76,4 +77,4 @@ CREATE TABLE enclosing(
7677
my_string VARCHAR(256),
7778
foo_id INTEGER,
7879
my_boolean BOOLEAN
79-
);
80+
);

scalasql/test/resources/postgres-customer-schema.sql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ CREATE TABLE data_types (
5252
my_local_date DATE,
5353
my_local_time TIME,
5454
my_local_date_time TIMESTAMP,
55+
my_util_date TIMESTAMP,
5556
my_instant TIMESTAMP WITH TIME ZONE,
5657
my_var_binary BYTEA,
5758
my_uuid UUID,
@@ -82,10 +83,11 @@ CREATE TABLE enclosing(
8283
my_boolean BOOLEAN
8384
);
8485

86+
8587
CREATE SCHEMA otherschema;
8688

8789
CREATE TABLE otherschema.invoice(
8890
id SERIAL PRIMARY KEY,
8991
total DECIMAL(20, 2),
9092
vendor_name VARCHAR(256)
91-
);
93+
);

scalasql/test/resources/sqlite-customer-schema.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ CREATE TABLE data_types (
4848
my_local_date DATE,
4949
my_local_time TIME,
5050
my_local_date_time TIMESTAMP,
51+
my_util_date TIMESTAMP,
5152
my_instant DATETIME,
5253
my_var_binary VARBINARY,
5354
my_uuid BINARY(16),
@@ -77,4 +78,4 @@ CREATE TABLE enclosing(
7778
my_string VARCHAR(256),
7879
foo_id INTEGER,
7980
my_boolean BOOLEAN
80-
);
81+
);

0 commit comments

Comments
 (0)