packages feed

continuum-client-0.1.0.0: src/Continuum/Client/Base.hs

{-# LANGUAGE CPP              #-}
{-# LANGUAGE DeriveGeneric    #-}
{-# LANGUAGE FlexibleContexts #-}

module Continuum.Client.Base
       (module Continuum.Client.Base
        , module Continuum.Common.Types
        )
       where

import qualified Nanomsg as N
import           Data.Serialize (encode, decode)
import qualified Continuum.Common.Serialization as S
import           Continuum.Common.Types

data ContinuumClient = ContinuumClient
    { clientSocket   :: N.Socket N.Req
    , clientEndpoint :: N.Endpoint }

connect :: String
           -> String
           -> IO ContinuumClient

connect host port = do
  socket   <- N.socket N.Req
  endpoint <- N.connect socket ("tcp://" ++ host ++ ":" ++ port)
  return ContinuumClient { clientSocket   = socket
                         , clientEndpoint = endpoint}

disconnect :: ContinuumClient -> IO ()
disconnect client = do
  N.shutdown (clientSocket client) (clientEndpoint client)
  N.close (clientSocket client)
  return ()

executeQuery :: ContinuumClient
             -> DbName
             -> SelectQuery
             -> IO (DbErrorMonad DbResult)
executeQuery client dbName query = do
  let sock = (clientSocket client)
  _      <-  N.send sock (encode (Select dbName query))
  bs     <-  N.recv sock
  return $ (S.decodeDbResult bs)

sendRequest :: ContinuumClient
             -> Request
             -> IO (DbErrorMonad DbResult)
sendRequest client request = do
  let sock = (clientSocket client)
  _      <-  N.send sock (encode request)
  bs     <-  N.recv sock
  return $ (S.decodeDbResult bs)