annotate demo/broadcast.ur @ 2238:7f92d70a326e

Only use string (rather than numeric, etc.) primitives in parsed SQL statements.
author Ziv Scully <ziv@mit.edu>
date Mon, 06 Jul 2015 01:31:04 -0700
parents 0406e9cccb72
children
rev   line source
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