summaryrefslogtreecommitdiff
path: root/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala
diff options
context:
space:
mode:
Diffstat (limited to 'crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala')
-rw-r--r--crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala45
1 files changed, 37 insertions, 8 deletions
diff --git a/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala b/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala
index 1035940..0f095eb 100644
--- a/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala
+++ b/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala
@@ -8,18 +8,51 @@ import java.io.{
InputStream,
OutputStream
}
+import scala.concurrent.Future
import java.util.UUID
-
-import slick.driver.H2Driver.api._
+import slick.jdbc.H2Profile.api._
trait Storage { self: Core with Parsers with Schedulers =>
type BuildId = UUID
+ case class Build(
+ id: BuildId,
+ url: String,
+ rebuild: Int,
+ state: Int
+ )
+
+ class Builds(tag: Tag) extends Table[Build](tag, "builds") {
+ def id = column[BuildId]("id", O.PrimaryKey)
+ def url = column[String]("url")
+ def rebuild = column[Int]("rebuild")
+ def state = column[Int]("state")
+ def * = (id, url, rebuild, state) <> (Build.tupled, Build.unapply)
+ }
+ val builds = TableQuery[Builds]
+
+ val database = Database.forConfig("crashbox.db")
-
- def newBuildId() = UUID.randomUUID()
+ def setupDatabase(): Future[Unit] = {
+ log.info("Preparing build database")
+ val setup = DBIO.seq(
+ builds.schema.create
+ )
+ database.run(setup)
+ }
+ def newBuildId(): BuildId = UUID.randomUUID()
+
+ def nextBuild(url: String): Future[Build] = database.run{
+ builds.filter(_.url === url).map(_.rebuild).take(1).result.headOption
+ }.map{ no =>
+ Build(newBuildId(), url, no.getOrElse(0), 0)
+ }
+
+ def updateBuildState(buildId: BuildId, state: BuildState) = {
+ log.info(s"Build $buildId: state update $state")
+ }
private val streamsDirectory: File = new File(
@@ -55,8 +88,4 @@ trait Storage { self: Core with Parsers with Schedulers =>
new FileInputStream(logFile(buildId, task))
}
- def updateBuildState(buildId: BuildId, state: BuildState) = {
- log.info(s"Build $buildId: state update $state")
- }
-
}