46b0c2df |
1 | structure Contact :> CONTACT = |
2 | struct |
3 | |
4 | open Util Sql Init |
5 | |
6 | |
7 | (* Managing transactions *) |
8 | |
9 | type kind = {id :int, name : string, makeUrl : (string * string) option} |
10 | |
11 | fun makerToSql NONE = "FALSE, NULL, NULL" |
12 | | makerToSql (SOME (pre, post)) = $`TRUE, ^(C.stringToSql pre), ^(C.stringToSql post)` |
13 | |
14 | fun makerToSqlUpd NONE = "url = FALSE, urlPrefix = NULL, urlPostfix = NULL" |
15 | | makerToSqlUpd (SOME (pre, post)) = $`url = TRUE, urlPrefix = ^(C.stringToSql pre), urlPostfix = ^(C.stringToSql post)` |
16 | |
17 | fun mkKindRow [id, name, url, urlPrefix, urlPostfix] = |
18 | {id = C.intFromSql id, name = C.stringFromSql name, |
19 | makeUrl = (if C.boolFromSql url then |
20 | SOME (C.stringFromSql urlPrefix, C.stringFromSql urlPostfix) |
21 | else |
22 | NONE)} |
23 | | mkKindRow row = raise Fail ("Bad kind row : " ^ makeSet id row) |
24 | |
25 | fun addKind (name, makeUrl) = |
26 | let |
27 | val db = getDb () |
28 | val id = nextSeq (db, "ContactKindSeq") |
29 | in |
30 | C.dml db ($`INSERT INTO ContactKind (id, name, url, urlPrefix, urlPostfix) |
31 | VALUES (^id, ^(C.stringToSql name), ^(makerToSql makeUrl))`); |
32 | C.intFromSql id |
33 | end |
34 | |
35 | fun lookupKind id = |
36 | let |
37 | val c = getDb () |
38 | in |
39 | (case C.oneOrNoRows c ($`SELECT id, name, url, urlPrefix, urlPostfix FROM ContactKind WHERE id = ^(C.intToSql id)`) of |
40 | NONE => raise Fail "Contact kind not found" |
41 | | SOME r => mkKindRow r) |
42 | end |
43 | |
44 | fun modKind (kind : kind) = |
45 | let |
46 | val db = getDb () |
47 | in |
48 | ignore (C.dml db ($`UPDATE ContactKind |
49 | SET name = ^(C.stringToSql (#name kind)), ^(makerToSqlUpd (#makeUrl kind)) |
50 | WHERE id = ^(C.intToSql (#id kind))`)) |
51 | end |
52 | |
53 | fun deleteKind id = |
54 | ignore (C.dml (getDb ()) ($`DELETE FROM ContactKind WHERE id = ^(C.intToSql id)`)) |
55 | |
56 | fun listKinds () = |
57 | C.map (getDb ()) mkKindRow ($`SELECT id, name, url, urlPrefix, urlPostfix FROM ContactKind |
58 | ORDER BY name`) |
59 | |
60 | end |