summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorunknown <guilhem@mysql.com>2004-03-18 19:31:06 +0200
committerunknown <guilhem@mysql.com>2004-03-18 19:31:06 +0200
commita068b4a75506a23cc2381394745066e2891e288d (patch)
treef6d687cac6d9b8083a09bc30eff261588dac84e4 /client
parentbffc3339c5dd71fa810ef44c78d3577a7908c6f2 (diff)
parent83e696e61cf55da401d985cc6e14b759f7391820 (diff)
downloadmariadb-git-a068b4a75506a23cc2381394745066e2891e288d.tar.gz
Merge gbichot@213.136.52.20:/home/bk/mysql-4.1
into mysql.com:/home/mysql_src/mysql-4.1 client/mysqlbinlog.cc: Auto merged mysql-test/r/mysqlbinlog.result: Auto merged
Diffstat (limited to 'client')
-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);
}