packages feed

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 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