postgresql-libpq 0.7.1 → 0.7.2
raw patch · 2 files changed
+80/−2 lines, 2 files
Files
- Database/PostgreSQL/LibPQ.hsc +78/−0
- postgresql-libpq.cabal +2/−2
Database/PostgreSQL/LibPQ.hsc view
@@ -143,6 +143,11 @@ , escapeByteaConn , unescapeBytea + -- * Using COPY FROM+ , CopyResult(..)+ , putCopyData+ , putCopyEnd+ -- * Asynchronous Command Processing -- $asynccommand , sendQuery@@ -203,6 +208,9 @@ import Foreign import Foreign.C.Types import Foreign.C.String+#if __GLASGOW_HASKELL__ >= 702+import qualified Foreign.ForeignPtr.Unsafe as Unsafe+#endif import qualified Foreign.Concurrent as FC import System.Posix.Types ( Fd(..) ) import Data.List ( foldl' )@@ -290,7 +298,11 @@ -- | Test if a connection is the Null Connection. isNullConnection :: Connection -> Bool+#if __GLASGOW_HASKELL__ >= 702+isNullConnection (Conn x) = Unsafe.unsafeForeignPtrToPtr x == nullPtr+#else isNullConnection (Conn x) = unsafeForeignPtrToPtr x == nullPtr+#endif {-# INLINE isNullConnection #-} -- | If 'connectStart' succeeds, the next stage is to poll libpq so@@ -1499,6 +1511,66 @@ return $ Just $ B.fromForeignPtr tofp 0 $ fromIntegral l +-- $copyfrom+--+-- This provides support for PostgreSQL's @COPY FROM@ facility.+--+-- For more information, see:+--+-- * <http://www.postgresql.org/docs/current/static/sql-copy.html>+--+-- * <http://www.postgresql.org/docs/current/static/libpq-copy.html>+--++data CopyResult = CopyOk -- ^ The data was sent.+ | CopyError -- ^ An error occurred (use 'errorMessage'+ -- to retrieve details).+ | CopyWouldBlock -- ^ The data was not sent because the+ -- attempt would block (this case is only+ -- possible if the connection is in+ -- nonblocking mode) Wait for+ -- write-ready (e.g. by using+ -- 'Control.Concurrent.threadWaitWrite'+ -- on the 'socket') and try again.+++toCopyResult :: CInt -> CopyResult+toCopyResult n | n < 0 = CopyError+ | n == 0 = CopyWouldBlock+ | otherwise = CopyOk+++-- | Send raw @COPY@ data to the server during the 'CopyIn' state.+putCopyData :: Connection -> B.ByteString -> IO CopyResult+putCopyData conn bs =+ B.unsafeUseAsCStringLen bs $ putCopyCString conn+++putCopyCString :: Connection -> CStringLen -> IO CopyResult+putCopyCString conn (str, len) =+ fmap toCopyResult $+ withConn conn $ \ptr -> c_PQputCopyData ptr str (fromIntegral len)+++-- | Send end-of-data indication to the server during the 'CopyIn' state.+--+-- * @putCopyEnd conn Nothing@ ends the 'CopyIn' operation successfully.+--+-- * @putCopyEnd conn (Just errormsg)@ forces the @COPY@ to fail, with+-- @errormsg@ used as the error message.+--+-- After 'putCopyEnd' returns 'CopyOk', call 'getResult' to obtain the final+-- result status of the @COPY@ command. Then return to normal operation.+putCopyEnd :: Connection -> Maybe B.ByteString -> IO CopyResult+putCopyEnd conn Nothing =+ fmap toCopyResult $+ withConn conn $ \ptr -> c_PQputCopyEnd ptr nullPtr+putCopyEnd conn (Just errormsg) =+ fmap toCopyResult $+ B.useAsCString errormsg $ \errormsg_cstr ->+ withConn conn $ \ptr -> c_PQputCopyEnd ptr errormsg_cstr++ -- $asynccommand -- The 'exec' function is adequate for submitting commands in normal, -- synchronous applications. It has a couple of deficiencies, however,@@ -2286,6 +2358,12 @@ type PGVerbosity = CInt foreign import ccall unsafe "libpq-fe.h PQsetErrorVerbosity" c_PQsetErrorVerbosity :: Ptr PGconn -> PGVerbosity -> IO PGVerbosity++foreign import ccall "libpq-fe.h PQputCopyData"+ c_PQputCopyData :: Ptr PGconn -> Ptr CChar -> CInt -> IO CInt++foreign import ccall "libpq-fe.h PQputCopyEnd"+ c_PQputCopyEnd :: Ptr PGconn -> CString -> IO CInt foreign import ccall "libpq-fe.h PQsendQuery" c_PQsendQuery :: Ptr PGconn -> CString ->IO CInt
postgresql-libpq.cabal view
@@ -1,5 +1,5 @@ Name: postgresql-libpq-Version: 0.7.1+Version: 0.7.2 Synopsis: low-level binding to libpq Description: This is a binding to libpq: the C application@@ -38,4 +38,4 @@ source-repository this type: git location: http://github.com/lpsmith/postgresql-libpq- tag: v0.7.1+ tag: v0.7.2