Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit a22138d

Browse files
committed
Provide more flexibility and allow other dialect providers to override impl of GetValueFn<T>
1 parent 1bd8a55 commit a22138d

File tree

4 files changed

+130
-133
lines changed

4 files changed

+130
-133
lines changed

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public class OracleOrmLiteDialectProvider : OrmLiteDialectProviderBase<OracleOrm
2323
};
2424

2525
protected readonly List<string> ReservedParameterNames = new List<string>
26-
{
27-
"COMMENT", "DATE", "DECIMAL", "FLOAT", "ORDER", "USER", "LONG"
28-
};
26+
{
27+
"COMMENT", "DATE", "DECIMAL", "FLOAT", "ORDER", "USER", "LONG"
28+
};
2929

3030
protected const int MaxNameLength = 30;
3131
protected const int MaxStringColumnLength = 4000;
@@ -178,41 +178,52 @@ public override object ConvertDbValue(object value, Type type)
178178
return base.ConvertDbValue(value, type);
179179
}
180180

181-
public override GetValueDelegate GetReaderGuidDelegate(IDataRecord reader)
181+
public override GetValueDelegate GetValueFn<T>(IDataRecord reader)
182182
{
183-
if (CompactGuid)
183+
var nullableType = Nullable.GetUnderlyingType(typeof(T));
184+
if (nullableType == null)
184185
{
185-
return i =>
186+
if (typeof(T) == typeof(Guid))
186187
{
187-
var guid = reader.GetValue(i);
188-
return new Guid((byte[])guid);
189-
};
188+
if (CompactGuid)
189+
{
190+
return i =>
191+
{
192+
var guid = reader.GetValue(i);
193+
return new Guid((byte[])guid);
194+
};
195+
}
196+
return i =>
197+
{
198+
var guid = reader.GetValue(i);
199+
return new Guid(guid.ToString());
200+
};
201+
}
190202
}
191-
return i =>
192-
{
193-
var guid = reader.GetValue(i);
194-
return new Guid(guid.ToString());
195-
};
196-
}
197-
198-
public override GetValueDelegate GetReaderNullableGuidDelegate(IDataRecord reader)
199-
{
200-
if (CompactGuid)
203+
else
201204
{
202-
return i =>
205+
if (typeof (T) == typeof (Guid))
203206
{
204-
if (reader.IsDBNull(i)) return null;
205-
var guid = reader.GetValue(i);
206-
return new Guid((Byte[])guid);
207-
};
207+
if (CompactGuid)
208+
{
209+
return i =>
210+
{
211+
if (reader.IsDBNull(i)) return null;
212+
var guid = reader.GetValue(i);
213+
return new Guid((Byte[])guid);
214+
};
215+
}
216+
return i =>
217+
{
218+
if (reader.IsDBNull(i)) return null;
219+
var guid = reader.GetValue(i);
220+
return new Guid(guid.ToString());
221+
};
222+
}
208223
}
209-
return i =>
210-
{
211-
if (reader.IsDBNull(i)) return null;
212-
var guid = reader.GetValue(i);
213-
return new Guid(guid.ToString());
214-
};
215-
}
224+
225+
return GetValueFn<T>(reader);
226+
}
216227

217228
public override string GetQuotedValue(object value, Type fieldType)
218229
{

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ public interface IOrmLiteDialectProvider
4141

4242
object ConvertDbValue(object value, Type type);
4343

44-
GetValueDelegate GetReaderGuidDelegate(IDataRecord reader);
45-
GetValueDelegate GetReaderNullableGuidDelegate(IDataRecord reader);
44+
GetValueDelegate GetValueFn<T>(IDataRecord reader);
4645

4746
string GetQuotedValue(object value, Type fieldType);
4847

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 81 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -368,16 +368,6 @@ public virtual object ConvertDbValue(object value, Type type)
368368
}
369369
}
370370

371-
public virtual GetValueDelegate GetReaderGuidDelegate(IDataRecord reader)
372-
{
373-
return i => reader.GetGuid(i);
374-
}
375-
376-
public virtual GetValueDelegate GetReaderNullableGuidDelegate(IDataRecord reader)
377-
{
378-
return i => reader.IsDBNull(i) ? null : (Guid?)reader.GetGuid(i);
379-
}
380-
381371
public virtual string GetQuotedValue(object value, Type fieldType)
382372
{
383373
if (value == null) return "NULL";
@@ -1172,7 +1162,6 @@ public static ModelDefinition GetModelDefinition(Type modelType)
11721162
return modelType.GetModelDefinition();
11731163
}
11741164

1175-
#region DDL
11761165
public virtual string ToAddColumnStatement(Type modelType, FieldDefinition fieldDef)
11771166
{
11781167

@@ -1286,7 +1275,87 @@ protected virtual string FkOptionToString(OnFkOption option)
12861275
}
12871276
}
12881277

