protected internal override void DecodeBody(ref SequenceReader <byte> reader, object context) { TableID = reader.ReadLong(6); reader.TryReadLittleEndian(out short flags); reader.TryReadLittleEndian(out short extraDataLen); reader.Advance(extraDataLen); IncludedColumnsBeforeUpdate = reader.ReadBitArray((int)reader.ReadLengthEncodedInteger()); IncludedColumns = reader.ReadBitArray((int)reader.ReadLengthEncodedInteger()); TableMapEvent tableMap = null; if (context is ReplicationState repState) { repState.TableMap.TryGetValue(TableID, out tableMap); } if (tableMap == null) { throw new Exception($"The table's metadata was not found: {TableID}."); } Rows = ReadUpdatedRows(ref reader, tableMap, IncludedColumnsBeforeUpdate, IncludedColumns); }
protected override void ReadIncludedColumns(ref SequenceReader <byte> reader) { var columnCount = (int)reader.ReadLengthEncodedInteger(); IncludedColumnsBeforeUpdate = reader.ReadBitArray(columnCount); IncludedColumns = reader.ReadBitArray(columnCount); }
protected internal override void DecodeBody(ref SequenceReader <byte> reader, object context) { TableID = reader.ReadLong(6); reader.Advance(2); // skip flags byte len; reader.TryRead(out len); SchemaName = reader.ReadString(len); reader.TryRead(out len); TableName = reader.ReadString(len); ColumnCount = (int)reader.ReadLengthEncodedInteger(); ColumnTypes = reader.Sequence.Slice(reader.Consumed, ColumnCount).ToArray(); reader.Advance(ColumnCount); reader.ReadLengthEncodedInteger(); ColumnMetadata = ReadColumnMetadata(ref reader, ColumnTypes); NullBitmap = reader.ReadBitArray(ColumnCount); Metadata = ReadTableMetadata(ref reader); if (context is ReplicationState repState) { repState.TableMap[TableID] = this; } }
private void ReadMetadataField(ref SequenceReader <byte> subReader, MetadataFieldType fieldType, TableMetadata metadata, int numericColumnCount) { switch (fieldType) { case MetadataFieldType.SIGNEDNESS: metadata.Signedness = subReader.ReadBitArray(numericColumnCount); break; case MetadataFieldType.DEFAULT_CHARSET: metadata.DefaultCharset = ReadDefaultCharset(ref subReader); break; case MetadataFieldType.COLUMN_CHARSET: metadata.ColumnCharsets = ReadIntegers(ref subReader); break; case MetadataFieldType.COLUMN_NAME: metadata.ColumnNames = ReadStringList(ref subReader); break; case MetadataFieldType.SET_STR_VALUE: metadata.SetStrValues = ReadTypeValues(ref subReader); break; case MetadataFieldType.ENUM_STR_VALUE: metadata.EnumStrValues = ReadTypeValues(ref subReader); break; case MetadataFieldType.GEOMETRY_TYPE: metadata.GeometryTypes = ReadIntegers(ref subReader); break; case MetadataFieldType.SIMPLE_PRIMARY_KEY: metadata.SimplePrimaryKeys = ReadIntegers(ref subReader); break; case MetadataFieldType.PRIMARY_KEY_WITH_PREFIX: metadata.PrimaryKeysWithPrefix = ReadIntegerDictionary(ref subReader); break; case MetadataFieldType.ENUM_AND_SET_DEFAULT_CHARSET: metadata.EnumAndSetDefaultCharset = ReadDefaultCharset(ref subReader); break; case MetadataFieldType.ENUM_AND_SET_COLUMN_CHARSET: metadata.EnumAndSetColumnCharsets = ReadIntegers(ref subReader); break; default: throw new Exception("Unsupported table metadata field type: " + fieldType); } }
public object ReadValue(ref SequenceReader <byte> reader, int meta) { int bitArrayLength = (meta >> 8) * 8 + (meta & 0xFF); return(reader.ReadBitArray(bitArrayLength, false)); }
protected object[] ReadRow(ref SequenceReader <byte> reader, TableMapEvent table, BitArray includedColumns, int columnCount) { var cells = new object[columnCount]; var nullColumns = reader.ReadBitArray(columnCount, true); var columnTypes = table.ColumnTypes; var columnMetadata = table.ColumnMetadata; for (int i = 0, numberOfSkippedColumns = 0; i < columnTypes.Length; i++) { if (!includedColumns.Get(i)) { numberOfSkippedColumns++; continue; } int index = i - numberOfSkippedColumns; if (nullColumns.Get(index)) { continue; } var typeCode = columnTypes[i]; var meta = columnMetadata[i]; var length = 0; var columnType = (ColumnType)typeCode; if (columnType == ColumnType.STRING) { if (meta >= 256) { int meta0 = meta >> 8, meta1 = meta & 0xFF; if ((meta0 & 0x30) != 0x30) { typeCode = (byte)(meta0 | 0x30); columnType = (ColumnType)typeCode; length = meta1 | (((meta0 & 0x30) ^ 0x30) << 4); } else { // mysql-5.6.24 sql/rpl_utility.h enum_field_types (line 278) if (meta0 == (int)ColumnType.ENUM || meta0 == (int)ColumnType.SET) { typeCode = (byte)meta0; columnType = (ColumnType)typeCode; } length = meta1; } } else { length = meta; } } cells[index] = ReadCell(ref reader, columnType, meta, length); } return(cells); }
protected virtual void ReadIncludedColumns(ref SequenceReader <byte> reader) { IncludedColumns = reader.ReadBitArray((int)reader.ReadLengthEncodedInteger()); }
private TableMetadata ReadTableMetadata(ref SequenceReader <byte> reader) { var numericColumnCount = ColumnTypes.Count(c => IsNumberColumn((ColumnType)c)); var metadata = new TableMetadata(); while (reader.Remaining > 0) { reader.TryRead(out byte filedTypeCode); var fieldType = (MetadataFieldType)filedTypeCode; switch (fieldType) { case MetadataFieldType.SIGNEDNESS: metadata.Signedness = reader.ReadBitArray(numericColumnCount); break; case MetadataFieldType.DEFAULT_CHARSET: metadata.DefaultCharset = ReadDefaultCharset(ref reader); break; case MetadataFieldType.COLUMN_CHARSET: metadata.ColumnCharsets = ReadIntegers(ref reader); break; case MetadataFieldType.COLUMN_NAME: metadata.ColumnNames = ReadStringList(ref reader); break; case MetadataFieldType.SET_STR_VALUE: metadata.SetStrValues = ReadTypeValues(ref reader); break; case MetadataFieldType.ENUM_STR_VALUE: metadata.EnumStrValues = ReadTypeValues(ref reader); break; case MetadataFieldType.GEOMETRY_TYPE: metadata.GeometryTypes = ReadIntegers(ref reader); break; case MetadataFieldType.SIMPLE_PRIMARY_KEY: metadata.SimplePrimaryKeys = ReadIntegers(ref reader); break; case MetadataFieldType.PRIMARY_KEY_WITH_PREFIX: metadata.PrimaryKeysWithPrefix = ReadIntegerDictionary(ref reader); break; case MetadataFieldType.ENUM_AND_SET_DEFAULT_CHARSET: metadata.EnumAndSetDefaultCharset = ReadDefaultCharset(ref reader); break; case MetadataFieldType.ENUM_AND_SET_COLUMN_CHARSET: metadata.EnumAndSetColumnCharsets = ReadIntegers(ref reader); break; default: throw new Exception("Unsupported table metadata field type: " + fieldType); } } return(metadata); }