Update several modules to deal with new WebUser column 'app'
[hcoop/zz_old/portal.git] / balance.sml
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}
13 | mkBalanceRow row = Init.rowError ("balance", row)
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)
21 VALUES (^(C.intToSql id), ^(C.stringToSql name), 0.0)`);
22 id
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 =
60 C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app
61 FROM WebUser
62 WHERE bal = ^(C.intToSql bal)
63 ORDER BY name`)
64
65 end