diff options
author | unknown <guilhem@mysql.com> | 2004-03-18 19:31:06 +0200 |
---|---|---|
committer | unknown <guilhem@mysql.com> | 2004-03-18 19:31:06 +0200 |
commit | a068b4a75506a23cc2381394745066e2891e288d (patch) | |
tree | f6d687cac6d9b8083a09bc30eff261588dac84e4 /client | |
parent | bffc3339c5dd71fa810ef44c78d3577a7908c6f2 (diff) | |
parent | 83e696e61cf55da401d985cc6e14b759f7391820 (diff) | |
download | mariadb-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.cc | 39 |
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); } |