1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-08 14:02:17 +03:00

Merge pull request #188 from kou/rows-events-v2

Add support for ROWS_EVENT V2
This commit is contained in:
Georg Richter
2021-12-31 17:19:49 +01:00
committed by GitHub
2 changed files with 35 additions and 3 deletions

View File

@@ -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);
@@ -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;
@@ -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)))
@@ -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;