relational-query-HDBC 0.2.0.2 → 0.3.0.0
raw patch · 8 files changed
+120/−40 lines, 8 filesdep ~persistable-record
Dependency ranges changed: persistable-record
Files
- relational-query-HDBC.cabal +1/−1
- src/Database/HDBC/Record/Delete.hs +10/−2
- src/Database/HDBC/Record/Insert.hs +30/−22
- src/Database/HDBC/Record/InsertQuery.hs +11/−3
- src/Database/HDBC/Record/KeyUpdate.hs +16/−2
- src/Database/HDBC/Record/Query.hs +11/−3
- src/Database/HDBC/Record/Statement.hs +31/−5
- src/Database/HDBC/Record/Update.hs +10/−2
relational-query-HDBC.cabal view
@@ -1,5 +1,5 @@ name: relational-query-HDBC-version: 0.2.0.2+version: 0.3.0.0 synopsis: HDBC instance of relational-query and typed query interface for HDBC description: This package contains the HDBC instance of relational-query and the typed query interface for HDBC.
src/Database/HDBC/Record/Delete.hs view
@@ -12,7 +12,7 @@ -- This module provides typed 'Delete' running sequence -- which intermediate structres are typed. module Database.HDBC.Record.Delete (- PreparedDelete, prepare, prepareDelete,+ PreparedDelete, prepare, prepareDelete, withPrepareDelete, runPreparedDelete, runDelete ) where@@ -23,7 +23,7 @@ import Database.Record (ToSql) import Database.HDBC.Record.Statement- (prepareNoFetch, PreparedStatement, runPreparedNoFetch, runNoFetch)+ (prepareNoFetch, withPrepareNoFetch, PreparedStatement, runPreparedNoFetch, runNoFetch) -- | Typed prepared delete type.@@ -42,6 +42,14 @@ -> Delete p -> IO (PreparedDelete p) prepareDelete = prepare++-- | Bracketed prepare operation.+withPrepareDelete :: IConnection conn+ => conn+ -> Delete p+ -> (PreparedDelete p -> IO a)+ -> IO a+withPrepareDelete = withPrepareNoFetch -- | Bind parameters, execute statement and get execution result. runPreparedDelete :: ToSql SqlValue p
src/Database/HDBC/Record/Insert.hs view
@@ -16,7 +16,7 @@ runPreparedInsert, runInsert, mapInsert, - chunksInsertActions, chunksInsert,+ chunksInsert, ) where import Database.HDBC (IConnection, SqlValue)@@ -25,8 +25,8 @@ import Database.Record (ToSql, fromRecord) import Database.HDBC.Record.Statement- (prepareNoFetch, unsafePrepare, PreparedStatement, untypePrepared, BoundStatement (..),- runPreparedNoFetch, runNoFetch, mapNoFetch, executeNoFetch)+ (prepareNoFetch, withPrepareNoFetch, withUnsafePrepare, PreparedStatement, untypePrepared,+ BoundStatement (..), runPreparedNoFetch, runNoFetch, mapNoFetch, executeNoFetch) -- | Typed prepared insert type.@@ -84,25 +84,33 @@ | otherwise = Right c : rec' tl where (c, tl) = splitAt n xs --- | Prepare and insert with chunk insert statement. Result is insert action list.-{-# DEPRECATED chunksInsertActions "Difficult to release around prepared statement resources." #-}-chunksInsertActions :: (IConnection conn, ToSql SqlValue a)- => conn- -> Insert a- -> [a]- -> IO [ IO [Integer] ]-chunksInsertActions conn i0 rs = do- ins <- unsafePrepare conn $ untypeInsert i0- iChunk <- unsafePrepare conn $ untypeChunkInsert i0- let insert (Right c) = do- rv <- executeNoFetch $ chunkBind iChunk c- return [rv]- insert (Left c) =- mapM (runPreparedInsert ins) c- return . map insert $ chunks (chunkSizeOfInsert i0) rs+withPrepareChunksInsert :: (IConnection conn, ToSql SqlValue a)+ => conn+ -> Insert a+ -> (PreparedInsert a -> PreparedStatement [p] () -> Int -> IO b)+ -> IO b+withPrepareChunksInsert conn i0 body =+ withPrepareNoFetch conn i0+ (\ins -> withUnsafePrepare conn (untypeChunkInsert i0)+ (\iChunk -> body ins iChunk $ chunkSizeOfInsert i0) ) +-- Prepare and insert with chunk insert statement.+chunksInsertActions :: ToSql SqlValue a+ => [a]+ -> PreparedInsert a+ -> PreparedStatement [a] ()+ -> Int+ -> IO [[Integer]]+chunksInsertActions rs ins iChunk size =+ mapM insert $ chunks size rs+ where+ insert (Right c) = do+ rv <- executeNoFetch $ chunkBind iChunk c+ return [rv]+ insert (Left c) =+ mapM (runPreparedInsert ins) c+ -- | Prepare and insert with chunk insert statement. chunksInsert :: (IConnection conn, ToSql SqlValue a) => conn -> Insert a -> [a] -> IO [[Integer]]-chunksInsert conn ins rs = do- as <- chunksInsertActions conn ins rs- sequence as+chunksInsert conn ins rs =+ withPrepareChunksInsert conn ins $ chunksInsertActions rs
src/Database/HDBC/Record/InsertQuery.hs view
@@ -12,7 +12,7 @@ -- This module provides typed 'InsertQuery' running sequence -- which intermediate structres are typed. module Database.HDBC.Record.InsertQuery (- PreparedInsertQuery, prepare, prepareInsertQuery,+ PreparedInsertQuery, prepare, prepareInsertQuery, withPrepareInsertQuery, runPreparedInsertQuery, runInsertQuery ) where@@ -23,7 +23,7 @@ import Database.Record (ToSql) import Database.HDBC.Record.Statement- (prepareNoFetch, PreparedStatement, runPreparedNoFetch)+ (prepareNoFetch, withPrepareNoFetch, PreparedStatement, runPreparedNoFetch, runNoFetch) -- | Typed prepared insert query type. type PreparedInsertQuery p = PreparedStatement p ()@@ -42,6 +42,14 @@ -> IO (PreparedInsertQuery p) prepareInsertQuery = prepare +-- | Bracketed prepare operation.+withPrepareInsertQuery :: IConnection conn+ => conn+ -> InsertQuery p+ -> (PreparedInsertQuery p -> IO a)+ -> IO a+withPrepareInsertQuery = withPrepareNoFetch+ -- | Bind parameters, execute statement and get execution result. runPreparedInsertQuery :: ToSql SqlValue p => PreparedInsertQuery p@@ -56,4 +64,4 @@ -> InsertQuery p -> p -> IO Integer-runInsertQuery conn q p = prepareInsertQuery conn q >>= (`runPreparedInsertQuery` p)+runInsertQuery = runNoFetch
src/Database/HDBC/Record/KeyUpdate.hs view
@@ -14,13 +14,14 @@ module Database.HDBC.Record.KeyUpdate ( PreparedKeyUpdate, - prepare, prepareKeyUpdate,+ prepare, prepareKeyUpdate, withPrepareKeyUpdate, bindKeyUpdate, runPreparedKeyUpdate, runKeyUpdate ) where +import Control.Exception (bracket) import Database.HDBC (IConnection, SqlValue, Statement) import qualified Database.HDBC as HDBC @@ -59,6 +60,19 @@ -> IO (PreparedKeyUpdate p a) prepareKeyUpdate = prepare +-- | Bracketed prepare operation.+withPrepareKeyUpdate :: IConnection conn+ => conn+ -> KeyUpdate p a+ -> (PreparedKeyUpdate p a -> IO b)+ -> IO b+withPrepareKeyUpdate conn ku body =+ bracket (HDBC.prepare conn sql) HDBC.finish+ $ body . PreparedKeyUpdate key+ where+ sql = untypeKeyUpdate ku+ key = Query.updateKey ku+ -- | Typed operation to bind parameters for 'PreparedKeyUpdate' type. bindKeyUpdate :: ToSql SqlValue a => PreparedKeyUpdate p a@@ -82,4 +96,4 @@ -> KeyUpdate p a -> a -> IO Integer-runKeyUpdate conn q a = prepareKeyUpdate conn q >>= (`runPreparedKeyUpdate` a)+runKeyUpdate conn q a = withPrepareKeyUpdate conn q (`runPreparedKeyUpdate` a)
src/Database/HDBC/Record/Query.hs view
@@ -12,7 +12,7 @@ -- This module provides typed 'Query' running sequence -- which intermediate structres are typed. module Database.HDBC.Record.Query (- PreparedQuery, prepare, prepareQuery,+ PreparedQuery, prepare, prepareQuery, withPrepareQuery, fetch, fetchAll, fetchAll', listToUnique, fetchUnique, fetchUnique',@@ -31,7 +31,7 @@ (ToSql, RecordFromSql, FromSql(recordFromSql), runToRecord) import Database.HDBC.Record.Statement- (unsafePrepare, PreparedStatement,+ (unsafePrepare, withUnsafePrepare, PreparedStatement, bind, BoundStatement, execute, ExecutedStatement, executed) @@ -53,6 +53,14 @@ -> IO (PreparedQuery p a) -- ^ Result typed prepared query with parameter type 'p' and result type 'a' prepareQuery = prepare +-- | Bracketed prepare operation.+withPrepareQuery :: IConnection conn+ => conn -- ^ Database connection+ -> Query p a -- ^ Typed query+ -> (PreparedQuery p a -> IO b) -- ^ Body action to use prepared statement+ -> IO b -- ^ Result action+withPrepareQuery conn = withUnsafePrepare conn . untypeQuery+ -- | Polymorphic fetch operation. fetchRecordsExplicit :: Functor f => (Statement -> IO (f [SqlValue]) )@@ -138,4 +146,4 @@ -> Query p a -- ^ Query to get record type 'a' requires parameter 'p' -> p -- ^ Parameter type -> IO [a] -- ^ Action to get records-runQuery' conn q p = prepare conn q >>= (`runPreparedQuery'` p)+runQuery' conn q p = withPrepareQuery conn q (`runPreparedQuery'` p)
src/Database/HDBC/Record/Statement.hs view
@@ -12,8 +12,10 @@ -- This module provides typed statement running sequence -- which intermediate structres are typed. module Database.HDBC.Record.Statement (- PreparedStatement, untypePrepared, unsafePrepare,+ PreparedStatement, untypePrepared, unsafePrepare, finish, + withUnsafePrepare, withPrepareNoFetch,+ BoundStatement (..), bind', bind, bindTo, ExecutedStatement, executed, result, execute,@@ -21,6 +23,7 @@ prepareNoFetch, executeNoFetch, runPreparedNoFetch, runNoFetch, mapNoFetch ) where +import Control.Exception (bracket) import Database.Relational.Query (UntypeableNoFetch (untypeNoFetch)) import Database.HDBC (IConnection, Statement, SqlValue) import qualified Database.HDBC as HDBC@@ -72,6 +75,30 @@ -> IO (PreparedStatement p ()) prepareNoFetch conn = unsafePrepare conn . untypeNoFetch +-- | Close PreparedStatement. Useful for connection pooling cases.+finish :: PreparedStatement p a -> IO ()+finish = HDBC.finish . prepared++-- | Bracketed prepare operation.+-- Unsafely make Typed prepared statement.+withUnsafePrepare :: IConnection conn+ => conn -- ^ Database connection+ -> String -- ^ Raw SQL String+ -> (PreparedStatement p a -> IO b)+ -> IO b+withUnsafePrepare conn qs =+ bracket (unsafePrepare conn qs) finish++-- | Bracketed prepare operation.+-- Generalized prepare inferred from 'UntypeableNoFetch' instance.+withPrepareNoFetch :: (UntypeableNoFetch s, IConnection conn)+ => conn+ -> s p+ -> (PreparedStatement p () -> IO a)+ -> IO a+withPrepareNoFetch conn s =+ bracket (prepareNoFetch conn s) finish+ -- | Typed operation to bind parameters. bind' :: RecordToSql SqlValue p -- ^ Proof object to convert from parameter type 'p' into 'SqlValue' list. -> PreparedStatement p a -- ^ Prepared query to bind to@@ -111,7 +138,7 @@ -> s a -> a -> IO Integer-runNoFetch conn s p = prepareNoFetch conn s >>= (`runPreparedNoFetch` p)+runNoFetch conn s p = withPrepareNoFetch conn s (`runPreparedNoFetch` p) -- | Prepare and run it against each parameter list. mapNoFetch :: (UntypeableNoFetch s, IConnection conn, ToSql SqlValue a)@@ -119,6 +146,5 @@ -> s a -> [a] -> IO [Integer]-mapNoFetch conn s rs = do- ps <- prepareNoFetch conn s- mapM (runPreparedNoFetch ps) rs+mapNoFetch conn s rs =+ withPrepareNoFetch conn s (\ps -> mapM (runPreparedNoFetch ps) rs)
src/Database/HDBC/Record/Update.hs view
@@ -12,7 +12,7 @@ -- This module provides typed 'Update' running sequence -- which intermediate structres are typed. module Database.HDBC.Record.Update (- PreparedUpdate, prepare, prepareUpdate,+ PreparedUpdate, prepare, prepareUpdate, withPrepareUpdate, runPreparedUpdate, runUpdate, mapUpdate ) where@@ -23,7 +23,7 @@ import Database.Record (ToSql) import Database.HDBC.Record.Statement- (prepareNoFetch, PreparedStatement, runPreparedNoFetch, runNoFetch, mapNoFetch)+ (prepareNoFetch, withPrepareNoFetch, PreparedStatement, runPreparedNoFetch, runNoFetch, mapNoFetch) -- | Typed prepared update type.@@ -42,6 +42,14 @@ -> Update p -> IO (PreparedUpdate p) prepareUpdate = prepare++-- | Bracketed prepare operation.+withPrepareUpdate :: IConnection conn+ => conn+ -> Update p+ -> (PreparedUpdate p -> IO a)+ -> IO a+withPrepareUpdate = withPrepareNoFetch -- | Bind parameters, execute statement and get execution result. runPreparedUpdate :: ToSql SqlValue p