Created
August 14, 2015 11:59
-
-
Save bomgar/f7e9837551cc852a6022 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package test | |
| import java.sql.{PreparedStatement, ResultSet, Timestamp} | |
| import java.time.Instant | |
| import com.zaxxer.hikari.{HikariConfig, HikariDataSource} | |
| import slick.driver.JdbcDriver | |
| import slick.jdbc.{GetResult, PositionedParameters, PositionedResult, SetParameter} | |
| import scala.concurrent.Await | |
| import scala.concurrent.duration._ | |
| import scala.util.Random | |
| object SlickTest extends App { | |
| val dataSource = new HikariDataSource(createHikariConfig) | |
| val driver = slick.driver.H2Driver | |
| val db: driver.api.Database = driver.api.Database.forDataSource(dataSource) | |
| import driver.api._ | |
| protected class TestDBIO[T](dbio: DBIO[T]) { | |
| def runAndAwait(): T = { | |
| Await.result(db.run(dbio), 10.seconds) | |
| } | |
| } | |
| implicit def toTestDBIO[T](dbio: DBIO[T]): TestDBIO[T] = new TestDBIO[T](dbio) | |
| private def instantToTimeStamp(instant: Instant) = if (instant == null) null else new Timestamp(instant.toEpochMilli) | |
| private def timeStampToInstant(timestamp: Timestamp) = if (timestamp == null) null else Instant.ofEpochMilli(timestamp.getTime) | |
| // scalastyle:on | |
| protected implicit val instantMappedColumnType: JdbcDriver#BaseColumnType[Instant] = MappedColumnType.base[Instant, Timestamp]( | |
| d => instantToTimeStamp(d), | |
| d => timeStampToInstant(d) | |
| ) | |
| protected implicit val instantDriverJdbcType: driver.DriverJdbcType[Instant] = new driver.DriverJdbcType[Instant]() { | |
| override def sqlType: Int = java.sql.Types.TIMESTAMP | |
| override def getValue(r: ResultSet, idx: Int): Instant = timeStampToInstant(r.getTimestamp(idx)) | |
| override def setValue(v: Instant, p: PreparedStatement, idx: Int): Unit = p.setTimestamp(idx, instantToTimeStamp(v)) | |
| override def updateValue(v: Instant, r: ResultSet, idx: Int): Unit = r.updateTimestamp(idx, instantToTimeStamp(v)) | |
| } | |
| protected implicit val instantGetResult: GetResult[Instant] = new GetResult[Instant] { | |
| override def apply(positionedResult: PositionedResult): Instant = timeStampToInstant(positionedResult.nextTimestamp()) | |
| } | |
| protected implicit val instantOptionGetResult: GetResult[Option[Instant]] = new GetResult[Option[Instant]] { | |
| override def apply(positionedResult: PositionedResult): Option[Instant] = | |
| positionedResult.nextTimestampOption().map(timestamp => timeStampToInstant(timestamp)) | |
| } | |
| protected implicit val instantSetParameter: SetParameter[Instant] = new SetParameter[Instant] { | |
| override def apply(instant: Instant, positionedParameter: PositionedParameters): Unit = | |
| positionedParameter.setTimestamp(instantToTimeStamp(instant)) | |
| } | |
| protected implicit val instantOptionSetParameter: SetParameter[Option[Instant]] = new SetParameter[Option[Instant]] { | |
| override def apply(instantOption: Option[Instant], positionedParameter: PositionedParameters): Unit = | |
| positionedParameter.setTimestampOption(instantOption.map(instant => instantToTimeStamp(instant))) | |
| } | |
| sqlu"""CREATE TABLE `TEST_TABLE` ( | |
| `ID` char(36), | |
| `OCCURRED` TIMESTAMP, | |
| PRIMARY KEY (`ID`) | |
| )""".runAndAwait() | |
| case class TestEntry(id: String, occurred: Instant) | |
| class TestEntries(tag: Tag) extends Table[TestEntry](tag, "TEST_TABLE") { | |
| val id: Rep[String] = column[String]("ID", O.PrimaryKey) | |
| val occurred: Rep[Instant] = column[Instant]("OCCURRED") | |
| // scalastyle:off method.name | |
| def * = (id, | |
| occurred) <> | |
| (TestEntry.tupled, TestEntry.unapply) | |
| // scalastyle:on method.name | |
| } | |
| protected val testTable = TableQuery[TestEntries] | |
| testTable.insertOrUpdate(TestEntry(id = "1", occurred = Instant.ofEpochMilli(1000))).runAndAwait() | |
| val result = testTable | |
| .filter(_.occurred <= Instant.ofEpochMilli(2500)) | |
| .sortBy(_.occurred.asc) | |
| .result | |
| .runAndAwait() | |
| result.foreach(println) | |
| dataSource.close() | |
| private def createHikariConfig: HikariConfig = { | |
| val hikariConfig: HikariConfig = new HikariConfig() | |
| hikariConfig.setPoolName("database.app") | |
| hikariConfig.setDriverClassName("org.h2.Driver") | |
| hikariConfig.setJdbcUrl("jdbc:h2:mem:" + Random.alphanumeric.take(15).mkString + ";MODE=MySQL") | |
| hikariConfig.setConnectionInitSql("CREATE SCHEMA IF NOT EXISTS \"public\";") | |
| hikariConfig.setMinimumIdle(1) | |
| hikariConfig.setMaximumPoolSize(5) | |
| hikariConfig | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment