1 structure Balance
:> BALANCE
=
7 (* Managing balances
*)
9 type balance
= {id
:int, name
: string, amount
: real}
11 fun mkBalanceRow
[id
, name
, amount
] =
12 {id
= C
.intFromSql id
, name
= C
.stringFromSql name
, amount
= C
.realFromSql amount
}
13 | mkBalanceRow row
= Init
.rowError ("balance", row
)
18 val id
= nextSeq (db
, "BalanceSeq")
20 C
.dml
db ($`INSERT INTO
Balance (id
, name
, amount
)
21 VALUES (^
(C
.intToSql id
), ^
(C
.stringToSql name
), 0.0)`
);
25 fun lookupBalance id
=
29 (case C
.oneOrNoRows
c ($`SELECT id
, name
, amount FROM Balance WHERE id
= ^
(C
.intToSql id
)`
) of
30 NONE
=> raise Fail
"Balance not found"
31 | SOME r
=> mkBalanceRow r
)
34 fun modBalance (balance
: balance
) =
38 ignore (C
.dml
db ($`UPDATE Balance
39 SET name
= ^
(C
.stringToSql (#name balance
))
40 WHERE id
= ^
(C
.intToSql (#id balance
))`
))
43 fun deleteBalance id
=
44 ignore (C
.dml (getDb ()) ($`DELETE FROM Balance WHERE id
= ^
(C
.intToSql id
)`
))
47 C
.map (getDb ()) mkBalanceRow ($`SELECT id
, name
, amount FROM Balance
50 fun listOwnedBalances () =
51 C
.map (getDb ()) mkBalanceRow ($`SELECT Balance
.id
, Balance
.name
, amount
52 FROM Balance JOIN WebUser
53 ON Balance
.name
= WebUser
.name
54 AND WebUser
.bal
= Balance
.id
55 ORDER BY Balance
.name`
)
57 fun validBalanceName name
=
59 andalso CharVector
.all (fn ch
=> Char.isAlpha ch
orelse ch
= #
"+") name
61 fun balanceNameToId name
=
62 case C
.oneOrNoRows (getDb ()) ($`SELECT id FROM Balance WHERE name
= ^
(C
.stringToSql name
)`
) of
63 SOME
[id
] => SOME (C
.intFromSql id
)
66 fun listBalanceUsers bal
=
67 C
.map (getDb ()) mkUserRow ($`SELECT id
, name
, rname
, bal
, joined
, app
, shares
69 WHERE bal
= ^
(C
.intToSql bal
)