@@ -11,37 +11,80 @@
11-----------------------------------------------------------------------------
11-----------------------------------------------------------------------------
13module Database.PostgreSQL.Simple.LargeObjects
13module Database.PostgreSQL.Simple.LargeObjects
14− ( loImport
16+ , loImport
15 , loExport
18 , loExport
19import Control.Applicative ((<$>))
33import Control.Applicative ((<$>))
20import Control.Exception (throwIO)
34import Control.Exception (throwIO)
35+import qualified Data.ByteString as B
21−import Database.PostgreSQL.LibPQ (Oid(..))
36+import Database.PostgreSQL.LibPQ (Oid(..),LoFd(..))
22import qualified Database.PostgreSQL.LibPQ as PQ
37import qualified Database.PostgreSQL.LibPQ as PQ
23import Database.PostgreSQL.Simple.Internal
38import Database.PostgreSQL.Simple.Internal
24−import Foreign.C.Types(CInt)
39+import Foreign.C.Types (CInt)
40+import System.IO (IOMode(..),SeekMode(..))
26−loImport :: Connection -> FilePath -> IO Oid
42+liftPQ :: B.ByteString -> Connection -> (PQ.Connection -> IO (Maybe a)) -> IO a
27−loImport conn path = withConnection conn $ \c -> do
43+liftPQ str conn m = withConnection conn $ \c -> do
28− res <- PQ.loImport c path
44+ res <- m c
29 case res of
45 case res of
30 Nothing -> do
46 Nothing -> do
31− msg <- maybe "loImport error" id <$> PQ.errorMessage c
47+ msg <- maybe str id <$> PQ.errorMessage c
32 throwIO $ SqlError { sqlNativeError = -1 -- FIXME?
48 throwIO $ SqlError { sqlNativeError = -1 -- FIXME?
33 , sqlErrorMsg = msg
49 , sqlErrorMsg = msg
34 , sqlState = "" }
50 , sqlState = "" }
35 Just x -> return x
51 Just x -> return x
53+loCreat :: Connection -> IO Oid
54+loCreat conn = liftPQ "loCreat" conn (\c -> PQ.loCreat c)
56+loCreate :: Connection -> Oid -> IO Oid
57+loCreate conn oid = liftPQ "loCreate" conn (\c -> PQ.loCreate c oid)
59+loImport :: Connection -> FilePath -> IO Oid
60+loImport conn path = liftPQ "loImport" conn (\c -> PQ.loImport c path)
62+loImportWithOid :: Connection -> FilePath -> Oid -> IO Oid
63+loImportWithOid conn path oid = liftPQ "loImportWithOid" conn (\c -> PQ.loImportWithOid c path oid)
38loExport :: Connection -> Oid -> FilePath -> IO ()
65loExport :: Connection -> Oid -> FilePath -> IO ()
39−loExport conn oid path = withConnection conn $ \c -> do
66+loExport conn oid path = liftPQ "loExport" conn (\c -> PQ.loExport c oid path)
40− res <- PQ.loExport c oid path
67+
41− case res of
68+loOpen :: Connection -> Oid -> IOMode -> IO LoFd
42− Nothing -> do
69+loOpen conn oid mode = liftPQ "loOpen" conn (\c -> PQ.loOpen c oid mode )
43− msg <- maybe "loExport error" id <$> PQ.errorMessage c
70+
44− throwIO $ SqlError { sqlNativeError = -1 -- FIXME?
71+loWrite :: Connection -> LoFd -> B.ByteString -> IO Int
45− , sqlErrorMsg = msg
72+loWrite conn fd dat = liftPQ "loWrite" conn (\c -> PQ.loWrite c fd dat)
47− Just x -> return x
74+loRead :: Connection -> LoFd -> Int -> IO B.ByteString
75+loRead conn fd maxlen = liftPQ "loRead" conn (\c -> PQ.loRead c fd maxlen)
77+loSeek :: Connection -> LoFd -> SeekMode -> Int -> IO Int
78+loSeek conn fd seekmode offset = liftPQ "loSeek" conn (\c -> PQ.loSeek c fd seekmode offset)
80+loTell :: Connection -> LoFd -> IO Int
81+loTell conn fd = liftPQ "loTell" conn (\c -> PQ.loTell c fd)
83+loTruncate :: Connection -> LoFd -> Int -> IO ()
84+loTruncate conn fd len = liftPQ "loTruncate" conn (\c -> PQ.loTruncate c fd len)
86+loClose :: Connection -> LoFd -> IO ()
87+loClose conn fd = liftPQ "loClose" conn (\c -> PQ.loClose c fd)
89+loUnlink :: Connection -> Oid -> IO ()
90+loUnlink conn oid = liftPQ "loUnlink" conn (\c -> PQ.loUnlink c oid)