summaryrefslogtreecommitdiff
path: root/sql/rpl_utility.cc
diff options
context:
space:
mode:
authorAndrei Elkin <andrei.elkin@oracle.com>2012-04-21 13:24:39 +0300
committerAndrei Elkin <andrei.elkin@oracle.com>2012-04-21 13:24:39 +0300
commit14de6de946d78dc2c5674d7d1e27edc170e5de6b (patch)
tree5f529072426678936974bb7abecd548dc5af7004 /sql/rpl_utility.cc
parentdcb5071b1906d76b4c61d3125ddc7368f3ee8c4f (diff)
parent49e484c8cd2e362e843bbd5d756422cc7e2686d3 (diff)
downloadmariadb-git-14de6de946d78dc2c5674d7d1e27edc170e5de6b.tar.gz
merge bug11754117-45670 fixes from 5.1.
Diffstat (limited to 'sql/rpl_utility.cc')
-rw-r--r--sql/rpl_utility.cc63
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