packages feed

montage-client-0.1: examples/Reference.hs

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables  #-}
import Data.Conduit.Pool (Pool, createPool)
import Network.Riak (defaultClient, connect, disconnect,
                    Client(port), Connection)

import qualified Data.Attoparsec.ByteString.Char8 as AttoC
import qualified Data.ByteString.Char8 as S

import Control.Monad
import Control.Exception (assert)
import System.ZMQ as ZMQ
import System.IO
import Data.Word (Word8)
import Data.Maybe

import qualified Data.ByteString.Lazy.Char8 as B
import qualified Data.ByteString.Lazy as BW

import Text.ProtocolBuffers.Basic (toUtf8)
import Text.ProtocolBuffers.WireMessage (messageGet, messagePut, Wire)
import Text.ProtocolBuffers.Reflections (ReflectDescriptor)

import Network.Riak.MontageClient as MO
import Utils

import Proto.User.UserInfo as UI
import Proto.User.UserEvent as UE
import Proto.User.UserName as UN

threadCount :: Int
threadCount = 1

main :: IO ()
main = do
  ctx <- ZMQ.init 1

  -- Montage ZeroMQ
  montageZpool <- createPool (do
      s <- ZMQ.socket ctx Req
      ZMQ.connect s "tcp://localhost:7078"
      return s
      ) ZMQ.close 1 5 threadCount

  let ui = generateUI (1,2)
  _ <- montagePut montageZpool ui
  let ue = generateUE (2,3)
  _ <- montagePut montageZpool ue
  let un = generateUN (2, "montage")
  _ <- montagePut montageZpool un

  (subKey, valuesFound) <- montageGetBy' montageZpool "u-info" (putDecimal 1) ["u-event", "u-name"]
  assert ((data' $ fromMaybe (error "failed get subKey") subKey) == data' ui) $ return ()
  assert (length valuesFound == 2) $ return ()
  assert (and $ map isJust valuesFound) $ return ()
  let [Just ueFound, Just unFound] = valuesFound
  assert ((data' ueFound == data' ue) && (data' unFound == data' un)) $ return ()

  hPutStrLn stdout "\nsuccessfully did reference get\n"