public TableMapLogEvent()

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]);
        // }
    }