adamc@699: structure Room = Broadcast.Make(struct
adamc@699: type t = string
adamc@699: end)
adamc@699:
adamc@699: sequence s
adamc@699: table t : { Id : int, Title : string, Room : Room.topic }
adamc@708: PRIMARY KEY Id
adamc@699:
adamc@732: fun chat id () =
adamc@699: r <- oneRow (SELECT t.Title, t.Room FROM t WHERE t.Id = {[id]});
adamc@699: ch <- Room.subscribe r.T.Room;
adamc@699:
adamc@699: newLine <- source "";
adamc@699: buf <- Buffer.create;
adamc@699:
adamc@699: let
adamc@699: fun onload () =
adamc@699: let
adamc@699: fun listener () =
adamc@699: s <- recv ch;
adamc@699: Buffer.write buf s;
adamc@699: listener ()
adamc@699: in
adamc@699: listener ()
adamc@699: end
adamc@699:
adamc@699: fun getRoom () =
adamc@699: r <- oneRow (SELECT t.Room FROM t WHERE t.Id = {[id]});
adamc@699: return r.T.Room
adamc@699:
adamc@699: fun speak line =
adamc@699: room <- getRoom ();
adamc@699: Room.send room line
adamc@699:
adamc@699: fun doSpeak () =
adamc@699: line <- get newLine;
adamc@699: set newLine "";
adamc@699: speak line
adamc@699: in
adamc@699: return
adamc@699:
{[r.T.Title]}
adamc@699:
adamc@699:
adamc@699:
adamc@699:
Messages
adamc@699:
adamc@699:
adamc@699:
adamc@699:
adamc@699: end
adamc@699:
adamc@699: fun list () =
adamc@699: queryX' (SELECT * FROM t)
adamc@699: (fn r =>
adamc@699: count <- Room.subscribers r.T.Room;
adamc@699: return
adamc@699:
{[r.T.Id]}
adamc@732:
{[r.T.Title]}
adamc@699:
{[count]}
adamc@732:
adamc@732:
adamc@699:
)
adamc@699:
adamc@732: and delete id () =
adamc@699: dml (DELETE FROM t WHERE Id = {[id]});
adamc@699: main ()
adamc@699:
adamc@699: and main () =
adamc@699: let
adamc@699: fun create r =
adamc@699: id <- nextval s;
adamc@699: room <- Room.create;
adamc@699: dml (INSERT INTO t (Id, Title, Room) VALUES ({[id]}, {[r.Title]}, {[room]}));
adamc@699: main ()
adamc@699: in
adamc@699: ls <- list ();
adamc@699: return
adamc@699: