Contact kind administration
[hcoop/zz_old/portal.git] / contact.sml
CommitLineData
46b0c2df 1structure Contact :> CONTACT =
2struct
3
4open Util Sql Init
5
6
7(* Managing transactions *)
8
9type kind = {id :int, name : string, makeUrl : (string * string) option}
10
11fun makerToSql NONE = "FALSE, NULL, NULL"
12 | makerToSql (SOME (pre, post)) = $`TRUE, ^(C.stringToSql pre), ^(C.stringToSql post)`
13
14fun makerToSqlUpd NONE = "url = FALSE, urlPrefix = NULL, urlPostfix = NULL"
15 | makerToSqlUpd (SOME (pre, post)) = $`url = TRUE, urlPrefix = ^(C.stringToSql pre), urlPostfix = ^(C.stringToSql post)`
16
17fun 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
25fun 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
35fun 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
44fun 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
53fun deleteKind id =
54 ignore (C.dml (getDb ()) ($`DELETE FROM ContactKind WHERE id = ^(C.intToSql id)`))
55
56fun listKinds () =
57 C.map (getDb ()) mkKindRow ($`SELECT id, name, url, urlPrefix, urlPostfix FROM ContactKind
58 ORDER BY name`)
59
60end