on e891d51 help sign in
rel8/src/Rel8/Statement/Select.hs
62 lines 1.8 kB history raw
1{-# language ScopedTypeVariables #-}
2{-# language TypeApplications #-}
4module Rel8.Statement.Select
5 ( select
6 , selectWithNames
7 )
8where
10-- base
11import Control.Exception ( throwIO )
12import Control.Monad ( (>=>) )
13import Prelude
15-- hasql
16import Hasql.Connection ( Connection )
17import qualified Hasql.Decoders as Hasql
18import qualified Hasql.Encoders as Hasql
19import qualified Hasql.Session as Hasql
20import qualified Hasql.Statement as Hasql
22-- rel8
23import Rel8.Query ( Query )
24import Rel8.Query.SQL ( sqlForQuery, sqlForQueryWithNames )
25import Rel8.Table.Recontextualize ( Selects )
26import Rel8.Table.Serialize ( Serializable, parse )
28-- text
29import qualified Data.Text as Text
30import Data.Text.Encoding ( encodeUtf8 )
33-- | Run a @SELECT@ query, returning all rows.
34select :: forall exprs a. Serializable exprs a
35 => Query exprs -> Connection -> IO [a]
36select query = case sqlForQuery query of
37 Nothing -> const $ pure []
38 Just sql -> Hasql.run session >=> either throwIO pure
39 where
40 session = Hasql.statement () statement
41 statement = Hasql.Statement bytes params decode prepare
42 bytes = encodeUtf8 (Text.pack sql)
43 params = Hasql.noParams
44 decode = Hasql.rowList (parse @exprs @a)
45 prepare = False
48selectWithNames :: forall exprs a names.
49 ( Selects names exprs
50 , Serializable exprs a
51 )
52 => names -> Query exprs -> Connection -> IO [a]
53selectWithNames names query = case sqlForQueryWithNames names query of
54 Nothing -> const $ pure []
55 Just sql -> Hasql.run session >=> either throwIO pure
56 where
57 session = Hasql.statement () statement
58 statement = Hasql.Statement bytes params decode prepare
59 bytes = encodeUtf8 (Text.pack sql)
60 params = Hasql.noParams
61 decode = Hasql.rowList (parse @exprs @a)
62 prepare = False