Skip to content

Commit 91677e9

Browse files
authored
Merge pull request shyiko#251 from ahmedahamid/master
Add support for reading optional table metadata
2 parents fe60d76 + fb5fe1b commit 91677e9

File tree

4 files changed

+435
-0
lines changed

4 files changed

+435
-0
lines changed

src/main/java/com/github/shyiko/mysql/binlog/event/TableMapEventData.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class TableMapEventData implements EventData {
2828
private byte[] columnTypes;
2929
private int[] columnMetadata;
3030
private BitSet columnNullability;
31+
private TableMapEventMetadata eventMetadata;
3132

3233
public long getTableId() {
3334
return tableId;
@@ -77,6 +78,10 @@ public void setColumnNullability(BitSet columnNullability) {
7778
this.columnNullability = columnNullability;
7879
}
7980

81+
public TableMapEventMetadata getEventMetadata() { return eventMetadata; }
82+
83+
public void setEventMetadata(TableMapEventMetadata eventMetadata) { this.eventMetadata = eventMetadata; }
84+
8085
@Override
8186
public String toString() {
8287
final StringBuilder sb = new StringBuilder();
@@ -93,6 +98,7 @@ public String toString() {
9398
sb.append(i == 0 ? "" : ", ").append(columnMetadata[i]);
9499
}
95100
sb.append(", columnNullability=").append(columnNullability);
101+
sb.append(", eventMetadata=").append(eventMetadata);
96102
sb.append('}');
97103
return sb.toString();
98104
}
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
/*
2+
* Copyright 2013 Stanley Shyiko
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.github.shyiko.mysql.binlog.event;
17+
18+
import java.io.Serializable;
19+
import java.util.BitSet;
20+
import java.util.List;
21+
import java.util.Map;
22+
23+
/**
24+
* @author <a href="mailto:[email protected]">Ahmed Abdul Hamid</a>
25+
*/
26+
public class TableMapEventMetadata implements EventData {
27+
28+
private BitSet signedness;
29+
private DefaultCharset defaultCharset;
30+
private List<Integer> columnCharsets;
31+
private List<String> columnNames;
32+
private List<String[]> setStrValues;
33+
private List<String[]> enumStrValues;
34+
private List<Integer> geometryTypes;
35+
private List<Integer> simplePrimaryKeys;
36+
private Map<Integer, Integer> primaryKeysWithPrefix;
37+
private DefaultCharset enumAndSetDefaultCharset;
38+
private List<Integer> enumAndSetColumnCharsets;
39+
40+
public BitSet getSignedness() {
41+
return signedness;
42+
}
43+
44+
public void setSignedness(BitSet signedness) {
45+
this.signedness = signedness;
46+
}
47+
48+
public DefaultCharset getDefaultCharset() {
49+
return defaultCharset;
50+
}
51+
52+
public void setDefaultCharset(DefaultCharset defaultCharset) {
53+
this.defaultCharset = defaultCharset;
54+
}
55+
56+
public List<Integer> getColumnCharsets() {
57+
return columnCharsets;
58+
}
59+
60+
public void setColumnCharsets(List<Integer> columnCharsets) {
61+
this.columnCharsets = columnCharsets;
62+
}
63+
64+
public List<String> getColumnNames() {
65+
return columnNames;
66+
}
67+
68+
public void setColumnNames(List<String> columnNames) {
69+
this.columnNames = columnNames;
70+
}
71+
72+
public List<String[]> getSetStrValues() {
73+
return setStrValues;
74+
}
75+
76+
public void setSetStrValues(List<String[]> setStrValues) {
77+
this.setStrValues = setStrValues;
78+
}
79+
80+
public List<String[]> getEnumStrValues() {
81+
return enumStrValues;
82+
}
83+
84+
public void setEnumStrValues(List<String[]> enumStrValues) {
85+
this.enumStrValues = enumStrValues;
86+
}
87+
88+
public List<Integer> getGeometryTypes() {
89+
return geometryTypes;
90+
}
91+
92+
public void setGeometryTypes(List<Integer> geometryTypes) {
93+
this.geometryTypes = geometryTypes;
94+
}
95+
96+
public List<Integer> getSimplePrimaryKeys() {
97+
return simplePrimaryKeys;
98+
}
99+
100+
public void setSimplePrimaryKeys(List<Integer> simplePrimaryKeys) {
101+
this.simplePrimaryKeys = simplePrimaryKeys;
102+
}
103+
104+
public Map<Integer, Integer> getPrimaryKeysWithPrefix() {
105+
return primaryKeysWithPrefix;
106+
}
107+
108+
public void setPrimaryKeysWithPrefix(Map<Integer, Integer> primaryKeysWithPrefix) {
109+
this.primaryKeysWithPrefix = primaryKeysWithPrefix;
110+
}
111+
112+
public DefaultCharset getEnumAndSetDefaultCharset() {
113+
return enumAndSetDefaultCharset;
114+
}
115+
116+
public void setEnumAndSetDefaultCharset(DefaultCharset enumAndSetDefaultCharset) {
117+
this.enumAndSetDefaultCharset = enumAndSetDefaultCharset;
118+
}
119+
120+
public List<Integer> getEnumAndSetColumnCharsets() {
121+
return enumAndSetColumnCharsets;
122+
}
123+
124+
public void setEnumAndSetColumnCharsets(List<Integer> enumAndSetColumnCharsets) {
125+
this.enumAndSetColumnCharsets = enumAndSetColumnCharsets;
126+
}
127+
128+
@Override
129+
public String toString() {
130+
final StringBuilder sb = new StringBuilder();
131+
sb.append("TableMapEventMetadata");
132+
sb.append("{signedness=").append(signedness);
133+
sb.append(", defaultCharset=").append(defaultCharset == null ? "null" : defaultCharset);
134+
135+
sb.append(", columnCharsets=").append(columnCharsets == null ? "null" : "");
136+
appendList(sb, columnCharsets);
137+
138+
sb.append(", columnNames=").append(columnNames == null ? "null" : "");
139+
appendList(sb, columnNames);
140+
141+
sb.append(", setStrValues=").append(setStrValues == null ? "null" : "");
142+
for (int i = 0; setStrValues != null && i < setStrValues.size(); ++i) {
143+
sb.append(i == 0 ? "" : ", ").append(join(", ", setStrValues.get(i)));
144+
}
145+
146+
sb.append(", enumStrValues=").append(enumStrValues == null ? "null" : "");
147+
for (int i = 0; enumStrValues != null && i < enumStrValues.size(); ++i) {
148+
sb.append(i == 0 ? "" : ", ").append(join(", ", enumStrValues.get(i)));
149+
}
150+
151+
sb.append(", geometryTypes=").append(geometryTypes == null ? "null" : "");
152+
appendList(sb, geometryTypes);
153+
154+
sb.append(", simplePrimaryKeys=").append(simplePrimaryKeys == null ? "null" : "");
155+
appendList(sb, simplePrimaryKeys);
156+
157+
sb.append(", primaryKeysWithPrefix=").append(primaryKeysWithPrefix == null ? "null" : "");
158+
appendMap(sb, primaryKeysWithPrefix);
159+
160+
sb.append(", enumAndSetDefaultCharset=").append(enumAndSetDefaultCharset == null ? "null" :
161+
enumAndSetDefaultCharset);
162+
163+
sb.append(", enumAndSetColumnCharsets=").append(enumAndSetColumnCharsets == null ? "null" : "");
164+
appendList(sb, enumAndSetColumnCharsets);
165+
166+
sb.append('}');
167+
return sb.toString();
168+
}
169+
170+
private static String join(CharSequence delimiter, CharSequence... elements) {
171+
if (elements == null || elements.length == 0) {
172+
return "";
173+
}
174+
175+
final StringBuilder sb = new StringBuilder();
176+
sb.append(elements[0]);
177+
178+
for (int i = 1; i < elements.length; ++i) {
179+
sb.append(delimiter).append(elements[i]);
180+
}
181+
return sb.toString();
182+
}
183+
184+
private static void appendList(StringBuilder sb, List<?> elements) {
185+
if (elements == null) {
186+
return;
187+
}
188+
189+
for (int i = 0; i < elements.size(); ++i) {
190+
sb.append(i == 0 ? "" : ", ").append(elements.get(i));
191+
}
192+
}
193+
194+
private static void appendMap(StringBuilder sb, Map<?, ?> map) {
195+
if (map == null) {
196+
return;
197+
}
198+
199+
int entryCount = 0;
200+
for (Map.Entry<?, ?> entry : map.entrySet()) {
201+
sb.append(entryCount++ == 0 ? "" : ", ").append(entry.getKey() + ": " + entry.getValue());
202+
}
203+
}
204+
205+
/**
206+
* @author <a href="mailto:[email protected]">Ahmed Abdul Hamid</a>
207+
*/
208+
public static class DefaultCharset implements Serializable {
209+
private int defaultCharsetCollation;
210+
private Map<Integer, Integer> charsetCollations;
211+
212+
public void setDefaultCharsetCollation(int defaultCharsetCollation) {
213+
this.defaultCharsetCollation = defaultCharsetCollation;
214+
}
215+
216+
public int getDefaultCharsetCollation() {
217+
return defaultCharsetCollation;
218+
}
219+
220+
public void setCharsetCollations(Map<Integer, Integer> charsetCollations) {
221+
this.charsetCollations = charsetCollations;
222+
}
223+
224+
public Map<Integer, Integer> getCharsetCollations() {
225+
return charsetCollations;
226+
}
227+
228+
@Override
229+
public String toString() {
230+
final StringBuilder sb = new StringBuilder();
231+
sb.append(defaultCharsetCollation);
232+
sb.append(", charsetCollations=") .append(charsetCollations == null ? "null" : "");
233+
appendMap(sb, charsetCollations);
234+
return sb.toString();
235+
}
236+
}
237+
}

src/main/java/com/github/shyiko/mysql/binlog/event/deserialization/TableMapEventDataDeserializer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
*/
2626
public class TableMapEventDataDeserializer implements EventDataDeserializer<TableMapEventData> {
2727

28+
private final TableMapEventMetadataDeserializer metadataDeserializer = new TableMapEventMetadataDeserializer();
29+
2830
@Override
2931
public TableMapEventData deserialize(ByteArrayInputStream inputStream) throws IOException {
3032
TableMapEventData eventData = new TableMapEventData();
@@ -38,6 +40,8 @@ public TableMapEventData deserialize(ByteArrayInputStream inputStream) throws IO
3840
inputStream.readPackedInteger(); // metadata length
3941
eventData.setColumnMetadata(readMetadata(inputStream, eventData.getColumnTypes()));
4042
eventData.setColumnNullability(inputStream.readBitSet(numberOfColumns, true));
43+
eventData.setEventMetadata(metadataDeserializer.deserialize(
44+
new ByteArrayInputStream(inputStream.read(inputStream.available())), numberOfColumns));
4145
return eventData;
4246
}
4347

0 commit comments

Comments
 (0)