packages feed

pg-transact 0.1.0.1 → 0.1.2.0

raw patch · 2 files changed

+46/−1 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Database.PostgreSQL.Transact: TooManyRows :: String -> TooManyRows
+ Database.PostgreSQL.Transact: formatQuery :: (ToRow q, MonadIO m) => Query -> q -> DBT m ByteString
+ Database.PostgreSQL.Transact: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Database.PostgreSQL.Transact.DBT m)
+ Database.PostgreSQL.Transact: instance GHC.Classes.Eq Database.PostgreSQL.Transact.TooManyRows
+ Database.PostgreSQL.Transact: instance GHC.Exception.Type.Exception Database.PostgreSQL.Transact.TooManyRows
+ Database.PostgreSQL.Transact: instance GHC.Show.Show Database.PostgreSQL.Transact.TooManyRows
+ Database.PostgreSQL.Transact: newtype TooManyRows
+ Database.PostgreSQL.Transact: queryOne :: (ToRow a, FromRow b) => Query -> a -> DB (Maybe b)
+ Database.PostgreSQL.Transact: queryOne_ :: FromRow b => Query -> DB (Maybe b)

Files

pg-transact.cabal view
@@ -1,5 +1,5 @@ name:                pg-transact-version:             0.1.0.1+version:             0.1.2.0 synopsis: Another postgresql-simple transaction monad description: Another postgresql-simple transaction monad homepage:            https://github.com/jfischoff/pg-transact#readme
src/Database/PostgreSQL/Transact.hs view
@@ -2,6 +2,7 @@ module Database.PostgreSQL.Transact where import Control.Monad.Trans.Reader import Database.PostgreSQL.Simple as Simple+import Database.PostgreSQL.Simple.Types as Simple import Database.PostgreSQL.Simple.Transaction import Control.Monad.IO.Class import Control.Monad.Trans.Class@@ -10,6 +11,8 @@ import Data.Int import Control.Monad import qualified Data.ByteString as BS+import qualified Data.ByteString.Char8 as BSC+import qualified Control.Monad.Fail as Fail  newtype DBT m a = DBT { unDBT :: ReaderT Connection m a }   deriving (MonadTrans, MonadThrow)@@ -30,6 +33,9 @@   return = lift . return   DBT m >>= k = DBT $ m >>= unDBT . k +instance Fail.MonadFail m => Fail.MonadFail (DBT m) where+  fail = lift . Fail.fail+ isClass25 :: SqlError -> Bool isClass25 SqlError{..} = BS.take 2 sqlState == "25" @@ -146,3 +152,42 @@ -- Throws 'FormatError' if the query could not be formatted correctly. returning :: (ToRow q, FromRow r, MonadIO m) => Query -> [q] -> DBT m [r] returning q xs = getConnection >>= \conn -> liftIO $ Simple.returning conn q xs+++-- | Format a query string.+--+-- This function is exposed to help with debugging and logging. Do not+-- use it to prepare queries for execution.+--+-- String parameters are escaped according to the character set in use+-- on the 'Connection'.+--+-- Throws 'FormatError' if the query string could not be formatted+-- correctly.+formatQuery :: (ToRow q, MonadIO m) => Query -> q -> DBT m BS.ByteString+formatQuery q xs = getConnection >>= \conn -> liftIO $ Simple.formatQuery conn q xs++newtype TooManyRows = TooManyRows String+  deriving(Show, Eq)++instance Exception TooManyRows++queryOne :: (ToRow a, FromRow b) => Query -> a -> DB (Maybe b)+queryOne q x = do+  rows <- Database.PostgreSQL.Transact.query q x+  case rows of+    []  -> return Nothing+    [a] -> return $ Just a+    _  -> do+      let Simple.Query str = q+      throwM $ TooManyRows $ BSC.unpack str++queryOne_ :: FromRow b => Query -> DB (Maybe b)+queryOne_ q = do+  rows <- Database.PostgreSQL.Transact.query_ q+  case rows of+    []  -> return Nothing+    [x] -> return $ Just x+    _  -> do+      let Simple.Query str = q+      throwM $ TooManyRows $ BSC.unpack str