packages feed

hasql-transaction-1.2.2: src/conflicts-test/Main/Statements.hs

module Main.Statements where

import Hasql.Decoders qualified as D
import Hasql.Encoders qualified as E
import Hasql.Statement
import Prelude

createAccountTable :: Statement () ()
createAccountTable =
  unpreparable sql E.noParams D.noResult
  where
    sql =
      "create table account (id bigserial not null, balance numeric not null, primary key (id))"

dropAccountTable :: Statement () ()
dropAccountTable =
  unpreparable
    "drop table account"
    E.noParams
    D.noResult

createAccount :: Statement Scientific Int64
createAccount =
  preparable
    "insert into account (balance) values ($1) returning id"
    ((E.param . E.nonNullable) E.numeric)
    (D.singleRow ((D.column . D.nonNullable) D.int8))

modifyBalance :: Statement (Int64, Scientific) Bool
modifyBalance =
  preparable
    "update account set balance = balance + $2 where id = $1"
    ((fst >$< (E.param . E.nonNullable) E.int8) <> (snd >$< (E.param . E.nonNullable) E.numeric))
    (fmap (> 0) D.rowsAffected)

getBalance :: Statement Int64 (Maybe Scientific)
getBalance =
  preparable
    "select balance from account where id = $1"
    ((E.param . E.nonNullable) E.int8)
    (D.rowMaybe ((D.column . D.nonNullable) D.numeric))