1#ifndef _EVENT_H_
2#define _EVENT_H_
3/* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; version 2 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
17
18/**
19 @defgroup Event_Scheduler Event Scheduler
20 @ingroup Runtime_Environment
21 @{
22
23 @file events.h
24
25 A public interface of Events_Scheduler module.
26*/
27
28#ifdef HAVE_PSI_INTERFACE
29extern PSI_mutex_key key_event_scheduler_LOCK_scheduler_state;
30extern PSI_cond_key key_event_scheduler_COND_state;
31extern PSI_thread_key key_thread_event_scheduler, key_thread_event_worker;
32#endif /* HAVE_PSI_INTERFACE */
33
34/* Always defined, for SHOW PROCESSLIST. */
35extern PSI_stage_info stage_waiting_on_empty_queue;
36extern PSI_stage_info stage_waiting_for_next_activation;
37extern PSI_stage_info stage_waiting_for_scheduler_to_stop;
38
39#include "sql_string.h" /* LEX_CSTRING */
40#include "my_time.h" /* interval_type */
41
42class Event_db_repository;
43class Event_parse_data;
44class Event_queue;
45class Event_scheduler;
46struct TABLE_LIST;
47class THD;
48typedef class Item COND;
49
50int
51sortcmp_lex_string(const LEX_CSTRING *s, const LEX_CSTRING *t,
52 const CHARSET_INFO *cs);
53
54/**
55 @brief A facade to the functionality of the Event Scheduler.
56
57 Every public operation against the scheduler has to be executed via the
58 interface provided by a static method of this class. No instance of this
59 class is ever created and it has no non-static data members.
60
61 The life cycle of the Events module is the following:
62
63 At server start up:
64 init_mutexes() -> init()
65 When the server is running:
66 create_event(), drop_event(), start_or_stop_event_scheduler(), etc
67 At shutdown:
68 deinit(), destroy_mutexes().
69
70 The peculiar initialization and shutdown cycle is an adaptation to the
71 outside server startup/shutdown framework and mimics the rest of MySQL
72 subsystems (ACL, time zone tables, etc).
73*/
74
75class Events
76{
77public:
78 /*
79 the following block is to support --event-scheduler command line option
80 and the @@global.event_scheduler SQL variable.
81 See sys_var.cc
82 */
83 enum enum_opt_event_scheduler { EVENTS_OFF, EVENTS_ON, EVENTS_DISABLED,
84 EVENTS_ORIGINAL };
85 /* Protected using LOCK_global_system_variables only. */
86 static ulong opt_event_scheduler, startup_state;
87 static ulong inited;
88 static bool check_if_system_tables_error();
89 static bool start(int *err_no);
90 static bool stop();
91
92public:
93 /* A hack needed for Event_queue_element */
94 static Event_db_repository *
95 get_db_repository() { return db_repository; }
96
97 static bool init(THD *thd, bool opt_noacl);
98
99 static void
100 deinit();
101
102 static void
103 init_mutexes();
104
105 static void
106 destroy_mutexes();
107
108 static bool
109 create_event(THD *thd, Event_parse_data *parse_data);
110
111 static bool
112 update_event(THD *thd, Event_parse_data *parse_data,
113 LEX_CSTRING *new_dbname, LEX_CSTRING *new_name);
114
115 static bool
116 drop_event(THD *thd, const LEX_CSTRING *dbname, const LEX_CSTRING *name,
117 bool if_exists);
118
119 static void
120 drop_schema_events(THD *thd, const char *db);
121
122 static bool
123 show_create_event(THD *thd, const LEX_CSTRING *dbname,
124 const LEX_CSTRING *name);
125
126 /* Needed for both SHOW CREATE EVENT and INFORMATION_SCHEMA */
127 static int
128 reconstruct_interval_expression(String *buf, interval_type interval,
129 longlong expression);
130
131 static int
132 fill_schema_events(THD *thd, TABLE_LIST *tables, COND * /* cond */);
133
134 static void
135 dump_internal_status();
136
137 static void set_original_state(ulong startup_state_org)
138 {
139 startup_state= startup_state_org;
140 }
141
142private:
143
144 static bool
145 load_events_from_db(THD *thd);
146
147private:
148 static Event_queue *event_queue;
149 static Event_scheduler *scheduler;
150 static Event_db_repository *db_repository;
151
152private:
153 /* Prevent use of these */
154 Events(const Events &);
155 void operator=(Events &);
156};
157
158/**
159 @} (end of group Event Scheduler)
160*/
161
162#endif /* _EVENT_H_ */
163