Created
September 2, 2015 07:30
-
-
Save fomkin/15cf77e5b097b32ded9a to your computer and use it in GitHub Desktop.
This file contains 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
// 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 <[email protected]> | |
*/ | |
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