adamc@699: functor Make(M : sig type t end) = struct adamc@699: sequence s adamc@699: table t : {Id : int, Client : client, Channel : channel M.t} adamc@709: PRIMARY KEY (Id, Client) adamc@699: adamc@699: type topic = int adamc@699: adamc@699: val inj : sql_injectable topic = _ adamc@699: adamc@699: val create = nextval s adamc@699: adamc@699: fun subscribe id = adamc@699: cli <- self; adamc@699: ro <- oneOrNoRows (SELECT t.Channel FROM t WHERE t.Id = {[id]} AND t.Client = {[cli]}); adamc@699: case ro of adamc@699: None => adamc@699: ch <- channel; adamc@699: dml (INSERT INTO t (Id, Client, Channel) VALUES ({[id]}, {[cli]}, {[ch]})); adamc@699: return ch adamc@699: | Some r => return r.T.Channel adamc@699: adamc@699: fun send id msg = adamc@699: queryI (SELECT t.Channel FROM t WHERE t.Id = {[id]}) adamc@699: (fn r => Basis.send r.T.Channel msg) adamc@699: adamc@699: fun subscribers id = adamc@699: r <- oneRow (SELECT COUNT( * ) AS N FROM t WHERE t.Id = {[id]}); adamc@699: return r.N adamc@699: end