haroonga-0.1.0.0: Bindings/Groonga/CommandAPI.hs
module Bindings.Groonga.CommandAPI
( grn_ctx_init
, grn_ctx_fin
, grn_database_open
, grn_database_create
, grn_execute_command
, grn_get_errbuf
, grn_get_version
, module Bindings.Groonga.Types ) where
import Bindings.Groonga
import Bindings.Groonga.Types
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr
import Foreign.Marshal.Alloc
import Foreign.Storable
import Control.Monad.Trans.Resource (allocate, release, runResourceT)
import Control.Monad.Trans.Class (lift)
grn_ctx_init :: IO (Ptr C'_grn_ctx)
grn_ctx_init = do
rc <- c'grn_init
ctx <- c'grn_ctx_open rc
return ctx
grn_ctx_fin :: Ptr C'_grn_ctx -> IO C'grn_rc
grn_ctx_fin ctx = do
_ <- c'grn_ctx_fin ctx
rc <- c'grn_fin
return rc
grn_database_open :: Ptr C'_grn_ctx -> Database -> IO (Ptr C'_grn_obj)
grn_database_open ctx dbpath = do
dbname <- newCAString dbpath
db <- c'grn_db_open ctx dbname
return db
grn_database_create :: Ptr C'_grn_ctx -> Database -> IO (Ptr C'_grn_obj)
grn_database_create ctx dbpath = do
dbname <- newCAString dbpath
db <- c'grn_db_create ctx dbname nullPtr
return db
grn_execute_command :: Ptr C'_grn_ctx -> Command -> IO String
grn_execute_command ctx command = runResourceT $ do
let command_len = length command
flag = 0
ccommand <- lift $ newCAString command
_ <- lift $ c'grn_ctx_send ctx ccommand (fromIntegral command_len) flag
(res_key,received_res) <- allocate (malloc :: IO (Ptr CString)) free
(len_key,received_len) <- allocate (malloc :: IO (Ptr CUInt)) free
(flag_key,received_flag) <- allocate (malloc :: IO (Ptr CInt)) free
_ <- lift $ c'grn_ctx_recv ctx received_res received_len received_flag
res_cstr <- lift $ peek received_res
res_str <- lift $ peekCString res_cstr
lift $ mapM_ release [res_key, len_key, flag_key]
return res_str
grn_get_errbuf :: Ptr C'_grn_ctx -> IO String
grn_get_errbuf ctx = do
let char = p'_grn_ctx'errbuf ctx
errbuf <- peekCString char
return errbuf
grn_get_version :: IO String
grn_get_version = do
cversion <- c'grn_get_version
version <- peekCString cversion
return version