Skip to content

Commit 122735e

Browse files
committed
Replace large switch statement with lookup table.
1 parent 9673c0f commit 122735e

File tree

5 files changed

+107
-185
lines changed

5 files changed

+107
-185
lines changed

src/MySqlConnector/MySqlClient/MySqlConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ public override System.Data.DataTable GetSchema(string collectionName, string[]
257257
var dbType = dbTypeMap.DbTypes.FirstOrDefault();
258258
dt.Rows.Add(new object[] {
259259
dbTypeMap.ClrType.FullName,
260-
map.ColumnTypeName,
260+
map.DataTypeName,
261261
(int)dbType,
262262
map.Unsigned
263263
});

src/MySqlConnector/MySqlClient/Results/ResultSet.cs

Lines changed: 4 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -275,97 +275,10 @@ public string GetDataTypeName(int ordinal)
275275
if (ordinal < 0 || ordinal > ColumnDefinitions.Length)
276276
throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ColumnDefinitions.Length));
277277

278-
switch (ColumnTypes[ordinal])
279-
{
280-
case MySqlDbType.Bool:
281-
return "BOOL";
282-
283-
case MySqlDbType.UByte:
284-
case MySqlDbType.Byte:
285-
return "TINYINT";
286-
287-
case MySqlDbType.UInt16:
288-
case MySqlDbType.Int16:
289-
return "SMALLINT";
290-
291-
case MySqlDbType.UInt24:
292-
case MySqlDbType.Int24:
293-
return "MEDIUMINT";
294-
295-
case MySqlDbType.UInt32:
296-
case MySqlDbType.Int32:
297-
return "INT";
298-
299-
case MySqlDbType.UInt64:
300-
case MySqlDbType.Int64:
301-
return "BIGINT";
302-
303-
case MySqlDbType.Bit:
304-
return "BIT";
305-
306-
case MySqlDbType.Enum:
307-
return "ENUM";
308-
309-
case MySqlDbType.Set:
310-
return "SET";
311-
312-
case MySqlDbType.Guid:
313-
return "CHAR(36)";
314-
315-
case MySqlDbType.String:
316-
var columnDefinition = ColumnDefinitions[ordinal];
317-
return string.Format(CultureInfo.InvariantCulture, "CHAR({0})", columnDefinition.ColumnLength / SerializationUtility.GetBytesPerCharacter(columnDefinition.CharacterSet));
318-
319-
case MySqlDbType.VarString:
320-
case MySqlDbType.TinyText:
321-
case MySqlDbType.Text:
322-
case MySqlDbType.MediumText:
323-
case MySqlDbType.LongText:
324-
return "VARCHAR";
325-
326-
case MySqlDbType.Binary:
327-
case MySqlDbType.VarBinary:
328-
case MySqlDbType.TinyBlob:
329-
case MySqlDbType.Blob:
330-
case MySqlDbType.MediumBlob:
331-
case MySqlDbType.LongBlob:
332-
return "BLOB";
333-
334-
case MySqlDbType.Date:
335-
return "DATE";
336-
337-
case MySqlDbType.DateTime:
338-
return "DATETIME";
339-
340-
case MySqlDbType.Timestamp:
341-
return "TIMESTAMP";
342-
343-
case MySqlDbType.Time:
344-
return "TIME";
345-
346-
case MySqlDbType.Year:
347-
return "YEAR";
348-
349-
case MySqlDbType.Float:
350-
return "FLOAT";
351-
352-
case MySqlDbType.Double:
353-
return "DOUBLE";
354-
355-
case MySqlDbType.Decimal:
356-
case MySqlDbType.NewDecimal:
357-
return "DECIMAL";
358-
359-
case MySqlDbType.JSON:
360-
return "JSON";
361-
362-
case MySqlDbType.Null:
363-
// not a valid data type name, but only happens when there is no way to infer the type of the column, e.g., "SELECT NULL;"
364-
return "NULL";
365-
366-
default:
367-
throw new NotImplementedException("GetDataTypeName for {0} is not implemented".FormatInvariant(ColumnTypes[ordinal]));
368-
}
278+
var mySqlDbType = ColumnTypes[ordinal];
279+
if (mySqlDbType == MySqlDbType.String)
280+
return string.Format(CultureInfo.InvariantCulture, "CHAR({0})", ColumnDefinitions[ordinal].ColumnLength / SerializationUtility.GetBytesPerCharacter(ColumnDefinitions[ordinal].CharacterSet));
281+
return TypeMapper.Mapper.GetColumnMapping(mySqlDbType).SimpleDataTypeName;
369282
}
370283

371284
public Type GetFieldType(int ordinal)
Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,28 @@
1-
using System.Collections.Generic;
2-
using MySql.Data.Serialization;
3-
41
namespace MySql.Data.MySqlClient.Types
52
{
6-
internal class ColumnTypeMapping
3+
internal sealed class ColumnTypeMapping
74
{
8-
internal static string CreateLookupKey(string columnTypeName, bool unsigned, int length)
9-
{
10-
return columnTypeName.Trim().ToLowerInvariant()
11-
+ "|" + (unsigned ? "u" : "s")
12-
+ "|" + length;
13-
}
5+
public static string CreateLookupKey(string columnTypeName, bool isUnsigned, int length) => $"{columnTypeName}|{(isUnsigned ? "u" : "s")}|{length}";
146

15-
public ColumnTypeMapping(string columnTypeName, DbTypeMapping dbTypeMapping, IEnumerable<ColumnType> columnTypes,
16-
bool unsigned=false,
17-
bool binary=false,
18-
int length=0
19-
)
7+
public ColumnTypeMapping(string dataTypeName, DbTypeMapping dbTypeMapping, MySqlDbType mySqlDbType, bool unsigned = false, bool binary = false, int length = 0, string simpleDataTypeName = null)
208
{
21-
ColumnTypeName = columnTypeName;
9+
DataTypeName = dataTypeName;
10+
SimpleDataTypeName = simpleDataTypeName ?? dataTypeName;
2211
DbTypeMapping = dbTypeMapping;
12+
MySqlDbType = mySqlDbType;
2313
Unsigned = unsigned;
2414
Binary = binary;
2515
Length = length;
2616
}
2717

28-
internal readonly string ColumnTypeName;
29-
internal readonly DbTypeMapping DbTypeMapping;
30-
internal readonly IEnumerable<ColumnType> ColumnTypes;
31-
internal readonly bool Binary;
32-
internal readonly bool Unsigned;
33-
internal readonly int Length;
18+
public string DataTypeName { get; }
19+
public string SimpleDataTypeName { get; }
20+
public DbTypeMapping DbTypeMapping { get; }
21+
public MySqlDbType MySqlDbType { get; }
22+
public bool Binary { get; }
23+
public bool Unsigned { get; }
24+
public int Length { get; }
3425

35-
internal string LookupKey => CreateLookupKey(ColumnTypeName, Unsigned, Length);
26+
public string CreateLookupKey() => CreateLookupKey(DataTypeName, Unsigned, Length);
3627
}
37-
}
28+
}

0 commit comments

Comments
 (0)