hasql 1.6.4.3 → 1.6.4.4
raw patch · 34 files changed
+533/−494 lines, 34 filesdep ~basedep ~rerebasePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, rerebase
API changes (from Hackage documentation)
- Hasql.Connection: acquire :: Settings -> IO (Either ConnectionError Connection)
- Hasql.Connection: data Connection
- Hasql.Connection: release :: Connection -> IO ()
- Hasql.Connection: settings :: ByteString -> Word16 -> ByteString -> ByteString -> ByteString -> Settings
- Hasql.Connection: type ConnectionError = Maybe ByteString
- Hasql.Connection: type Settings = ByteString
- Hasql.Connection: withLibPQConnection :: Connection -> (Connection -> IO a) -> IO a
- Hasql.Decoders: array :: Array a -> Value a
- Hasql.Decoders: bool :: Value Bool
- Hasql.Decoders: bytea :: Value ByteString
- Hasql.Decoders: char :: Value Char
- Hasql.Decoders: column :: NullableOrNot Value a -> Row a
- Hasql.Decoders: composite :: Composite a -> Value a
- Hasql.Decoders: custom :: (Bool -> ByteString -> Either Text a) -> Value a
- Hasql.Decoders: data Array a
- Hasql.Decoders: data Composite a
- Hasql.Decoders: data NullableOrNot decoder a
- Hasql.Decoders: data Result a
- Hasql.Decoders: data Row a
- Hasql.Decoders: data Value a
- Hasql.Decoders: date :: Value Day
- Hasql.Decoders: dimension :: (forall m. Monad m => Int -> m a -> m b) -> Array a -> Array b
- Hasql.Decoders: element :: NullableOrNot Value a -> Array a
- Hasql.Decoders: enum :: (Text -> Maybe a) -> Value a
- Hasql.Decoders: field :: NullableOrNot Value a -> Composite a
- Hasql.Decoders: float4 :: Value Float
- Hasql.Decoders: float8 :: Value Double
- Hasql.Decoders: foldlRows :: (a -> b -> a) -> a -> Row b -> Result a
- Hasql.Decoders: foldrRows :: (b -> a -> a) -> a -> Row b -> Result a
- Hasql.Decoders: hstore :: (forall m. Monad m => Int -> m (Text, Maybe Text) -> m a) -> Value a
- Hasql.Decoders: inet :: Value (NetAddr IP)
- Hasql.Decoders: int2 :: Value Int16
- Hasql.Decoders: int4 :: Value Int32
- Hasql.Decoders: int8 :: Value Int64
- Hasql.Decoders: interval :: Value DiffTime
- Hasql.Decoders: json :: Value Value
- Hasql.Decoders: jsonBytes :: (ByteString -> Either Text a) -> Value a
- Hasql.Decoders: jsonb :: Value Value
- Hasql.Decoders: jsonbBytes :: (ByteString -> Either Text a) -> Value a
- Hasql.Decoders: listArray :: NullableOrNot Value element -> Value [element]
- Hasql.Decoders: noResult :: Result ()
- Hasql.Decoders: nonNullable :: decoder a -> NullableOrNot decoder a
- Hasql.Decoders: nullable :: decoder a -> NullableOrNot decoder (Maybe a)
- Hasql.Decoders: numeric :: Value Scientific
- Hasql.Decoders: refine :: (a -> Either Text b) -> Value a -> Value b
- Hasql.Decoders: rowList :: Row a -> Result [a]
- Hasql.Decoders: rowMaybe :: Row a -> Result (Maybe a)
- Hasql.Decoders: rowVector :: Row a -> Result (Vector a)
- Hasql.Decoders: rowsAffected :: Result Int64
- Hasql.Decoders: singleRow :: Row a -> Result a
- Hasql.Decoders: text :: Value Text
- Hasql.Decoders: time :: Value TimeOfDay
- Hasql.Decoders: timestamp :: Value LocalTime
- Hasql.Decoders: timestamptz :: Value UTCTime
- Hasql.Decoders: timetz :: Value (TimeOfDay, TimeZone)
- Hasql.Decoders: uuid :: Value UUID
- Hasql.Decoders: vectorArray :: Vector vector element => NullableOrNot Value element -> Value (vector element)
- Hasql.Encoders: array :: Array a -> Value a
- Hasql.Encoders: bool :: Value Bool
- Hasql.Encoders: bytea :: Value ByteString
- Hasql.Encoders: char :: Value Char
- Hasql.Encoders: composite :: Composite a -> Value a
- Hasql.Encoders: data Array a
- Hasql.Encoders: data Composite a
- Hasql.Encoders: data NullableOrNot encoder a
- Hasql.Encoders: data Params a
- Hasql.Encoders: data Value a
- Hasql.Encoders: date :: Value Day
- Hasql.Encoders: dimension :: (forall a. (a -> b -> a) -> a -> c -> a) -> Array b -> Array c
- Hasql.Encoders: element :: NullableOrNot Value a -> Array a
- Hasql.Encoders: enum :: (a -> Text) -> Value a
- Hasql.Encoders: field :: NullableOrNot Value a -> Composite a
- Hasql.Encoders: float4 :: Value Float
- Hasql.Encoders: float8 :: Value Double
- Hasql.Encoders: foldableArray :: Foldable foldable => NullableOrNot Value element -> Value (foldable element)
- Hasql.Encoders: inet :: Value (NetAddr IP)
- Hasql.Encoders: int2 :: Value Int16
- Hasql.Encoders: int4 :: Value Int32
- Hasql.Encoders: int8 :: Value Int64
- Hasql.Encoders: interval :: Value DiffTime
- Hasql.Encoders: json :: Value Value
- Hasql.Encoders: jsonBytes :: Value ByteString
- Hasql.Encoders: jsonLazyBytes :: Value ByteString
- Hasql.Encoders: jsonb :: Value Value
- Hasql.Encoders: jsonbBytes :: Value ByteString
- Hasql.Encoders: jsonbLazyBytes :: Value ByteString
- Hasql.Encoders: name :: Value Text
- Hasql.Encoders: noParams :: Params ()
- Hasql.Encoders: nonNullable :: encoder a -> NullableOrNot encoder a
- Hasql.Encoders: nullable :: encoder a -> NullableOrNot encoder (Maybe a)
- Hasql.Encoders: numeric :: Value Scientific
- Hasql.Encoders: oid :: Value Int32
- Hasql.Encoders: param :: NullableOrNot Value a -> Params a
- Hasql.Encoders: text :: Value Text
- Hasql.Encoders: time :: Value TimeOfDay
- Hasql.Encoders: timestamp :: Value LocalTime
- Hasql.Encoders: timestamptz :: Value UTCTime
- Hasql.Encoders: timetz :: Value (TimeOfDay, TimeZone)
- Hasql.Encoders: unknown :: Value ByteString
- Hasql.Encoders: unknownEnum :: (a -> Text) -> Value a
- Hasql.Encoders: uuid :: Value UUID
- Hasql.Session: ClientError :: Maybe ByteString -> CommandError
- Hasql.Session: EndOfInput :: RowError
- Hasql.Session: QueryError :: ByteString -> [Text] -> CommandError -> QueryError
- Hasql.Session: ResultError :: ResultError -> CommandError
- Hasql.Session: RowError :: Int -> Int -> RowError -> ResultError
- Hasql.Session: ServerError :: ByteString -> ByteString -> Maybe ByteString -> Maybe ByteString -> Maybe Int -> ResultError
- Hasql.Session: UnexpectedAmountOfRows :: Int -> ResultError
- Hasql.Session: UnexpectedNull :: RowError
- Hasql.Session: UnexpectedResult :: Text -> ResultError
- Hasql.Session: ValueError :: Text -> RowError
- Hasql.Session: data CommandError
- Hasql.Session: data QueryError
- Hasql.Session: data ResultError
- Hasql.Session: data RowError
- Hasql.Session: data Session a
- Hasql.Session: run :: Session a -> Connection -> IO (Either QueryError a)
- Hasql.Session: sql :: ByteString -> Session ()
- Hasql.Session: statement :: params -> Statement params result -> Session result
- Hasql.Statement: Statement :: ByteString -> Params a -> Result b -> Bool -> Statement a b
- Hasql.Statement: data Statement a b
- Hasql.Statement: instance Data.Profunctor.Unsafe.Profunctor Hasql.Statement.Statement
- Hasql.Statement: instance GHC.Base.Functor (Hasql.Statement.Statement a)
- Hasql.Statement: refineResult :: (a -> Either Text b) -> Statement params a -> Statement params b
+ Hasql.TestingUtils.Constants: localConnectionSettings :: Settings
+ Hasql.TestingUtils.TestingDsl: ClientError :: Maybe ByteString -> CommandError
+ Hasql.TestingUtils.TestingDsl: ConnectionError :: ConnectionError -> SessionError
+ Hasql.TestingUtils.TestingDsl: QueryError :: ByteString -> [Text] -> CommandError -> QueryError
+ Hasql.TestingUtils.TestingDsl: ResultError :: ResultError -> CommandError
+ Hasql.TestingUtils.TestingDsl: SessionError :: QueryError -> SessionError
+ Hasql.TestingUtils.TestingDsl: data () => CommandError
+ Hasql.TestingUtils.TestingDsl: data () => QueryError
+ Hasql.TestingUtils.TestingDsl: data () => Session a
+ Hasql.TestingUtils.TestingDsl: data SessionError
+ Hasql.TestingUtils.TestingDsl: instance GHC.Classes.Eq Hasql.TestingUtils.TestingDsl.SessionError
+ Hasql.TestingUtils.TestingDsl: instance GHC.Show.Show Hasql.TestingUtils.TestingDsl.SessionError
+ Hasql.TestingUtils.TestingDsl: runSessionOnLocalDb :: Session a -> IO (Either SessionError a)
+ Hasql.TestingUtils.TestingDsl: runStatementInSession :: Statement a b -> a -> Session b
Files
- README.md +9/−0
- benchmarks/Main.hs +4/−4
- hasql.cabal +95/−74
- library/Hasql/Commands.hs +2/−2
- library/Hasql/Connection/Core.hs +4/−4
- library/Hasql/Decoders/All.hs +11/−11
- library/Hasql/Decoders/Array.hs +1/−1
- library/Hasql/Decoders/Composite.hs +1/−1
- library/Hasql/Decoders/Result.hs +7/−7
- library/Hasql/Decoders/Results.hs +3/−3
- library/Hasql/Decoders/Row.hs +3/−3
- library/Hasql/Decoders/Value.hs +1/−1
- library/Hasql/Encoders/All.hs +10/−10
- library/Hasql/Encoders/Array.hs +3/−3
- library/Hasql/Encoders/Params.hs +5/−5
- library/Hasql/Encoders/Value.hs +3/−3
- library/Hasql/Errors.hs +1/−1
- library/Hasql/IO.hs +6/−6
- library/Hasql/PTI.hs +0/−230
- library/Hasql/PostgresTypeInfo.hs +230/−0
- library/Hasql/Prelude.hs +4/−4
- library/Hasql/PreparedStatementRegistry.hs +2/−2
- library/Hasql/Session/Core.hs +7/−7
- library/Hasql/Settings.hs +3/−3
- library/Hasql/Statement.hs +10/−9
- profiling/Main.hs +5/−5
- tasty/Main.hs +45/−45
- tasty/Main/Connection.hs +1/−1
- tasty/Main/DSL.hs +0/−42
- tasty/Main/Statements.hs +2/−2
- testing-utils/Hasql/TestingUtils/Constants.hs +13/−0
- testing-utils/Hasql/TestingUtils/TestingDsl.hs +37/−0
- threads-test/Main.hs +3/−3
- threads-test/Main/Statements.hs +2/−2
README.md view
@@ -52,6 +52,15 @@ # Tutorials +## Videos++There's several videos on Hasql done as part of a nice intro-level series of live Haskell+Bazel coding by the "Ants Are Everywhere" YouTube channel:++- [Coding Day 20: Switching from postgresql-simple to Hasql](https://youtu.be/ce7bGKETtoA?si=RmY_yDG24EX6i38I)+- [Coding Day 21: Refactoring the Hasql code](https://youtu.be/a9mPNXbT-qw?si=RTtXe6BXnZSQZzh-)++## Articles+ - [Organization of Hasql code in a dedicated library](https://github.com/nikita-volkov/hasql-tutorial1) # Short Example
benchmarks/Main.hs view
@@ -2,10 +2,10 @@ import Criterion import Criterion.Main-import qualified Hasql.Connection as A-import qualified Hasql.Decoders as D-import qualified Hasql.Session as B-import qualified Hasql.Statement as C+import Hasql.Connection qualified as A+import Hasql.Decoders qualified as D+import Hasql.Session qualified as B+import Hasql.Statement qualified as C import Prelude main :: IO ()
hasql.cabal view
@@ -1,33 +1,32 @@-cabal-version: 3.0-name: hasql-version: 1.6.4.3-category: Hasql, Database, PostgreSQL-synopsis: An efficient PostgreSQL driver with a flexible mapping API+cabal-version: 3.0+name: hasql+version: 1.6.4.4+category: Hasql, Database, PostgreSQL+synopsis: An efficient PostgreSQL driver with a flexible mapping API description: Root of the \"hasql\" ecosystem. For details and tutorials see <https://github.com/nikita-volkov/hasql the readme>. The API comes free from all kinds of exceptions. All error-reporting is explicit and is presented using the 'Either' type. -homepage: https://github.com/nikita-volkov/hasql-bug-reports: https://github.com/nikita-volkov/hasql/issues-author: Nikita Volkov <nikita.y.volkov@mail.ru>-maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>-copyright: (c) 2014, Nikita Volkov-license: MIT-license-file: LICENSE+homepage: https://github.com/nikita-volkov/hasql+bug-reports: https://github.com/nikita-volkov/hasql/issues+author: Nikita Volkov <nikita.y.volkov@mail.ru>+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>+copyright: (c) 2014, Nikita Volkov+license: MIT+license-file: LICENSE extra-source-files: CHANGELOG.md README.md source-repository head- type: git+ type: git location: git://github.com/nikita-volkov/hasql.git common base+ default-language: Haskell2010 default-extensions:- NoImplicitPrelude- NoMonomorphismRestriction Arrows BangPatterns ConstraintKinds@@ -44,11 +43,14 @@ FunctionalDependencies GADTs GeneralizedNewtypeDeriving+ ImportQualifiedPost LambdaCase LiberalTypeSynonyms MagicHash MultiParamTypeClasses MultiWayIf+ NoImplicitPrelude+ NoMonomorphismRestriction OverloadedStrings ParallelListComp PatternGuards@@ -64,20 +66,24 @@ TypeOperators UnboxedTuples - default-language: Haskell2010- common executable- import: base+ import: base ghc-options:- -O2 -threaded -with-rtsopts=-N -rtsopts -funbox-strict-fields+ -O2+ -threaded+ -with-rtsopts=-N+ -rtsopts+ -funbox-strict-fields common test- import: base- ghc-options: -threaded -with-rtsopts=-N+ import: base+ ghc-options:+ -threaded+ -with-rtsopts=-N library- import: base- hs-source-dirs: library+ import: base+ hs-source-dirs: library exposed-modules: Hasql.Connection Hasql.Decoders@@ -101,81 +107,96 @@ Hasql.Encoders.Value Hasql.Errors Hasql.IO+ Hasql.PostgresTypeInfo Hasql.Prelude Hasql.PreparedStatementRegistry- Hasql.PTI Hasql.Session.Core Hasql.Settings build-depends:- , aeson >=2 && <3- , attoparsec >=0.10 && <0.15- , base >=4.13 && <5- , bytestring >=0.10 && <0.13- , bytestring-strict-builder >=0.4.5.1 && <0.5- , contravariant >=1.3 && <2- , dlist >=0.8 && <0.9 || >=1 && <2- , hashable >=1.2 && <2- , hashtables >=1.1 && <2- , mtl >=2 && <3- , network-ip >=0.3.0.3 && <0.4- , postgresql-binary >=0.13.1 && <0.14- , postgresql-libpq >=0.9 && <0.11- , profunctors >=5.1 && <6- , scientific >=0.3 && <0.4- , text >=1 && <3- , text-builder >=0.6.7 && <0.7- , time >=1.9 && <2- , transformers >=0.3 && <0.7- , uuid >=1.3 && <2- , vector >=0.10 && <0.14+ aeson >=2 && <3,+ attoparsec >=0.10 && <0.15,+ base >=4.14 && <5,+ bytestring >=0.10 && <0.13,+ bytestring-strict-builder >=0.4.5.1 && <0.5,+ contravariant >=1.3 && <2,+ dlist >=0.8 && <0.9 || >=1 && <2,+ hashable >=1.2 && <2,+ hashtables >=1.1 && <2,+ mtl >=2 && <3,+ network-ip >=0.3.0.3 && <0.4,+ postgresql-binary >=0.13.1 && <0.14,+ postgresql-libpq >=0.9 && <0.11,+ profunctors >=5.1 && <6,+ scientific >=0.3 && <0.4,+ text >=1 && <3,+ text-builder >=0.6.7 && <0.7,+ time >=1.9 && <2,+ transformers >=0.3 && <0.7,+ uuid >=1.3 && <2,+ vector >=0.10 && <0.14, +library testing-utils+ import: base+ hs-source-dirs: testing-utils+ exposed-modules:+ Hasql.TestingUtils.Constants+ Hasql.TestingUtils.TestingDsl++ build-depends:+ hasql,+ rerebase <2,+ test-suite tasty- import: base- type: exitcode-stdio-1.0+ import: base+ type: exitcode-stdio-1.0 hs-source-dirs: tasty- main-is: Main.hs+ main-is: Main.hs other-modules: Main.Connection- Main.DSL Main.Prelude Main.Statements build-depends:- , contravariant-extras >=0.3.5.2 && <0.4- , hasql- , quickcheck-instances >=0.3.11 && <0.4- , rerebase <2- , tasty >=0.12 && <2- , tasty-hunit >=0.9 && <0.11- , tasty-quickcheck >=0.9 && <0.11+ contravariant-extras >=0.3.5.2 && <0.4,+ hasql,+ hasql:testing-utils,+ quickcheck-instances >=0.3.11 && <0.4,+ rerebase <2,+ tasty >=0.12 && <2,+ tasty-hunit >=0.9 && <0.11,+ tasty-quickcheck >=0.9 && <0.11, test-suite threads-test- import: test- type: exitcode-stdio-1.0+ import: test+ type: exitcode-stdio-1.0 hs-source-dirs: threads-test- main-is: Main.hs- other-modules: Main.Statements+ main-is: Main.hs+ other-modules: Main.Statements build-depends:- , hasql- , rerebase+ hasql,+ rerebase, benchmark benchmarks- import: executable- type: exitcode-stdio-1.0+ import: executable+ type: exitcode-stdio-1.0 hs-source-dirs: benchmarks- main-is: Main.hs+ main-is: Main.hs build-depends:- , criterion >=1.6 && <2- , hasql- , rerebase <2+ criterion >=1.6 && <2,+ hasql,+ rerebase <2, test-suite profiling- import: base- type: exitcode-stdio-1.0+ import: base+ type: exitcode-stdio-1.0 hs-source-dirs: profiling- main-is: Main.hs- ghc-options: -O2 -threaded -rtsopts+ main-is: Main.hs+ ghc-options:+ -O2+ -threaded+ -rtsopts+ build-depends:- , hasql- , rerebase >=1 && <2+ hasql,+ rerebase >=1 && <2,
library/Hasql/Commands.hs view
@@ -6,8 +6,8 @@ ) where -import qualified Data.ByteString.Builder as BB-import qualified Data.ByteString.Lazy as BL+import Data.ByteString.Builder qualified as BB+import Data.ByteString.Lazy qualified as BL import Hasql.Prelude newtype Commands
library/Hasql/Connection/Core.hs view
@@ -2,11 +2,11 @@ -- This module provides a low-level effectful API dealing with the connections to the database. module Hasql.Connection.Core where -import qualified Database.PostgreSQL.LibPQ as LibPQ-import qualified Hasql.IO as IO+import Database.PostgreSQL.LibPQ qualified as LibPQ+import Hasql.IO qualified as IO import Hasql.Prelude-import qualified Hasql.PreparedStatementRegistry as PreparedStatementRegistry-import qualified Hasql.Settings as Settings+import Hasql.PreparedStatementRegistry qualified as PreparedStatementRegistry+import Hasql.Settings qualified as Settings -- | -- A single connection to the database.
library/Hasql/Decoders/All.hs view
@@ -2,18 +2,18 @@ -- A DSL for declaration of result decoders. module Hasql.Decoders.All where -import qualified Data.Aeson as Aeson-import qualified Data.Vector.Generic as GenericVector-import qualified Hasql.Decoders.Array as Array-import qualified Hasql.Decoders.Composite as Composite-import qualified Hasql.Decoders.Result as Result-import qualified Hasql.Decoders.Results as Results-import qualified Hasql.Decoders.Row as Row-import qualified Hasql.Decoders.Value as Value+import Data.Aeson qualified as Aeson+import Data.Vector.Generic qualified as GenericVector+import Hasql.Decoders.Array qualified as Array+import Hasql.Decoders.Composite qualified as Composite+import Hasql.Decoders.Result qualified as Result+import Hasql.Decoders.Results qualified as Results+import Hasql.Decoders.Row qualified as Row+import Hasql.Decoders.Value qualified as Value import Hasql.Prelude hiding (bool, maybe)-import qualified Hasql.Prelude as Prelude-import qualified Network.IP.Addr as NetworkIp-import qualified PostgreSQL.Binary.Decoding as A+import Hasql.Prelude qualified as Prelude+import Network.IP.Addr qualified as NetworkIp+import PostgreSQL.Binary.Decoding qualified as A -- * Result
library/Hasql/Decoders/Array.hs view
@@ -1,7 +1,7 @@ module Hasql.Decoders.Array where import Hasql.Prelude-import qualified PostgreSQL.Binary.Decoding as A+import PostgreSQL.Binary.Decoding qualified as A newtype Array a = Array (ReaderT Bool A.Array a)
library/Hasql/Decoders/Composite.hs view
@@ -1,7 +1,7 @@ module Hasql.Decoders.Composite where import Hasql.Prelude-import qualified PostgreSQL.Binary.Decoding as A+import PostgreSQL.Binary.Decoding qualified as A newtype Composite a = Composite (ReaderT Bool A.Composite a)
library/Hasql/Decoders/Result.hs view
@@ -1,14 +1,14 @@ module Hasql.Decoders.Result where -import qualified Data.Attoparsec.ByteString.Char8 as Attoparsec-import qualified Data.ByteString as ByteString-import qualified Data.Vector as Vector-import qualified Data.Vector.Mutable as MutableVector-import qualified Database.PostgreSQL.LibPQ as LibPQ-import qualified Hasql.Decoders.Row as Row+import Data.Attoparsec.ByteString.Char8 qualified as Attoparsec+import Data.ByteString qualified as ByteString+import Data.Vector qualified as Vector+import Data.Vector.Mutable qualified as MutableVector+import Database.PostgreSQL.LibPQ qualified as LibPQ+import Hasql.Decoders.Row qualified as Row import Hasql.Errors import Hasql.Prelude hiding (many, maybe)-import qualified Hasql.Prelude as Prelude+import Hasql.Prelude qualified as Prelude newtype Result a = Result (ReaderT (Bool, LibPQ.Result) (ExceptT ResultError IO) a)
library/Hasql/Decoders/Results.hs view
@@ -10,11 +10,11 @@ -- * Row-by-row fetching. module Hasql.Decoders.Results where -import qualified Database.PostgreSQL.LibPQ as LibPQ-import qualified Hasql.Decoders.Result as Result+import Database.PostgreSQL.LibPQ qualified as LibPQ+import Hasql.Decoders.Result qualified as Result import Hasql.Errors import Hasql.Prelude hiding (many, maybe)-import qualified Hasql.Prelude as Prelude+import Hasql.Prelude qualified as Prelude newtype Results a = Results (ReaderT (Bool, LibPQ.Connection) (ExceptT CommandError IO) a)
library/Hasql/Decoders/Row.hs view
@@ -1,10 +1,10 @@ module Hasql.Decoders.Row where -import qualified Database.PostgreSQL.LibPQ as LibPQ-import qualified Hasql.Decoders.Value as Value+import Database.PostgreSQL.LibPQ qualified as LibPQ+import Hasql.Decoders.Value qualified as Value import Hasql.Errors import Hasql.Prelude hiding (error)-import qualified PostgreSQL.Binary.Decoding as A+import PostgreSQL.Binary.Decoding qualified as A newtype Row a = Row (ReaderT Env (ExceptT RowError IO) a)
library/Hasql/Decoders/Value.hs view
@@ -1,7 +1,7 @@ module Hasql.Decoders.Value where import Hasql.Prelude-import qualified PostgreSQL.Binary.Decoding as A+import PostgreSQL.Binary.Decoding qualified as A newtype Value a = Value (Bool -> A.Value a)
library/Hasql/Encoders/All.hs view
@@ -2,17 +2,17 @@ -- A DSL for declaration of query parameter encoders. module Hasql.Encoders.All where -import qualified Data.Aeson as Aeson-import qualified Data.ByteString.Lazy as LazyByteString-import qualified Hasql.Encoders.Array as Array-import qualified Hasql.Encoders.Params as Params-import qualified Hasql.Encoders.Value as Value-import qualified Hasql.PTI as PTI+import Data.Aeson qualified as Aeson+import Data.ByteString.Lazy qualified as LazyByteString+import Hasql.Encoders.Array qualified as Array+import Hasql.Encoders.Params qualified as Params+import Hasql.Encoders.Value qualified as Value+import Hasql.PostgresTypeInfo qualified as PTI import Hasql.Prelude hiding (bool)-import qualified Hasql.Prelude as Prelude-import qualified Network.IP.Addr as NetworkIp-import qualified PostgreSQL.Binary.Encoding as A-import qualified Text.Builder as C+import Hasql.Prelude qualified as Prelude+import Network.IP.Addr qualified as NetworkIp+import PostgreSQL.Binary.Encoding qualified as A+import Text.Builder qualified as C -- * Parameters Product Encoder
library/Hasql/Encoders/Array.hs view
@@ -1,9 +1,9 @@ module Hasql.Encoders.Array where -import qualified Hasql.PTI as B+import Hasql.PostgresTypeInfo qualified as B import Hasql.Prelude-import qualified PostgreSQL.Binary.Encoding as A-import qualified Text.Builder as C+import PostgreSQL.Binary.Encoding qualified as A+import Text.Builder qualified as C data Array a = Array B.OID B.OID (Bool -> a -> A.Array) (a -> C.Builder)
library/Hasql/Encoders/Params.hs view
@@ -1,11 +1,11 @@ module Hasql.Encoders.Params where -import qualified Database.PostgreSQL.LibPQ as A-import qualified Hasql.Encoders.Value as C-import qualified Hasql.PTI as D+import Database.PostgreSQL.LibPQ qualified as A+import Hasql.Encoders.Value qualified as C+import Hasql.PostgresTypeInfo qualified as D import Hasql.Prelude-import qualified PostgreSQL.Binary.Encoding as B-import qualified Text.Builder as E+import PostgreSQL.Binary.Encoding qualified as B+import Text.Builder qualified as E -- | -- Encoder of some representation of a parameters product.
library/Hasql/Encoders/Value.hs view
@@ -1,9 +1,9 @@ module Hasql.Encoders.Value where -import qualified Hasql.PTI as PTI+import Hasql.PostgresTypeInfo qualified as PTI import Hasql.Prelude-import qualified PostgreSQL.Binary.Encoding as B-import qualified Text.Builder as C+import PostgreSQL.Binary.Encoding qualified as B+import Text.Builder qualified as C data Value a = Value PTI.OID PTI.OID (Bool -> a -> B.Encoding) (a -> C.Builder)
library/Hasql/Errors.hs view
@@ -10,7 +10,7 @@ -- * Row-by-row fetching. module Hasql.Errors where -import qualified Data.ByteString.Char8 as BC+import Data.ByteString.Char8 qualified as BC import Hasql.Prelude -- |
library/Hasql/IO.hs view
@@ -2,14 +2,14 @@ -- An API of low-level IO operations. module Hasql.IO where -import qualified Database.PostgreSQL.LibPQ as LibPQ-import qualified Hasql.Commands as Commands-import qualified Hasql.Decoders.Result as ResultDecoders-import qualified Hasql.Decoders.Results as ResultsDecoders-import qualified Hasql.Encoders.Params as ParamsEncoders+import Database.PostgreSQL.LibPQ qualified as LibPQ+import Hasql.Commands qualified as Commands+import Hasql.Decoders.Result qualified as ResultDecoders+import Hasql.Decoders.Results qualified as ResultsDecoders+import Hasql.Encoders.Params qualified as ParamsEncoders import Hasql.Errors import Hasql.Prelude-import qualified Hasql.PreparedStatementRegistry as PreparedStatementRegistry+import Hasql.PreparedStatementRegistry qualified as PreparedStatementRegistry {-# INLINE acquireConnection #-} acquireConnection :: ByteString -> IO LibPQ.Connection
− library/Hasql/PTI.hs
@@ -1,230 +0,0 @@-module Hasql.PTI where--import qualified Database.PostgreSQL.LibPQ as LibPQ-import Hasql.Prelude hiding (bool)---- | A Postgresql type info-data PTI = PTI {ptiOID :: !OID, ptiArrayOID :: !(Maybe OID)}---- | A Word32 and a LibPQ representation of an OID-data OID = OID {oidWord32 :: !Word32, oidPQ :: !LibPQ.Oid, oidFormat :: !LibPQ.Format}--mkOID :: LibPQ.Format -> Word32 -> OID-mkOID format x =- OID x ((LibPQ.Oid . fromIntegral) x) format--mkPTI :: LibPQ.Format -> Word32 -> Maybe Word32 -> PTI-mkPTI format oid arrayOID =- PTI (mkOID format oid) (fmap (mkOID format) arrayOID)---- * Constants--abstime :: PTI-abstime = mkPTI LibPQ.Binary 702 (Just 1023)--aclitem :: PTI-aclitem = mkPTI LibPQ.Binary 1033 (Just 1034)--bit :: PTI-bit = mkPTI LibPQ.Binary 1560 (Just 1561)--bool :: PTI-bool = mkPTI LibPQ.Binary 16 (Just 1000)--box :: PTI-box = mkPTI LibPQ.Binary 603 (Just 1020)--bpchar :: PTI-bpchar = mkPTI LibPQ.Binary 1042 (Just 1014)--bytea :: PTI-bytea = mkPTI LibPQ.Binary 17 (Just 1001)--char :: PTI-char = mkPTI LibPQ.Binary 18 (Just 1002)--cid :: PTI-cid = mkPTI LibPQ.Binary 29 (Just 1012)--cidr :: PTI-cidr = mkPTI LibPQ.Binary 650 (Just 651)--circle :: PTI-circle = mkPTI LibPQ.Binary 718 (Just 719)--cstring :: PTI-cstring = mkPTI LibPQ.Binary 2275 (Just 1263)--date :: PTI-date = mkPTI LibPQ.Binary 1082 (Just 1182)--daterange :: PTI-daterange = mkPTI LibPQ.Binary 3912 (Just 3913)--float4 :: PTI-float4 = mkPTI LibPQ.Binary 700 (Just 1021)--float8 :: PTI-float8 = mkPTI LibPQ.Binary 701 (Just 1022)--gtsvector :: PTI-gtsvector = mkPTI LibPQ.Binary 3642 (Just 3644)--inet :: PTI-inet = mkPTI LibPQ.Binary 869 (Just 1041)--int2 :: PTI-int2 = mkPTI LibPQ.Binary 21 (Just 1005)--int2vector :: PTI-int2vector = mkPTI LibPQ.Binary 22 (Just 1006)--int4 :: PTI-int4 = mkPTI LibPQ.Binary 23 (Just 1007)--int4range :: PTI-int4range = mkPTI LibPQ.Binary 3904 (Just 3905)--int8 :: PTI-int8 = mkPTI LibPQ.Binary 20 (Just 1016)--int8range :: PTI-int8range = mkPTI LibPQ.Binary 3926 (Just 3927)--interval :: PTI-interval = mkPTI LibPQ.Binary 1186 (Just 1187)--json :: PTI-json = mkPTI LibPQ.Binary 114 (Just 199)--jsonb :: PTI-jsonb = mkPTI LibPQ.Binary 3802 (Just 3807)--line :: PTI-line = mkPTI LibPQ.Binary 628 (Just 629)--lseg :: PTI-lseg = mkPTI LibPQ.Binary 601 (Just 1018)--macaddr :: PTI-macaddr = mkPTI LibPQ.Binary 829 (Just 1040)--money :: PTI-money = mkPTI LibPQ.Binary 790 (Just 791)--name :: PTI-name = mkPTI LibPQ.Binary 19 (Just 1003)--numeric :: PTI-numeric = mkPTI LibPQ.Binary 1700 (Just 1231)--numrange :: PTI-numrange = mkPTI LibPQ.Binary 3906 (Just 3907)--oid :: PTI-oid = mkPTI LibPQ.Binary 26 (Just 1028)--oidvector :: PTI-oidvector = mkPTI LibPQ.Binary 30 (Just 1013)--path :: PTI-path = mkPTI LibPQ.Binary 602 (Just 1019)--point :: PTI-point = mkPTI LibPQ.Binary 600 (Just 1017)--polygon :: PTI-polygon = mkPTI LibPQ.Binary 604 (Just 1027)--record :: PTI-record = mkPTI LibPQ.Binary 2249 (Just 2287)--refcursor :: PTI-refcursor = mkPTI LibPQ.Binary 1790 (Just 2201)--regclass :: PTI-regclass = mkPTI LibPQ.Binary 2205 (Just 2210)--regconfig :: PTI-regconfig = mkPTI LibPQ.Binary 3734 (Just 3735)--regdictionary :: PTI-regdictionary = mkPTI LibPQ.Binary 3769 (Just 3770)--regoper :: PTI-regoper = mkPTI LibPQ.Binary 2203 (Just 2208)--regoperator :: PTI-regoperator = mkPTI LibPQ.Binary 2204 (Just 2209)--regproc :: PTI-regproc = mkPTI LibPQ.Binary 24 (Just 1008)--regprocedure :: PTI-regprocedure = mkPTI LibPQ.Binary 2202 (Just 2207)--regtype :: PTI-regtype = mkPTI LibPQ.Binary 2206 (Just 2211)--reltime :: PTI-reltime = mkPTI LibPQ.Binary 703 (Just 1024)--text :: PTI-text = mkPTI LibPQ.Binary 25 (Just 1009)--tid :: PTI-tid = mkPTI LibPQ.Binary 27 (Just 1010)--time :: PTI-time = mkPTI LibPQ.Binary 1083 (Just 1183)--timestamp :: PTI-timestamp = mkPTI LibPQ.Binary 1114 (Just 1115)--timestamptz :: PTI-timestamptz = mkPTI LibPQ.Binary 1184 (Just 1185)--timetz :: PTI-timetz = mkPTI LibPQ.Binary 1266 (Just 1270)--tinterval :: PTI-tinterval = mkPTI LibPQ.Binary 704 (Just 1025)--tsquery :: PTI-tsquery = mkPTI LibPQ.Binary 3615 (Just 3645)--tsrange :: PTI-tsrange = mkPTI LibPQ.Binary 3908 (Just 3909)--tstzrange :: PTI-tstzrange = mkPTI LibPQ.Binary 3910 (Just 3911)--tsvector :: PTI-tsvector = mkPTI LibPQ.Binary 3614 (Just 3643)--txid_snapshot :: PTI-txid_snapshot = mkPTI LibPQ.Binary 2970 (Just 2949)--textUnknown :: PTI-textUnknown = mkPTI LibPQ.Text 705 (Just 705)--binaryUnknown :: PTI-binaryUnknown = mkPTI LibPQ.Binary 705 (Just 705)--uuid :: PTI-uuid = mkPTI LibPQ.Binary 2950 (Just 2951)--varbit :: PTI-varbit = mkPTI LibPQ.Binary 1562 (Just 1563)--varchar :: PTI-varchar = mkPTI LibPQ.Binary 1043 (Just 1015)--void :: PTI-void = mkPTI LibPQ.Binary 2278 Nothing--xid :: PTI-xid = mkPTI LibPQ.Binary 28 (Just 1011)--xml :: PTI-xml = mkPTI LibPQ.Binary 142 (Just 143)
+ library/Hasql/PostgresTypeInfo.hs view
@@ -0,0 +1,230 @@+module Hasql.PostgresTypeInfo where++import Database.PostgreSQL.LibPQ qualified as LibPQ+import Hasql.Prelude hiding (bool)++-- | A Postgresql type info+data PTI = PTI {ptiOID :: !OID, ptiArrayOID :: !(Maybe OID)}++-- | A Word32 and a LibPQ representation of an OID+data OID = OID {oidWord32 :: !Word32, oidPQ :: !LibPQ.Oid, oidFormat :: !LibPQ.Format}++mkOID :: LibPQ.Format -> Word32 -> OID+mkOID format x =+ OID x ((LibPQ.Oid . fromIntegral) x) format++mkPTI :: LibPQ.Format -> Word32 -> Maybe Word32 -> PTI+mkPTI format oid arrayOID =+ PTI (mkOID format oid) (fmap (mkOID format) arrayOID)++-- * Constants++abstime :: PTI+abstime = mkPTI LibPQ.Binary 702 (Just 1023)++aclitem :: PTI+aclitem = mkPTI LibPQ.Binary 1033 (Just 1034)++bit :: PTI+bit = mkPTI LibPQ.Binary 1560 (Just 1561)++bool :: PTI+bool = mkPTI LibPQ.Binary 16 (Just 1000)++box :: PTI+box = mkPTI LibPQ.Binary 603 (Just 1020)++bpchar :: PTI+bpchar = mkPTI LibPQ.Binary 1042 (Just 1014)++bytea :: PTI+bytea = mkPTI LibPQ.Binary 17 (Just 1001)++char :: PTI+char = mkPTI LibPQ.Binary 18 (Just 1002)++cid :: PTI+cid = mkPTI LibPQ.Binary 29 (Just 1012)++cidr :: PTI+cidr = mkPTI LibPQ.Binary 650 (Just 651)++circle :: PTI+circle = mkPTI LibPQ.Binary 718 (Just 719)++cstring :: PTI+cstring = mkPTI LibPQ.Binary 2275 (Just 1263)++date :: PTI+date = mkPTI LibPQ.Binary 1082 (Just 1182)++daterange :: PTI+daterange = mkPTI LibPQ.Binary 3912 (Just 3913)++float4 :: PTI+float4 = mkPTI LibPQ.Binary 700 (Just 1021)++float8 :: PTI+float8 = mkPTI LibPQ.Binary 701 (Just 1022)++gtsvector :: PTI+gtsvector = mkPTI LibPQ.Binary 3642 (Just 3644)++inet :: PTI+inet = mkPTI LibPQ.Binary 869 (Just 1041)++int2 :: PTI+int2 = mkPTI LibPQ.Binary 21 (Just 1005)++int2vector :: PTI+int2vector = mkPTI LibPQ.Binary 22 (Just 1006)++int4 :: PTI+int4 = mkPTI LibPQ.Binary 23 (Just 1007)++int4range :: PTI+int4range = mkPTI LibPQ.Binary 3904 (Just 3905)++int8 :: PTI+int8 = mkPTI LibPQ.Binary 20 (Just 1016)++int8range :: PTI+int8range = mkPTI LibPQ.Binary 3926 (Just 3927)++interval :: PTI+interval = mkPTI LibPQ.Binary 1186 (Just 1187)++json :: PTI+json = mkPTI LibPQ.Binary 114 (Just 199)++jsonb :: PTI+jsonb = mkPTI LibPQ.Binary 3802 (Just 3807)++line :: PTI+line = mkPTI LibPQ.Binary 628 (Just 629)++lseg :: PTI+lseg = mkPTI LibPQ.Binary 601 (Just 1018)++macaddr :: PTI+macaddr = mkPTI LibPQ.Binary 829 (Just 1040)++money :: PTI+money = mkPTI LibPQ.Binary 790 (Just 791)++name :: PTI+name = mkPTI LibPQ.Binary 19 (Just 1003)++numeric :: PTI+numeric = mkPTI LibPQ.Binary 1700 (Just 1231)++numrange :: PTI+numrange = mkPTI LibPQ.Binary 3906 (Just 3907)++oid :: PTI+oid = mkPTI LibPQ.Binary 26 (Just 1028)++oidvector :: PTI+oidvector = mkPTI LibPQ.Binary 30 (Just 1013)++path :: PTI+path = mkPTI LibPQ.Binary 602 (Just 1019)++point :: PTI+point = mkPTI LibPQ.Binary 600 (Just 1017)++polygon :: PTI+polygon = mkPTI LibPQ.Binary 604 (Just 1027)++record :: PTI+record = mkPTI LibPQ.Binary 2249 (Just 2287)++refcursor :: PTI+refcursor = mkPTI LibPQ.Binary 1790 (Just 2201)++regclass :: PTI+regclass = mkPTI LibPQ.Binary 2205 (Just 2210)++regconfig :: PTI+regconfig = mkPTI LibPQ.Binary 3734 (Just 3735)++regdictionary :: PTI+regdictionary = mkPTI LibPQ.Binary 3769 (Just 3770)++regoper :: PTI+regoper = mkPTI LibPQ.Binary 2203 (Just 2208)++regoperator :: PTI+regoperator = mkPTI LibPQ.Binary 2204 (Just 2209)++regproc :: PTI+regproc = mkPTI LibPQ.Binary 24 (Just 1008)++regprocedure :: PTI+regprocedure = mkPTI LibPQ.Binary 2202 (Just 2207)++regtype :: PTI+regtype = mkPTI LibPQ.Binary 2206 (Just 2211)++reltime :: PTI+reltime = mkPTI LibPQ.Binary 703 (Just 1024)++text :: PTI+text = mkPTI LibPQ.Binary 25 (Just 1009)++tid :: PTI+tid = mkPTI LibPQ.Binary 27 (Just 1010)++time :: PTI+time = mkPTI LibPQ.Binary 1083 (Just 1183)++timestamp :: PTI+timestamp = mkPTI LibPQ.Binary 1114 (Just 1115)++timestamptz :: PTI+timestamptz = mkPTI LibPQ.Binary 1184 (Just 1185)++timetz :: PTI+timetz = mkPTI LibPQ.Binary 1266 (Just 1270)++tinterval :: PTI+tinterval = mkPTI LibPQ.Binary 704 (Just 1025)++tsquery :: PTI+tsquery = mkPTI LibPQ.Binary 3615 (Just 3645)++tsrange :: PTI+tsrange = mkPTI LibPQ.Binary 3908 (Just 3909)++tstzrange :: PTI+tstzrange = mkPTI LibPQ.Binary 3910 (Just 3911)++tsvector :: PTI+tsvector = mkPTI LibPQ.Binary 3614 (Just 3643)++txid_snapshot :: PTI+txid_snapshot = mkPTI LibPQ.Binary 2970 (Just 2949)++textUnknown :: PTI+textUnknown = mkPTI LibPQ.Text 705 (Just 705)++binaryUnknown :: PTI+binaryUnknown = mkPTI LibPQ.Binary 705 (Just 705)++uuid :: PTI+uuid = mkPTI LibPQ.Binary 2950 (Just 2951)++varbit :: PTI+varbit = mkPTI LibPQ.Binary 1562 (Just 1563)++varchar :: PTI+varchar = mkPTI LibPQ.Binary 1043 (Just 1015)++void :: PTI+void = mkPTI LibPQ.Binary 2278 Nothing++xid :: PTI+xid = mkPTI LibPQ.Binary 28 (Just 1011)++xml :: PTI+xml = mkPTI LibPQ.Binary 142 (Just 143)
library/Hasql/Prelude.hs view
@@ -34,8 +34,8 @@ import Data.Bits as Exports import Data.Bool as Exports import Data.ByteString as Exports (ByteString)-import qualified Data.ByteString.Builder-import qualified Data.ByteString.Lazy+import Data.ByteString.Builder qualified+import Data.ByteString.Lazy qualified import Data.Char as Exports import Data.Coerce as Exports import Data.Complex as Exports@@ -68,8 +68,8 @@ import Data.Semigroup as Exports hiding (First (..), Last (..)) import Data.String as Exports import Data.Text as Exports (Text)-import qualified Data.Text.Lazy-import qualified Data.Text.Lazy.Builder+import Data.Text.Lazy qualified+import Data.Text.Lazy.Builder qualified import Data.Time as Exports import Data.Traversable as Exports import Data.Tuple as Exports
library/Hasql/PreparedStatementRegistry.hs view
@@ -6,8 +6,8 @@ ) where -import qualified ByteString.StrictBuilder as B-import qualified Data.HashTable.IO as A+import ByteString.StrictBuilder qualified as B+import Data.HashTable.IO qualified as A import Hasql.Prelude hiding (lookup) data PreparedStatementRegistry
library/Hasql/Session/Core.hs view
@@ -1,14 +1,14 @@ module Hasql.Session.Core where -import qualified Hasql.Connection.Core as Connection-import qualified Hasql.Decoders.Result as Decoders.Result-import qualified Hasql.Decoders.Results as Decoders.Results-import qualified Hasql.Encoders.All as Encoders-import qualified Hasql.Encoders.Params as Encoders.Params+import Hasql.Connection.Core qualified as Connection+import Hasql.Decoders.Result qualified as Decoders.Result+import Hasql.Decoders.Results qualified as Decoders.Results+import Hasql.Encoders.All qualified as Encoders+import Hasql.Encoders.Params qualified as Encoders.Params import Hasql.Errors-import qualified Hasql.IO as IO+import Hasql.IO qualified as IO import Hasql.Prelude-import qualified Hasql.Statement as Statement+import Hasql.Statement qualified as Statement -- | -- A batch of actions to be executed in the context of a database connection.
library/Hasql/Settings.hs view
@@ -1,8 +1,8 @@ module Hasql.Settings where -import qualified Data.ByteString as B-import qualified Data.ByteString.Builder as BB-import qualified Data.ByteString.Lazy as BL+import Data.ByteString qualified as B+import Data.ByteString.Builder qualified as BB+import Data.ByteString.Lazy qualified as BL import Hasql.Prelude -- |
library/Hasql/Statement.hs view
@@ -12,13 +12,14 @@ ) where -import qualified Hasql.Decoders as Decoders-import qualified Hasql.Decoders.All as Decoders-import qualified Hasql.Encoders as Encoders+import Hasql.Decoders qualified as Decoders+import Hasql.Decoders.All qualified as Decoders+import Hasql.Encoders qualified as Encoders import Hasql.Prelude -- |--- Specification of a strictly single-statement query, which can be parameterized and prepared, encapsulating the mapping of parameters and results.+-- Specification of a strictly single-statement query, which can be parameterized and prepared.+-- It encapsulates the mapping of parameters and results in association with an SQL template. -- -- Following is an example of a declaration of a prepared statement with its associated codecs. --@@ -38,7 +39,7 @@ -- -- The statement above accepts a product of two parameters of type 'Int64' -- and produces a single result of type 'Int64'.-data Statement a b+data Statement params result = Statement -- | SQL template. --@@ -50,9 +51,9 @@ -- the value encoders are specified in the parameters encoder. ByteString -- | Parameters encoder.- (Encoders.Params a)+ (Encoders.Params params) -- | Decoder of result.- (Decoders.Result b)+ (Decoders.Result result) -- | Flag, determining whether it should be prepared. -- -- Set it to 'True' if your application has a limited amount of queries and doesn't generate the SQL dynamically.@@ -63,7 +64,7 @@ -- It should be noted that starting from version @1.21.0@ @pgbouncer@ now does provide support for prepared statements. Bool -instance Functor (Statement a) where+instance Functor (Statement params) where {-# INLINE fmap #-} fmap = rmap @@ -97,7 +98,7 @@ -- "insert into location (id, x, y) select * from unnest ($1, $2, $3)" -- encoder = -- Data.Vector.'Data.Vector.unzip3' '>$<'--- Contravariant.Extras.'Contravariant.Extras.contrazip3'+-- Contravariant.Extras.contrazip3 -- (Encoders.'Encoders.param' $ Encoders.'Encoders.nonNullable' $ Encoders.'Encoders.foldableArray' $ Encoders.'Encoders.nonNullable' Encoders.'Encoders.uuid') -- (Encoders.'Encoders.param' $ Encoders.'Encoders.nonNullable' $ Encoders.'Encoders.foldableArray' $ Encoders.'Encoders.nonNullable' Encoders.'Encoders.float8') -- (Encoders.'Encoders.param' $ Encoders.'Encoders.nonNullable' $ Encoders.'Encoders.foldableArray' $ Encoders.'Encoders.nonNullable' Encoders.'Encoders.float8')
profiling/Main.hs view
@@ -1,10 +1,10 @@ module Main where -import qualified Data.Vector as F-import qualified Hasql.Connection as A-import qualified Hasql.Decoders as D-import qualified Hasql.Session as B-import qualified Hasql.Statement as C+import Data.Vector qualified as F+import Hasql.Connection qualified as A+import Hasql.Decoders qualified as D+import Hasql.Session qualified as B+import Hasql.Statement qualified as C import Prelude main :: IO ()
tasty/Main.hs view
@@ -1,14 +1,14 @@ module Main where import Contravariant.Extras-import qualified Hasql.Decoders as Decoders-import qualified Hasql.Encoders as Encoders-import qualified Hasql.Session as Session-import qualified Hasql.Statement as Statement-import qualified Main.Connection as Connection-import qualified Main.DSL as DSL+import Hasql.Decoders qualified as Decoders+import Hasql.Encoders qualified as Encoders+import Hasql.Session qualified as Session+import Hasql.Statement qualified as Statement+import Hasql.TestingUtils.TestingDsl qualified as Session+import Main.Connection qualified as Connection import Main.Prelude hiding (assert)-import qualified Main.Statements as Statements+import Main.Statements qualified as Statements import Test.QuickCheck.Instances () import Test.Tasty import Test.Tasty.HUnit@@ -136,19 +136,19 @@ assertEqual (show x) (Right (Right ((1, True), ("hello", 3)))) x, testGroup "unknownEnum" $ [ testCase "" $ do- res <- DSL.session $ do+ res <- Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "drop type if exists mood"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "create type mood as enum ('sad', 'ok', 'happy')"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql encoder decoder True where@@ -158,7 +158,7 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.enum (Just . id)))) encoder = Encoders.param (Encoders.nonNullable (Encoders.unknownEnum id))- in DSL.statement "ok" statement+ in Session.statement "ok" statement assertEqual "" (Right "ok") res ],@@ -301,12 +301,12 @@ s <- Session.statement (1, 1) sumStatement Session.sql "end;" return s- in DSL.session session >>= \x -> assertEqual (show x) (Right 2) x,+ in Session.runSessionOnLocalDb session >>= \x -> assertEqual (show x) (Right 2) x, testCase "Executing the same query twice" $ pure (), testCase "Interval Encoding" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql encoder decoder True where@@ -316,11 +316,11 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.bool))) encoder = Encoders.param (Encoders.nonNullable (Encoders.interval))- in DSL.statement (10 :: DiffTime) statement+ in Session.statement (10 :: DiffTime) statement in actualIO >>= \x -> assertEqual (show x) (Right True) x, testCase "Interval Decoding" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql encoder decoder True where@@ -330,11 +330,11 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.interval))) encoder = Encoders.noParams- in DSL.statement () statement+ in Session.statement () statement in actualIO >>= \x -> assertEqual (show x) (Right (10 :: DiffTime)) x, testCase "Interval Encoding/Decoding" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql encoder decoder True where@@ -344,23 +344,23 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.interval))) encoder = Encoders.param (Encoders.nonNullable (Encoders.interval))- in DSL.statement (10 :: DiffTime) statement+ in Session.statement (10 :: DiffTime) statement in actualIO >>= \x -> assertEqual (show x) (Right (10 :: DiffTime)) x, testCase "Unknown" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "drop type if exists mood"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "create type mood as enum ('sad', 'ok', 'happy')"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql encoder decoder True where@@ -370,23 +370,23 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.bool))) encoder = Encoders.param (Encoders.nonNullable (Encoders.unknown))- in DSL.statement "ok" statement+ in Session.statement "ok" statement in actualIO >>= assertEqual "" (Right True), testCase "Textual Unknown" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "create or replace function overloaded(a int, b int) returns int as $$ select a + b $$ language sql;"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "create or replace function overloaded(a text, b text, c text) returns text as $$ select a || b || c $$ language sql;"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql encoder decoder True where@@ -396,23 +396,23 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.text))) encoder = contramany (Encoders.param (Encoders.nonNullable (Encoders.unknown)))- in DSL.statement ["1", "2", "4", "5", "6"] statement+ in Session.statement ["1", "2", "4", "5", "6"] statement in actualIO >>= assertEqual "" (Right "3456"), testCase "Enum" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "drop type if exists mood"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql mempty Decoders.noResult True where sql = "create type mood as enum ('sad', 'ok', 'happy')"- in DSL.statement () statement+ in Session.statement () statement let statement = Statement.Statement sql encoder decoder True where@@ -422,13 +422,13 @@ (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.enum (Just . id)))) encoder = Encoders.param (Encoders.nonNullable ((Encoders.enum id)))- in DSL.statement "ok" statement+ in Session.statement "ok" statement in actualIO >>= assertEqual "" (Right "ok"), testCase "The same prepared statement used on different types" $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do let effect1 =- DSL.statement "ok" statement+ Session.statement "ok" statement where statement = Statement.Statement sql encoder decoder True@@ -440,7 +440,7 @@ decoder = (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) (Decoders.text))) effect2 =- DSL.statement 1 statement+ Session.statement 1 statement where statement = Statement.Statement sql encoder decoder True@@ -456,26 +456,26 @@ testCase "Affected rows counting" $ replicateM_ 13 $ let actualIO =- DSL.session $ do+ Session.runSessionOnLocalDb $ do dropTable createTable replicateM_ 100 insertRow deleteRows <* dropTable where dropTable =- DSL.statement ()+ Session.statement () $ Statements.plain $ "drop table if exists a" createTable =- DSL.statement ()+ Session.statement () $ Statements.plain $ "create table a (id bigserial not null, name varchar not null, primary key (id))" insertRow =- DSL.statement ()+ Session.statement () $ Statements.plain $ "insert into a (name) values ('a')" deleteRows =- DSL.statement () $ Statement.Statement sql mempty decoder False+ Session.statement () $ Statement.Statement sql mempty decoder False where sql = "delete from a"@@ -484,16 +484,16 @@ in actualIO >>= assertEqual "" (Right 100), testCase "Result of an auto-incremented column" $ let actualIO =- DSL.session $ do- DSL.statement () $ Statements.plain $ "drop table if exists a"- DSL.statement () $ Statements.plain $ "create table a (id serial not null, v char not null, primary key (id))"- id1 <- DSL.statement () $ Statement.Statement "insert into a (v) values ('a') returning id" mempty (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) Decoders.int4)) False- id2 <- DSL.statement () $ Statement.Statement "insert into a (v) values ('b') returning id" mempty (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) Decoders.int4)) False- DSL.statement () $ Statements.plain $ "drop table if exists a"+ Session.runSessionOnLocalDb $ do+ Session.statement () $ Statements.plain $ "drop table if exists a"+ Session.statement () $ Statements.plain $ "create table a (id serial not null, v char not null, primary key (id))"+ id1 <- Session.statement () $ Statement.Statement "insert into a (v) values ('a') returning id" mempty (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) Decoders.int4)) False+ id2 <- Session.statement () $ Statement.Statement "insert into a (v) values ('b') returning id" mempty (Decoders.singleRow ((Decoders.column . Decoders.nonNullable) Decoders.int4)) False+ Session.statement () $ Statements.plain $ "drop table if exists a" pure (id1, id2) in assertEqual "" (Right (1, 2)) =<< actualIO, testCase "List decoding" $ let actualIO =- DSL.session $ DSL.statement () $ Statements.selectList+ Session.runSessionOnLocalDb $ Session.statement () $ Statements.selectList in assertEqual "" (Right [(1, 2), (3, 4), (5, 6)]) =<< actualIO ]
tasty/Main/Connection.hs view
@@ -1,6 +1,6 @@ module Main.Connection where -import qualified Hasql.Connection as HC+import Hasql.Connection qualified as HC import Main.Prelude with :: (HC.Connection -> IO a) -> IO (Either HC.ConnectionError a)
− tasty/Main/DSL.hs
@@ -1,42 +0,0 @@-module Main.DSL- ( Session,- SessionError (..),- session,- Hasql.Session.statement,- Hasql.Session.sql,- )-where--import qualified Hasql.Connection as HC-import qualified Hasql.Session-import Main.Prelude--type Session =- Hasql.Session.Session--data SessionError- = ConnectionError (HC.ConnectionError)- | SessionError (Hasql.Session.QueryError)- deriving (Show, Eq)--session :: Session a -> IO (Either SessionError a)-session session =- runExceptT $ acquire >>= \connection -> use connection <* release connection- where- acquire =- ExceptT $ fmap (mapLeft ConnectionError) $ HC.acquire settings- where- settings =- HC.settings host port user password database- where- host = "localhost"- port = 5432- user = "postgres"- password = "postgres"- database = "postgres"- use connection =- ExceptT- $ fmap (mapLeft SessionError)- $ Hasql.Session.run session connection- release connection =- lift $ HC.release connection
tasty/Main/Statements.hs view
@@ -1,7 +1,7 @@ module Main.Statements where -import qualified Hasql.Decoders as HD-import qualified Hasql.Statement as HQ+import Hasql.Decoders qualified as HD+import Hasql.Statement qualified as HQ import Main.Prelude plain :: ByteString -> HQ.Statement () ()
+ testing-utils/Hasql/TestingUtils/Constants.hs view
@@ -0,0 +1,13 @@+module Hasql.TestingUtils.Constants where++import Hasql.Connection qualified as Connection++localConnectionSettings :: Connection.Settings+localConnectionSettings =+ Connection.settings host port user password database+ where+ host = "localhost"+ port = 5432+ user = "postgres"+ password = "postgres"+ database = "postgres"
+ testing-utils/Hasql/TestingUtils/TestingDsl.hs view
@@ -0,0 +1,37 @@+module Hasql.TestingUtils.TestingDsl+ ( Session.Session,+ SessionError (..),+ Session.QueryError (..),+ Session.CommandError (..),+ runSessionOnLocalDb,+ runStatementInSession,+ )+where++import Hasql.Connection qualified as Connection+import Hasql.Session qualified as Session+import Hasql.Statement qualified as Statement+import Hasql.TestingUtils.Constants qualified as Constants+import Prelude++data SessionError+ = ConnectionError (Connection.ConnectionError)+ | SessionError (Session.QueryError)+ deriving (Show, Eq)++runSessionOnLocalDb :: Session.Session a -> IO (Either SessionError a)+runSessionOnLocalDb session =+ runExceptT $ acquire >>= \connection -> use connection <* release connection+ where+ acquire =+ ExceptT $ fmap (mapLeft ConnectionError) $ Connection.acquire Constants.localConnectionSettings+ use connection =+ ExceptT+ $ fmap (mapLeft SessionError)+ $ Session.run session connection+ release connection =+ lift $ Connection.release connection++runStatementInSession :: Statement.Statement a b -> a -> Session.Session b+runStatementInSession statement params =+ Session.statement params statement
threads-test/Main.hs view
@@ -1,8 +1,8 @@ module Main where -import qualified Hasql.Connection-import qualified Hasql.Session-import qualified Main.Statements as Statements+import Hasql.Connection qualified+import Hasql.Session qualified+import Main.Statements qualified as Statements import Prelude main :: IO ()
threads-test/Main/Statements.hs view
@@ -1,7 +1,7 @@ module Main.Statements where -import qualified Hasql.Decoders as D-import qualified Hasql.Encoders as E+import Hasql.Decoders qualified as D+import Hasql.Encoders qualified as E import Hasql.Statement import Prelude