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 |
a90420b4 |
48 | ORDER BY name`) |
49 | |
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`) |
8d347a33 |
56 | |
57 | fun validBalanceName name = |
58 | size name <= 20 |
59 | andalso CharVector.all (fn ch => Char.isAlpha ch orelse ch = #"+") name |
60 | |
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) |
64 | | _ => NONE |
65 | |
66 | fun listBalanceUsers bal = |
302c9f57 |
67 | C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app, shares |
8d347a33 |
68 | FROM WebUser |
69 | WHERE bal = ^(C.intToSql bal) |
70 | ORDER BY name`) |
71 | |
a90420b4 |
72 | end |