1289-
#endregion DDL
1278+
public virtual GetValueDelegate GetValueFn<T>(IDataRecord reader)
1279+
{
1280+
var nullableType = Nullable.GetUnderlyingType(typeof(T));
1281+
1282+
if (nullableType == null)
1283+
{
1284+
var typeCode = Type.GetTypeCode(typeof(T));
1285+
switch (typeCode)
1286+
{
1287+
case TypeCode.String:
1288+
return reader.GetString;
1289+
case TypeCode.Boolean:
1290+
return i => reader.GetBoolean(i);
1291+
case TypeCode.Int16:
1292+
case TypeCode.Int32:
1293+
case TypeCode.Int64:
1294+
case TypeCode.Single:
1295+
case TypeCode.Double:
1296+
case TypeCode.Decimal:
1297+
return i =>
1298+
{
1299+
var value = reader.GetValue(i);
1300+
if (value is T)
1301+
return value;
1302+
1303+
switch (typeCode)
1304+
{
1305+
case TypeCode.Int16:
1306+
return Convert.ToInt16(value);
1307+
case TypeCode.Int32:
1308+
return Convert.ToInt32(value);
1309+
case TypeCode.Int64:
1310+
return Convert.ToInt64(value);
1311+
case TypeCode.Single:
1312+
return Convert.ToSingle(value);
1313+
case TypeCode.Double:
1314+
return Convert.ToDouble(value);
1315+
case TypeCode.Decimal:
1316+
return Convert.ToDecimal(value);
1317+
default:
1318+
return value;
1319+
}
1320+
};
1321+
case TypeCode.DateTime:
1322+
return i => reader.GetDateTime(i);
1323+
}
1324+
1325+
if (typeof(T) == typeof(Guid))
1326+
return i => reader.GetGuid(i);
1327+
}
1328+
else
1329+
{
1330+
var typeCode = Type.GetTypeCode(nullableType);
1331+
switch (typeCode)
1332+
{
1333+
case TypeCode.String:
1334+
return reader.GetString;
1335+
case TypeCode.Boolean:
1336+
return i => reader.IsDBNull(i) ? null : (bool?)reader.GetBoolean(i);
1337+
case TypeCode.Int16:
1338+
return i => reader.IsDBNull(i) ? null : (short?)reader.GetInt16(i);
1339+
case TypeCode.Int32:
1340+
return i => reader.IsDBNull(i) ? null : (int?)reader.GetInt32(i);
1341+
case TypeCode.Int64:
1342+
return i => reader.IsDBNull(i) ? null : (long?)reader.GetInt64(i);
1343+
case TypeCode.Single:
1344+
return i => reader.IsDBNull(i) ? null : (float?)reader.GetFloat(i);
1345+
case TypeCode.Double:
1346+
return i => reader.IsDBNull(i) ? null : (double?)reader.GetDouble(i);
1347+
case TypeCode.Decimal:
1348+
return i => reader.IsDBNull(i) ? null : (decimal?)reader.GetDecimal(i);
1349+
case TypeCode.DateTime:
1350+
return i => reader.IsDBNull(i) ? null : (DateTime?)reader.GetDateTime(i);
1351+
}
1352+
1353+
if (typeof(T) == typeof(Guid))
1354+
return i => reader.IsDBNull(i) ? null : (Guid?)reader.GetGuid(i);
1355+
}
1356+
1357+
return reader.GetValue;
1358+
}
12901359

12911360
}
12921361
}

src/ServiceStack.OrmLite/OrmLiteReadExtensions.cs

Lines changed: 6 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -67,88 +67,6 @@ internal static IDataReader ExecReader(this IDbCommand dbCmd, string sql, IEnume
6767
return dbCmd.ExecuteReader();
6868
}
6969

