# HG changeset patch # User Adam Chlipala # Date 1256234748 14400 # Node ID 6b0f3853cc8122fc9feaf6fbc852ce0f403120a1 # Parent 59097824f19b2213907a4df09c9cedfeccd4560c authorship table diff -r 59097824f19b -r 6b0f3853cc81 demo/more/conference.ur --- a/demo/more/conference.ur Thu Oct 22 12:16:31 2009 -0400 +++ b/demo/more/conference.ur Thu Oct 22 14:05:48 2009 -0400 @@ -2,7 +2,7 @@ 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 @@ 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 @@ WHERE user.Id = {[r.Id]} AND user.Password = {[r.Password]}) + val getLogin = + ro <- checkLogin; + case ro of + None => error You must be logged in to do that. + | Some r => return r + fun checkPaper id = - ro <- checkLogin; - if (case ro of - None => False - | Some r => r.OnPc) then + 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 @@ 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 @@ 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]}
+ + + +