You've already forked mariadb-connector-c
mirror of
https://github.com/mariadb-corporation/mariadb-connector-c.git
synced 2025-08-08 14:02:17 +03:00
Add support for ROWS_EVENT V2
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
This commit is contained in:
@@ -245,6 +245,8 @@ struct st_mariadb_rpl_rows_event {
|
|||||||
char *column_update_bitmap;
|
char *column_update_bitmap;
|
||||||
size_t row_data_size;
|
size_t row_data_size;
|
||||||
void *row_data;
|
void *row_data;
|
||||||
|
size_t extra_data_size;
|
||||||
|
void *extra_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct st_mariadb_rpl_heartbeat_event {
|
struct st_mariadb_rpl_heartbeat_event {
|
||||||
|
@@ -348,9 +348,19 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WRITE_ROWS_EVENT_V1:
|
case WRITE_ROWS_EVENT_V1:
|
||||||
|
case WRITE_ROWS_EVENT:
|
||||||
case UPDATE_ROWS_EVENT_V1:
|
case UPDATE_ROWS_EVENT_V1:
|
||||||
|
case UPDATE_ROWS_EVENT:
|
||||||
case DELETE_ROWS_EVENT_V1:
|
case DELETE_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;
|
rpl_event->event.rows.type= rpl_event->event_type - WRITE_ROWS_EVENT_V1;
|
||||||
|
}
|
||||||
if (rpl->fd_header_len == 6)
|
if (rpl->fd_header_len == 6)
|
||||||
{
|
{
|
||||||
rpl_event->event.rows.table_id= uint4korr(ev);
|
rpl_event->event.rows.table_id= uint4korr(ev);
|
||||||
@@ -361,6 +371,25 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
|
|||||||
}
|
}
|
||||||
rpl_event->event.rows.flags= uint2korr(ev);
|
rpl_event->event.rows.flags= uint2korr(ev);
|
||||||
ev+= 2;
|
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);
|
len= rpl_event->event.rows.column_count= mysql_net_field_length(&ev);
|
||||||
if (!len)
|
if (!len)
|
||||||
break;
|
break;
|
||||||
@@ -369,7 +398,8 @@ MARIADB_RPL_EVENT * STDCALL mariadb_rpl_fetch(MARIADB_RPL *rpl, MARIADB_RPL_EVEN
|
|||||||
goto mem_error;
|
goto mem_error;
|
||||||
memcpy(rpl_event->event.rows.column_bitmap, ev, (len + 7) / 8);
|
memcpy(rpl_event->event.rows.column_bitmap, ev, (len + 7) / 8);
|
||||||
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 =
|
if (!(rpl_event->event.rows.column_update_bitmap =
|
||||||
(char *)ma_alloc_root(&rpl_event->memroot, (len + 7) / 8)))
|
(char *)ma_alloc_root(&rpl_event->memroot, (len + 7) / 8)))
|
||||||
|
Reference in New Issue
Block a user