Skip to content

Commit bfa3b92

Browse files
committed
support enum & set
1 parent 2dafd05 commit bfa3b92

File tree

6 files changed

+34
-11
lines changed

6 files changed

+34
-11
lines changed

src/SciSharp.MySQL.Replication/ColumnMetadata.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ public class ColumnMetadata
1717
/// </summary>
1818
public ColumnType Type { get; set; }
1919

20+
/// <summary>
21+
/// Gets or sets the underlying type of the column.
22+
/// </summary>
23+
public ColumnType? UnderlyingType { get; set; }
24+
2025
/// <summary>
2126
/// Gets or sets the metadata value associated with the column.
2227
/// </summary>

src/SciSharp.MySQL.Replication/Events/EnumTypeTableMetadataInitializer.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,13 @@ private bool IsEnumColumn(ColumnMetadata columnMetadata)
2626
if (columnMetadata.Type != ColumnType.STRING)
2727
return false;
2828

29-
// Len = 1 or 2
30-
return (columnMetadata.MetadataValue & 0xFF) < 3;
29+
var meta0 = columnMetadata.MetadataValue >> 8;
30+
31+
if (meta0 != (int)ColumnType.ENUM)
32+
return false;
33+
34+
columnMetadata.UnderlyingType = ColumnType.ENUM;
35+
return true;
3136
}
3237
}
3338
}

src/SciSharp.MySQL.Replication/Events/RowsEvent.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,9 @@ protected object[] ReadRow(ref SequenceReader<byte> reader, TableMapEvent table,
232232
if (nullColumns.Get(index))
233233
continue;
234234

235-
var typeCode = columnTypes[i];
236235
var columnMetadata = table.Metadata.Columns[i];
237236

238-
cells[index] = ReadCell(ref reader, (ColumnType)typeCode, columnMetadata);
237+
cells[index] = ReadCell(ref reader, (ColumnType)(columnMetadata.UnderlyingType ?? columnMetadata.Type), columnMetadata);
239238
}
240239

241240
return cells;

src/SciSharp.MySQL.Replication/Events/SetTypeTableMetadataInitializer.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,29 @@ public void InitializeMetadata(TableMetadata metadata)
1111

1212
foreach (var column in metadata.Columns)
1313
{
14-
if (column.Type != ColumnType.SET)
14+
if (!IsSetColumn(column))
1515
continue;
1616

1717
column.SetValues = metadata.SetStrValues[setColumnIndex];
1818
setColumnIndex++;
1919
}
2020
}
21+
22+
private bool IsSetColumn(ColumnMetadata columnMetadata)
23+
{
24+
if (columnMetadata.Type == ColumnType.SET)
25+
return true;
26+
27+
if (columnMetadata.Type != ColumnType.STRING)
28+
return false;
29+
30+
var meta0 = columnMetadata.MetadataValue >> 8;
31+
32+
if (meta0 != (int)ColumnType.SET)
33+
return false;
34+
35+
columnMetadata.UnderlyingType = ColumnType.SET;
36+
return true;
37+
}
2138
}
2239
}

src/SciSharp.MySQL.Replication/Events/TableMapEvent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ protected internal override void DecodeBody(ref SequenceReader<byte> reader, obj
114114

115115
foreach (var columnMetadata in Metadata.Columns)
116116
{
117-
var valueTypeIndex = (int)columnMetadata.Type;
117+
var valueTypeIndex = (int) (columnMetadata.UnderlyingType ?? columnMetadata.Type);
118118

119119
if (valueTypeIndex < DataTypes.Length && DataTypes[valueTypeIndex] is IColumnMetadataLoader columnMetadataLoader)
120120
{

src/SciSharp.MySQL.Replication/Types/StringType.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,16 @@ namespace SciSharp.MySQL.Replication.Types
1111
/// <remarks>
1212
/// Handles the reading and conversion of MySQL STRING values.
1313
/// </remarks>
14-
class StringType : EnumType
14+
class StringType : IMySQLDataType
1515
{
1616
/// <summary>
1717
/// Reads a STRING value from the binary log.
1818
/// </summary>
1919
/// <param name="reader">The sequence reader containing the bytes to read.</param>
2020
/// <param name="columnMetadata">Metadata for the column.</param>
2121
/// <returns>A string representing the MySQL STRING value.</returns>
22-
public override object ReadValue(ref SequenceReader<byte> reader, ColumnMetadata columnMetadata)
22+
public object ReadValue(ref SequenceReader<byte> reader, ColumnMetadata columnMetadata)
2323
{
24-
if (columnMetadata.MaxLength < 3)
25-
return base.ReadValue(ref reader, columnMetadata);
26-
2724
return reader.ReadLengthEncodedString();
2825
}
2926
}

0 commit comments

Comments
 (0)