{-# LANGUAGE FlexibleContexts #-}
module Database.HDBC.Record.Update (
  PreparedUpdate, prepare, prepareUpdate, withPrepareUpdate,
  runPreparedUpdate, runUpdate, mapUpdate
  ) where
import Database.HDBC (IConnection, SqlValue)
import Database.Relational (Update)
import Database.Record (ToSql)
import Database.HDBC.Record.Statement
  (prepareNoFetch, withPrepareNoFetch, PreparedStatement, executeNoFetch, runNoFetch, mapNoFetch)
type PreparedUpdate p = PreparedStatement p ()
prepare :: IConnection conn
        => conn
        -> Update p
        -> IO (PreparedUpdate p)
prepare =  prepareNoFetch
prepareUpdate :: IConnection conn
              => conn
              -> Update p
              -> IO (PreparedUpdate p)
prepareUpdate =  prepare
withPrepareUpdate :: IConnection conn
                  => conn
                  -> Update p
                  -> (PreparedUpdate p -> IO a)
                  -> IO a
withPrepareUpdate = withPrepareNoFetch
runPreparedUpdate :: ToSql SqlValue p
                  => PreparedUpdate p
                  -> p
                  -> IO Integer
runPreparedUpdate = executeNoFetch
runUpdate :: (IConnection conn, ToSql SqlValue p)
          => conn
          -> Update p
          -> p
          -> IO Integer
runUpdate =  runNoFetch
mapUpdate :: (IConnection conn, ToSql SqlValue a)
          => conn
          -> Update a
          -> [a]
          -> IO [Integer]
mapUpdate = mapNoFetch