module Database.PostgreSQL.PQTypes.Internal.C.Interface (
c_PQfreemem
, c_PQstatus
, c_PQerrorMessage
, c_PQsetClientEncoding
, c_PQsocket
, c_PQconsumeInput
, c_PQresultStatus
, c_PQresultErrorField
, c_PQresultErrorMessage
, c_PQntuples
, c_PQnfields
, c_PQcmdTuples
, c_PQgetisnull
, c_PQfname
, c_PQclear
, c_PQcancel
, c_PQconnectdb
, c_PQfinish
, c_PQinitTypes
, c_PQregisterTypes
, c_PQparamExec
, c_PQparamPrepare
, c_PQparamExecPrepared
, c_PQparamCreate
, c_PQparamClear
, c_PQparamCount
, nullStringCStringLen
) where
import Foreign.C
import Foreign.ForeignPtr
import Foreign.Marshal.Alloc
import Foreign.Ptr
import System.Posix.Types
import qualified Control.Exception as E
import Database.PostgreSQL.PQTypes.Internal.C.Types
foreign import ccall unsafe "PQfreemem"
c_PQfreemem :: Ptr a -> IO ()
foreign import ccall unsafe "PQstatus"
c_PQstatus :: Ptr PGconn -> IO ConnStatusType
foreign import ccall unsafe "PQerrorMessage"
c_PQerrorMessage :: Ptr PGconn -> IO CString
foreign import ccall unsafe "PQsocket"
c_PQsocket :: Ptr PGconn -> IO Fd
foreign import ccall safe "PQsetClientEncoding"
c_PQsetClientEncoding :: Ptr PGconn -> CString -> IO CInt
foreign import ccall safe "PQconsumeInput"
c_PQconsumeInput :: Ptr PGconn -> IO CInt
foreign import ccall safe "PQconnectdb"
c_PQconnectdb :: CString -> IO (Ptr PGconn)
foreign import ccall safe "PQfinish"
c_PQfinish :: Ptr PGconn -> IO ()
foreign import ccall unsafe "PQresultStatus"
c_PQresultStatus :: Ptr PGresult -> IO ExecStatusType
foreign import ccall unsafe "PQresultErrorField"
c_PQresultErrorField :: Ptr PGresult -> ErrorField -> IO CString
foreign import ccall unsafe "PQresultErrorMessage"
c_PQresultErrorMessage :: Ptr PGresult -> IO CString
foreign import ccall unsafe "PQntuples"
c_PQntuples :: Ptr PGresult -> IO CInt
foreign import ccall unsafe "PQnfields"
c_PQnfields :: Ptr PGresult -> IO CInt
foreign import ccall unsafe "PQcmdTuples"
c_PQcmdTuples :: Ptr PGresult -> IO CString
foreign import ccall unsafe "PQgetisnull"
c_PQgetisnull :: Ptr PGresult -> CInt -> CInt -> IO CInt
foreign import ccall unsafe "PQfname"
c_PQfname :: Ptr PGresult -> CInt -> IO CString
foreign import ccall safe "PQclear"
c_PQclear :: Ptr PGresult -> IO ()
foreign import ccall safe "&PQclear"
c_ptr_PQclear :: FunPtr (Ptr PGresult -> IO ())
foreign import ccall unsafe "PQgetCancel"
c_PQgetCancel :: Ptr PGconn -> IO (Ptr PGcancel)
foreign import ccall unsafe "PQfreeCancel"
c_PQfreeCancel :: Ptr PGcancel -> IO ()
foreign import ccall safe "PQcancel"
c_rawPQcancel :: Ptr PGcancel -> CString -> CInt -> IO CInt
c_PQcancel :: Ptr PGconn -> IO (Maybe String)
c_PQcancel :: Ptr PGconn -> IO (Maybe String)
c_PQcancel Ptr PGconn
conn = forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
E.bracket (Ptr PGconn -> IO (Ptr PGcancel)
c_PQgetCancel Ptr PGconn
conn) Ptr PGcancel -> IO ()
c_PQfreeCancel forall a b. (a -> b) -> a -> b
$ \Ptr PGcancel
cancel -> do
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
errbufsize forall a b. (a -> b) -> a -> b
$ \Ptr CChar
errbuf -> do
Ptr PGcancel -> Ptr CChar -> CInt -> IO CInt
c_rawPQcancel Ptr PGcancel
cancel Ptr CChar
errbuf (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
errbufsize) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
CInt
0 -> forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr CChar -> IO String
peekCString Ptr CChar
errbuf
CInt
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
where
errbufsize :: Int
errbufsize :: Int
errbufsize = Int
256
foreign import ccall unsafe "PQparamCreate"
c_PQparamCreate :: Ptr PGconn -> Ptr PGerror -> IO (Ptr PGparam)
foreign import ccall unsafe "PQparamClear"
c_PQparamClear :: Ptr PGparam -> IO ()
foreign import ccall unsafe "PQparamCount"
c_PQparamCount :: Ptr PGparam -> IO CInt
foreign import ccall safe "PQinitTypes"
c_PQinitTypes :: Ptr PGconn -> IO ()
foreign import ccall safe "PQregisterTypes"
c_PQregisterTypes :: Ptr PGconn -> Ptr PGerror -> TypeClass -> Ptr PGregisterType -> CInt -> CInt -> IO CInt
foreign import ccall safe "PQparamExec"
c_rawPQparamExec :: Ptr PGconn -> Ptr PGerror -> Ptr PGparam -> CString -> ResultFormat -> IO (Ptr PGresult)
foreign import ccall safe "PQparamPrepare"
c_rawPQparamPrepare :: Ptr PGconn -> Ptr PGerror -> Ptr PGparam -> CString -> CString -> IO (Ptr PGresult)
foreign import ccall safe "PQparamExecPrepared"
c_rawPQparamExecPrepared :: Ptr PGconn -> Ptr PGerror -> Ptr PGparam -> CString -> ResultFormat -> IO (Ptr PGresult)
c_PQparamExec :: Ptr PGconn -> Ptr PGerror -> Ptr PGparam -> CString -> ResultFormat -> IO (ForeignPtr PGresult)
c_PQparamExec :: Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> Ptr CChar
-> ResultFormat
-> IO (ForeignPtr PGresult)
c_PQparamExec Ptr PGconn
conn Ptr PGerror
err Ptr PGparam
param Ptr CChar
fmt ResultFormat
mode = do
forall a. IO a -> IO a
E.mask_ forall a b. (a -> b) -> a -> b
$ forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr PGresult -> IO ())
c_ptr_PQclear
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> Ptr CChar
-> ResultFormat
-> IO (Ptr PGresult)
c_rawPQparamExec Ptr PGconn
conn Ptr PGerror
err Ptr PGparam
param Ptr CChar
fmt ResultFormat
mode
c_PQparamPrepare
:: Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> CString
-> CString
-> IO (ForeignPtr PGresult)
c_PQparamPrepare :: Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> Ptr CChar
-> Ptr CChar
-> IO (ForeignPtr PGresult)
c_PQparamPrepare Ptr PGconn
conn Ptr PGerror
err Ptr PGparam
param Ptr CChar
queryName Ptr CChar
query = do
forall a. IO a -> IO a
E.mask_ forall a b. (a -> b) -> a -> b
$ forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr PGresult -> IO ())
c_ptr_PQclear
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> Ptr CChar
-> Ptr CChar
-> IO (Ptr PGresult)
c_rawPQparamPrepare Ptr PGconn
conn Ptr PGerror
err Ptr PGparam
param Ptr CChar
queryName Ptr CChar
query
c_PQparamExecPrepared
:: Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> CString
-> ResultFormat
-> IO (ForeignPtr PGresult)
c_PQparamExecPrepared :: Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> Ptr CChar
-> ResultFormat
-> IO (ForeignPtr PGresult)
c_PQparamExecPrepared Ptr PGconn
conn Ptr PGerror
err Ptr PGparam
param Ptr CChar
queryName ResultFormat
mode = do
forall a. IO a -> IO a
E.mask_ forall a b. (a -> b) -> a -> b
$ forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FunPtr (Ptr PGresult -> IO ())
c_ptr_PQclear
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Ptr PGconn
-> Ptr PGerror
-> Ptr PGparam
-> Ptr CChar
-> ResultFormat
-> IO (Ptr PGresult)
c_rawPQparamExecPrepared Ptr PGconn
conn Ptr PGerror
err Ptr PGparam
param Ptr CChar
queryName ResultFormat
mode
foreign import ccall unsafe "&pqt_hs_null_string_ptr"
nullStringPtr :: Ptr CChar
nullStringCStringLen :: CStringLen
nullStringCStringLen :: CStringLen
nullStringCStringLen = (Ptr CChar
nullStringPtr, Int
0)