1 structure Init
:> INIT
=
7 exception Access
of string
9 val urlPrefix
= "http://users.hcoop.net/portal/"
10 val boardEmail
= "board.fake@hcoop.net"
12 fun conn () = C
.conn
"dbname='hcoop'"
15 type user
= {id
: int, name
: string, rname
: string, bal
: int, joined
: C
.timestamp
}
17 val db
= ref (NONE
: C
.conn option
)
18 val user
= ref (NONE
: user option
)
26 fun rowError (tab
, vs
) = raise Fail ("Bad " ^ tab ^
"row: " ^ makeSet fromSql vs
)
28 fun getDb () = valOf (!db
)
30 fun mkUserRow
[id
, name
, rname
, bal
, joined
] =
31 {id
= C
.intFromSql id
, name
= C
.stringFromSql name
, rname
= C
.stringFromSql rname
,
32 bal
= C
.intFromSql bal
, joined
= C
.timestampFromSql joined
}
33 | mkUserRow row
= rowError ("user", row
)
42 case Web
.getCgi
"REMOTE_USER" of
43 NONE
=> raise Fail
"Not logged in"
45 (case C
.oneOrNoRows
c ($`SELECT id
, name
, rname
, bal
, joined
47 WHERE name
=^
(C
.stringToSql name
)`
) of
48 NONE
=> raise Fail
"User not found"
49 | SOME r
=> user
:= SOME (mkUserRow r
));
61 fun getUser () = valOf (!user
)
62 fun getUserId () = #
id (getUser ())
63 fun getUserName () = #
name (getUser ())
66 mkUserRow (C
.oneRow (getDb ()) ($`SELECT id
, name
, rname
, bal
, joined
68 WHERE id
= ^
(C
.intToSql id
)`
))
71 C
.map (getDb ()) mkUserRow ($`SELECT id
, name
, rname
, bal
, joined
75 fun nextSeq (db
, seq
) =
76 case C
.oneRow
db ($`SELECT
nextval('^
(seq
)')`
) of
77 [id
] => C
.intFromSql id
78 | _
=> raise Fail
"Bad next sequence val"
80 fun addUser (name
, rname
, bal
) =
83 val id
= nextSeq (db
, "WebUserSeq")
85 C
.dml
db ($`INSERT INTO
WebUser (id
, name
, rname
, bal
, joined
)
86 VALUES (^
(C
.intToSql id
), ^
(C
.stringToSql name
), ^
(C
.stringToSql rname
), ^
(C
.intToSql bal
), CURRENT_TIMESTAMP
)`
);
90 fun modUser (user
: user
) =
94 ignore (C
.dml
db ($`UPDATE WebUser SET
95 name
= ^
(C
.stringToSql (#name user
)), rname
= ^
(C
.stringToSql (#rname user
)),
96 bal
= ^
(C
.intToSql (#bal user
))
97 WHERE id
= ^
(C
.intToSql (#id user
))`
))
101 C
.dml (getDb ()) ($`DELETE FROM WebUser WHERE id
= ^
(C
.intToSql id
)`
)
103 fun validUsername name
=
105 andalso CharVector
.all
Char.isAlpha name
107 fun userNameToId name
=
108 case C
.oneOrNoRows (getDb ()) ($`SELECT id FROM WebUser WHERE name
= ^
(C
.stringToSql name
)`
) of
109 SOME
[id
] => SOME (C
.intFromSql id
)
113 case C
.oneRow (getDb ()) "SELECT CURRENT_DATE" of
114 [d
] => C
.stringFromSql d
115 | r
=> rowError ("dateString", r
)