|
30 | 30 | /**
|
31 | 31 | * @author <a href="mailto:[email protected]">Ahmed Abdul Hamid</a>
|
32 | 32 | */
|
33 |
| -public class TableMapEventMetadataDeserializer implements EventDataDeserializer<TableMapEventMetadata> { |
| 33 | +public class TableMapEventMetadataDeserializer { |
34 | 34 |
|
35 |
| - private final int numberOfColumns; |
36 |
| - |
37 |
| - public TableMapEventMetadataDeserializer(int numberOfColumns) { |
38 |
| - this.numberOfColumns = numberOfColumns; |
39 |
| - } |
40 |
| - |
41 |
| - @Override |
42 |
| - public TableMapEventMetadata deserialize(ByteArrayInputStream inputStream) throws IOException { |
43 |
| - |
44 |
| - if (inputStream.available() <= 0) { |
| 35 | + public TableMapEventMetadata deserialize(ByteArrayInputStream inputStream, int numberOfColumns) throws IOException { |
| 36 | + int remainingBytes = inputStream.available(); |
| 37 | + if (remainingBytes <= 0) { |
45 | 38 | return null;
|
46 | 39 | }
|
47 | 40 |
|
48 |
| - TableMapEventMetadata eventData = new TableMapEventMetadata(); |
| 41 | + TableMapEventMetadata result = new TableMapEventMetadata(); |
49 | 42 |
|
50 |
| - while (inputStream.available() > 0) { |
| 43 | + for (; remainingBytes > 0; inputStream.enterBlock(remainingBytes)) { |
51 | 44 | MetadataFieldType fieldType = MetadataFieldType.byCode(inputStream.readInteger(1));
|
52 | 45 | int fieldLength = inputStream.readPackedInteger();
|
53 | 46 |
|
| 47 | + remainingBytes = inputStream.available(); |
| 48 | + inputStream.enterBlock(fieldLength); |
| 49 | + |
54 | 50 | switch (fieldType) {
|
55 | 51 | case SIGNEDNESS:
|
56 |
| - eventData.setSignedness(readSignedness(inputStream, numberOfColumns)); |
| 52 | + result.setSignedness(readSignedness(inputStream, numberOfColumns)); |
57 | 53 | break;
|
58 | 54 | case DEFAULT_CHARSET:
|
59 |
| - eventData.setDefaultCharset(readDefaultCharset(inputStream.readAsNewStream(fieldLength))); |
| 55 | + result.setDefaultCharset(readDefaultCharset(inputStream)); |
60 | 56 | break;
|
61 | 57 | case COLUMN_CHARSET:
|
62 |
| - eventData.setColumnCharsets(readIntegers(inputStream.readAsNewStream(fieldLength))); |
| 58 | + result.setColumnCharsets(readIntegers(inputStream)); |
63 | 59 | break;
|
64 | 60 | case COLUMN_NAME:
|
65 |
| - eventData.setColumnNames(readColumnNames(inputStream.readAsNewStream(fieldLength))); |
| 61 | + result.setColumnNames(readColumnNames(inputStream)); |
66 | 62 | break;
|
67 | 63 | case SET_STR_VALUE:
|
68 |
| - eventData.setSetStrValues(readTypeValues(inputStream.readAsNewStream(fieldLength))); |
| 64 | + result.setSetStrValues(readTypeValues(inputStream)); |
69 | 65 | break;
|
70 | 66 | case ENUM_STR_VALUE:
|
71 |
| - eventData.setEnumStrValues(readTypeValues(inputStream.readAsNewStream(fieldLength))); |
| 67 | + result.setEnumStrValues(readTypeValues(inputStream)); |
72 | 68 | break;
|
73 | 69 | case GEOMETRY_TYPE:
|
74 |
| - eventData.setGeometryTypes(readIntegers(inputStream.readAsNewStream(fieldLength))); |
| 70 | + result.setGeometryTypes(readIntegers(inputStream)); |
75 | 71 | break;
|
76 | 72 | case SIMPLE_PRIMARY_KEY:
|
77 |
| - eventData.setSimplePrimaryKeys(readIntegers(inputStream.readAsNewStream(fieldLength))); |
| 73 | + result.setSimplePrimaryKeys(readIntegers(inputStream)); |
78 | 74 | break;
|
79 | 75 | case PRIMARY_KEY_WITH_PREFIX:
|
80 |
| - eventData.setPrimaryKeysWithPrefix(readIntegerPairs(inputStream.readAsNewStream(fieldLength))); |
| 76 | + result.setPrimaryKeysWithPrefix(readIntegerPairs(inputStream)); |
81 | 77 | break;
|
82 | 78 | case ENUM_AND_SET_DEFAULT_CHARSET:
|
83 |
| - eventData.setEnumAndSetDefaultCharset(readDefaultCharset(inputStream.readAsNewStream(fieldLength))); |
| 79 | + result.setEnumAndSetDefaultCharset(readDefaultCharset(inputStream)); |
84 | 80 | break;
|
85 | 81 | case ENUM_AND_SET_COLUMN_CHARSET:
|
86 |
| - eventData.setEnumAndSetColumnCharsets(readIntegers(inputStream.readAsNewStream(fieldLength))); |
| 82 | + result.setEnumAndSetColumnCharsets(readIntegers(inputStream)); |
87 | 83 | break;
|
88 | 84 | default:
|
| 85 | + // set the remaining bytes before throwing so the main event deserializer |
| 86 | + // knows how many bytes to skip in order to skip this entire Table Map event |
| 87 | + inputStream.enterBlock(remainingBytes); |
89 | 88 | throw new IOException("Unsupported table metadata field type " + fieldType);
|
90 | 89 | }
|
| 90 | + remainingBytes -= fieldLength; |
91 | 91 | }
|
92 |
| - return eventData; |
| 92 | + return result; |
93 | 93 | }
|
94 | 94 |
|
95 | 95 | private static BitSet readSignedness(ByteArrayInputStream inputStream, int length) throws IOException {
|
|
0 commit comments