diff --git a/include/mariadb_rpl.h b/include/mariadb_rpl.h index 3cd63030..96b3aba0 100644 --- a/include/mariadb_rpl.h +++ b/include/mariadb_rpl.h @@ -151,6 +151,7 @@ typedef struct st_mariadb_rpl { unsigned long start_position; uint32_t flags; uint8_t fd_header_len; /* header len from last format description event */ + uint8_t use_checksum; } MARIADB_RPL; /* Event header */ diff --git a/libmariadb/mariadb_rpl.c b/libmariadb/mariadb_rpl.c index c7dacb5c..8d4bf5a0 100644 --- a/libmariadb/mariadb_rpl.c +++ b/libmariadb/mariadb_rpl.c @@ -180,6 +180,12 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN ev= rpl->buffer + EVENT_HEADER_OFS; + if (rpl->use_checksum) + { + rpl_event->checksum= *(ev + rpl_event->event_length - 4); + rpl_event->event_length-= 4; + } + switch(rpl_event->event_type) { case HEARTBEAT_LOG_EVENT: rpl_event->event.heartbeat.timestamp= uint4korr(ev); @@ -202,8 +208,10 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN rpl_event->event.format_description.server_version = (char *)(ev); ev+= 50; rpl_event->event.format_description.timestamp= uint4korr(ev); - ev+= 2; + ev+= 4; rpl->fd_header_len= rpl_event->event.format_description.header_len= (uint8_t)*ev; + ev= rpl->buffer + rpl->buffer_size - 5; + rpl->use_checksum= *ev; break; case QUERY_EVENT: { @@ -301,7 +309,7 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN case ROTATE_EVENT: rpl_event->event.rotate.position= uint8korr(ev); ev+= 8; - len= rpl->buffer + rpl->buffer_size - ev; + len= rpl_event->event_length - rpl->fd_header_len - 8; if (rpl_alloc_string(rpl_event, &rpl_event->event.rotate.filename, ev, len)) goto mem_error; break;