8d347a33 |
1 | structure Balance :> BALANCE = |
2 | struct |
3 | |
4 | open Util Sql Init |
5 | |
6 | |
7 | (* Managing balances *) |
8 | |
9 | type balance = {id :int, name : string, amount : real} |
10 | |
11 | fun mkBalanceRow [id, name, amount] = |
12 | {id = C.intFromSql id, name = C.stringFromSql name, amount = C.realFromSql amount} |
369e1577 |
13 | | mkBalanceRow row = Init.rowError ("balance", row) |
8d347a33 |
14 | |
15 | fun addBalance name = |
16 | let |
17 | val db = getDb () |
18 | val id = nextSeq (db, "BalanceSeq") |
19 | in |
20 | C.dml db ($`INSERT INTO Balance (id, name, amount) |
369e1577 |
21 | VALUES (^(C.intToSql id), ^(C.stringToSql name), 0.0)`); |
22 | id |
8d347a33 |
23 | end |
24 | |
25 | fun lookupBalance id = |
26 | let |
27 | val c = getDb () |
28 | in |
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) |
32 | end |
33 | |
34 | fun modBalance (balance : balance) = |
35 | let |
36 | val db = getDb () |
37 | in |
38 | ignore (C.dml db ($`UPDATE Balance |
39 | SET name = ^(C.stringToSql (#name balance)) |
40 | WHERE id = ^(C.intToSql (#id balance))`)) |
41 | end |
42 | |
43 | fun deleteBalance id = |
44 | ignore (C.dml (getDb ()) ($`DELETE FROM Balance WHERE id = ^(C.intToSql id)`)) |
45 | |
46 | fun listBalances () = |
47 | C.map (getDb ()) mkBalanceRow ($`SELECT id, name, amount FROM Balance |
48 | ORDER BY name`) |
49 | |
50 | fun validBalanceName name = |
51 | size name <= 20 |
52 | andalso CharVector.all (fn ch => Char.isAlpha ch orelse ch = #"+") name |
53 | |
54 | fun balanceNameToId name = |
55 | case C.oneOrNoRows (getDb ()) ($`SELECT id FROM Balance WHERE name = ^(C.stringToSql name)`) of |
56 | SOME [id] => SOME (C.intFromSql id) |
57 | | _ => NONE |
58 | |
59 | fun listBalanceUsers bal = |
ca988110 |
60 | C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app |
8d347a33 |
61 | FROM WebUser |
62 | WHERE bal = ^(C.intToSql bal) |
63 | ORDER BY name`) |
64 | |
65 | end |