in dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/TableMapLogEvent.java [405:539]
public TableMapLogEvent(LogHeader header, LogBuffer buffer, FormatDescriptionLogEvent descriptionEvent){
super(header);
final int commonHeaderLen = descriptionEvent.commonHeaderLen;
final int postHeaderLen = descriptionEvent.postHeaderLen[header.type - 1];
/* Read the post-header */
buffer.position(commonHeaderLen + TM_MAPID_OFFSET);
if (postHeaderLen == 6) {
/*
* Master is of an intermediate source tree before 5.1.4. Id is 4
* bytes
*/
tableId = buffer.getUint32();
} else {
// DBUG_ASSERT(post_header_len == TABLE_MAP_HEADER_LEN);
tableId = buffer.getUlong48();
}
// flags = buffer.getUint16();
/* Read the variable part of the event */
buffer.position(commonHeaderLen + postHeaderLen);
dbname = buffer.getName();
buffer.forward(1); /* termination null */
// fixed issue #2714
tblname = buffer.getName();
buffer.forward(1); /* termination null */
// Read column information from buffer
columnCnt = (int) buffer.getPackedLong();
columnInfo = new ColumnInfo[columnCnt];
for (int i = 0; i < columnCnt; i++) {
ColumnInfo info = new ColumnInfo();
info.type = buffer.getUint8();
columnInfo[i] = info;
}
if (buffer.position() < buffer.limit()) {
final int fieldSize = (int) buffer.getPackedLong();
decodeFields(buffer, fieldSize);
nullBits = buffer.getBitmap(columnCnt);
for (int i = 0; i < columnCnt; i++) {
if (nullBits.get(i)) {
columnInfo[i].nullable = true;
}
}
/*
* After null_bits field, there are some new fields for extra
* metadata.
*/
existOptionalMetaData = false;
List<TableMapLogEvent.Pair> defaultCharsetPairs = null;
List<Integer> columnCharsets = null;
while (buffer.hasRemaining()) {
// optional metadata fields
int type = buffer.getUint8();
int len = (int) buffer.getPackedLong();
switch (type) {
case SIGNEDNESS:
parse_signedness(buffer, len);
break;
case DEFAULT_CHARSET:
defaultCharsetPairs = parse_default_charset(buffer, len);
break;
case COLUMN_CHARSET:
columnCharsets = parse_column_charset(buffer, len);
break;
case COLUMN_NAME:
// set @@global.binlog_row_metadata='FULL'
// 主要是补充列名相关信息
existOptionalMetaData = true;
parse_column_name(buffer, len);
break;
case SET_STR_VALUE:
parse_set_str_value(buffer, len, true);
break;
case ENUM_STR_VALUE:
parse_set_str_value(buffer, len, false);
break;
case GEOMETRY_TYPE:
parse_geometry_type(buffer, len);
break;
case SIMPLE_PRIMARY_KEY:
parse_simple_pk(buffer, len);
break;
case PRIMARY_KEY_WITH_PREFIX:
parse_pk_with_prefix(buffer, len);
break;
case ENUM_AND_SET_DEFAULT_CHARSET:
parse_default_charset(buffer, len);
break;
case ENUM_AND_SET_COLUMN_CHARSET:
parse_column_charset(buffer, len);
break;
case COLUMN_VISIBILITY:
parse_column_visibility(buffer, len);
break;
default:
throw new IllegalArgumentException("unknow type : " + type);
}
}
if (existOptionalMetaData) {
int index = 0;
int char_col_index = 0;
for (int i = 0; i < columnCnt; i++) {
int cs = -1;
int type = getRealType(columnInfo[i].type, columnInfo[i].meta);
if (is_character_type(type)) {
if (defaultCharsetPairs != null && !defaultCharsetPairs.isEmpty()) {
if (index < defaultCharsetPairs.size()
&& char_col_index == defaultCharsetPairs.get(index).col_index) {
cs = defaultCharsetPairs.get(index).col_charset;
index++;
} else {
cs = default_charset;
}
char_col_index++;
} else if (columnCharsets != null) {
cs = columnCharsets.get(index);
index++;
}
columnInfo[i].charset = cs;
}
}
}
}
// for (int i = 0; i < columnCnt; i++) {
// System.out.println(columnInfo[i]);
// }
}