module Database.PostgreSQL.Query.Internal
(
buildFields
, updateTable
, insertInto
) where
import Database.PostgreSQL.Query.SqlBuilder
import Database.PostgreSQL.Query.TH
import Database.PostgreSQL.Query.Types
import qualified Data.List as L
buildFields :: [FN] -> SqlBuilder
buildFields :: [FN] -> SqlBuilder
buildFields [FN]
flds = [SqlBuilder] -> SqlBuilder
forall a. Monoid a => [a] -> a
mconcat
([SqlBuilder] -> SqlBuilder) -> [SqlBuilder] -> SqlBuilder
forall a b. (a -> b) -> a -> b
$ SqlBuilder -> [SqlBuilder] -> [SqlBuilder]
forall a. a -> [a] -> [a]
L.intersperse SqlBuilder
", "
([SqlBuilder] -> [SqlBuilder]) -> [SqlBuilder] -> [SqlBuilder]
forall a b. (a -> b) -> a -> b
$ (FN -> SqlBuilder) -> [FN] -> [SqlBuilder]
forall a b. (a -> b) -> [a] -> [b]
map FN -> SqlBuilder
forall a. ToSqlBuilder a => a -> SqlBuilder
toSqlBuilder [FN]
flds
updateTable :: (ToSqlBuilder q, ToMarkedRow flds)
=> FN
-> flds
-> q
-> SqlBuilder
updateTable :: FN -> flds -> q -> SqlBuilder
updateTable FN
tname flds
flds q
q =
let mr :: MarkedRow
mr = flds -> MarkedRow
forall a. ToMarkedRow a => a -> MarkedRow
toMarkedRow flds
flds
setFields :: SqlBuilder
setFields = SqlBuilder -> MarkedRow -> SqlBuilder
mrToBuilder SqlBuilder
", " MarkedRow
mr
in [sqlExp|UPDATE ^{tname}
SET ^{setFields} ^{q}|]
insertInto :: (ToMarkedRow b)
=> FN
-> b
-> SqlBuilder
insertInto :: FN -> b -> SqlBuilder
insertInto FN
tname b
b =
let mr :: MarkedRow
mr = b -> MarkedRow
forall a. ToMarkedRow a => a -> MarkedRow
toMarkedRow b
b
names :: SqlBuilder
names = [SqlBuilder] -> SqlBuilder
forall a. Monoid a => [a] -> a
mconcat
([SqlBuilder] -> SqlBuilder) -> [SqlBuilder] -> SqlBuilder
forall a b. (a -> b) -> a -> b
$ SqlBuilder -> [SqlBuilder] -> [SqlBuilder]
forall a. a -> [a] -> [a]
L.intersperse SqlBuilder
", "
([SqlBuilder] -> [SqlBuilder]) -> [SqlBuilder] -> [SqlBuilder]
forall a b. (a -> b) -> a -> b
$ ((FN, SqlBuilder) -> SqlBuilder)
-> [(FN, SqlBuilder)] -> [SqlBuilder]
forall a b. (a -> b) -> [a] -> [b]
map (FN -> SqlBuilder
forall a. ToSqlBuilder a => a -> SqlBuilder
toSqlBuilder (FN -> SqlBuilder)
-> ((FN, SqlBuilder) -> FN) -> (FN, SqlBuilder) -> SqlBuilder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FN, SqlBuilder) -> FN
forall a b. (a, b) -> a
fst)
([(FN, SqlBuilder)] -> [SqlBuilder])
-> [(FN, SqlBuilder)] -> [SqlBuilder]
forall a b. (a -> b) -> a -> b
$ MarkedRow -> [(FN, SqlBuilder)]
unMR MarkedRow
mr
values :: SqlBuilder
values = [SqlBuilder] -> SqlBuilder
forall a. Monoid a => [a] -> a
mconcat
([SqlBuilder] -> SqlBuilder) -> [SqlBuilder] -> SqlBuilder
forall a b. (a -> b) -> a -> b
$ SqlBuilder -> [SqlBuilder] -> [SqlBuilder]
forall a. a -> [a] -> [a]
L.intersperse SqlBuilder
", "
([SqlBuilder] -> [SqlBuilder]) -> [SqlBuilder] -> [SqlBuilder]
forall a b. (a -> b) -> a -> b
$ ((FN, SqlBuilder) -> SqlBuilder)
-> [(FN, SqlBuilder)] -> [SqlBuilder]
forall a b. (a -> b) -> [a] -> [b]
map (FN, SqlBuilder) -> SqlBuilder
forall a b. (a, b) -> b
snd
([(FN, SqlBuilder)] -> [SqlBuilder])
-> [(FN, SqlBuilder)] -> [SqlBuilder]
forall a b. (a -> b) -> a -> b
$ MarkedRow -> [(FN, SqlBuilder)]
unMR MarkedRow
mr
in [sqlExp|INSERT INTO ^{tname}
(^{names}) VALUES (^{values})|]