ejdb2-binding-0.1.0.0: src/Database/EJDB2/Query.hs
module Database.EJDB2.Query
( Query
, fromString
, setBool
, setBoolAtIndex
, setI64
, setI64AtIndex
, setF64
, setF64AtIndex
, setString
, setStringAtIndex
, setRegex
, setRegexAtIndex
, setNull
, setNullAtIndex
) where
import qualified Data.Bool as Bool
import Data.IORef
import Data.Int
import Database.EJDB2.Bindings.JQL
import Database.EJDB2.QueryConstructor
import Database.EJDB2.Result
import Foreign
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc
-- | Create query object from specified text query. Collection must be specified in query.
fromString :: String -- ^ Query text
-> IO Query
fromString string = do
jqlPtr <- malloc
withCString string $ \cString -> do
c_jql_create jqlPtr nullPtr cString >>= checkRC
jql <- peek jqlPtr
jqlFPtr <- newForeignPtr p_finalizerJQL jqlPtr
ioRef <- newIORef []
return $ Query jql jqlFPtr ioRef
-- | Bind bool to query placeholder
setBool :: Bool
-> String -- ^ Placeholder
-> Query
-> IO ()
setBool bool placeholder (Query jql _ _) =
withCString placeholder $ \cPlaceholder ->
c_jql_set_bool jql cPlaceholder 0 (CBool (Bool.bool 0 1 bool)) >>= checkRC
-- | Bind bool to query at specified index
setBoolAtIndex :: Bool
-> Int -- ^ Index
-> Query
-> IO ()
setBoolAtIndex bool index (Query jql _ _) =
c_jql_set_bool jql
nullPtr
(CInt $ fromIntegral index)
(CBool (Bool.bool 0 1 bool)) >>= checkRC
-- | Bind number to query placeholder
setI64 :: Int64
-> String -- ^ Placeholder
-> Query
-> IO ()
setI64 number placeholder (Query jql _ _) = withCString placeholder $
\cPlaceholder -> c_jql_set_i64 jql cPlaceholder 0 (CIntMax number)
>>= checkRC
-- | Bind number to query at specified index
setI64AtIndex :: Int64
-> Int -- ^ Index
-> Query
-> IO ()
setI64AtIndex number index (Query jql _ _) =
c_jql_set_i64 jql nullPtr (CInt $ fromIntegral index) (CIntMax number)
>>= checkRC
-- | Bind 'Double' to query placeholder
setF64 :: Double
-> String -- ^ Placeholder
-> Query
-> IO ()
setF64 number placeholder (Query jql _ _) = withCString placeholder $
\cPlaceholder -> c_jql_set_f64 jql cPlaceholder 0 (CDouble number)
>>= checkRC
-- | Bind 'Double' to query at specified index
setF64AtIndex :: Double
-> Int -- ^ Index
-> Query
-> IO ()
setF64AtIndex number index (Query jql _ _) =
c_jql_set_f64 jql nullPtr (CInt $ fromIntegral index) (CDouble number)
>>= checkRC
newCStringInIORef :: String -> IORef [ForeignPtr CChar] -> IO CString
newCStringInIORef string ioRef = do
cString <- newCString string
cStringPtr <- newForeignPtr finalizerFree cString
modifyIORef' ioRef ((:) cStringPtr)
return cString
-- | Bind string to query placeholder
setString :: String
-> String -- ^ Placeholder
-> Query
-> IO ()
setString string placeholder (Query jql _ ioRef) = do
cString <- newCStringInIORef string ioRef
withCString placeholder $
\cPlaceholder -> c_jql_set_str jql cPlaceholder 0 cString >>= checkRC
-- | Bind string to query at specified index
setStringAtIndex :: String
-> Int -- ^ Index
-> Query
-> IO ()
setStringAtIndex string index (Query jql _ ioRef) = do
cString <- newCStringInIORef string ioRef
c_jql_set_str jql nullPtr (CInt $ fromIntegral index) cString >>= checkRC
-- | Bind regex to query placeholder
setRegex :: String -- ^ Regex
-> String -- ^ Placeholder
-> Query
-> IO ()
setRegex string placeholder (Query jql _ ioRef) = do
cString <- newCStringInIORef string ioRef
withCString placeholder $
\cPlaceholder -> c_jql_set_regexp jql cPlaceholder 0 cString >>= checkRC
-- | Bind regex to query at specified index
setRegexAtIndex :: String -- ^ Regex
-> Int -- ^ Index
-> Query
-> IO ()
setRegexAtIndex string index (Query jql _ ioRef) = do
cString <- newCStringInIORef string ioRef
c_jql_set_regexp jql nullPtr (CInt $ fromIntegral index) cString >>= checkRC
-- | Bind /null/ value to query placeholder
setNull :: String -- ^ Placeholder
-> Query
-> IO ()
setNull placeholder (Query jql _ _) = withCString placeholder $
\cPlaceholder -> c_jql_set_null jql cPlaceholder 0 >>= checkRC
-- | Bind /null/ value to query at specified index
setNullAtIndex :: Int -- ^ Index
-> Query
-> IO ()
setNullAtIndex index (Query jql _ _) =
c_jql_set_null jql nullPtr (CInt $ fromIntegral index) >>= checkRC