Skip to content

Instantly share code, notes, and snippets.

@fomkin
Created September 2, 2015 07:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fomkin/15cf77e5b097b32ded9a to your computer and use it in GitHub Desktop.
Save fomkin/15cf77e5b097b32ded9a to your computer and use it in GitHub Desktop.
// build.sbt:
//
// scalaVersion := "2.11.7"
//
// libraryDependencies ++= Seq(
// "com.github.fomkin" %% "scala-reql-akka" % "0.1.0-SNAPSHOT",
// "com.github.fomkin" %% "pushka-json" % "0.2.0",
// "com.typesafe.akka" %% "akka-actor" % "2.3.7"
// )
import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import pushka.Ast
import pushka.json._
import reql.akka.ReqlTcpConnection
/**
* @author Aleksey Fomkin <aleksey.fomkin@gmail.com>
*/
object Main extends App {
val system = ActorSystem("ScalaReqlDriverExample")
// Про Ast. Сам драйвер парсить ничего не умеет. Парсиг перекладывается
// на плечи пользователя. По этому соединение параметризуется типом данных
// которым оно оперирует. В данном случае это pushka.Ast.
val connection = system.actorOf(Props(new ReqlTcpConnection[Ast]() {
override protected def onFatalError(message: String): Unit = {
println(message)
}
// Реалюзуем парсер на пушке.
protected def parseResponse(s: String): Response = {
val m = read[Ast](s) match { case Ast.Obj(x) ⇒ x }
val t = m("t") match { case Ast.Num(x) ⇒ x.toInt }
Response(t, m("r"))
}
}))
val myActor = system.actorOf(Props(new MyActor(connection)))
scala.io.StdIn.readLine(s"Hit ENTER to exit ...\n")
system.shutdown()
}
// Актор с логикой приложения.
class MyActor(val dbConnection: ActorRef) extends Actor {
import reql.akka.ReqlTcpConnection
import reql.dsl._
// Драйвер в случае с Akka это простой актор
// который принимает и шлет сообщения. Здесь
// мы отсылаем StartQuery, драйвер подписывает
// наш актор на ответы по этому запросу.
dbConnection ! ReqlTcpConnection.StartQuery(
// DSL на сколько возможно копирует официальный драйвер
// для JavaScript. http://rethinkdb.com/api/javascript
r.db("test").table("messages").changes()
)
dbConnection ! ReqlTcpConnection.StartQuery(
r.db("test").table("messages").insert(
// Так можно формировать документы, которые будут работать с базой.
// Здесь работают функции из базы...
json(
text = "Hello world",
author = "Fomkin",
// .. такие как now().
timestamp = r.now()
)
)
)
def receive: Receive = {
// Первым запросом мы подписались на обновления таблицы `messages`.
// Сюда придет два ответа: первый ответ это пустой список (Ast.Arr),
// как подтверждение что мы подписались на таблицу. Второй будет ответом
// на insert(). Далее, если мы запушим что, нибудь в таблицу, то сюда
// поступят эти данные.
case ReqlTcpConnection.Response(_, rt, data: Ast) ⇒
println("--------------------------------")
println(s"Response type: $rt")
println(s"Data: $data")
}
// Пок так. Будем развивать драйвер вместе с продуктом.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment