1 structure Init
:> INIT
=
7 exception Access
of string
10 val urlPrefix
= "http://users.hcoop.net/portal/"
11 val boardEmail
= "board.fake@hcoop.net"
13 fun conn () = C
.conn
"dbname='hcoop'"
16 type user
= {id
: int, name
: string, rname
: string, bal
: int, joined
: C
.timestamp
,
19 val db
= ref (NONE
: C
.conn option
)
20 val user
= ref (NONE
: user option
)
28 fun rowError (tab
, vs
) = raise Fail ("Bad " ^ tab ^
"row: " ^ makeSet fromSql vs
)
30 fun getDb () = valOf (!db
)
32 fun mkUserRow
[id
, name
, rname
, bal
, joined
, app
] =
33 {id
= C
.intFromSql id
, name
= C
.stringFromSql name
, rname
= C
.stringFromSql rname
,
34 bal
= C
.intFromSql bal
, joined
= C
.timestampFromSql joined
,
35 app
= C
.intFromSql app
}
36 | mkUserRow row
= rowError ("user", row
)
46 case Web
.getCgi
"REMOTE_USER" of
47 NONE
=> raise Fail
"Not logged in"
49 (case C
.oneOrNoRows
c ($`SELECT id
, name
, rname
, bal
, joined
, app
51 WHERE name
=^
(C
.stringToSql name
)`
) of
52 NONE
=> raise Fail
"User not found"
58 case C
.oneOrNoRows
c ($`SELECT ipaddr
60 WHERE id
= ^
(C
.intToSql (#app r
))
61 AND ipaddr IS NOT NULL`
) of
63 if Web
.getParam
"agree" = "on" then
64 (case Web
.getCgi
"REMOTE_ADDR" of
65 NONE
=> raise Fail
"REMOTE_ADDR not set"
67 ignore (C
.dml
c ($`UPDATE MemberApp
68 SET ipaddr
= ^
(C
.stringToSql ra
),
69 applied
= CURRENT_TIMESTAMP
70 WHERE id
= ^
(C
.intToSql (#app r
))`
)))
85 fun getUser () = valOf (!user
)
86 fun getUserId () = #
id (getUser ())
87 fun getUserName () = #
name (getUser ())
90 mkUserRow (C
.oneRow (getDb ()) ($`SELECT id
, name
, rname
, bal
, joined
, app
92 WHERE id
= ^
(C
.intToSql id
)`
))
95 C
.map (getDb ()) mkUserRow ($`SELECT id
, name
, rname
, bal
, joined
, app
99 fun nextSeq (db
, seq
) =
100 case C
.oneRow
db ($`SELECT
nextval('^
(seq
)')`
) of
101 [id
] => C
.intFromSql id
102 | _
=> raise Fail
"Bad next sequence val"
104 fun addUser (name
, rname
, bal
, app
) =
107 val id
= nextSeq (db
, "WebUserSeq")
109 C
.dml
db ($`INSERT INTO
WebUser (id
, name
, rname
, bal
, joined
, app
)
110 VALUES (^
(C
.intToSql id
), ^
(C
.stringToSql name
), ^
(C
.stringToSql rname
), ^
(C
.intToSql bal
), CURRENT_TIMESTAMP
, ^
(C
.intToSql app
))`
);
114 fun modUser (user
: user
) =
118 ignore (C
.dml
db ($`UPDATE WebUser SET
119 name
= ^
(C
.stringToSql (#name user
)), rname
= ^
(C
.stringToSql (#rname user
)),
120 bal
= ^
(C
.intToSql (#bal user
)), app
= ^
(C
.intToSql (#app user
))
121 WHERE id
= ^
(C
.intToSql (#id user
))`
))
125 C
.dml (getDb ()) ($`DELETE FROM WebUser WHERE id
= ^
(C
.intToSql id
)`
)
127 fun validUsername name
=
129 andalso CharVector
.all
Char.isAlpha name
131 fun userNameToId name
=
132 case C
.oneOrNoRows (getDb ()) ($`SELECT id FROM WebUser WHERE name
= ^
(C
.stringToSql name
)`
) of
133 SOME
[id
] => SOME (C
.intFromSql id
)
137 case C
.oneRow (getDb ()) "SELECT CURRENT_DATE" of
138 [d
] => C
.stringFromSql d
139 | r
=> rowError ("dateString", r
)
141 fun grandfatherUsers () =
145 fun mkApp
[id
, name
, rname
] =
147 val id
= C
.intFromSql id
148 val name
= C
.stringFromSql name
149 val rname
= C
.stringFromSql rname
151 val aid
= nextSeq (db
, "MemberAppSeq")
153 ignore (C
.dml
db ($`INSERT INTO
MemberApp (id
, name
, rname
, gname
, email
, forward
, uses
, other
,
154 passwd
, status
, applied
, confirmed
, decided
, msg
)
155 VALUES (^
(C
.intToSql aid
), ^
(C
.stringToSql name
), ^
(C
.stringToSql rname
),
156 NULL
, '^name@hcoop
.net
', FALSE
, 'GRANDFATHERED
', 'GRANDFATHERED
',
157 'GRANDFATHERED
', 4, CURRENT_TIMESTAMP
, CURRENT_TIMESTAMP
,
158 CURRENT_TIMESTAMP
, 'GRANDFATHERED
')`
));
159 ignore (C
.dml
db ($`UPDATE WebUser SET app
= ^
(C
.intToSql aid
) WHERE id
= ^
(C
.intToSql id
)`
))
162 C
.app db mkApp
"SELECT id, name, rname FROM WebUser WHERE app IS NULL"