diff options
author | Andrei Elkin <andrei.elkin@oracle.com> | 2012-04-21 13:24:39 +0300 |
---|---|---|
committer | Andrei Elkin <andrei.elkin@oracle.com> | 2012-04-21 13:24:39 +0300 |
commit | 14de6de946d78dc2c5674d7d1e27edc170e5de6b (patch) | |
tree | 5f529072426678936974bb7abecd548dc5af7004 /sql/rpl_utility.cc | |
parent | dcb5071b1906d76b4c61d3125ddc7368f3ee8c4f (diff) | |
parent | 49e484c8cd2e362e843bbd5d756422cc7e2686d3 (diff) | |
download | mariadb-git-14de6de946d78dc2c5674d7d1e27edc170e5de6b.tar.gz |
merge bug11754117-45670 fixes from 5.1.
Diffstat (limited to 'sql/rpl_utility.cc')
-rw-r--r-- | sql/rpl_utility.cc | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/sql/rpl_utility.cc b/sql/rpl_utility.cc index 8638d5e3c16..627bad741e8 100644 --- a/sql/rpl_utility.cc +++ b/sql/rpl_utility.cc @@ -18,6 +18,7 @@ #ifndef MYSQL_CLIENT #include "unireg.h" // REQUIRED by later includes #include "rpl_rli.h" +#include "log_event.h" #include "sql_select.h" /** @@ -1056,3 +1057,65 @@ table_def::~table_def() #endif } + +#if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) + +Deferred_log_events::Deferred_log_events(Relay_log_info *rli) : last_added(NULL) +{ + my_init_dynamic_array(&array, sizeof(Log_event *), 32, 16); +} + +Deferred_log_events::~Deferred_log_events() +{ + delete_dynamic(&array); +} + +int Deferred_log_events::add(Log_event *ev) +{ + last_added= ev; + insert_dynamic(&array, (uchar*) &ev); + return 0; +} + +bool Deferred_log_events::is_empty() +{ + return array.elements == 0; +} + +bool Deferred_log_events::execute(Relay_log_info *rli) +{ + bool res= false; + + DBUG_ASSERT(rli->deferred_events_collecting); + + rli->deferred_events_collecting= false; + for (uint i= 0; !res && i < array.elements; i++) + { + Log_event *ev= (* (Log_event **) + dynamic_array_ptr(&array, i)); + res= ev->apply_event(rli); + } + rli->deferred_events_collecting= true; + return res; +} + +void Deferred_log_events::rewind() +{ + /* + Reset preceeding Query log event events which execution was + deferred because of slave side filtering. + */ + if (!is_empty()) + { + for (uint i= 0; i < array.elements; i++) + { + Log_event *ev= *(Log_event **) dynamic_array_ptr(&array, i); + delete ev; + } + if (array.elements > array.max_element) + freeze_size(&array); + reset_dynamic(&array); + } +} + +#endif |