@@ -200,29 +200,37 @@ public short GetInt16(int ordinal)
200
200
201
201
public int GetInt32 ( int ordinal )
202
202
{
203
- var value = GetValue ( ordinal ) ;
204
- if ( value is int )
205
- return ( int ) value ;
203
+ if ( ordinal < 0 || ordinal > ResultSet . ColumnDefinitions ! . Length )
204
+ throw new ArgumentOutOfRangeException ( nameof ( ordinal ) , "value must be between 0 and {0}." . FormatInvariant ( ResultSet . ColumnDefinitions ! . Length ) ) ;
206
205
207
- if ( value is sbyte )
208
- return ( sbyte ) value ;
209
- if ( value is byte )
210
- return ( byte ) value ;
211
- if ( value is short )
212
- return ( short ) value ;
213
- if ( value is ushort )
214
- return ( ushort ) value ;
215
- if ( value is uint )
216
- return checked ( ( int ) ( uint ) value ) ;
217
- if ( value is long )
218
- return checked ( ( int ) ( long ) value ) ;
219
- if ( value is ulong )
220
- return checked ( ( int ) ( ulong ) value ) ;
221
- if ( value is decimal )
222
- return ( int ) ( decimal ) value ;
223
- return ( int ) value ;
206
+ if ( m_dataOffsets [ ordinal ] == - 1 )
207
+ throw new InvalidCastException ( ) ;
208
+
209
+ var columnDefinition = ResultSet . ColumnDefinitions [ ordinal ] ;
210
+ if ( ( columnDefinition . ColumnType != ColumnType . Tiny &&
211
+ columnDefinition . ColumnType != ColumnType . Short &&
212
+ columnDefinition . ColumnType != ColumnType . Int24 &&
213
+ columnDefinition . ColumnType != ColumnType . Long &&
214
+ columnDefinition . ColumnType != ColumnType . Longlong &&
215
+ columnDefinition . ColumnType != ColumnType . Bit &&
216
+ columnDefinition . ColumnType != ColumnType . Year &&
217
+ columnDefinition . ColumnType != ColumnType . Decimal ) ||
218
+ ( columnDefinition . ColumnType == ColumnType . Tiny && Connection . TreatTinyAsBoolean && columnDefinition . ColumnLength == 1 && ( columnDefinition . ColumnFlags & ColumnFlags . Unsigned ) == 0 ) )
219
+ {
220
+ throw new InvalidCastException ( "Can't convert {0} to Int32" . FormatInvariant ( ResultSet . ColumnTypes ! [ ordinal ] ) ) ;
221
+ }
222
+
223
+ var data = m_data . Slice ( m_dataOffsets [ ordinal ] , m_dataLengths [ ordinal ] ) . Span ;
224
+
225
+ if ( columnDefinition . ColumnType == ColumnType . Bit )
226
+ return checked ( ( int ) ReadBit ( data , columnDefinition ) ) ;
227
+ else if ( columnDefinition . ColumnType == ColumnType . Decimal )
228
+ return ( int ) ( decimal ) GetValue ( ordinal ) ;
229
+ return GetInt32Core ( data , columnDefinition ) ;
224
230
}
225
231
232
+ protected abstract int GetInt32Core ( ReadOnlySpan < byte > data , ColumnDefinitionPayload columnDefinition ) ;
233
+
226
234
public long GetInt64 ( int ordinal )
227
235
{
228
236
var value = GetValue ( ordinal ) ;
@@ -433,7 +441,7 @@ protected static Guid CreateGuidFromBytes(MySqlGuidFormat guidFormat, ReadOnlySp
433
441
#endif
434
442
}
435
443
436
- protected static object ReadBit ( ReadOnlySpan < byte > data , ColumnDefinitionPayload columnDefinition )
444
+ protected static ulong ReadBit ( ReadOnlySpan < byte > data , ColumnDefinitionPayload columnDefinition )
437
445
{
438
446
if ( ( columnDefinition . ColumnFlags & ColumnFlags . Binary ) == 0 )
439
447
{
0 commit comments