Commit | Line | Data |
---|---|---|
208e2cbc AC |
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} | |
ee587f7f | 13 | | mkBalanceRow row = Init.rowError ("balance", row) |
208e2cbc AC |
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) | |
ee587f7f AC |
21 | VALUES (^(C.intToSql id), ^(C.stringToSql name), 0.0)`); |
22 | id | |
208e2cbc AC |
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 | |
afc975d0 AC |
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`) | |
208e2cbc AC |
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 = | |
827fa7c4 | 67 | C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app, shares |
208e2cbc AC |
68 | FROM WebUser |
69 | WHERE bal = ^(C.intToSql bal) | |
70 | ORDER BY name`) | |
71 | ||
afc975d0 | 72 | end |