Skip to content

Commit d31d152

Browse files
committed
Replace switch statement with lookup table.
1 parent 122735e commit d31d152

File tree

5 files changed

+17
-84
lines changed

5 files changed

+17
-84
lines changed

src/MySqlConnector/MySqlClient/Results/ResultSet.cs

Lines changed: 1 addition & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -286,71 +286,7 @@ public Type GetFieldType(int ordinal)
286286
if (ordinal < 0 || ordinal > ColumnDefinitions.Length)
287287
throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ColumnDefinitions.Length));
288288

289-
var columnDefinition = ColumnDefinitions[ordinal];
290-
var isUnsigned = (columnDefinition.ColumnFlags & ColumnFlags.Unsigned) != 0;
291-
switch (columnDefinition.ColumnType)
292-
{
293-
case ColumnType.Tiny:
294-
return Connection.TreatTinyAsBoolean && columnDefinition.ColumnLength == 1 ? typeof(bool) :
295-
isUnsigned ? typeof(byte) : typeof(sbyte);
296-
297-
case ColumnType.Int24:
298-
case ColumnType.Long:
299-
return isUnsigned ? typeof(uint) : typeof(int);
300-
301-
case ColumnType.Longlong:
302-
return isUnsigned ? typeof(ulong) : typeof(long);
303-
304-
case ColumnType.Bit:
305-
return typeof(ulong);
306-
307-
case ColumnType.String:
308-
if (!Connection.OldGuids && columnDefinition.ColumnLength / SerializationUtility.GetBytesPerCharacter(columnDefinition.CharacterSet) == 36)
309-
return typeof(Guid);
310-
goto case ColumnType.VarString;
311-
312-
case ColumnType.VarString:
313-
case ColumnType.TinyBlob:
314-
case ColumnType.Blob:
315-
case ColumnType.MediumBlob:
316-
case ColumnType.LongBlob:
317-
return columnDefinition.CharacterSet == CharacterSet.Binary ?
318-
(Connection.OldGuids && columnDefinition.ColumnLength == 16 ? typeof(Guid) : typeof(byte[])) :
319-
typeof(string);
320-
321-
case ColumnType.Json:
322-
return typeof(string);
323-
324-
case ColumnType.Short:
325-
return isUnsigned ? typeof(ushort) : typeof(short);
326-
327-
case ColumnType.Date:
328-
case ColumnType.DateTime:
329-
case ColumnType.Timestamp:
330-
return typeof(DateTime);
331-
332-
case ColumnType.Time:
333-
return typeof(TimeSpan);
334-
335-
case ColumnType.Year:
336-
return typeof(int);
337-
338-
case ColumnType.Float:
339-
return typeof(float);
340-
341-
case ColumnType.Double:
342-
return typeof(double);
343-
344-
case ColumnType.Decimal:
345-
case ColumnType.NewDecimal:
346-
return typeof(decimal);
347-
348-
case ColumnType.Null:
349-
return typeof(object);
350-
351-
default:
352-
throw new NotImplementedException("GetFieldType for {0} is not implemented".FormatInvariant(columnDefinition.ColumnType));
353-
}
289+
return TypeMapper.Mapper.GetColumnMapping(ColumnTypes[ordinal]).DbTypeMapping.ClrType;
354290
}
355291

356292
public int FieldCount => ColumnDefinitions?.Length ?? 0;
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System;
32
using System.Data;
43

54
namespace MySql.Data.MySqlClient.Types
65
{
7-
internal class DbTypeMapping
6+
internal sealed class DbTypeMapping
87
{
9-
public DbTypeMapping(Type clrType, IEnumerable<DbType> dbTypes,
10-
Func<object, object> convert = null)
8+
public DbTypeMapping(Type clrType, DbType[] dbTypes, Func<object, object> convert = null)
119
{
1210
ClrType = clrType;
1311
DbTypes = dbTypes;
1412
m_convert = convert;
1513
}
1614

17-
internal readonly Type ClrType;
18-
internal readonly IEnumerable<DbType> DbTypes;
15+
public Type ClrType { get; }
16+
public DbType[] DbTypes { get; }
1917

20-
internal object DoConversion(object obj)
18+
public object DoConversion(object obj)
2119
{
2220
if (obj.GetType() == ClrType)
2321
return obj;
@@ -26,4 +24,4 @@ internal object DoConversion(object obj)
2624

2725
readonly Func<object, object> m_convert;
2826
}
29-
}
27+
}

src/MySqlConnector/MySqlClient/Types/TypeMapper.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ private TypeMapper()
1919

2020
// boolean
2121
var typeBoolean = AddDbTypeMapping(new DbTypeMapping(typeof(bool), new[] { DbType.Boolean }, convert: o => Convert.ToBoolean(o)));
22-
AddMySqlDbTypeMapping(new ColumnTypeMapping("BIT", typeBoolean, MySqlDbType.Bit));
2322
AddMySqlDbTypeMapping(new ColumnTypeMapping("TINYINT", typeBoolean, MySqlDbType.Bool, unsigned: false, length: 1, simpleDataTypeName: "BOOL"));
2423
AddMySqlDbTypeMapping(new ColumnTypeMapping("TINYINT", typeBoolean, MySqlDbType.Bool, unsigned: true, length: 1));
2524

