diff options
author | Benjamin Barenblat <bbaren@mit.edu> | 2017-07-23 09:50:04 -0400 |
---|---|---|
committer | Benjamin Barenblat <bbaren@mit.edu> | 2017-07-23 09:50:04 -0400 |
commit | 0cccdb0ae595cd7e3e136e984ac7b95b99f71a53 (patch) | |
tree | 491d3b13813610943c60460d3e178d3a73916346 /demo/broadcast.ur |
Import urweb_20170720+dfsg.orig.tar.gz
[dgit import orig urweb_20170720+dfsg.orig.tar.gz]
Diffstat (limited to 'demo/broadcast.ur')
-rw-r--r-- | demo/broadcast.ur | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/demo/broadcast.ur b/demo/broadcast.ur new file mode 100644 index 0000000..0b04b13 --- /dev/null +++ b/demo/broadcast.ur @@ -0,0 +1,29 @@ +functor Make(M : sig type t end) = struct + sequence s + table t : {Id : int, Client : client, Channel : channel M.t} + PRIMARY KEY (Id, Client) + + 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 |