hasql-dynamic-statements 0.1.0.2 → 0.2
raw patch · 6 files changed
+87/−29 lines, 6 filesdep +QuickCheckdep +hasql-dynamic-statementsdep +hasql-implicitsdep −data-defaultdep ~hasql
Dependencies added: QuickCheck, hasql-dynamic-statements, hasql-implicits, quickcheck-instances, rerebase, tasty, tasty-hunit, tasty-quickcheck
Dependencies removed: data-default
Dependency ranges changed: hasql
Files
- hasql-dynamic-statements.cabal +19/−3
- library/Hasql/DynamicStatements/Prelude.hs +0/−4
- library/Hasql/DynamicStatements/Snippet.hs +0/−2
- library/Hasql/DynamicStatements/Snippet/Defs.hs +5/−19
- library/Hasql/DynamicStatements/Statement.hs +1/−1
- test/Main.hs +62/−0
hasql-dynamic-statements.cabal view
@@ -1,5 +1,5 @@ name: hasql-dynamic-statements-version: 0.1.0.2+version: 0.2 synopsis: Toolkit for constructing Hasql statements dynamically description: This library introduces into the Hasql ecosystem a new abstraction named Snippet,@@ -36,6 +36,22 @@ base >=4.12 && <5, bytestring >=0.10 && <0.11, containers >=0.6 && <0.7,- data-default >=0.7 && <0.8,- hasql >=1.3.0.5 && <1.4,+ hasql >=1.4 && <1.5,+ hasql-implicits >=0.1 && <0.2, ptr >=0.16.6 && <0.17++test-suite test+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ main-is: Main.hs+ default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples+ default-language: Haskell2010+ build-depends:+ hasql,+ hasql-dynamic-statements,+ QuickCheck >=2.8.1 && <3,+ 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
library/Hasql/DynamicStatements/Prelude.hs view
@@ -80,7 +80,3 @@ -- bytestring ------------------------- import Data.ByteString as Exports (ByteString)---- data-default---------------------------import Data.Default as Exports
library/Hasql/DynamicStatements/Snippet.hs view
@@ -2,9 +2,7 @@ ( Snippet, param,- nullableParam, encoderAndParam,- encoderAndNullableParam, ) where
library/Hasql/DynamicStatements/Snippet/Defs.hs view
@@ -2,6 +2,7 @@ import Hasql.DynamicStatements.Prelude import qualified Hasql.Encoders as Encoders+import qualified Hasql.Implicits.Encoders as Encoders {-|@@ -48,26 +49,11 @@ {-| Parameter encoded using an implicitly derived encoder from the type. -}-param :: Default (Encoders.Value param) => param -> Snippet-param = encoderAndParam def--{-|-Nullable parameter encoded using an implicitly derived encoder from the type.--}-nullableParam :: Default (Encoders.Value param) => Maybe param -> Snippet-nullableParam = encoderAndNullableParam def+param :: Encoders.DefaultParamEncoder param => param -> Snippet+param = encoderAndParam Encoders.defaultParam {-| Parameter with an explicitly defined encoder. -}-encoderAndParam :: Encoders.Value param -> param -> Snippet-encoderAndParam = paramsEncoderAndParam . Encoders.param--{-|-Nullable parameter with an explicitly defined encoder.--}-encoderAndNullableParam :: Encoders.Value param -> Maybe param -> Snippet-encoderAndNullableParam = paramsEncoderAndParam . Encoders.nullableParam--paramsEncoderAndParam :: Encoders.Params param -> param -> Snippet-paramsEncoderAndParam encoder param = Snippet (pure (ParamSnippetChunk (param >$ encoder)))+encoderAndParam :: Encoders.NullableOrNot Encoders.Value param -> param -> Snippet+encoderAndParam encoder param = Snippet (pure (ParamSnippetChunk (param >$ Encoders.param encoder)))
library/Hasql/DynamicStatements/Statement.hs view
@@ -26,7 +26,7 @@ foldMap (mappend " from " . Snippet.'SnippetDefs.param') from <> foldMap (mappend " for " . Snippet.'SnippetDefs.param') to <> ")"- decoder = Decoders.'Decoders.singleRow' (Decoders.'Decoders.column' Decoders.'Decoders.text')+ decoder = Decoders.'Decoders.singleRow' (Decoders.'Decoders.column' (Decoders.'Decoders.nonNullable' Decoders.'Decoders.text')) in 'dynamicallyParameterized' snippet decoder @
+ test/Main.hs view
@@ -0,0 +1,62 @@+module Main where++import Prelude hiding (assert)+import Test.QuickCheck.Instances+import Test.Tasty+import Test.Tasty.Runners+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck+import qualified Test.QuickCheck as QuickCheck+import qualified Hasql.Statement as Statement+import qualified Hasql.Encoders as Encoders+import qualified Hasql.Decoders as Decoders+import qualified Hasql.Session as Session+import qualified Hasql.Connection as Connection+import qualified Hasql.DynamicStatements.Snippet as Snippet+import qualified Hasql.DynamicStatements.Session as Session+++main =+ defaultMain tree++tree =+ testGroup "All tests"+ [+ testCase "Select substring" $ let+ sample string from to = let+ snippet =+ "select substring(" <> Snippet.param @Text string <>+ foldMap (mappend " from " . Snippet.param @Int32) from <>+ foldMap (mappend " for " . Snippet.param @Int32) to <>+ ")"+ decoder = Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.text))+ in runSession (Session.dynamicallyParameterizedStatement snippet decoder)+ in do+ assertEqual "" (Right (Right "bc")) =<< sample "abcd" (Just 2) (Just 2)+ assertEqual "" (Right (Right "bcd")) =<< sample "abcd" (Just 2) (Just 3)+ assertEqual "" (Right (Right "abc")) =<< sample "abcd" Nothing (Just 3)+ assertEqual "" (Right (Right "bcd")) =<< sample "abcd" (Just 2) Nothing+ ]++runSession :: Session.Session a -> IO (Either Connection.ConnectionError (Either Session.QueryError a))+runSession = withConnection . Session.run++withConnection :: (Connection.Connection -> IO a) -> IO (Either Connection.ConnectionError a)+withConnection handler =+ runExceptT $ acquire >>= \connection -> use connection <* release connection+ where+ acquire =+ ExceptT $ Connection.acquire settings+ where+ settings =+ Connection.settings host port user password database+ where+ host = "localhost"+ port = 5432+ user = "postgres"+ password = ""+ database = "postgres"+ use connection =+ lift $ handler connection+ release connection =+ lift $ Connection.release connection