2006-06-27 08:48:50 +02:00
|
|
|
#ifndef _EVENT_DB_REPOSITORY_H_
|
|
|
|
#define _EVENT_DB_REPOSITORY_H_
|
|
|
|
/* Copyright (C) 2004-2006 MySQL AB
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2006-12-27 02:23:51 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2006-06-27 08:48:50 +02:00
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
|
2006-07-11 18:28:15 +02:00
|
|
|
#define EVEX_OPEN_TABLE_FAILED -1
|
|
|
|
|
2006-06-28 01:28:03 +02:00
|
|
|
enum enum_events_table_field
|
|
|
|
{
|
|
|
|
ET_FIELD_DB = 0,
|
|
|
|
ET_FIELD_NAME,
|
|
|
|
ET_FIELD_BODY,
|
|
|
|
ET_FIELD_DEFINER,
|
|
|
|
ET_FIELD_EXECUTE_AT,
|
|
|
|
ET_FIELD_INTERVAL_EXPR,
|
|
|
|
ET_FIELD_TRANSIENT_INTERVAL,
|
|
|
|
ET_FIELD_CREATED,
|
|
|
|
ET_FIELD_MODIFIED,
|
|
|
|
ET_FIELD_LAST_EXECUTED,
|
|
|
|
ET_FIELD_STARTS,
|
|
|
|
ET_FIELD_ENDS,
|
|
|
|
ET_FIELD_STATUS,
|
|
|
|
ET_FIELD_ON_COMPLETION,
|
|
|
|
ET_FIELD_SQL_MODE,
|
|
|
|
ET_FIELD_COMMENT,
|
BUG#16420: Events: timestamps become UTC
BUG#26429: SHOW CREATE EVENT is incorrect for an event that
STARTS NOW()
BUG#26431: Impossible to re-create an event from backup if its
STARTS clause is in the past
WL#3698: Events: execution in local time zone
The problem was that local times specified by the user in AT, STARTS
and ENDS of CREATE EVENT/ALTER EVENT statement were converted to UTC,
and the original time zone was forgotten. This way, event scheduler
couldn't honor Daylight Saving Time shifts, and times shown to the
user were also in UTC. Additionally, CREATE EVENT didn't allow times
in the past, thus preventing straightforward event restoration from
old backups.
This patch reworks event scheduler time computations, performing them
in the time zone associated with the event. Also it allows times to
be in the past.
The patch adds time_zone column to mysql.event table.
NOTE: The patch is almost final, but the bug#9953 should be pushed
first.
client/mysqldump.c:
Before every CREATE EVENT, output its time zone.
mysql-test/include/wait_condition.inc:
Add optional $wait_timeout parameter.
mysql-test/lib/init_db.sql:
Add time_zone column.
mysql-test/r/events.result:
Update result.
mysql-test/r/events_bugs.result:
Update result.
mysql-test/r/events_grant.result:
Update result.
mysql-test/r/events_restart_phase1.result:
Update result.
mysql-test/r/events_scheduling.result:
Update result.
mysql-test/r/mysqldump.result:
Update result.
mysql-test/r/ps.result:
Update result.
mysql-test/r/system_mysql_db.result:
Update result.
mysql-test/t/events.test:
Remove STARTS from the result, as it depends on current time.
mysql-test/t/events_bugs.test:
Time in the past is no longer an error.
mysql-test/t/events_restart_phase1.test:
Fill new column 'time_zone' in mysql.event.
mysql-test/t/events_scheduling.test:
Cleanup: disable event scheduler.
scripts/mysql_create_system_tables.sh:
Add new column 'time_zone' to mysql.event.
scripts/mysql_fix_privilege_tables.sql:
Add new column 'time_zone' to mysql.event.
sql/event_data_objects.cc:
The essence of the change is the following:
- for internal times use my_time_t instead of TIME. Assignment and
comparison is done now on plain numbers.
- in init_execute_at(), init_starts(), init_ends() convert given time
to number of seconds since Epoch (aka Unix time, in UTC).
- handle time_zone field loading and storing.
- in get_next_time(), Unix time is converted back to event time zone,
interval is added, and the result is converted to UTC again.
- fix Event_timed::get_create_event() to report STARTS and ENDS.
- before executing the event body we set thread time zone to the
event time zone.
sql/event_data_objects.h:
Add time_zone member to Event_basic class.
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_db_repository.cc:
Add time_zone column handling.
Give a warning and do not create an event if its execution time is in
the past, and ON COMPLETION NOT PRESERVE is set, because such an event
should be dropped by that time. Also, do not allow ALTER EVENT to
set execution time in the past when ON COMPLETION NOT PRESERVE is set.
sql/event_db_repository.h:
Add enum member for new time zone column.
sql/event_queue.cc:
Replace handling of broken down times with simple handling of
my_time_t.
sql/event_queue.h:
Store internal times in my_time_t (number of seconds since Epoch),
rather than in broken down TIME structure.
sql/event_scheduler.cc:
Add TODO comment.
sql/events.cc:
Send time_zone column for SHOW CREATE EVENT.
sql/share/errmsg.txt:
Update error message, and add two more errors.
sql/sql_show.cc:
Add TIME_ZONE column to the output of SHOW EVENTS.
mysql-test/r/events_time_zone.result:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/r/events_time_zone.result
mysql-test/t/events_time_zone.test:
BitKeeper file /home/tomash/src/mysql_ab/mysql-5.1-wl3698/mysql-test/t/events_time_zone.test
2007-03-16 17:31:07 +03:00
|
|
|
ET_FIELD_TIME_ZONE,
|
2006-06-28 01:28:03 +02:00
|
|
|
ET_FIELD_COUNT /* a cool trick to count the number of fields :) */
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2006-06-28 14:22:14 +02:00
|
|
|
int
|
|
|
|
events_table_index_read_for_db(THD *thd, TABLE *schema_table,
|
|
|
|
TABLE *event_table);
|
|
|
|
|
|
|
|
int
|
|
|
|
events_table_scan_all(THD *thd, TABLE *schema_table, TABLE *event_table);
|
|
|
|
|
2006-07-10 13:44:43 +02:00
|
|
|
class Event_basic;
|
WL#3337 (Events new architecture)
This cut No 7 should finish the part of fixing the parsing of the events :
- Event_timed is no more used during parsing. Less problems because it has
a mutex. Event_parse_data class is used during parsing. It is suited only
for this purpose. It's pretty lightweight
- Late checking of data from parsing is being performed. This should solve
the problems of nested events in SP or other events (for the situation
of no nested bodies). Before if an ALTER EVENT was in a SP, then when the
SP was compiled, and not executed, the actual init_xxx methods of Event_timed
were called, which is wrong.
- It could be a side effect of using a specialized class, but test events_stress is
now 25% quicker.
Cut No8 will start splitting Event_scheduler into 2 parts, the QUEUE will be moved
to Event_queue.
mysql-test/r/events.result:
update result
mysql-test/t/events.test:
disabled is actually wrong, should be disable, but because of the early
checking it was never parsed.
sql/event_data_objects.cc:
move add init_xxx methods from Event_timed to Event_parse_data
Event_parse data does not need definer_user and definer_host
in Event_timed::compile() do not use lex.et, well there is no more lex.et :)
sql/event_data_objects.h:
move parsing responsibilities from Event_timed to Event_parse_data
sql/event_db_repository.cc:
No more Event_timed comes from parsing but Event_parse_data
The initialization of Item*-s from parsing is done late, and not
during the actual parsing. This is the right way to go because
if an ALTER EVENT is inside a SP or CREATE EVENT it should not be
executed (initialized) during parsing, as it was done.
sql/event_db_repository.h:
No more Event_timed comes from parsing but Event_parse_data
The initialization of Item*-s from parsing is done late, and not
during the actual parsing. This is the right way to go because
if an ALTER EVENT is inside a SP or CREATE EVENT it should not be
executed (initialized) during parsing, as it was done.
sql/event_scheduler.cc:
No more Event_timed comes from parsing but Event_parse_data
The initialization of Item*-s from parsing is done late, and not
during the actual parsing. This is the right way to go because
if an ALTER EVENT is inside a SP or CREATE EVENT it should not be
executed (initialized) during parsing, as it was done.
sql/event_scheduler.h:
No more Event_timed comes from parsing but Event_parse_data
The initialization of Item*-s from parsing is done late, and not
during the actual parsing. This is the right way to go because
if an ALTER EVENT is inside a SP or CREATE EVENT it should not be
executed (initialized) during parsing, as it was done.
sql/events.cc:
No more Event_timed comes from parsing but Event_parse_data
The initialization of Item*-s from parsing is done late, and not
during the actual parsing. This is the right way to go because
if an ALTER EVENT is inside a SP or CREATE EVENT it should not be
executed (initialized) during parsing, as it was done.
sql/events.h:
No more Event_timed comes from parsing but Event_parse_data
The initialization of Item*-s from parsing is done late, and not
during the actual parsing. This is the right way to go because
if an ALTER EVENT is inside a SP or CREATE EVENT it should not be
executed (initialized) during parsing, as it was done.
sql/sql_lex.cc:
lex->et_compile_phase and lex->et are no more.
Use lex->event_parse_data
sql/sql_lex.h:
lex->et_compile_phase and lex->et are no more.
Use lex->event_parse_data
sql/sql_parse.cc:
lex->et_compile_phase and lex->et are no more.
Use lex->event_parse_data
ACL checks were moved inside the Events subsystem.
Also ending of the transaction is performed only just
before doing disk operation. Therefore only when needed.
sql/sql_yacc.yy:
lex->et and lex->et_parse_phase are no more
Use the specialized for parsing Event_parse_data
2006-06-29 00:42:25 +02:00
|
|
|
class Event_parse_data;
|
2006-06-28 01:28:03 +02:00
|
|
|
|
|
|
|
class Event_db_repository
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Event_db_repository(){}
|
|
|
|
|
2006-08-17 14:22:59 +02:00
|
|
|
bool
|
2006-08-28 10:27:42 +02:00
|
|
|
create_event(THD *thd, Event_parse_data *parse_data, my_bool create_if_not);
|
2006-06-28 01:28:03 +02:00
|
|
|
|
2006-07-11 18:28:15 +02:00
|
|
|
bool
|
|
|
|
update_event(THD *thd, Event_parse_data *parse_data, LEX_STRING *new_dbname,
|
|
|
|
LEX_STRING *new_name);
|
2006-06-28 01:28:03 +02:00
|
|
|
|
2006-07-11 18:28:15 +02:00
|
|
|
bool
|
2006-08-28 10:27:42 +02:00
|
|
|
drop_event(THD *thd, LEX_STRING db, LEX_STRING name, bool drop_if_exists);
|
2006-06-28 01:28:03 +02:00
|
|
|
|
2006-08-17 14:22:59 +02:00
|
|
|
void
|
2006-06-28 01:28:03 +02:00
|
|
|
drop_schema_events(THD *thd, LEX_STRING schema);
|
|
|
|
|
2006-07-11 18:28:15 +02:00
|
|
|
bool
|
|
|
|
find_named_event(THD *thd, LEX_STRING db, LEX_STRING name, TABLE *table);
|
2006-07-05 17:12:50 +02:00
|
|
|
|
2006-07-11 18:28:15 +02:00
|
|
|
bool
|
2006-07-10 13:44:43 +02:00
|
|
|
load_named_event(THD *thd, LEX_STRING dbname, LEX_STRING name, Event_basic *et);
|
2006-06-28 01:28:03 +02:00
|
|
|
|
2006-06-28 14:22:14 +02:00
|
|
|
int
|
|
|
|
open_event_table(THD *thd, enum thr_lock_type lock_type, TABLE **table);
|
|
|
|
|
|
|
|
int
|
2006-08-21 17:16:46 +02:00
|
|
|
fill_schema_events(THD *thd, TABLE_LIST *tables, const char *db);
|
2006-06-28 14:22:14 +02:00
|
|
|
|
|
|
|
private:
|
2006-08-17 14:22:59 +02:00
|
|
|
void
|
2006-06-28 01:28:03 +02:00
|
|
|
drop_events_by_field(THD *thd, enum enum_events_table_field field,
|
|
|
|
LEX_STRING field_value);
|
2006-08-17 14:22:59 +02:00
|
|
|
bool
|
2006-06-28 14:22:14 +02:00
|
|
|
index_read_for_db_for_i_s(THD *thd, TABLE *schema_table, TABLE *event_table,
|
2006-08-21 17:16:46 +02:00
|
|
|
const char *db);
|
2006-06-28 14:22:14 +02:00
|
|
|
|
2006-08-17 14:22:59 +02:00
|
|
|
bool
|
2006-06-28 14:22:14 +02:00
|
|
|
table_scan_all_for_i_s(THD *thd, TABLE *schema_table, TABLE *event_table);
|
2006-06-28 01:28:03 +02:00
|
|
|
|
2006-07-03 11:20:08 +02:00
|
|
|
static bool
|
|
|
|
check_system_tables(THD *thd);
|
|
|
|
|
2006-06-28 01:28:03 +02:00
|
|
|
/* Prevent use of these */
|
|
|
|
Event_db_repository(const Event_db_repository &);
|
|
|
|
void operator=(Event_db_repository &);
|
|
|
|
};
|
2006-06-27 08:48:50 +02:00
|
|
|
|
|
|
|
#endif /* _EVENT_DB_REPOSITORY_H_ */
|