sqlc-hs-0.2.0.0: templates/internal.mysql.hs.jinja
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module {{ moduleName }} (
Query(..),
Params,
Result,
{{ moduleName }}.Enum,
-- * :execResult
ExecResult(..),
execResult,
-- * :exec
exec,
-- * :execrows
execRows,
-- * :execlastid
execLastId,
-- * :one
queryOne,
-- * :many
queryMany,
fold,
-- * Reexports
Database.MySQL.Simple.Connection,
Database.MySQL.Simple.QueryParams.QueryParams,
Database.MySQL.Simple.QueryResults.QueryResults,
) where
import Database.MySQL.Simple (Connection)
import GHC.TypeLits (Symbol)
import qualified Data.Int
import qualified Database.MySQL.Simple
import qualified Database.MySQL.Simple.QueryParams
import qualified Database.MySQL.Simple.QueryResults
newtype Query (name :: Symbol) (command :: Symbol)
= Query Database.MySQL.Simple.Query
data family Params (name :: Symbol)
data family Result (name :: Symbol)
data family Enum (name :: Symbol)
data ExecResult = ExecResult
{ lastInsertId :: !Data.Int.Int64,
rowsAffected :: !Data.Int.Int64
}
exec ::
Database.MySQL.Simple.QueryParams.QueryParams (Params name) =>
Connection ->
Query name ":exec" ->
Params name ->
IO ()
exec connection (Query sql) params = do
_rowsAffected <- Database.MySQL.Simple.execute connection sql params
pure ()
execRows ::
Database.MySQL.Simple.QueryParams.QueryParams (Params name) =>
Connection ->
Query name ":execrows" ->
Params name ->
IO Data.Int.Int64
execRows connection (Query sql) =
Database.MySQL.Simple.execute connection sql
execLastId ::
Database.MySQL.Simple.QueryParams.QueryParams (Params name) =>
Connection ->
Query name ":execlastid" ->
Params name ->
IO Data.Int.Int64
execLastId connection (Query sql) params = do
_rowsAffected <- Database.MySQL.Simple.execute connection sql params
lastInsertId <- Database.MySQL.Simple.insertID connection
pure (fromIntegral lastInsertId)
execResult ::
Database.MySQL.Simple.QueryParams.QueryParams (Params name) =>
Connection ->
Query name ":execresult" ->
Params name ->
IO ExecResult
execResult connection (Query sql) params = do
rowsAffected <- Database.MySQL.Simple.execute connection sql params
lastInsertId <- Database.MySQL.Simple.insertID connection
pure ExecResult {
lastInsertId = fromIntegral lastInsertId,
rowsAffected = rowsAffected
}
queryOne ::
( Database.MySQL.Simple.QueryParams.QueryParams (Params name),
Database.MySQL.Simple.QueryResults.QueryResults (Result name)
) =>
Connection ->
Query name ":one" ->
Params name ->
IO (Maybe (Result name))
queryOne connection (Query sql) params = do
result <- Database.MySQL.Simple.query connection sql params
case result of
[] -> pure Nothing
x : _ -> pure (Just x)
queryMany ::
( Database.MySQL.Simple.QueryParams.QueryParams (Params name),
Database.MySQL.Simple.QueryResults.QueryResults (Result name)
) =>
Connection ->
Query name ":many" ->
Params name ->
IO [Result name]
queryMany connection (Query sql) =
Database.MySQL.Simple.query connection sql
fold ::
( Database.MySQL.Simple.QueryParams.QueryParams (Params name),
Database.MySQL.Simple.QueryResults.QueryResults (Result name)
) =>
Connection ->
Query name ":many" ->
Params name ->
a ->
(a -> Result name -> IO a) ->
IO a
fold connection (Query sql) =
Database.MySQL.Simple.fold connection sql
{-# INLINABLE fold #-}