-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathmytap-event.sql
307 lines (238 loc) · 8.34 KB
/
mytap-event.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
-- EVENTS
-- ======
-- >= 5.5
USE tap;
DELIMITER //
/************************************************************************************/
-- Is the scheduler process running
DROP FUNCTION IF EXISTS _scheduler //
CREATE FUNCTION _scheduler()
RETURNS VARCHAR(3)
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(3);
SELECT @@GLOBAL.event_scheduler INTO ret;
RETURN ret;
END //
DROP FUNCTION IF EXISTS scheduler_is //
CREATE FUNCTION scheduler_is(want VARCHAR(3), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = 'Event scheduler process should be correctly set';
END IF;
RETURN eq(_scheduler(), want, description);
END //
DROP FUNCTION IF EXISTS _has_event //
CREATE FUNCTION _has_event(sname VARCHAR(64), ename VARCHAR(64))
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
DECLARE ret BOOLEAN;
SELECT 1 INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN COALESCE(ret, 0);
END //
DROP FUNCTION IF EXISTS has_event //
CREATE FUNCTION has_event(sname VARCHAR(64), ename VARCHAR(64), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should exist');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
RETURN ok(_has_event(sname, ename), description);
END //
DROP FUNCTION IF EXISTS hasnt_event //
CREATE FUNCTION hasnt_event(sname VARCHAR(64), ename VARCHAR(64), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should not exist');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist')));
END IF;
RETURN ok(NOT _has_event(sname, ename), description);
END //
/****************************************************************************/
-- EVENT TYPE
-- { ONE TIME | RECURRING }
DROP FUNCTION IF EXISTS _event_type //
CREATE FUNCTION _event_type(sname VARCHAR(64), ename VARCHAR(64))
RETURNS VARCHAR(9)
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(9);
SELECT `event_type` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END //
DROP FUNCTION IF EXISTS event_type_is //
CREATE FUNCTION event_type_is(sname VARCHAR(64), ename VARCHAR(64), etype VARCHAR(9), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE valid ENUM('ONE TIME','RECURRING');
DECLARE CONTINUE HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Event Type must be { ONE TIME | RECURRING }'));
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Event Type ', qv(etype));
END IF;
SET valid = etype;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_type(sname, ename), etype, description);
END //
/****************************************************************************/
-- INTERVAL_VALUE for recurring events
-- VARCHAR(256) ALLOWS NULL
-- stores a number as a string!
DROP FUNCTION IF EXISTS _event_interval_value //
CREATE FUNCTION _event_interval_value(sname VARCHAR(64), ename VARCHAR(64))
RETURNS VARCHAR(256)
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(256);
SELECT `interval_value` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END //
DROP FUNCTION IF EXISTS event_interval_value_is //
CREATE FUNCTION event_interval_value_is(sname VARCHAR(64), ename VARCHAR(64), ivalue VARCHAR(256), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Interval Value ', qv(ivalue));
END IF;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_interval_value(sname, ename), ivalue, description);
END //
/****************************************************************************/
-- INTERVAL_FIELD for recurring events
-- VARCHAR(18) ALLOWS NULL
-- HOUR, DAY, WEEK etc
DROP FUNCTION IF EXISTS _event_interval_field //
CREATE FUNCTION _event_interval_field(sname VARCHAR(64), ename VARCHAR(64))
RETURNS VARCHAR(18)
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(18);
SELECT `interval_field` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END //
DROP FUNCTION IF EXISTS event_interval_field_is //
CREATE FUNCTION event_interval_field_is(sname VARCHAR(64), ename VARCHAR(64), ifield VARCHAR(18), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE valid ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE ',
'WEEK','SECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE',
'DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND');
DECLARE CONTINUE HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Event Interval must be { YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND }'));
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Interval Field ', qv(ifield));
END IF;
SET valid = ifield;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_interval_field(sname, ename), ifield, description);
END //
/****************************************************************************/
-- STATUS
-- { ENABLED | DISABLED | SLAVESIDE DISABLED }
DROP FUNCTION IF EXISTS _event_status //
CREATE FUNCTION _event_status(sname VARCHAR(64), ename VARCHAR(64))
RETURNS VARCHAR(18)
DETERMINISTIC
BEGIN
DECLARE ret VARCHAR(18);
SELECT `status` INTO ret
FROM `information_schema`.`events`
WHERE `event_schema` = sname
AND `event_name` = ename;
RETURN ret;
END //
DROP FUNCTION IF EXISTS event_status_is //
CREATE FUNCTION event_status_is(sname VARCHAR(64), ename VARCHAR(64), stat VARCHAR(18), description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE valid ENUM('ENABLED','DISABLED','SLAVESIDE DISABLED');
DECLARE CONTINUE HANDLER FOR 1265
RETURN CONCAT(ok(FALSE, description), '\n',
diag('Event Status must be { ENABLED | DISABLED | SLAVESIDE DISABLED }'));
IF description = '' THEN
SET description = CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' should have Status ', qv(stat));
END IF;
SET valid = stat;
IF NOT _has_event(sname,ename) THEN
RETURN CONCAT(ok(FALSE, description), '\n',
diag(CONCAT('Event ', quote_ident(sname), '.', quote_ident(ename),
' does not exist')));
END IF;
RETURN eq(_event_status(sname, ename), stat, description);
END //
/****************************************************************************/
-- Check that the proper events are defined
DROP FUNCTION IF EXISTS events_are //
CREATE FUNCTION events_are(sname VARCHAR(64), want TEXT, description TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
SET @want = want;
SET @have = (SELECT GROUP_CONCAT('`',`event_name`,'`')
FROM `information_schema`.`events`
WHERE `event_schema` = sname);
IF description = '' THEN
SET description = CONCAT('Schema ', quote_ident(sname), ' should have the correct Events');
END IF;
IF NOT _has_schema(sname) THEN
RETURN CONCAT( ok(FALSE, description), '\n',
diag(CONCAT('Schema ', quote_ident(sname), ' does not exist' )));
END IF;
CALL _populate_want(@want);
CALL _populate_have(@have);
SET @missing = (SELECT _missing(@have));
SET @extras = (SELECT _extra(@want));
RETURN _are('events', @extras, @missing, description);
END //
DELIMITER ;