Skip to content

Instantly share code, notes, and snippets.

@bomgar
Created August 14, 2015 11:59
Show Gist options
  • Select an option

  • Save bomgar/f7e9837551cc852a6022 to your computer and use it in GitHub Desktop.

Select an option

Save bomgar/f7e9837551cc852a6022 to your computer and use it in GitHub Desktop.
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