pg-store 0.4.2 → 0.4.3
raw patch · 12 files changed
+149/−159 lines, 12 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Database.PostgreSQL.Store: parseEntity :: (Entity a, Generic a, GEntity (Rep a)) => RowParser (GEntityWidth (Rep a)) a
+ Database.PostgreSQL.Store: parseEntity :: (Entity a, Generic a, GEntity (Rep a), Width a ~ GEntityWidth (Rep a)) => RowParser (Width a) a
- Database.PostgreSQL.Store.Entity: parseEntity :: (Entity a, Generic a, GEntity (Rep a)) => RowParser (GEntityWidth (Rep a)) a
+ Database.PostgreSQL.Store.Entity: parseEntity :: (Entity a, Generic a, GEntity (Rep a), Width a ~ GEntityWidth (Rep a)) => RowParser (Width a) a
Files
- pg-store.cabal +1/−1
- src/Database/PostgreSQL/Store.hs +5/−5
- src/Database/PostgreSQL/Store/Entity.hs +34/−38
- src/Database/PostgreSQL/Store/Errand.hs +27/−29
- src/Database/PostgreSQL/Store/Generics.hs +10/−11
- src/Database/PostgreSQL/Store/Query/Builder.hs +10/−11
- src/Database/PostgreSQL/Store/Query/TH.hs +13/−11
- src/Database/PostgreSQL/Store/RowParser.hs +10/−10
- src/Database/PostgreSQL/Store/Table.hs +14/−17
- src/Database/PostgreSQL/Store/Tuple.hs +19/−21
- src/Database/PostgreSQL/Store/Types.hs +3/−3
- src/Database/PostgreSQL/Store/Utilities.hs +3/−2
pg-store.cabal view
@@ -1,5 +1,5 @@ name: pg-store-version: 0.4.2+version: 0.4.3 category: Database synopsis: Simple storage interface to PostgreSQL description: Simple storage interface to PostgreSQL
src/Database/PostgreSQL/Store.hs view
@@ -48,11 +48,11 @@ RowErrorDetail (..) ) where -import Database.PostgreSQL.Store.Types-import Database.PostgreSQL.Store.Query-import Database.PostgreSQL.Store.Table import Database.PostgreSQL.Store.Entity-import Database.PostgreSQL.Store.RowParser import Database.PostgreSQL.Store.Errand+import Database.PostgreSQL.Store.Query+import Database.PostgreSQL.Store.RowParser+import Database.PostgreSQL.Store.Table+import Database.PostgreSQL.Store.Types -import qualified Database.PostgreSQL.LibPQ as P+import qualified Database.PostgreSQL.LibPQ as P
src/Database/PostgreSQL/Store/Entity.hs view
@@ -1,16 +1,15 @@-{-# LANGUAGE OverloadedStrings,- ConstraintKinds,- DataKinds,- DefaultSignatures,- FlexibleContexts,- FlexibleInstances,- ScopedTypeVariables,- TypeFamilies,- TypeOperators,- TypeApplications,- TypeSynonymInstances,- UndecidableInstances-#-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE UndecidableInstances #-} -- | -- Module: Database.PostgreSQL.Store.Entity@@ -43,38 +42,36 @@ GenericEntity ) where -import GHC.Generics (Meta (..))-import GHC.TypeLits hiding (Text)+import GHC.Generics (Meta (..))+import GHC.TypeLits hiding (Text) import Control.Applicative -import Data.Int-import Data.Word+import qualified Data.Aeson as A+import Data.Attoparsec.ByteString+import Data.Attoparsec.ByteString.Char8 (decimal, double, scientific, signed,+ skipSpace) import Data.Bits+import qualified Data.ByteString as B+import qualified Data.ByteString.Builder as B+import qualified Data.ByteString.Lazy as BL+import Data.Int import Data.Proxy+import Data.Scientific (FPFormat (Fixed), Scientific,+ formatScientific) import Data.Semigroup-import Data.Scientific (Scientific, formatScientific, FPFormat (Fixed))+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Lazy as TL+import Data.Word import Numeric.Natural -import qualified Data.Aeson as A--import Data.Attoparsec.ByteString-import Data.Attoparsec.ByteString.Char8 (signed, decimal, double, scientific, skipSpace)--import qualified Data.ByteString as B-import qualified Data.ByteString.Builder as B-import qualified Data.ByteString.Lazy as BL--import qualified Data.Text as T-import qualified Data.Text.Encoding as T-import qualified Data.Text.Lazy as TL--import Database.PostgreSQL.Store.Types-import Database.PostgreSQL.Store.Tuple import Database.PostgreSQL.Store.Generics-import Database.PostgreSQL.Store.Utilities-import Database.PostgreSQL.Store.RowParser import Database.PostgreSQL.Store.Query.Builder+import Database.PostgreSQL.Store.RowParser+import Database.PostgreSQL.Store.Tuple+import Database.PostgreSQL.Store.Types+import Database.PostgreSQL.Store.Utilities -- | Generic record entity class (KnownNat (GRecordWidth rec)) => GEntityRecord (rec :: KRecord) where@@ -170,7 +167,6 @@ class (KnownNat (Width a)) => Entity a where -- | Number of values of which the entity consists type Width a :: Nat- type Width a = GEntityWidth (Rep a) -- | Embed the entity into the query.@@ -182,8 +178,8 @@ -- | Retrieve an instance of @a@ from the result set. parseEntity :: RowParser (Width a) a - default parseEntity :: (Generic a, GEntity (Rep a))- => RowParser (GEntityWidth (Rep a)) a+ default parseEntity :: (Generic a, GEntity (Rep a), Width a ~ GEntityWidth (Rep a))+ => RowParser (Width a) a parseEntity = parseGeneric -- | Embed an entity into the query.
src/Database/PostgreSQL/Store/Errand.hs view
@@ -1,16 +1,14 @@-{-# LANGUAGE OverloadedStrings,- GeneralizedNewtypeDeriving,- TypeApplications,- TypeFamilies,- ScopedTypeVariables,- MultiParamTypeClasses,- FunctionalDependencies,- UndecidableInstances,- FlexibleInstances,- FlexibleContexts,- TypeSynonymInstances,- DataKinds,- QuasiQuotes #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE UndecidableInstances #-} -- | -- Module: Database.PostgreSQL.Store.Errand@@ -50,23 +48,20 @@ import GHC.TypeLits import Control.Applicative-import Control.Monad.Trans import Control.Monad.Except import Control.Monad.Reader -import Data.Maybe--import qualified Data.ByteString as B- import Data.Attoparsec.ByteString.Char8+import qualified Data.ByteString as B+import Data.Maybe -import qualified Database.PostgreSQL.LibPQ as P+import qualified Database.PostgreSQL.LibPQ as P -import Database.PostgreSQL.Store.Types-import Database.PostgreSQL.Store.Tuple import Database.PostgreSQL.Store.Entity-import Database.PostgreSQL.Store.RowParser import Database.PostgreSQL.Store.Query+import Database.PostgreSQL.Store.RowParser+import Database.PostgreSQL.Store.Tuple+import Database.PostgreSQL.Store.Types -- | Error during errand data ErrandError@@ -141,7 +136,7 @@ -- | Counts the rows that have been affected by a query. countAffectedRows :: P.Result -> Errand Int-countAffectedRows res = do+countAffectedRows res = fmap (\ numTuples -> fromMaybe 0 (numTuples >>= maybeResult . endResult . parse decimal)) (liftIO (P.cmdTuples res)) where@@ -160,14 +155,19 @@ -- | Execute the query described in @q x@ and pass its 'P.Result' to the given function. executeWith :: (P.Result -> Errand r) -> q x -> ErrandResult q r +-- |+acceptResult :: IO (Maybe P.Result) -> Errand P.Result+acceptResult action = do+ mbRes <- liftIO action+ res <- transformResult mbRes+ res <$ validateResult res+ instance ErrandQuery Statement r where type ErrandResult Statement r = Errand r executeWith end (Statement stmt) = do con <- Errand ask- mbRes <- liftIO (P.execParams con stmt [] P.Text)- res <- transformResult mbRes- validateResult res+ res <- acceptResult (P.execParams con stmt [] P.Text) end res instance ErrandQuery Query r where@@ -175,9 +175,7 @@ executeWith end (Query stmt params) = do con <- Errand ask- mbRes <- liftIO (P.execParams con stmt params P.Text)- res <- transformResult mbRes- validateResult res+ res <- acceptResult (P.execParams con stmt params P.Text) end res instance (WithTuple ts (Errand r)) => ErrandQuery (PrepQuery ts) r where
src/Database/PostgreSQL/Store/Generics.hs view
@@ -1,14 +1,13 @@-{-# LANGUAGE ConstraintKinds,- DataKinds,- FlexibleContexts,- FlexibleInstances,- GADTs,- StandaloneDeriving,- TypeFamilies,- TypeOperators,- TypeSynonymInstances,- UndecidableInstances-#-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE UndecidableInstances #-} -- | -- Module: Database.PostgreSQL.Store.Generics
src/Database/PostgreSQL/Store/Query/Builder.hs view
@@ -1,8 +1,9 @@-{-# LANGUAGE ExistentialQuantification,- TypeOperators,- TypeApplications,- ScopedTypeVariables,- DataKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE ExistentialQuantification #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-} -- | -- Module: Database.PostgreSQL.Store.Query.Builder@@ -36,18 +37,16 @@ withParam9 ) where -import Data.Semigroup-+import qualified Data.ByteString as B+import Data.Hashable import Data.List+import Data.Semigroup import Data.String import Data.Tagged-import Data.Hashable -import qualified Data.ByteString as B-+import Database.PostgreSQL.Store.Tuple import Database.PostgreSQL.Store.Types import Database.PostgreSQL.Store.Utilities-import Database.PostgreSQL.Store.Tuple -- | Generator for queries, its type parameter hints the type needed to generate the attached values data QueryGenerator a
src/Database/PostgreSQL/Store/Query/TH.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-} -- | -- Module: Database.PostgreSQL.Store.Query.TH@@ -110,25 +111,26 @@ pgPrepQuery ) where +import Language.Haskell.Meta.Parse import Language.Haskell.TH import Language.Haskell.TH.Quote-import Language.Haskell.Meta.Parse import Control.Applicative -import Data.Tagged-import Data.List-import Data.Char+import qualified Blaze.ByteString.Builder as B+import qualified Blaze.ByteString.Builder.Char.Utf8 as B+ import Data.Attoparsec.Text-import qualified Data.ByteString as B-import qualified Blaze.ByteString.Builder as B-import qualified Blaze.ByteString.Builder.Char.Utf8 as B-import qualified Data.Text as T+import qualified Data.ByteString as B+import Data.Char+import Data.List+import Data.Tagged+import qualified Data.Text as T -import Database.PostgreSQL.Store.Utilities import Database.PostgreSQL.Store.Entity-import Database.PostgreSQL.Store.Table import Database.PostgreSQL.Store.Query.Builder+import Database.PostgreSQL.Store.Table+import Database.PostgreSQL.Store.Utilities -- | Name valueName :: Parser String
src/Database/PostgreSQL/Store/RowParser.hs view
@@ -1,9 +1,9 @@-{-# LANGUAGE DataKinds,- RankNTypes,- KindSignatures,- TypeOperators,- TypeApplications,- ScopedTypeVariables #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeOperators #-} -- | -- Module: Database.PostgreSQL.Store.RowParser@@ -39,12 +39,12 @@ import Control.Monad.Except +import qualified Data.ByteString as B import Data.Proxy-import qualified Data.ByteString as B import Database.PostgreSQL.Store.Types -import qualified Database.PostgreSQL.LibPQ as P+import qualified Database.PostgreSQL.LibPQ as P -- | Location of an error data RowErrorLocation = RowErrorLocation P.Column P.Row@@ -115,7 +115,7 @@ -- | Just like the '(<*>)' operator. (<*>$) :: forall a v b w. (KnownNat v) => RowParser v (a -> b) -> RowParser w a -> RowParser (v + w) b-pf <*>$ px = pf >>=$ \ f -> (\ x -> f x) <$> px+pf <*>$ px = pf >>=$ (<$> px) -- | Skip a number of columns. skipColumns :: RowParser n ()@@ -138,7 +138,7 @@ -- | Retrieve a column's type and content. retrieveColumn :: RowParser 1 (Oid, Maybe B.ByteString)-retrieveColumn = processContent (\ a b -> Just (a, b))+retrieveColumn = processContent (curry Just) -- | Retrieve a column's content. retrieveContent :: RowParser 1 B.ByteString
src/Database/PostgreSQL/Store/Table.hs view
@@ -1,17 +1,15 @@-{-# LANGUAGE OverloadedStrings,- ConstraintKinds,- DataKinds,- FlexibleContexts,- FlexibleInstances,- TypeFamilies,- TypeOperators,- TypeSynonymInstances,- UndecidableInstances,- ScopedTypeVariables,- QuasiQuotes,- DefaultSignatures,- TypeApplications-#-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE UndecidableInstances #-} -- | -- Module: Database.PostgreSQL.Store.Table@@ -46,15 +44,14 @@ import GHC.Generics import GHC.TypeLits +import qualified Data.ByteString as B import Data.Kind import Data.Proxy import Data.Tagged -import qualified Data.ByteString as B- import Database.PostgreSQL.Store.Entity-import Database.PostgreSQL.Store.Utilities import Database.PostgreSQL.Store.Query.Builder+import Database.PostgreSQL.Store.Utilities -- | Type-level description of a record data KColumns
src/Database/PostgreSQL/Store/Tuple.hs view
@@ -1,20 +1,18 @@-{-# LANGUAGE GADTs,- TypeFamilies,- TypeOperators,- TypeApplications,- ScopedTypeVariables,- MultiParamTypeClasses,- RankNTypes,- DataKinds,- PolyKinds,- ConstraintKinds,- FlexibleContexts,- FlexibleInstances,- UndecidableInstances,- FunctionalDependencies,- BangPatterns,- StandaloneDeriving-#-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-} -- | -- Module: Database.PostgreSQL.Store.Tuple@@ -45,16 +43,16 @@ import GHC.TypeLits -import Data.List import Data.Kind+import Data.List import Data.Tagged +infixl 5 |>+ -- | Append a single element to the end of a list. type family (|>) (x :: [a]) (y :: a) :: [a] where '[] |> y = '[y]- (x ': xs) |> y = x ': (xs |> y)--infixl 5 |>+ (x : xs) |> y = x : (xs |> y) -- | Generic product type data Tuple (ts :: [Type]) where
src/Database/PostgreSQL/Store/Types.hs view
@@ -16,13 +16,13 @@ Format ) where -import Text.Show.Functions ()+import Text.Show.Functions () -import qualified Data.ByteString as B+import qualified Data.ByteString as B import Database.PostgreSQL.Store.Tuple -import Database.PostgreSQL.LibPQ (Oid (..), Format (Text))+import Database.PostgreSQL.LibPQ (Format (Text), Oid (..)) -- | SQL statement newtype Statement a = Statement B.ByteString
src/Database/PostgreSQL/Store/Utilities.hs view
@@ -15,13 +15,14 @@ import Language.Haskell.TH import Language.Haskell.TH.Syntax -import qualified Data.ByteString as B import qualified Blaze.ByteString.Builder as B import qualified Blaze.ByteString.Builder.Char.Utf8 as B++import qualified Data.ByteString as B import qualified Data.Text as T import qualified Data.Text.Encoding as T -import Text.Read (readMaybe)+import Text.Read (readMaybe) -- | Show as 'ByteString' showByteString :: (Show a) => a -> B.ByteString