val emailSuffix : string
type user = {id : int, name : string, rname : string, bal : int, joined : C.timestamp,
- app : int}
+ app : int, shares : int}
val rowError : string * C.value list -> 'a
val lookupUser : int -> user
val listUsers : unit -> user list
- val addUser : string * string * int * int -> int
- (* Pass name, real name, and balance ID *)
+ val addUser : string * string * int * int * int -> int
+ (* Pass name, real name, balance ID, and share count *)
val modUser : user -> unit
val deleteUser : int -> string
+ val byPledge : unit -> user list
val validUsername : string -> bool
val userNameToId : string -> int option
val close = C.close
type user = {id : int, name : string, rname : string, bal : int, joined : C.timestamp,
- app : int}
+ app : int, shares : int}
val db = ref (NONE : C.conn option)
val user = ref (NONE : user option)
fun getDb () = valOf (!db)
-fun mkUserRow [id, name, rname, bal, joined, app] =
+fun mkUserRow [id, name, rname, bal, joined, app, shares] =
{id = C.intFromSql id, name = C.stringFromSql name, rname = C.stringFromSql rname,
bal = C.intFromSql bal, joined = C.timestampFromSql joined,
- app = C.intFromSql app}
+ app = C.intFromSql app, shares = C.intFromSql shares}
| mkUserRow row = rowError ("user", row)
fun init () =
case Web.getCgi "REMOTE_USER" of
NONE => raise Fail "Not logged in"
| SOME name =>
- (case C.oneOrNoRows c ($`SELECT id, name, rname, bal, joined, app
+ (case C.oneOrNoRows c ($`SELECT id, name, rname, bal, joined, app, shares
FROM WebUserActive
WHERE name=^(C.stringToSql name)`) of
NONE => raise Fail "User not found"
fun getUserName () = #name (getUser ())
fun lookupUser id =
- mkUserRow (C.oneRow (getDb ()) ($`SELECT id, name, rname, bal, joined, app
+ mkUserRow (C.oneRow (getDb ()) ($`SELECT id, name, rname, bal, joined, app, shares
FROM WebUser
WHERE id = ^(C.intToSql id)`))
fun listUsers () =
- C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app
+ C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app, shares
FROM WebUser
ORDER BY name`)
[id] => C.intFromSql id
| _ => raise Fail "Bad next sequence val"
-fun addUser (name, rname, bal, app) =
+fun addUser (name, rname, bal, app, shares) =
let
val db = getDb ()
val id = nextSeq (db, "WebUserSeq")
in
- C.dml db ($`INSERT INTO WebUser (id, name, rname, bal, joined, app)
- VALUES (^(C.intToSql id), ^(C.stringToSql name), ^(C.stringToSql rname), ^(C.intToSql bal), CURRENT_TIMESTAMP, ^(C.intToSql app))`);
+ C.dml db ($`INSERT INTO WebUser (id, name, rname, bal, joined, app, shares)
+ VALUES (^(C.intToSql id), ^(C.stringToSql name), ^(C.stringToSql rname), ^(C.intToSql bal),
+ CURRENT_TIMESTAMP, ^(C.intToSql app), ^(C.intToSql shares))`);
id
end
in
ignore (C.dml db ($`UPDATE WebUser SET
name = ^(C.stringToSql (#name user)), rname = ^(C.stringToSql (#rname user)),
- bal = ^(C.intToSql (#bal user)), app = ^(C.intToSql (#app user))
+ bal = ^(C.intToSql (#bal user)), app = ^(C.intToSql (#app user)),
+ shares = ^(C.intToSql (#shares user))
WHERE id = ^(C.intToSql (#id user))`))
end
+fun byPledge () =
+ C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app, shares
+ FROM WebUser
+ WHERE shares > 1
+ ORDER BY shares DESC`)
+
fun deleteUser id =
C.dml (getDb ()) ($`DELETE FROM WebUser WHERE id = ^(C.intToSql id)`)
bal INTEGER NOT NULL,
joined TIMESTAMP NOT NULL,
app INTEGER NOT NULL,
+ shares INTEGER NOT NULL,
FOREIGN KEY (bal) REFERENCES Balance(id) ON DELETE CASCADE,
FOREIGN KEY (app) REFERENCES MemberApp(id) ON DELETE CASCADE);
FOREIGN KEY (usr) REFERENCES WebUser(id) ON DELETE CASCADE);
CREATE VIEW WebUserPaying
- AS SELECT id, name, rname, bal, joined, app
+ AS SELECT id, name, rname, bal, joined, app, shares
FROM WebUser
JOIN (SELECT usr FROM Membership JOIN WebGroup
ON grp = WebGroup.id
- AND WebGroup.name = 'paying')
+ AND WebGroup.name = 'paying') AS bob
ON usr = WebUser.id;
CREATE VIEW WebUserActive
- AS SELECT id, name, rname, bal, joined, app
+ AS SELECT id, name, rname, bal, joined, app, shares
FROM WebUser
LEFT OUTER JOIN (SELECT usr FROM Membership JOIN WebGroup
ON grp = WebGroup.id AND (WebGroup.name IN ('retired', 'phantom'))) AS mem