diff options
Diffstat (limited to 'demo/broadcast.ur')
-rw-r--r-- | demo/broadcast.ur | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/demo/broadcast.ur b/demo/broadcast.ur new file mode 100644 index 00000000..13cb5ceb --- /dev/null +++ b/demo/broadcast.ur @@ -0,0 +1,28 @@ +functor Make(M : sig type t end) = struct + sequence s + table t : {Id : int, Client : client, Channel : channel M.t} + + type topic = int + + val inj : sql_injectable topic = _ + + val create = nextval s + + fun subscribe id = + cli <- self; + ro <- oneOrNoRows (SELECT t.Channel FROM t WHERE t.Id = {[id]} AND t.Client = {[cli]}); + case ro of + None => + ch <- channel; + dml (INSERT INTO t (Id, Client, Channel) VALUES ({[id]}, {[cli]}, {[ch]})); + return ch + | Some r => return r.T.Channel + + fun send id msg = + queryI (SELECT t.Channel FROM t WHERE t.Id = {[id]}) + (fn r => Basis.send r.T.Channel msg) + + fun subscribers id = + r <- oneRow (SELECT COUNT( * ) AS N FROM t WHERE t.Id = {[id]}); + return r.N +end |