packages feed

tokyocabinet-haskell-0.0.4: Database/TokyoCabinet/TDB/Query/C.hsc

{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
module Database.TokyoCabinet.TDB.Query.C where

import Data.Word
import Data.Bits

import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.C.Types
import Foreign.C.String

import Database.TokyoCabinet.TDB.C
import Database.TokyoCabinet.Map.C
import Database.TokyoCabinet.List.C

#include <tctdb.h>

data Condition =
    QCSTREQ   |
    QCSTRINC  |
    QCSTRBW   |
    QCSTREW   |
    QCSTRAND  |
    QCSTROR   |
    QCSTROREQ |
    QCSTRRX   |
    QCNUMEQ   |
    QCNUMGT   |
    QCNUMGE   |
    QCNUMLT   |
    QCNUMLE   |
    QCNUMBT   |
    QCNUMOREQ |
    QCNEGATE Condition |
    QCNOIDX  Condition
    deriving (Eq, Ord, Show)

data OrderType =
    QOSTRASC  |
    QOSTRDESC |
    QONUMASC  |
    QONUMDESC
    deriving (Eq, Ord, Show)

data PostTreatment m k v =
    QPPUT (m k v) |
    QPOUT  |
    QPNOP  |
    QPSTOP
    deriving (Eq, Ord, Show)

condToCInt :: Condition -> CInt
condToCInt QCSTREQ   = #const TDBQCSTREQ
condToCInt QCSTRINC  = #const TDBQCSTRINC
condToCInt QCSTRBW   = #const TDBQCSTRBW
condToCInt QCSTREW   = #const TDBQCSTREW
condToCInt QCSTRAND  = #const TDBQCSTRAND
condToCInt QCSTROR   = #const TDBQCSTROR
condToCInt QCSTROREQ = #const TDBQCSTROREQ
condToCInt QCSTRRX   = #const TDBQCSTRRX
condToCInt QCNUMEQ   = #const TDBQCNUMEQ
condToCInt QCNUMGT   = #const TDBQCNUMGT
condToCInt QCNUMGE   = #const TDBQCNUMGE
condToCInt QCNUMLT   = #const TDBQCNUMLT
condToCInt QCNUMLE   = #const TDBQCNUMLE
condToCInt QCNUMBT   = #const TDBQCNUMBT
condToCInt QCNUMOREQ = #const TDBQCNUMOREQ
condToCInt (QCNEGATE c) = (#const TDBQCNEGATE) .|. (condToCInt c)
condToCInt (QCNOIDX  c) = (#const TDBQCNOIDX) .|. (condToCInt c)

orderToCInt :: OrderType -> CInt
orderToCInt QOSTRASC  = #const TDBQOSTRASC
orderToCInt QOSTRDESC = #const TDBQOSTRDESC
orderToCInt QONUMASC  = #const TDBQONUMASC
orderToCInt QONUMDESC = #const TDBQONUMDESC

ptToCInt :: PostTreatment m k v -> CInt
ptToCInt QPNOP  = 0
ptToCInt QPOUT  = #const TDBQPOUT
ptToCInt QPSTOP = #const TDBQPSTOP
ptToCInt (QPPUT _) = #const TDBQPPUT

data TDBQRY = TDBQRY { unTDBQRY :: !(ForeignPtr QRY)
                     , unTDBOBJ :: TDB }

data QRY

foreign import ccall safe "tctdbqrynew"
  c_tctdbqrynew :: Ptr TDB' -> IO (Ptr QRY)

foreign import ccall safe "tctdbqrydel"
  c_tctdbqrydel :: Ptr QRY -> IO ()

foreign import ccall safe "&tctdbqrydel"
  tctdbqryFinalizer :: FunPtr (Ptr QRY -> IO ())

foreign import ccall safe "tctdbqryaddcond"
  c_tctdbqryaddcond :: Ptr QRY -> CString -> CInt -> CString -> IO ()

foreign import ccall safe "tctdbqrysetorder"
  c_tctdbqrysetorder :: Ptr QRY -> CString -> CInt -> IO ()

foreign import ccall safe "tctdbqrysetlimit"
  c_tctdbqrysetlimit :: Ptr QRY -> CInt -> CInt -> IO ()

foreign import ccall safe "tctdbqrysearch"
  c_tctdbqrysearch :: Ptr QRY -> IO (Ptr LIST)

foreign import ccall safe "tctdbqrysearchout"
  c_tctdbqrysearchout :: Ptr QRY -> IO Bool

foreign import ccall safe "tctdbqryhint"
  c_tctdbqryhint :: Ptr QRY -> IO CString

type TDBQRYPROC' = Ptr Word8 -> CInt -> Ptr MAP -> Ptr Word8 -> IO CInt

foreign import ccall safe "tctdbqryproc"
  c_tctdbqryproc :: Ptr QRY
                 -> FunPtr TDBQRYPROC'
                 -> Ptr Word8
                 -> IO Bool

foreign import ccall "wrapper"
  mkProc :: TDBQRYPROC' -> IO (FunPtr TDBQRYPROC')