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
zlib/*.ds?
zlib/*.vcproj
libmysqld/event_scheduler.cc
libmysqld/events.cc
......@@ -104,7 +104,7 @@ enum interval_type
INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
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
......
......@@ -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
../sql-common/my_time.c ../sql-common/my_user.c
../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/gstream.cc ../sql/ha_heap.cc ../sql/ha_myisam.cc
../sql/ha_myisammrg.cc ${mysql_se_ha_src}
......
......@@ -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 \
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 \
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 \
sql_tablespace.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
sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc
time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.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
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
......
......@@ -64,7 +64,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
tztime.h my_decimal.h\
sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.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 \
partition_info.h partition_element.h event_scheduler.h \
contributors.h
......@@ -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\
sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.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_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 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "event_priv.h"
#include "event.h"
#include "mysql_priv.h"
#include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "event_scheduler.h"
#include "sp_head.h"
......@@ -46,8 +48,8 @@
The scheduler only manages execution of the events. Their creation,
alteration and deletion is delegated to other routines found in event.cc .
These routines interact with the scheduler :
- CREATE EVENT -> Event_scheduler::add_event()
- ALTER EVENT -> Event_scheduler::replace_event()
- CREATE EVENT -> Event_scheduler::create_event()
- ALTER EVENT -> Event_scheduler::update_event()
- DROP EVENT -> Event_scheduler::drop_event()
There is one mutex in the single Event_scheduler object which controls
......@@ -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
the console so it can be fetched by the logs-into-tables and
......@@ -740,10 +771,10 @@ Event_scheduler::destroy()
/*
Adds an event to the scheduler queue
Creates an event in the scheduler queue
SYNOPSIS
Event_scheduler::add_event()
Event_scheduler::create_event()
et The event to add
check_existence Whether to check if already loaded.
......@@ -753,11 +784,11 @@ Event_scheduler::destroy()
*/
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;
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));
LOCK_SCHEDULER_DATA();
......@@ -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
Event_scheduler::replace_event()
......@@ -873,14 +904,14 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et)
*/
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)
{
enum enum_error_code res;
Event_timed *et_old, *et_new= NULL;
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",
thd, et, et->dbname.str, et->name.str, &LOCK_scheduler_data));
......
......@@ -16,6 +16,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
class Event_timed;
class THD;
typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*);
......@@ -26,7 +27,6 @@ events_init();
void
events_shutdown();
class Event_scheduler
{
public:
......@@ -66,14 +66,15 @@ class Event_scheduler
/* Methods for queue management follow */
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
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
drop_schema_events(THD *thd, LEX_STRING *schema);
......
......@@ -15,8 +15,10 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define MYSQL_LEX 1
#include "event_priv.h"
#include "event.h"
#include "mysql_priv.h"
#include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "sp_head.h"
......@@ -395,6 +397,8 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
break;
case INTERVAL_MICROSECOND:
DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
case INTERVAL_LAST:
DBUG_ASSERT(0);
}
if (interval_tmp.neg || expression > EVEX_MAX_INTERVAL_VALUE)
DBUG_RETURN(EVEX_BAD_PARAMS);
......@@ -834,6 +838,8 @@ bool get_next_time(TIME *next, TIME *start, TIME *time_now, TIME *last_exec,
*/
DBUG_RETURN(1);
break;
case INTERVAL_LAST:
DBUG_ASSERT(0);
}
DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months));
if (seconds)
......@@ -1279,7 +1285,6 @@ Event_timed::update_fields(THD *thd)
DBUG_RETURN(ret);
}
extern LEX_STRING interval_type_to_name[];
/*
Get SHOW CREATE EVENT as string
......
......@@ -14,8 +14,10 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "event_priv.h"
#include "event.h"
#include "mysql_priv.h"
#include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "event_scheduler.h"
#include "sp.h"
#include "sp_head.h"
......@@ -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.
SYNOPSIS
my_time_compare()
sortcmp_lex_string()
s - first LEX_STRING
t - second LEX_STRING
......@@ -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
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,
rows_affected)))
{
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);
}
/* 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,
{
Event_scheduler *scheduler= Event_scheduler::get_instance();
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_name: NULL)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
......
......@@ -17,29 +17,6 @@
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 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_ */
......@@ -16,9 +16,6 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysql_priv.h"
#define EVENT_EXEC_STARTED 0
#define EVENT_EXEC_ALREADY_EXEC 1
#define EVENT_EXEC_CANT_FORK 2
......@@ -27,17 +24,13 @@
#define EVEX_NAME_FIELD_LEN 64
#define EVEX_MAX_INTERVAL_VALUE 2147483647L
int
my_time_compare(TIME *a, TIME *b);
class Event_timed;
int
evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname,
const LEX_STRING ev_name,
TABLE *table);
int
event_timed_compare_q(void *vptr, byte* a, byte *b);
int
db_drop_event(THD *thd, Event_timed *et, bool drop_if_exists,
uint *rows_affected);
......
......@@ -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,
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,
const char *format_str,
uint format_length);
......@@ -1754,6 +1756,7 @@ void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str);
void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str);
int my_time_compare(TIME *a, TIME *b);
int test_if_number(char *str,int *res,bool allow_wildcards);
void change_byte(byte *,uint,char,char);
......@@ -1770,6 +1773,7 @@ void filesort_free_buffers(TABLE *table);
void change_double_for_sort(double nr,byte *to);
double my_double_round(double value, int dec, bool truncate);
int get_quick_record(SQL_SELECT *select);
int calc_weekday(long daynr,bool sunday_first_day_of_week);
uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
void find_date(char *pos,uint *vek,uint flag);
......
......@@ -24,7 +24,7 @@
#include "stacktrace.h"
#include "mysqld_suffix.h"
#include "mysys_err.h"
#include "event.h"
#include "events.h"
#include "ha_myisam.h"
......
......@@ -20,7 +20,7 @@
#include "mysql_priv.h"
#include <mysys_err.h>
#include "sp.h"
#include "event.h"
#include "events.h"
#include <my_dir.h>
#include <m_ctype.h>
#ifdef __WIN__
......
......@@ -26,7 +26,8 @@
#include "sp_head.h"
#include "sp.h"
#include "sp_cache.h"
#include "event.h"
#include "events.h"
#include "event_timed.h"
#ifdef HAVE_OPENSSL
/*
......
......@@ -26,7 +26,8 @@
#include "sql_trigger.h"
#include "authors.h"
#include "contributors.h"
#include "event.h"
#include "events.h"
#include "event_timed.h"
#include <my_dir.h>
#ifdef WITH_PARTITION_STORAGE_ENGINE
......
......@@ -38,7 +38,7 @@
#include "sp_pcontext.h"
#include "sp_rcontext.h"
#include "sp.h"
#include "event.h"
#include "event_timed.h"
#include <myisam.h>
#include <myisammrg.h>
......
......@@ -24,6 +24,30 @@
/* Some functions to calculate dates */
#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 */
/* 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,
}
/*
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
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