Skip to content

Commit

Permalink
Add support for ROWS_EVENT V2
Browse files Browse the repository at this point in the history
ROWS_EVENT V2 has the extra-data field after the flags field in
header.

See also: https://dev.mysql.com/doc/internals/en/rows-event.html
  • Loading branch information
kou committed Nov 19, 2021
1 parent 4fbe383 commit 3d0cc1a
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
2 changes: 2 additions & 0 deletions include/mariadb_rpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,8 @@ struct st_mariadb_rpl_rows_event {
char *column_update_bitmap;
size_t row_data_size;
void *row_data;
size_t extra_data_size;
void *extra_data;
};

struct st_mariadb_rpl_heartbeat_event {
Expand Down
36 changes: 33 additions & 3 deletions libmariadb/mariadb_rpl.c
Original file line number Diff line number Diff line change
Expand Up @@ -348,9 +348,19 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
break;
}
case WRITE_ROWS_EVENT_V1:
case WRITE_ROWS_EVENT:
case UPDATE_ROWS_EVENT_V1:
case UPDATE_ROWS_EVENT:
case DELETE_ROWS_EVENT_V1:
rpl_event->event.rows.type= rpl_event->event_type - WRITE_ROWS_EVENT_V1;
case DELETE_ROWS_EVENT:
if (rpl_event->event_type >= WRITE_ROWS_EVENT)
{
rpl_event->event.rows.type= rpl_event->event_type - WRITE_ROWS_EVENT;
}
else
{
rpl_event->event.rows.type= rpl_event->event_type - WRITE_ROWS_EVENT_V1;
}
if (rpl->fd_header_len == 6)
{
rpl_event->event.rows.table_id= uint4korr(ev);
Expand All @@ -361,6 +371,25 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
}
rpl_event->event.rows.flags= uint2korr(ev);
ev+= 2;
/* ROWS_EVENT V2 has the extra-data field.
See also: https://dev.mysql.com/doc/internals/en/rows-event.html
*/
if (rpl_event->event_type >= WRITE_ROWS_EVENT)
{
rpl_event->event.rows.extra_data_size= uint2korr(ev) - 2;
ev+= 2;
if (rpl_event->event.rows.extra_data_size > 0)
{
if (!(rpl_event->event.rows.extra_data =
(char *)ma_alloc_root(&rpl_event->memroot,
rpl_event->event.rows.extra_data_size)))
goto mem_error;
memcpy(rpl_event->event.rows.extra_data,
ev,
rpl_event->event.rows.extra_data_size);
ev+= rpl_event->event.rows.extra_data_size;
}
}
len= rpl_event->event.rows.column_count= mysql_net_field_length(&ev);
if (!len)
break;
Expand All @@ -369,7 +398,8 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
goto mem_error;
memcpy(rpl_event->event.rows.column_bitmap, ev, (len + 7) / 8);
ev+= (len + 7) / 8;
if (rpl_event->event_type == UPDATE_ROWS_EVENT_V1)
if (rpl_event->event_type == UPDATE_ROWS_EVENT_V1 ||
rpl_event->event_type == UPDATE_ROWS_EVENT)
{
if (!(rpl_event->event.rows.column_update_bitmap =
(char *)ma_alloc_root(&rpl_event->memroot, (len + 7) / 8)))
Expand All @@ -382,7 +412,7 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
{
if (!(rpl_event->event.rows.row_data =
(char *)ma_alloc_root(&rpl_event->memroot, rpl_event->event.rows.row_data_size)))
goto mem_error;
goto mem_error;
memcpy(rpl_event->event.rows.row_data, ev, rpl_event->event.rows.row_data_size);
}
break;
Expand Down

0 comments on commit 3d0cc1a

Please sign in to comment.