on f3daaff help sign in
rel8/src/Rel8/Statement/Select.hs
61 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 Prelude
14-- hasql
15import Hasql.Connection ( Connection )
16import qualified Hasql.Decoders as Hasql
17import qualified Hasql.Encoders as Hasql
18import qualified Hasql.Session as Hasql
19import qualified Hasql.Statement as Hasql
21-- rel8
22import Rel8.Query ( Query )
23import Rel8.Query.SQL ( sqlForQuery, sqlForQueryWithNames )
24import Rel8.Table.Recontextualize ( Selects )
25import Rel8.Table.Serialize ( Serializable, parse )
27-- text
28import qualified Data.Text as Text
29import Data.Text.Encoding ( encodeUtf8 )
32-- | Run a @SELECT@ query, returning all rows.
33select :: forall exprs a. Serializable exprs a
34 => Connection -> Query exprs -> IO [a]
35select c query = case sqlForQuery query of
36 Nothing -> pure []
37 Just sql -> Hasql.run session c >>= either throwIO pure
38 where
39 session = Hasql.statement () statement
40 statement = Hasql.Statement bytes params decode prepare
41 bytes = encodeUtf8 (Text.pack sql)
42 params = Hasql.noParams
43 decode = Hasql.rowList (parse @exprs @a)
44 prepare = False
47selectWithNames :: forall exprs a names.
48 ( Selects names exprs
49 , Serializable exprs a
50 )
51 => Connection -> names -> Query exprs -> IO [a]
52selectWithNames c names query = case sqlForQueryWithNames names query of
53 Nothing -> pure []
54 Just sql -> Hasql.run session c >>= either throwIO pure
55 where
56 session = Hasql.statement () statement
57 statement = Hasql.Statement bytes params decode prepare
58 bytes = encodeUtf8 (Text.pack sql)
59 params = Hasql.noParams
60 decode = Hasql.rowList (parse @exprs @a)
61 prepare = False