ひとりでやるRiak Advent Calendar 2012 day14 - Haskell Client

Chhole (Indian Curried Chick peas)

やっと動いたので報告。haskell.orgからHaskell-platformを入れておこう。もちろん7.4.xだろうと思う。7.6系は試してないけど、多分動くんじゃないかな。

RiakのHaskell clientはBasho謹製じゃないしサポートもしてないのだけど、割とあちこちで使われているようなので悪くない品質なのだろうと思う。私の知る限りいちばん古いのはErlang FactoryでBryan O'Sullyvanが話したところだろう。プレゼンはこっちだ。というわけで動かしてみた。

$ cabal update
$ cabal install riak

これでなんか罠があるけど、stmとなんとかtoolsを入れたらすんなり入った。Cabalがアレなのはいつものことですね。安心。で、こんなのを書くと

import qualified Network.Riak.Basic as RB
import qualified Network.Riak.Types as RT
import Network.Riak.Connection (
       defaultClient, connect, disconnect,
       exchange, exchangeMaybe, exchange_
       )
import Network.Riak.Request (ping, put, get)
import qualified Network.Riak.Response as Res
import Network.Riak.Content (binary)
import qualified Data.ByteString.Lazy.Char8 as BS

main = do
     conn <- connect $ RB.Client "127.0.0.1" "8087" (BS.pack "testme");
     resp0 <- exchange_ conn ping;
     resp1 <- exchange conn $ put (BS.pack "foo") (BS.pack "bar") Nothing (binary $ BS.pack  "content") RT.Default RT.Default False
     resp2 <- exchangeMaybe conn $ get (BS.pack "foo") (BS.pack "bar") RT.Default;
     disconnect conn
     putStrLn $ show $ Res.get resp2
--  or Just (seq_content, vclock) -> putStrLn $ show seq_content

基本的な考え方は、Network.Riak.Requestにあるいくつかの*Request型でリクエストを作って、クライアントを経由してそれをResponse型と交換するというものである。EXCHANGEするという名前のつけ方が面白い。タイムアウトやら何やら細かいオプションを全く設定できていないところが使いにくそうだがみんな不便してないのだろうか。それともどこかで高度に抽象化されているのだろうか。

$ runghc riak.hs
Just (fromList [Content {value = Chunk "content" Empty, content_type = Just (Chunk "application/octet-stream" Empty), charset = Nothing, content_encoding = Nothing, vtag = Just (Chunk "75CQYkt84u6WlGIdWaWwp8" Empty), links = fromList [], last_mod = Just 1360599501, last_mod_usecs = Just 307526, usermeta = fromList [], indexes = fromList []}],VClock 49d66fb11f1e6a185cb6557817c7142d)


まあこうやって動いてくれるところまで持ってくるために型を合わせる必要があったのだが、とーっても大変だったというか型みるだけじゃ分からないしドキュメントもないしグムムという状態であった。サンプルコードとして一助になれば幸い、というか、ハスケラーは毎日こんなことしてるのかすごい。ふつうなら、ここからもう一歩抽象化しないとアプリでは使いにくいなあという感じがひしひしとしますね…。


Jubatusやってた頃にもちょっとHaskellをいじっていたのだけど…相変わらず難しい。最近はcabalで入れたら~/Library/Haskell/doc/index.htmlにドキュメントが再構築されるみたいなのでそれを見ながらやればできそう。