From c4becb5fa4357e7a27e6536f3a20e3d5d6136cb0 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Thu, 22 Oct 2009 14:05:48 -0400 Subject: authorship table --- demo/more/conference.ur | 104 +++++++++++++++++++++++++++++++++++++++++------ demo/more/conference.urs | 2 +- 2 files changed, 92 insertions(+), 14 deletions(-) (limited to 'demo') diff --git a/demo/more/conference.ur b/demo/more/conference.ur index 290ff61d..8e408d2f 100644 --- a/demo/more/conference.ur +++ b/demo/more/conference.ur @@ -2,7 +2,7 @@ open Meta functor Make(M : sig con paper :: {(Type * Type)} - constraint [Id, Document] ~ paper + constraint [Id, Document, Authors] ~ paper val paper : $(map meta paper) val paperFolder : folder paper @@ -24,6 +24,11 @@ functor Make(M : sig PRIMARY KEY Id sequence paperId + table authorship : {Paper : int, User : int} + PRIMARY KEY (Paper, User), + CONSTRAINT Paper FOREIGN KEY Paper REFERENCES paper(Id), + CONSTRAINT User FOREIGN KEY User REFERENCES user(Id) + con review = [Paper = int, User = int] ++ map fst M.review table review : review PRIMARY KEY (Paper, User), @@ -43,14 +48,18 @@ functor Make(M : sig WHERE user.Id = {[r.Id]} AND user.Password = {[r.Password]}) - fun checkPaper id = + val getLogin = ro <- checkLogin; - if (case ro of - None => False - | Some r => r.OnPc) then + case ro of + None => error You must be logged in to do that. + | Some r => return r + + fun checkPaper id = + r <- getLogin; + if r.OnPc then return () else - error You must be logged in to do that. + error You aren't authorized to see that paper. structure Users = BulkEdit.Make(struct con keyName = #Id @@ -66,6 +75,29 @@ functor Make(M : sig val t = user end) + datatype dnat = O | S of source dnat + type dnatS = source dnat + + fun inc n = + v <- get n; + case v of + O => + n' <- source O; + set n (S n') + | S n => inc n + + fun dec n = + let + fun dec' last n = + v <- get n; + case v of + O => (case last of + None => return () + | Some n' => set n' O) + | S n' => dec' (Some n) n' + in + dec' None n + end fun doRegister r = n <- oneRowE1 (SELECT COUNT( * ) AS N @@ -151,18 +183,54 @@ functor Make(M : sig and submit () = let fun doSubmit r = - id <- nextval paperId; - dml (insert paper ({Id = sql_inject id, Document = sql_inject (fileData r.Document)} - ++ ensql M.paper (r -- #Document) M.paperFolder)); - return - OK, done! - + me <- getLogin; + coauthors <- List.mapM (fn name => oneOrNoRowsE1 (SELECT user.Id AS N + FROM user + WHERE user.Nam = {[name.Nam]})) r.Authors; + if List.exists Option.isNone coauthors then + error At least one of those coauthor usernames isn't registered. + else + id <- nextval paperId; + dml (insert paper ({Id = sql_inject id, Document = sql_inject (fileData r.Document)} + ++ ensql M.paper (r -- #Authors -- #Document) M.paperFolder)); + List.app (fn uid => + case uid of + None => error Impossible empty uid! + | Some uid => dml (INSERT INTO authorship (Paper, User) + VALUES ({[id]}, {[uid]}))) + (Some me.Id :: coauthors); + return + Thanks for submitting! + + + fun authorBlanks n = + case n of + O => + | S n => + Author:
+ +
+ + and authorBlanksS n = + n <- signal n; + return (authorBlanks n) in + me <- getLogin; + numAuthors <- source O; + return

Submit a Paper

- {allWidgets M.paper M.paperFolder} + Author: {[me.Nam]}
+ + + +