1 structure Qos
:> QOS
= struct
5 type entry
= { kind
: string, kindUrl
: string option
, name
: string, url
: string option
, usr
: int, uname
: string,
6 stamp
: C
.timestamp
, pstamp
: C
.timestamp option
, cstamp
: C
.timestamp option
}
8 fun mkEntryRow
[kind
, kindUrl
, name
, url
, usr
, uname
, stamp
, pstamp
, cstamp
] =
9 {kind
= C
.stringFromSql kind
, kindUrl
= if C
.isNull kindUrl
then NONE
else SOME (C
.stringFromSql kindUrl
),
10 name
= C
.stringFromSql name
, url
= if C
.isNull url
then NONE
else SOME (C
.stringFromSql url
),
11 usr
= C
.intFromSql usr
, uname
= C
.stringFromSql uname
, stamp
= C
.timestampFromSql stamp
,
12 pstamp
= if C
.isNull pstamp
then NONE
else SOME (C
.timestampFromSql pstamp
),
13 cstamp
= if C
.isNull cstamp
then NONE
else SOME (C
.timestampFromSql cstamp
)}
14 | mkEntryRow row
= rowError ("QOS", row
)
18 val usr
= Init
.getUserId ()
21 C
.map db
mkEntryRow ($`SELECT SupCategory
.name
, 'issue?cat
=' || SupCategory
.id
, title
,
22 'issue?cat
=' || SupCategory
.id ||
'&id
=' || SupIssue
.id
, usr
, WebUser
.name
,
23 stamp
, COALESCE(pstamp
, cstamp
), cstamp
24 FROM SupIssue JOIN SupCategory ON SupCategory
.id
= cat
25 JOIN WebUser ON WebUser
.id
= usr
26 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
27 AND (NOT priv OR usr
= ^
(C
.intToSql usr
)
28 OR (SELECT
COUNT(*) FROM Membership WHERE Membership
.usr
= ^
(C
.intToSql usr
)
29 AND (Membership
.grp
= 0 OR Membership
.grp
= SupCategory
.grp
)) > 0)
30 UNION SELECT
'APT package
', NULL
, data
, NULL
, usr
, name
, stamp
, cstamp
, cstamp
31 FROM Apt JOIN WebUser ON WebUser
.id
= usr
32 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
33 UNION SELECT
'Domain
', NULL
, data
, NULL
, usr
, name
, stamp
, cstamp
, cstamp
34 FROM Domain JOIN WebUser ON WebUser
.id
= usr
35 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
36 UNION SELECT
'Mailing list
', NULL
, data
, NULL
, usr
, name
, stamp
, cstamp
, cstamp
37 FROM MailingList JOIN WebUser ON WebUser
.id
= usr
38 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
39 UNION SELECT
'Security
', NULL
, data
, NULL
, usr
, name
, stamp
, cstamp
, cstamp
40 FROM Sec JOIN WebUser ON WebUser
.id
= usr
41 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
45 type grade
= { count
: int, minutes
: int }
46 type grades
= { pending
: grade
, closed
: grade
}
47 type reportCard
= { misc
: grades
,
53 fun mkGradeRow
[count
, minutes
] =
54 {count
= C
.intFromSql count
,
55 minutes
= if C
.isNull minutes
then 0 else C
.intFromSql minutes
}
56 | mkGradeRow row
= rowError ("grade", row
)
62 fun gradeRow s
= mkGradeRow (C
.oneRow db s
)
65 gradeRow ($`SELECT
COUNT(*), AVG(cstamp
- stamp
)
67 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
68 AND cstamp IS NOT NULL`
)
70 {misc
= {pending
= gradeRow
71 ($`SELECT
COUNT(*), AVG(COALESCE(pstamp
, cstamp
) - stamp
)
73 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
74 AND
COALESCE(pstamp
, cstamp
) IS NOT NULL`
),
76 ($`SELECT
COUNT(*), AVG(cstamp
- stamp
)
78 WHERE stamp
>= CURRENT_TIMESTAMP
- interval
'^
(C
.intToSql days
) DAYS
'
79 AND cstamp IS NOT NULL`
)},
81 domain
= default
"Domain",
82 mailingList
= default
"MailingList",