@@ -42,6 +41,7 @@ private TypeMapper()
4241
AddMySqlDbTypeMapping(new ColumnTypeMapping("INT", typeUint, MySqlDbType.UInt32, unsigned: true));
4342
AddMySqlDbTypeMapping(new ColumnTypeMapping("BIGINT", typeLong, MySqlDbType.Int64, unsigned: false));
4443
AddMySqlDbTypeMapping(new ColumnTypeMapping("BIGINT", typeUlong, MySqlDbType.UInt64, unsigned: true));
44+
AddMySqlDbTypeMapping(new ColumnTypeMapping("BIT", typeUlong, MySqlDbType.Bit));
4545

4646
// decimals
4747
var typeDecimal = AddDbTypeMapping(new DbTypeMapping(typeof(decimal), new[] { DbType.Decimal }, convert: o => Convert.ToDecimal(o)));
@@ -85,13 +85,12 @@ private TypeMapper()
8585
AddMySqlDbTypeMapping(new ColumnTypeMapping("GEOMETRYCOLLECTION", typeBinary, MySqlDbType.Geometry, binary: true));
8686

8787
// date/time
88-
var typeDateTime = AddDbTypeMapping(new DbTypeMapping(typeof(DateTime), new[] { DbType.DateTime, DbType.Date, DbType.DateTime2 }));
88+
var typeDateTime = AddDbTypeMapping(new DbTypeMapping(typeof(DateTime), new[] { DbType.DateTime, DbType.Date, DbType.DateTime2, DbType.DateTimeOffset }));
8989
var typeTime = AddDbTypeMapping(new DbTypeMapping(typeof(TimeSpan), new[] { DbType.Time }));
90-
var typeDateTimeOffset = AddDbTypeMapping(new DbTypeMapping(typeof(DateTimeOffset), new[] { DbType.DateTimeOffset }));
9190
AddMySqlDbTypeMapping(new ColumnTypeMapping("DATETIME", typeDateTime, MySqlDbType.DateTime));
9291
AddMySqlDbTypeMapping(new ColumnTypeMapping("DATE", typeDateTime, MySqlDbType.Date));
9392
AddMySqlDbTypeMapping(new ColumnTypeMapping("TIME", typeTime, MySqlDbType.Time));
94-
AddMySqlDbTypeMapping(new ColumnTypeMapping("TIMESTAMP", typeDateTimeOffset, MySqlDbType.Timestamp));
93+
AddMySqlDbTypeMapping(new ColumnTypeMapping("TIMESTAMP", typeDateTime, MySqlDbType.Timestamp));
9594
AddMySqlDbTypeMapping(new ColumnTypeMapping("YEAR", typeInt, MySqlDbType.Year));
9695

9796
// guid

tests/MySqlConnector.Tests/ConnectionTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void GetSchemaHasDataTypesCollection()
139139
Assert.True(dataTypes.Rows != null);
140140
Assert.True(dataTypes.Rows.Count > 15);
141141
var row1 = String.Join(",", dataTypes.Rows[0].ItemArray);
142-
Assert.Equal("System.Boolean,BIT,3,False", row1);
142+
Assert.Equal("System.Boolean,TINYINT,3,False", row1);
143143
}
144144
}
145145

tests/MySqlConnector.Tests/TypeMapperTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Data;
33
using System.Linq;
44
using MySql.Data.MySqlClient.Types;
@@ -29,8 +29,8 @@ public class TypeMapperTests
2929
[InlineData(typeof(DateTime), DbType.Date)]
3030
[InlineData(typeof(DateTime), DbType.DateTime)]
3131
[InlineData(typeof(DateTime), DbType.DateTime2)]
32+
[InlineData(typeof(DateTime), DbType.DateTimeOffset)]
3233
[InlineData(typeof(TimeSpan), DbType.Time)]
33-
[InlineData(typeof(DateTimeOffset), DbType.DateTimeOffset)]
3434
[InlineData(typeof(Guid), DbType.Guid)]
3535
public void DbTypeMappingTest(Type clrType, DbType dbType)
3636
{
@@ -58,7 +58,7 @@ public void ConversionTest(object original, DbType dbType, object expected)
5858
}
5959

6060
[Theory]
61-
[InlineData("bit", false, 0, DbType.Boolean)]
61+
[InlineData("bit", false, 0, DbType.UInt64)]
6262
[InlineData("tinyint", false, 1, DbType.Boolean)]
6363
[InlineData("tinyint", true, 1, DbType.Boolean)]
6464
[InlineData("tinyint", false, 0, DbType.SByte)]
@@ -99,12 +99,12 @@ public void ConversionTest(object original, DbType dbType, object expected)
9999
[InlineData("datetime", false, 0, DbType.DateTime)]
100100
[InlineData("date", false, 0, DbType.DateTime)] // todo: this should be DbType.Date
101101
[InlineData("time", false, 0, DbType.Time)]
102-
[InlineData("timestamp", false, 0, DbType.DateTimeOffset)]
102+
[InlineData("timestamp", false, 0, DbType.DateTime)]
103103
[InlineData("year", false, 0, DbType.Int32)]
104104
public void ColumnTypeMappingTest(string columnTypeName, bool unsigned, int length, DbType dbType)
105105
{
106106
Assert.Equal(dbType, TypeMapper.Mapper.GetDbTypeMapping(columnTypeName, unsigned, length).DbTypes.FirstOrDefault());
107107
Assert.Equal(dbType, TypeMapper.Mapper.GetDbTypeMapping(columnTypeName.ToUpperInvariant(), unsigned, length).DbTypes.FirstOrDefault());
108108
}
109109
}
110-
}
110+
}

0 commit comments

Comments
 (0)