summaryrefslogtreecommitdiff
path: root/client/mysqlbinlog.cc
diff options
context:
space:
mode:
authorguilhem@mysql.com <>2004-03-18 19:31:06 +0200
committerguilhem@mysql.com <>2004-03-18 19:31:06 +0200
commit32feac3093354ef3e3f89b3ade549d079ba8e9a7 (patch)
treef6d687cac6d9b8083a09bc30eff261588dac84e4 /client/mysqlbinlog.cc
parent1e0ccbd9b07f62051f8f5910c500932f0caae147 (diff)
parent244304fdbb8f5f2bb33fcd0fa9b22e43634c6668 (diff)
downloadmariadb-git-32feac3093354ef3e3f89b3ade549d079ba8e9a7.tar.gz
Merge gbichot@213.136.52.20:/home/bk/mysql-4.1
into mysql.com:/home/mysql_src/mysql-4.1
Diffstat (limited to 'client/mysqlbinlog.cc')
-rw-r--r--client/mysqlbinlog.cc39
1 files changed, 35 insertions, 4 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index d44b6188f0a..52cdbe09e36 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -652,7 +652,7 @@ static int dump_remote_log_entries(const char* logname)
{
char buf[128];
char last_db[FN_REFLEN+1] = "";
- uint len;
+ uint len, logname_len;
NET* net = &mysql->net;
int old_format;
DBUG_ENTER("dump_remote_log_entries");
@@ -669,10 +669,10 @@ static int dump_remote_log_entries(const char* logname)
}
int4store(buf, position);
int2store(buf + BIN_LOG_HEADER_SIZE, binlog_flags);
- len = (uint) strlen(logname);
+ logname_len = (uint) strlen(logname);
int4store(buf + 6, 0);
- memcpy(buf + 10, logname,len);
- if (simple_command(mysql, COM_BINLOG_DUMP, buf, len + 10, 1))
+ memcpy(buf + 10, logname, logname_len);
+ if (simple_command(mysql, COM_BINLOG_DUMP, buf, logname_len + 10, 1))
{
fprintf(stderr,"Got fatal error sending the log dump command\n");
DBUG_RETURN(1);
@@ -707,6 +707,37 @@ static int dump_remote_log_entries(const char* logname)
Log_event_type type= ev->get_type_code();
if (!old_format || ( type != LOAD_EVENT && type != CREATE_FILE_EVENT))
{
+ /*
+ If this is a Rotate event, maybe it's the end of the requested binlog;
+ in this case we are done (stop transfer).
+ This is suitable for binlogs, not relay logs (but for now we don't read
+ relay logs remotely because the server is not able to do that). If one
+ day we read relay logs remotely, then we will have a problem with the
+ detection below: relay logs contain Rotate events which are about the
+ binlogs, so which would trigger the end-detection below.
+ */
+ if (ev->get_type_code() == ROTATE_EVENT)
+ {
+ Rotate_log_event *rev= (Rotate_log_event *)ev;
+ /*
+ If this is a fake Rotate event, and not about our log, we can stop
+ transfer. If this a real Rotate event (so it's not about our log,
+ it's in our log describing the next log), we print it (because it's
+ part of our log) and then we will stop when we receive the fake one
+ soon.
+ */
+ if (rev->when == 0)
+ {
+ if ((rev->ident_len != logname_len) ||
+ memcmp(rev->new_log_ident, logname, logname_len))
+ DBUG_RETURN(0);
+ /*
+ Otherwise, this is a fake Rotate for our log, at the very beginning
+ for sure. Skip it.
+ */
+ continue;
+ }
+ }
if (process_event(&rec_count,last_db,ev,old_off,old_format))
DBUG_RETURN(1);
}