adamc@699
|
1 functor Make(M : sig type t end) = struct
|
adamc@699
|
2 sequence s
|
adamc@699
|
3 table t : {Id : int, Client : client, Channel : channel M.t}
|
adamc@709
|
4 PRIMARY KEY (Id, Client)
|
adamc@699
|
5
|
adamc@699
|
6 type topic = int
|
adamc@699
|
7
|
adamc@699
|
8 val inj : sql_injectable topic = _
|
adamc@699
|
9
|
adamc@699
|
10 val create = nextval s
|
adamc@699
|
11
|
adamc@699
|
12 fun subscribe id =
|
adamc@699
|
13 cli <- self;
|
adamc@699
|
14 ro <- oneOrNoRows (SELECT t.Channel FROM t WHERE t.Id = {[id]} AND t.Client = {[cli]});
|
adamc@699
|
15 case ro of
|
adamc@699
|
16 None =>
|
adamc@699
|
17 ch <- channel;
|
adamc@699
|
18 dml (INSERT INTO t (Id, Client, Channel) VALUES ({[id]}, {[cli]}, {[ch]}));
|
adamc@699
|
19 return ch
|
adamc@699
|
20 | Some r => return r.T.Channel
|
adamc@699
|
21
|
adamc@699
|
22 fun send id msg =
|
adamc@699
|
23 queryI (SELECT t.Channel FROM t WHERE t.Id = {[id]})
|
adamc@699
|
24 (fn r => Basis.send r.T.Channel msg)
|
adamc@699
|
25
|
adamc@699
|
26 fun subscribers id =
|
adamc@699
|
27 r <- oneRow (SELECT COUNT( * ) AS N FROM t WHERE t.Id = {[id]});
|
adamc@699
|
28 return r.N
|
adamc@699
|
29 end
|