blob: 2d4ef739ac8aa6779663c2e7ad8bab71a7b9d7c7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
functor Make(M : sig
type key
con id :: Name
con parent :: Name
con cols :: {Type}
constraint [id] ~ [parent]
constraint [id, parent] ~ cols
val key_inj : sql_injectable_prim key
table tab : ([id = key, parent = option key] ++ cols)
end) = struct
open M
fun tree (f : $([id = key, parent = option key] ++ cols) -> xbody)
(root : option M.key) =
let
fun recurse (root : option key) =
queryX' (SELECT * FROM tab WHERE {eqNullable' (SQL tab.{parent}) root})
(fn r =>
children <- recurse (Some r.Tab.id);
return <xml>
<li> {f r.Tab}</li>
<ul>
{children}
</ul>
</xml>)
in
recurse root
end
end
|