Commit 1d1e9d10 authored by andrey@lmy004's avatar andrey@lmy004

Reorganize, physically the events code

Unify method naming -> create/update/drop_event
Move class Event_timed to event_timed.h
class Events is in events.h (renamed from event.h)
The implementation is in events.cc (renamed from event.h)
parent 9669d3ae
...@@ -1771,3 +1771,4 @@ vio/viotest.cpp ...@@ -1771,3 +1771,4 @@ vio/viotest.cpp
zlib/*.ds? zlib/*.ds?
zlib/*.vcproj zlib/*.vcproj
libmysqld/event_scheduler.cc libmysqld/event_scheduler.cc
libmysqld/events.cc
...@@ -104,7 +104,7 @@ enum interval_type ...@@ -104,7 +104,7 @@ enum interval_type
INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE, INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND, INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND, INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND,
INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND, INTERVAL_LAST
}; };
C_MODE_END C_MODE_END
......
...@@ -29,7 +29,7 @@ ADD_LIBRARY(mysqldemb emb_qcache.cc libmysqld.c lib_sql.cc ...@@ -29,7 +29,7 @@ ADD_LIBRARY(mysqldemb emb_qcache.cc libmysqld.c lib_sql.cc
../libmysql/libmysql.c ../sql/password.c ../sql-common/client.c ../libmysql/libmysql.c ../sql/password.c ../sql-common/client.c
../sql-common/my_time.c ../sql-common/my_user.c ../sql-common/my_time.c ../sql-common/my_user.c
../sql-common/pack.c ../sql/derror.cc ../sql/event_executor.cc ../sql-common/pack.c ../sql/derror.cc ../sql/event_executor.cc
../sql/event_timed.cc ../sql/event.cc ../sql/discover.cc ../sql/event_timed.cc ../sql/events.cc ../sql/discover.cc
../sql/field_conv.cc ../sql/field.cc ../sql/filesort.cc ../sql/field_conv.cc ../sql/field.cc ../sql/filesort.cc
../sql/gstream.cc ../sql/ha_heap.cc ../sql/ha_myisam.cc ../sql/gstream.cc ../sql/ha_heap.cc ../sql/ha_myisam.cc
../sql/ha_myisammrg.cc ${mysql_se_ha_src} ../sql/ha_myisammrg.cc ${mysql_se_ha_src}
......
...@@ -68,7 +68,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \ ...@@ -68,7 +68,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \ spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \
sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \ sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \
parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \ parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \
event_scheduler.cc event.cc event_timed.cc \ event_scheduler.cc events.cc event_timed.cc \
rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \ rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \
sql_tablespace.cc \ sql_tablespace.cc \
rpl_injector.cc my_user.c partition_info.cc rpl_injector.cc my_user.c partition_info.cc
......
...@@ -52,7 +52,7 @@ ADD_EXECUTABLE(mysqld ../sql-common/client.c derror.cc des_key_file.cc ...@@ -52,7 +52,7 @@ ADD_EXECUTABLE(mysqld ../sql-common/client.c derror.cc des_key_file.cc
sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc
time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.cc time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.cc
rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_timed.cc rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_timed.cc
sql_tablespace.cc event.cc ../sql-common/my_user.c sql_tablespace.cc events.cc ../sql-common/my_user.c
partition_info.cc partition_info.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h ${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
......
...@@ -64,7 +64,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ ...@@ -64,7 +64,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
tztime.h my_decimal.h\ tztime.h my_decimal.h\
sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h \ sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h \
parse_file.h sql_view.h sql_trigger.h \ parse_file.h sql_view.h sql_trigger.h \
sql_array.h sql_cursor.h event.h event_priv.h \ sql_array.h sql_cursor.h events.h events_priv.h \
sql_plugin.h authors.h sql_partition.h \ sql_plugin.h authors.h sql_partition.h \
partition_info.h partition_element.h event_scheduler.h \ partition_info.h partition_element.h event_scheduler.h \
contributors.h contributors.h
...@@ -104,7 +104,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \ ...@@ -104,7 +104,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
tztime.cc my_time.c my_user.c my_decimal.cc\ tztime.cc my_time.c my_user.c my_decimal.cc\
sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.cc \ sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.cc \
sp_cache.cc parse_file.cc sql_trigger.cc \ sp_cache.cc parse_file.cc sql_trigger.cc \
event_scheduler.cc event.cc event_timed.cc \ event_scheduler.cc events.cc event_timed.cc \
sql_plugin.cc sql_binlog.cc \ sql_plugin.cc sql_binlog.cc \
sql_builtin.cc sql_tablespace.cc partition_info.cc sql_builtin.cc sql_tablespace.cc partition_info.cc
......
/* Copyright (C) 2004-2005 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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
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 */
...@@ -14,8 +14,10 @@ ...@@ -14,8 +14,10 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "event_priv.h" #include "mysql_priv.h"
#include "event.h" #include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "event_scheduler.h" #include "event_scheduler.h"
#include "sp_head.h" #include "sp_head.h"
...@@ -46,8 +48,8 @@ ...@@ -46,8 +48,8 @@
The scheduler only manages execution of the events. Their creation, The scheduler only manages execution of the events. Their creation,
alteration and deletion is delegated to other routines found in event.cc . alteration and deletion is delegated to other routines found in event.cc .
These routines interact with the scheduler : These routines interact with the scheduler :
- CREATE EVENT -> Event_scheduler::add_event() - CREATE EVENT -> Event_scheduler::create_event()
- ALTER EVENT -> Event_scheduler::replace_event() - ALTER EVENT -> Event_scheduler::update_event()
- DROP EVENT -> Event_scheduler::drop_event() - DROP EVENT -> Event_scheduler::drop_event()
There is one mutex in the single Event_scheduler object which controls There is one mutex in the single Event_scheduler object which controls
...@@ -298,6 +300,35 @@ class Worker_thread_param ...@@ -298,6 +300,35 @@ class Worker_thread_param
}; };
/*
Compares the execute_at members of 2 Event_timed instances.
Used as callback for the prioritized queue when shifting
elements inside.
SYNOPSIS
event_timed_compare_q()
vptr - not used (set it to NULL)
a - first Event_timed object
b - second Event_timed object
RETURN VALUE
-1 - a->execute_at < b->execute_at
0 - a->execute_at == b->execute_at
1 - a->execute_at > b->execute_at
NOTES
execute_at.second_part is not considered during comparison
*/
static int
event_timed_compare_q(void *vptr, byte* a, byte *b)
{
return my_time_compare(&((Event_timed *)a)->execute_at,
&((Event_timed *)b)->execute_at);
}
/* /*
Prints the stack of infos, warnings, errors from thd to Prints the stack of infos, warnings, errors from thd to
the console so it can be fetched by the logs-into-tables and the console so it can be fetched by the logs-into-tables and
...@@ -740,10 +771,10 @@ Event_scheduler::destroy() ...@@ -740,10 +771,10 @@ Event_scheduler::destroy()
/* /*
Adds an event to the scheduler queue Creates an event in the scheduler queue
SYNOPSIS SYNOPSIS
Event_scheduler::add_event() Event_scheduler::create_event()
et The event to add et The event to add
check_existence Whether to check if already loaded. check_existence Whether to check if already loaded.
...@@ -753,11 +784,11 @@ Event_scheduler::destroy() ...@@ -753,11 +784,11 @@ Event_scheduler::destroy()
*/ */
enum Event_scheduler::enum_error_code enum Event_scheduler::enum_error_code
Event_scheduler::add_event(THD *thd, Event_timed *et, bool check_existence) Event_scheduler::create_event(THD *thd, Event_timed *et, bool check_existence)
{ {
enum enum_error_code res; enum enum_error_code res;
Event_timed *et_new; Event_timed *et_new;
DBUG_ENTER("Event_scheduler::add_event"); DBUG_ENTER("Event_scheduler::create_event");
DBUG_PRINT("enter", ("thd=%p et=%p lock=%p",thd,et,&LOCK_scheduler_data)); DBUG_PRINT("enter", ("thd=%p et=%p lock=%p",thd,et,&LOCK_scheduler_data));
LOCK_SCHEDULER_DATA(); LOCK_SCHEDULER_DATA();
...@@ -859,7 +890,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et) ...@@ -859,7 +890,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et)
/* /*
Replaces an event in the scheduler queue Updates an event from the scheduler queue
SYNOPSIS SYNOPSIS
Event_scheduler::replace_event() Event_scheduler::replace_event()
...@@ -873,14 +904,14 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et) ...@@ -873,14 +904,14 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et)
*/ */
enum Event_scheduler::enum_error_code enum Event_scheduler::enum_error_code
Event_scheduler::replace_event(THD *thd, Event_timed *et, LEX_STRING *new_schema, Event_scheduler::update_event(THD *thd, Event_timed *et, LEX_STRING *new_schema,
LEX_STRING *new_name) LEX_STRING *new_name)
{ {
enum enum_error_code res; enum enum_error_code res;
Event_timed *et_old, *et_new= NULL; Event_timed *et_old, *et_new= NULL;
LEX_STRING old_schema, old_name; LEX_STRING old_schema, old_name;
DBUG_ENTER("Event_scheduler::replace_event"); DBUG_ENTER("Event_scheduler::update_event");
DBUG_PRINT("enter", ("thd=%p et=%p et=[%s.%s] lock=%p", DBUG_PRINT("enter", ("thd=%p et=%p et=[%s.%s] lock=%p",
thd, et, et->dbname.str, et->name.str, &LOCK_scheduler_data)); thd, et, et->dbname.str, et->name.str, &LOCK_scheduler_data));
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
class Event_timed;
class THD; class THD;
typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*); typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*);
...@@ -26,7 +27,6 @@ events_init(); ...@@ -26,7 +27,6 @@ events_init();
void void
events_shutdown(); events_shutdown();
class Event_scheduler class Event_scheduler
{ {
public: public:
...@@ -66,14 +66,15 @@ class Event_scheduler ...@@ -66,14 +66,15 @@ class Event_scheduler
/* Methods for queue management follow */ /* Methods for queue management follow */
enum enum_error_code enum enum_error_code
add_event(THD *thd, Event_timed *et, bool check_existence); create_event(THD *thd, Event_timed *et, bool check_existence);
enum enum_error_code
update_event(THD *thd, Event_timed *et, LEX_STRING *new_schema,
LEX_STRING *new_name);
bool bool
drop_event(THD *thd, Event_timed *et); drop_event(THD *thd, Event_timed *et);
enum enum_error_code
replace_event(THD *thd, Event_timed *et, LEX_STRING *new_schema,
LEX_STRING *new_name);
int int
drop_schema_events(THD *thd, LEX_STRING *schema); drop_schema_events(THD *thd, LEX_STRING *schema);
......
...@@ -15,8 +15,10 @@ ...@@ -15,8 +15,10 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define MYSQL_LEX 1 #define MYSQL_LEX 1
#include "event_priv.h" #include "mysql_priv.h"
#include "event.h" #include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "sp_head.h" #include "sp_head.h"
...@@ -395,6 +397,8 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval) ...@@ -395,6 +397,8 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
break; break;
case INTERVAL_MICROSECOND: case INTERVAL_MICROSECOND:
DBUG_RETURN(EVEX_MICROSECOND_UNSUP); DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
case INTERVAL_LAST:
DBUG_ASSERT(0);
} }
if (interval_tmp.neg || expression > EVEX_MAX_INTERVAL_VALUE) if (interval_tmp.neg || expression > EVEX_MAX_INTERVAL_VALUE)
DBUG_RETURN(EVEX_BAD_PARAMS); DBUG_RETURN(EVEX_BAD_PARAMS);
...@@ -834,6 +838,8 @@ bool get_next_time(TIME *next, TIME *start, TIME *time_now, TIME *last_exec, ...@@ -834,6 +838,8 @@ bool get_next_time(TIME *next, TIME *start, TIME *time_now, TIME *last_exec,
*/ */
DBUG_RETURN(1); DBUG_RETURN(1);
break; break;
case INTERVAL_LAST:
DBUG_ASSERT(0);
} }
DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months)); DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months));
if (seconds) if (seconds)
...@@ -1279,7 +1285,6 @@ Event_timed::update_fields(THD *thd) ...@@ -1279,7 +1285,6 @@ Event_timed::update_fields(THD *thd)
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
extern LEX_STRING interval_type_to_name[];
/* /*
Get SHOW CREATE EVENT as string Get SHOW CREATE EVENT as string
......
...@@ -14,8 +14,10 @@ ...@@ -14,8 +14,10 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "event_priv.h" #include "mysql_priv.h"
#include "event.h" #include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "event_scheduler.h" #include "event_scheduler.h"
#include "sp.h" #include "sp.h"
#include "sp_head.h" #include "sp_head.h"
...@@ -160,35 +162,11 @@ TABLE_FIELD_W_TYPE event_table_fields[Events::FIELD_COUNT] = { ...@@ -160,35 +162,11 @@ TABLE_FIELD_W_TYPE event_table_fields[Events::FIELD_COUNT] = {
}; };
LEX_STRING interval_type_to_name[] = {
{(char *) STRING_WITH_LEN("YEAR")},
{(char *) STRING_WITH_LEN("QUARTER")},
{(char *) STRING_WITH_LEN("MONTH")},
{(char *) STRING_WITH_LEN("DAY")},
{(char *) STRING_WITH_LEN("HOUR")},
{(char *) STRING_WITH_LEN("MINUTE")},
{(char *) STRING_WITH_LEN("WEEK")},
{(char *) STRING_WITH_LEN("SECOND")},
{(char *) STRING_WITH_LEN("MICROSECOND")},
{(char *) STRING_WITH_LEN("YEAR_MONTH")},
{(char *) STRING_WITH_LEN("DAY_HOUR")},
{(char *) STRING_WITH_LEN("DAY_MINUTE")},
{(char *) STRING_WITH_LEN("DAY_SECOND")},
{(char *) STRING_WITH_LEN("HOUR_MINUTE")},
{(char *) STRING_WITH_LEN("HOUR_SECOND")},
{(char *) STRING_WITH_LEN("MINUTE_SECOND")},
{(char *) STRING_WITH_LEN("DAY_MICROSECOND")},
{(char *) STRING_WITH_LEN("HOUR_MICROSECOND")},
{(char *) STRING_WITH_LEN("MINUTE_MICROSECOND")},
{(char *) STRING_WITH_LEN("SECOND_MICROSECOND")}
};
/* /*
Compares 2 LEX strings regarding case. Compares 2 LEX strings regarding case.
SYNOPSIS SYNOPSIS
my_time_compare() sortcmp_lex_string()
s - first LEX_STRING s - first LEX_STRING
t - second LEX_STRING t - second LEX_STRING
...@@ -210,68 +188,6 @@ int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs) ...@@ -210,68 +188,6 @@ int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs)
} }
/*
Compares 2 TIME structures
SYNOPSIS
my_time_compare()
a - first TIME
b - second time
RETURN VALUE
-1 - a < b
0 - a == b
1 - a > b
NOTES
TIME.second_part is not considered during comparison
*/
int
my_time_compare(TIME *a, TIME *b)
{
my_ulonglong a_t= TIME_to_ulonglong_datetime(a);
my_ulonglong b_t= TIME_to_ulonglong_datetime(b);
if (a_t > b_t)
return 1;
else if (a_t < b_t)
return -1;
return 0;
}
/*
Compares the execute_at members of 2 Event_timed instances.
Used as callback for the prioritized queue when shifting
elements inside.
SYNOPSIS
event_timed_compare()
vptr - not used (set it to NULL)
a - first Event_timed object
b - second Event_timed object
RETURNS:
-1 - a->execute_at < b->execute_at
0 - a->execute_at == b->execute_at
1 - a->execute_at > b->execute_at
Notes
execute_at.second_part is not considered during comparison
*/
int
event_timed_compare_q(void *vptr, byte* a, byte *b)
{
return my_time_compare(&((Event_timed *)a)->execute_at,
&((Event_timed *)b)->execute_at);
}
/* /*
Reconstructs interval expression from interval type and expression Reconstructs interval expression from interval type and expression
value that is in form of a value of the smalles entity: value that is in form of a value of the smalles entity:
...@@ -999,7 +915,8 @@ Events::create_event(THD *thd, Event_timed *et, uint create_options, ...@@ -999,7 +915,8 @@ Events::create_event(THD *thd, Event_timed *et, uint create_options,
rows_affected))) rows_affected)))
{ {
Event_scheduler *scheduler= Event_scheduler::get_instance(); Event_scheduler *scheduler= Event_scheduler::get_instance();
if (scheduler->initialized() && (ret= scheduler->add_event(thd, et, true))) if (scheduler->initialized() &&
(ret= scheduler->create_event(thd, et, true)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret); my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
} }
/* No need to close the table, it will be closed in sql_parse::do_command */ /* No need to close the table, it will be closed in sql_parse::do_command */
...@@ -1044,7 +961,7 @@ Events::update_event(THD *thd, Event_timed *et, sp_name *new_name, ...@@ -1044,7 +961,7 @@ Events::update_event(THD *thd, Event_timed *et, sp_name *new_name,
{ {
Event_scheduler *scheduler= Event_scheduler::get_instance(); Event_scheduler *scheduler= Event_scheduler::get_instance();
if (scheduler->initialized() && if (scheduler->initialized() &&
(ret= scheduler->replace_event(thd, et, (ret= scheduler->update_event(thd, et,
new_name? &new_name->m_db: NULL, new_name? &new_name->m_db: NULL,
new_name? &new_name->m_name: NULL))) new_name? &new_name->m_name: NULL)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret); my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
......
...@@ -17,29 +17,6 @@ ...@@ -17,29 +17,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define EVEX_OK 0
#define EVEX_KEY_NOT_FOUND -1
#define EVEX_OPEN_TABLE_FAILED -2
#define EVEX_WRITE_ROW_FAILED -3
#define EVEX_DELETE_ROW_FAILED -4
#define EVEX_GET_FIELD_FAILED -5
#define EVEX_PARSE_ERROR -6
#define EVEX_INTERNAL_ERROR -7
#define EVEX_NO_DB_ERROR -8
#define EVEX_COMPILE_ERROR -19
#define EVEX_GENERAL_ERROR -20
#define EVEX_BAD_IDENTIFIER -21
#define EVEX_BODY_TOO_LONG -22
#define EVEX_BAD_PARAMS -23
#define EVEX_NOT_RUNNING -24
#define EVEX_MICROSECOND_UNSUP -25
#define EVEX_CANT_KILL -26
#define EVENT_EXEC_NO_MORE (1L << 0)
#define EVENT_NOT_USED (1L << 1)
#define EVENT_FREE_WHEN_FINISHED (1L << 2)
class Event_timed; class Event_timed;
class Events class Events
...@@ -117,180 +94,4 @@ class Events ...@@ -117,180 +94,4 @@ class Events
}; };
class sp_head;
class Event_timed
{
Event_timed(const Event_timed &); /* Prevent use of these */
void operator=(Event_timed &);
my_bool in_spawned_thread;
ulong locked_by_thread_id;
my_bool running;
ulong thread_id;
pthread_mutex_t LOCK_running;
pthread_cond_t COND_finished;
bool status_changed;
bool last_executed_changed;
public:
enum enum_status
{
ENABLED = 1,
DISABLED
};
enum enum_on_completion
{
ON_COMPLETION_DROP = 1,
ON_COMPLETION_PRESERVE
};
TIME last_executed;
LEX_STRING dbname;
LEX_STRING name;
LEX_STRING body;
LEX_STRING definer_user;
LEX_STRING definer_host;
LEX_STRING definer;// combination of user and host
LEX_STRING comment;
TIME starts;
TIME ends;
TIME execute_at;
my_bool starts_null;
my_bool ends_null;
my_bool execute_at_null;
longlong expression;
interval_type interval;
ulonglong created;
ulonglong modified;
enum enum_on_completion on_completion;
enum enum_status status;
sp_head *sphead;
ulong sql_mode;
const uchar *body_begin;
bool dropped;
bool free_sphead_on_delete;
uint flags;//all kind of purposes
static void *operator new(size_t size)
{
void *p;
DBUG_ENTER("Event_timed::new(size)");
p= my_malloc(size, MYF(0));
DBUG_PRINT("info", ("alloc_ptr=0x%lx", p));
DBUG_RETURN(p);
}
static void *operator new(size_t size, MEM_ROOT *mem_root)
{ return (void*) alloc_root(mem_root, (uint) size); }
static void operator delete(void *ptr, size_t size)
{
DBUG_ENTER("Event_timed::delete(ptr,size)");
DBUG_PRINT("enter", ("free_ptr=0x%lx", ptr));
TRASH(ptr, size);
my_free((gptr) ptr, MYF(0));
DBUG_VOID_RETURN;
}
static void operator delete(void *ptr, MEM_ROOT *mem_root)
{
/*
Don't free the memory it will be done by the mem_root but
we need to call the destructor because we free other resources
which are not allocated on the root but on the heap, or we
deinit mutexes.
*/
DBUG_ASSERT(0);
}
Event_timed();
~Event_timed();
void
init();
void
deinit_mutexes();
int
init_definer(THD *thd);
int
init_execute_at(THD *thd, Item *expr);
int
init_interval(THD *thd, Item *expr, interval_type new_interval);
void
init_name(THD *thd, sp_name *spn);
int
init_starts(THD *thd, Item *starts);
int
init_ends(THD *thd, Item *ends);
void
init_body(THD *thd);
void
init_comment(THD *thd, LEX_STRING *set_comment);
int
load_from_row(MEM_ROOT *mem_root, TABLE *table);
bool
compute_next_execution_time();
int
drop(THD *thd);
void
mark_last_executed(THD *thd);
bool
update_fields(THD *thd);
int
get_create_event(THD *thd, String *buf);
int
execute(THD *thd, MEM_ROOT *mem_root);
int
compile(THD *thd, MEM_ROOT *mem_root);
bool
is_running();
int
spawn_now(void * (*thread_func)(void*), void *arg);
bool
spawn_thread_finish(THD *thd);
void
free_sp();
bool
has_equal_db(Event_timed *etn);
int
kill_thread(THD *thd);
void
set_thread_id(ulong tid) { thread_id= tid; }
};
#endif /* _EVENT_H_ */ #endif /* _EVENT_H_ */
...@@ -16,9 +16,6 @@ ...@@ -16,9 +16,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysql_priv.h"
#define EVENT_EXEC_STARTED 0 #define EVENT_EXEC_STARTED 0
#define EVENT_EXEC_ALREADY_EXEC 1 #define EVENT_EXEC_ALREADY_EXEC 1
#define EVENT_EXEC_CANT_FORK 2 #define EVENT_EXEC_CANT_FORK 2
...@@ -27,17 +24,13 @@ ...@@ -27,17 +24,13 @@
#define EVEX_NAME_FIELD_LEN 64 #define EVEX_NAME_FIELD_LEN 64
#define EVEX_MAX_INTERVAL_VALUE 2147483647L #define EVEX_MAX_INTERVAL_VALUE 2147483647L
int class Event_timed;
my_time_compare(TIME *a, TIME *b);
int int
evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname, evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname,
const LEX_STRING ev_name, const LEX_STRING ev_name,
TABLE *table); TABLE *table);
int
event_timed_compare_q(void *vptr, byte* a, byte *b);
int int
db_drop_event(THD *thd, Event_timed *et, bool drop_if_exists, db_drop_event(THD *thd, Event_timed *et, bool drop_if_exists,
uint *rows_affected); uint *rows_affected);
......
...@@ -1739,6 +1739,8 @@ bool date_add_interval(TIME *ltime, interval_type int_type, INTERVAL interval); ...@@ -1739,6 +1739,8 @@ bool date_add_interval(TIME *ltime, interval_type int_type, INTERVAL interval);
bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign,
longlong *seconds_out, long *microseconds_out); longlong *seconds_out, long *microseconds_out);
extern LEX_STRING interval_type_to_name[];
extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type, extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type,
const char *format_str, const char *format_str,
uint format_length); uint format_length);
...@@ -1754,6 +1756,7 @@ void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time, ...@@ -1754,6 +1756,7 @@ void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str); String *str);
void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time, void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str); String *str);
int my_time_compare(TIME *a, TIME *b);
int test_if_number(char *str,int *res,bool allow_wildcards); int test_if_number(char *str,int *res,bool allow_wildcards);
void change_byte(byte *,uint,char,char); void change_byte(byte *,uint,char,char);
...@@ -1770,6 +1773,7 @@ void filesort_free_buffers(TABLE *table); ...@@ -1770,6 +1773,7 @@ void filesort_free_buffers(TABLE *table);
void change_double_for_sort(double nr,byte *to); void change_double_for_sort(double nr,byte *to);
double my_double_round(double value, int dec, bool truncate); double my_double_round(double value, int dec, bool truncate);
int get_quick_record(SQL_SELECT *select); int get_quick_record(SQL_SELECT *select);
int calc_weekday(long daynr,bool sunday_first_day_of_week); int calc_weekday(long daynr,bool sunday_first_day_of_week);
uint calc_week(TIME *l_time, uint week_behaviour, uint *year); uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
void find_date(char *pos,uint *vek,uint flag); void find_date(char *pos,uint *vek,uint flag);
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "stacktrace.h" #include "stacktrace.h"
#include "mysqld_suffix.h" #include "mysqld_suffix.h"
#include "mysys_err.h" #include "mysys_err.h"
#include "event.h" #include "events.h"
#include "ha_myisam.h" #include "ha_myisam.h"
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include <mysys_err.h> #include <mysys_err.h>
#include "sp.h" #include "sp.h"
#include "event.h" #include "events.h"
#include <my_dir.h> #include <my_dir.h>
#include <m_ctype.h> #include <m_ctype.h>
#ifdef __WIN__ #ifdef __WIN__
......
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
#include "sp_head.h" #include "sp_head.h"
#include "sp.h" #include "sp.h"
#include "sp_cache.h" #include "sp_cache.h"
#include "event.h" #include "events.h"
#include "event_timed.h"
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
/* /*
......
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
#include "sql_trigger.h" #include "sql_trigger.h"
#include "authors.h" #include "authors.h"
#include "contributors.h" #include "contributors.h"
#include "event.h" #include "events.h"
#include "event_timed.h"
#include <my_dir.h> #include <my_dir.h>
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "sp_pcontext.h" #include "sp_pcontext.h"
#include "sp_rcontext.h" #include "sp_rcontext.h"
#include "sp.h" #include "sp.h"
#include "event.h" #include "event_timed.h"
#include <myisam.h> #include <myisam.h>
#include <myisammrg.h> #include <myisammrg.h>
......
...@@ -24,6 +24,30 @@ ...@@ -24,6 +24,30 @@
/* Some functions to calculate dates */ /* Some functions to calculate dates */
#ifndef TESTTIME #ifndef TESTTIME
LEX_STRING interval_type_to_name[INTERVAL_LAST] = {
{(char *) STRING_WITH_LEN("YEAR")},
{(char *) STRING_WITH_LEN("QUARTER")},
{(char *) STRING_WITH_LEN("MONTH")},
{(char *) STRING_WITH_LEN("DAY")},
{(char *) STRING_WITH_LEN("HOUR")},
{(char *) STRING_WITH_LEN("MINUTE")},
{(char *) STRING_WITH_LEN("WEEK")},
{(char *) STRING_WITH_LEN("SECOND")},
{(char *) STRING_WITH_LEN("MICROSECOND")},
{(char *) STRING_WITH_LEN("YEAR_MONTH")},
{(char *) STRING_WITH_LEN("DAY_HOUR")},
{(char *) STRING_WITH_LEN("DAY_MINUTE")},
{(char *) STRING_WITH_LEN("DAY_SECOND")},
{(char *) STRING_WITH_LEN("HOUR_MINUTE")},
{(char *) STRING_WITH_LEN("HOUR_SECOND")},
{(char *) STRING_WITH_LEN("MINUTE_SECOND")},
{(char *) STRING_WITH_LEN("DAY_MICROSECOND")},
{(char *) STRING_WITH_LEN("HOUR_MICROSECOND")},
{(char *) STRING_WITH_LEN("MINUTE_MICROSECOND")},
{(char *) STRING_WITH_LEN("SECOND_MICROSECOND")}
};
/* Calc weekday from daynr */ /* Calc weekday from daynr */
/* Returns 0 for monday, 1 for tuesday .... */ /* Returns 0 for monday, 1 for tuesday .... */
...@@ -909,4 +933,36 @@ calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, longlong *seconds_out, ...@@ -909,4 +933,36 @@ calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, longlong *seconds_out,
} }
/*
Compares 2 TIME structures
SYNOPSIS
my_time_compare()
a - first TIME
b - second time
RETURN VALUE
-1 - a < b
0 - a == b
1 - a > b
NOTES
TIME.second_part is not considered during comparison
*/
int
my_time_compare(TIME *a, TIME *b)
{
my_ulonglong a_t= TIME_to_ulonglong_datetime(a);
my_ulonglong b_t= TIME_to_ulonglong_datetime(b);
if (a_t > b_t)
return 1;
else if (a_t < b_t)
return -1;
return 0;
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment