@@ -210,43 +210,83 @@ public Event nextEvent(ByteArrayInputStream inputStream) throws IOException {
210
210
return null ;
211
211
}
212
212
EventHeader eventHeader = eventHeaderDeserializer .deserialize (inputStream );
213
- EventDataDeserializer eventDataDeserializer = getEventDataDeserializer (eventHeader .getEventType ());
214
- if (eventHeader .getEventType () == EventType .FORMAT_DESCRIPTION && formatDescEventDataDeserializer != null ) {
215
- eventDataDeserializer = formatDescEventDataDeserializer ;
216
- checksumLength = 0 ;
217
- } else if (eventHeader .getEventType () == EventType .TABLE_MAP && tableMapEventDataDeserializer != null ) {
218
- eventDataDeserializer = tableMapEventDataDeserializer ;
213
+ EventData eventData ;
214
+ switch (eventHeader .getEventType ()) {
215
+ case FORMAT_DESCRIPTION :
216
+ eventData = deserializeFormatDescriptionEventData (inputStream , eventHeader );
217
+ break ;
218
+ case TABLE_MAP :
219
+ eventData = deserializeTableMapEventData (inputStream , eventHeader );
220
+ break ;
221
+ default :
222
+ EventDataDeserializer eventDataDeserializer = getEventDataDeserializer (eventHeader .getEventType ());
223
+ eventData = deserializeEventData (inputStream , eventHeader , eventDataDeserializer );
219
224
}
220
- EventData eventData = deserializeEventData (inputStream , eventHeader , eventDataDeserializer );
221
- if (eventHeader .getEventType () == EventType .FORMAT_DESCRIPTION ) {
222
- FormatDescriptionEventData formatDescriptionEvent ;
223
- if (eventData instanceof EventDataWrapper ) {
224
- EventDataWrapper eventDataWrapper = (EventDataWrapper ) eventData ;
225
- formatDescriptionEvent = (FormatDescriptionEventData ) eventDataWrapper .getInternal ();
226
- if (formatDescEventDataDeserializer != null ) {
227
- eventData = eventDataWrapper .getExternal ();
225
+ return new Event (eventHeader , eventData );
226
+ }
227
+
228
+ private EventData deserializeFormatDescriptionEventData (ByteArrayInputStream inputStream , EventHeader eventHeader )
229
+ throws EventDataDeserializationException {
230
+ EventDataDeserializer eventDataDeserializer =
231
+ formatDescEventDataDeserializer != null ?
232
+ formatDescEventDataDeserializer :
233
+ getEventDataDeserializer (EventType .FORMAT_DESCRIPTION );
234
+ int eventBodyLength = (int ) eventHeader .getDataLength ();
235
+ EventData eventData ;
236
+ try {
237
+ inputStream .enterBlock (eventBodyLength );
238
+ try {
239
+ eventData = eventDataDeserializer .deserialize (inputStream );
240
+ // https://dev.mysql.com/worklog/task/?id=2540#tabs-2540-4
241
+ // +-----------+------------+-----------+------------------------+----------+
242
+ // | Header | Payload (dataLength) | Checksum Type (1 byte) | Checksum |
243
+ // +-----------+------------+-----------+------------------------+----------+
244
+ // | (eventBodyLength) |
245
+ // +------------------------------------------------------------+
246
+ FormatDescriptionEventData formatDescriptionEvent ;
247
+ if (eventData instanceof EventDataWrapper ) {
248
+ EventDataWrapper eventDataWrapper = (EventDataWrapper ) eventData ;
249
+ formatDescriptionEvent = (FormatDescriptionEventData ) eventDataWrapper .getInternal ();
250
+ if (formatDescEventDataDeserializer != null ) {
251
+ eventData = eventDataWrapper .getExternal ();
252
+ }
253
+ } else {
254
+ formatDescriptionEvent = (FormatDescriptionEventData ) eventData ;
228
255
}
229
- } else {
230
- formatDescriptionEvent = (FormatDescriptionEventData ) eventData ;
231
- }
232
- if (eventHeader .getDataLength () != formatDescriptionEvent .getDataLength ()) {
233
- // -1 byte to compensate for "checksum type" field
234
- checksumLength = (int ) (eventHeader .getDataLength () - formatDescriptionEvent .getDataLength () - 1 );
235
- }
236
- } else if (eventHeader .getEventType () == EventType .TABLE_MAP ) {
237
- TableMapEventData tableMapEvent ;
238
- if (eventData instanceof EventDataWrapper ) {
239
- EventDataWrapper eventDataWrapper = (EventDataWrapper ) eventData ;
240
- tableMapEvent = (TableMapEventData ) eventDataWrapper .getInternal ();
241
- if (tableMapEventDataDeserializer != null ) {
242
- eventData = eventDataWrapper .getExternal ();
256
+ int checksumBlockLength = eventBodyLength - formatDescriptionEvent .getDataLength ();
257
+ if (checksumBlockLength > 0 ) {
258
+ inputStream .skip (inputStream .available () - checksumBlockLength );
259
+ int checksumType = inputStream .read ();
260
+ checksumLength = ChecksumType .byOrdinal (checksumType ).getLength ();
243
261
}
244
- } else {
245
- tableMapEvent = ( TableMapEventData ) eventData ;
262
+ } finally {
263
+ inputStream . skipToTheEndOfTheBlock () ;
246
264
}
247
- tableMapEventByTableId .put (tableMapEvent .getTableId (), tableMapEvent );
265
+ } catch (IOException e ) {
266
+ throw new EventDataDeserializationException (eventHeader , e );
248
267
}
249
- return new Event (eventHeader , eventData );
268
+ return eventData ;
269
+ }
270
+
271
+ public EventData deserializeTableMapEventData (ByteArrayInputStream inputStream , EventHeader eventHeader )
272
+ throws IOException {
273
+ EventDataDeserializer eventDataDeserializer =
274
+ tableMapEventDataDeserializer != null ?
275
+ tableMapEventDataDeserializer :
276
+ getEventDataDeserializer (EventType .TABLE_MAP );
277
+ EventData eventData = deserializeEventData (inputStream , eventHeader , eventDataDeserializer );
278
+ TableMapEventData tableMapEvent ;
279
+ if (eventData instanceof EventDataWrapper ) {
280
+ EventDataWrapper eventDataWrapper = (EventDataWrapper ) eventData ;
281
+ tableMapEvent = (TableMapEventData ) eventDataWrapper .getInternal ();
282
+ if (tableMapEventDataDeserializer != null ) {
283
+ eventData = eventDataWrapper .getExternal ();
284
+ }
285
+ } else {
286
+ tableMapEvent = (TableMapEventData ) eventData ;
287
+ }
288
+ tableMapEventByTableId .put (tableMapEvent .getTableId (), tableMapEvent );
289
+ return eventData ;
250
290
}
251
291
252
292
private EventData deserializeEventData (ByteArrayInputStream inputStream , EventHeader eventHeader ,
0 commit comments