summaryrefslogtreecommitdiff
path: root/demo/broadcast.ur
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-04-05 11:48:55 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-04-05 11:48:55 -0400
commit3b3f14a1c2021f307e9290ec8fba64d6c791a93a (patch)
treeaffa61639daa2a14b7eb6c9f8bb56617fa62582c /demo/broadcast.ur
parenta44e147bbb6686867b425b7cf068d14c5f230f51 (diff)
Chat demo
Diffstat (limited to 'demo/broadcast.ur')
-rw-r--r--demo/broadcast.ur28
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