From 1f140b4936dc6a33b1aa87a1860ce054bd18b045 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Fri, 20 Jan 2017 10:44:50 -0800 Subject: Switch to supporting both primitive and sql.Timestamp column types via inherited traits --- .../scala/xyz/driver/core/database/database.scala | 65 ++++++++++++++++++---- 1 file changed, 53 insertions(+), 12 deletions(-) (limited to 'src/main/scala/xyz/driver/core/database') diff --git a/src/main/scala/xyz/driver/core/database/database.scala b/src/main/scala/xyz/driver/core/database/database.scala index c4cf180..308c391 100644 --- a/src/main/scala/xyz/driver/core/database/database.scala +++ b/src/main/scala/xyz/driver/core/database/database.scala @@ -28,36 +28,55 @@ package database { trait ColumnTypes { val profile: JdbcProfile + } + + trait NameColumnTypes extends ColumnTypes { import profile.api._ + implicit def `xyz.driver.core.Name.columnType`[T]: BaseColumnType[Name[T]] + } - implicit def `xyz.driver.core.Id.columnType`[T]: BaseColumnType[Id[T]] + object NameColumnTypes { + trait StringName extends NameColumnTypes { + import profile.api._ - implicit def `xyz.driver.core.Name.columnType`[T]: BaseColumnType[Name[T]] = - MappedColumnType.base[Name[T], String](_.value, Name[T](_)) + override implicit def `xyz.driver.core.Name.columnType`[T]: BaseColumnType[Name[T]] = + MappedColumnType.base[Name[T], String](_.value, Name[T]) + } + } - implicit def `xyz.driver.core.time.Time.columnType`: BaseColumnType[Time] = - MappedColumnType.base[Time, java.sql.Timestamp](time => new java.sql.Timestamp(time.millis), - timestamp => Time(timestamp.getTime)) + trait DateColumnTypes extends ColumnTypes { + import profile.api._ + implicit def `xyz.driver.core.time.Date.columnType`: BaseColumnType[Date] + } - implicit def `xyz.driver.core.time.Date.columnType`: BaseColumnType[Date] = - MappedColumnType.base[Date, java.sql.Date](dateToSqlDate(_), sqlDateToDate(_)) + object DateColumnTypes { + trait SqlDate extends DateColumnTypes { + import profile.api._ + override implicit def `xyz.driver.core.time.Date.columnType`: BaseColumnType[Date] = + MappedColumnType.base[Date, java.sql.Date](dateToSqlDate, sqlDateToDate) + } } - object ColumnTypes { - trait UUID extends ColumnTypes { + trait IdColumnTypes extends ColumnTypes { + import profile.api._ + implicit def `xyz.driver.core.Id.columnType`[T]: BaseColumnType[Id[T]] + } + + object IdColumnTypes { + trait UUID extends IdColumnTypes { import profile.api._ override implicit def `xyz.driver.core.Id.columnType`[T] = MappedColumnType .base[Id[T], java.util.UUID](id => java.util.UUID.fromString(id.value), uuid => Id[T](uuid.toString)) } - trait SerialId extends ColumnTypes { + trait SerialId extends IdColumnTypes { import profile.api._ override implicit def `xyz.driver.core.Id.columnType`[T] = MappedColumnType.base[Id[T], Long](_.value.toLong, serialId => Id[T](serialId.toString)) } - trait NaturalId extends ColumnTypes { + trait NaturalId extends IdColumnTypes { import profile.api._ override implicit def `xyz.driver.core.Id.columnType`[T] = @@ -65,6 +84,28 @@ package database { } } + trait TimestampColumnTypes extends ColumnTypes { + import profile.api._ + implicit def `xyz.driver.core.time.Time.columnType`: BaseColumnType[Time] + } + + object TimestampColumnTypes { + trait SqlTimestamp extends TimestampColumnTypes { + import profile.api._ + + override implicit def `xyz.driver.core.time.Time.columnType`: BaseColumnType[Time] = + MappedColumnType.base[Time, java.sql.Timestamp](time => new java.sql.Timestamp(time.millis), + timestamp => Time(timestamp.getTime)) + } + + trait PrimitiveTimestamp extends TimestampColumnTypes { + import profile.api._ + + override implicit def `xyz.driver.core.time.Time.columnType`: BaseColumnType[Time] = + MappedColumnType.base[Time, Long](_.millis, Time(_)) + } + } + trait DatabaseObject extends ColumnTypes { def createTables(): Future[Unit] def disconnect(): Unit -- cgit v1.2.3