70-
public static GetValueDelegate GetValueFn<T>(IDataRecord reader)
71-
{
72-
var nullableType = Nullable.GetUnderlyingType(typeof(T));
73-
74-
if (nullableType == null)
75-
{
76-
var typeCode = Type.GetTypeCode(typeof(T));
77-
switch (typeCode)
78-
{
79-
case TypeCode.String:
80-
return reader.GetString;
81-
case TypeCode.Boolean:
82-
return i => reader.GetBoolean(i);
83-
case TypeCode.Int16:
84-
case TypeCode.Int32:
85-
case TypeCode.Int64:
86-
case TypeCode.Single:
87-
case TypeCode.Double:
88-
case TypeCode.Decimal:
89-
return i =>
90-
{
91-
var value = reader.GetValue(i);
92-
if (value is T)
93-
return value;
94-
95-
switch (typeCode)
96-
{
97-
case TypeCode.Int16:
98-
return Convert.ToInt16(value);
99-
case TypeCode.Int32:
100-
return Convert.ToInt32(value);
101-
case TypeCode.Int64:
102-
return Convert.ToInt64(value);
103-
case TypeCode.Single:
104-
return Convert.ToSingle(value);
105-
case TypeCode.Double:
106-
return Convert.ToDouble(value);
107-
case TypeCode.Decimal:
108-
return Convert.ToDecimal(value);
109-
default:
110-
return value;
111-
}
112-
};
113-
case TypeCode.DateTime:
114-
return i => reader.GetDateTime(i);
115-
}
116-
117-
if (typeof (T) == typeof(Guid))
118-
return OrmLiteConfig.DialectProvider.GetReaderGuidDelegate(reader);
119-
}
120-
else
121-
{
122-
var typeCode = Type.GetTypeCode(nullableType);
123-
switch (typeCode)
124-
{
125-
case TypeCode.String:
126-
return reader.GetString;
127-
case TypeCode.Boolean:
128-
return i => reader.IsDBNull(i) ? null : (bool?)reader.GetBoolean(i);
129-
case TypeCode.Int16:
130-
return i => reader.IsDBNull(i) ? null : (short?)reader.GetInt16(i);
131-
case TypeCode.Int32:
132-
return i => reader.IsDBNull(i) ? null : (int?)reader.GetInt32(i);
133-
case TypeCode.Int64:
134-
return i => reader.IsDBNull(i) ? null : (long?)reader.GetInt64(i);
135-
case TypeCode.Single:
136-
return i => reader.IsDBNull(i) ? null : (float?)reader.GetFloat(i);
137-
case TypeCode.Double:
138-
return i => reader.IsDBNull(i) ? null : (double?)reader.GetDouble(i);
139-
case TypeCode.Decimal:
140-
return i => reader.IsDBNull(i) ? null : (decimal?)reader.GetDecimal(i);
141-
case TypeCode.DateTime:
142-
return i => reader.IsDBNull(i) ? null : (DateTime?)reader.GetDateTime(i);
143-
}
144-
145-
if (typeof(T) == typeof(Guid))
146-
return OrmLiteConfig.DialectProvider.GetReaderNullableGuidDelegate(reader);
147-
}
148-
149-
return reader.GetValue;
150-
}
151-
15270
public static bool IsScalar<T>()
15371
{
15472
return typeof(T).IsValueType || typeof(T) == typeof(string);
@@ -654,7 +572,7 @@ internal static List<T> ColumnFmt<T>(this IDbCommand dbCmd, string sql, params o
654572
internal static List<T> Column<T>(this IDataReader reader)
655573
{
656574
var columValues = new List<T>();
657-
var getValueFn = GetValueFn<T>(reader);
575+
var getValueFn = OrmLiteConfig.DialectProvider.GetValueFn<T>(reader);
658576
while (reader.Read())
659577
{
660578
var value = getValueFn(0);
@@ -681,7 +599,7 @@ internal static HashSet<T> ColumnDistinctFmt<T>(this IDbCommand dbCmd, string sq
681599
internal static HashSet<T> ColumnDistinct<T>(this IDataReader reader)
682600
{
683601
var columValues = new HashSet<T>();
684-
var getValueFn = GetValueFn<T>(reader);
602+
var getValueFn = OrmLiteConfig.DialectProvider.GetValueFn<T>(reader);
685603
while (reader.Read())
686604
{
687605
var value = getValueFn(0);
@@ -709,8 +627,8 @@ internal static Dictionary<K, List<V>> Lookup<K, V>(this IDataReader reader)
709627
{
710628
var lookup = new Dictionary<K, List<V>>();
711629

712-
var getKeyFn = GetValueFn<K>(reader);
713-
var getValueFn = GetValueFn<V>(reader);
630+
var getKeyFn = OrmLiteConfig.DialectProvider.GetValueFn<K>(reader);
631+
var getValueFn = OrmLiteConfig.DialectProvider.GetValueFn<V>(reader);
714632
while (reader.Read())
715633
{
716634
var key = (K)getKeyFn(0);
@@ -744,8 +662,8 @@ internal static Dictionary<K, V> Dictionary<K, V>(this IDataReader reader)
744662
{
745663
var map = new Dictionary<K, V>();
746664

747-
var getKeyFn = GetValueFn<K>(reader);
748-
var getValueFn = GetValueFn<V>(reader);
665+
var getKeyFn = OrmLiteConfig.DialectProvider.GetValueFn<K>(reader);
666+
var getValueFn = OrmLiteConfig.DialectProvider.GetValueFn<V>(reader);
749667
while (reader.Read())
750668
{
751669
var key = (K)getKeyFn(0);

0 commit comments

Comments
 (0)