Skip to content

Commit 38da18a

Browse files
committed
Fix reading of some values
1 parent 868bb6c commit 38da18a

1 file changed

Lines changed: 80 additions & 0 deletions

File tree

Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v4_0/TypeMapper.cs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,91 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Data.Common;
4+
using System.Numerics;
35
using System.Text;
6+
using FirebirdSql.Data.FirebirdClient;
47

58
namespace Xtensive.Sql.Drivers.Firebird.v4_0
69
{
710
internal class TypeMapper : v2_5.TypeMapper
811
{
12+
private static readonly Type BigIntegerType = typeof(BigInteger);
13+
14+
private static readonly BigInteger MaxIntAsBigInteger = new(int.MaxValue);
15+
private static readonly BigInteger MinIntAsBigInteger = new(int.MinValue);
16+
17+
private static readonly BigInteger MaxUIntAsBigInteger = new(uint.MaxValue);
18+
private static readonly BigInteger MinUIntAsBigInteger = new(uint.MinValue);
19+
20+
private static readonly BigInteger MaxLongAsBigInteger = new(long.MaxValue);
21+
private static readonly BigInteger MinLongAsBigInteger = new(long.MinValue);
22+
23+
private static readonly BigInteger MaxULongAsBigInteger = new(ulong.MaxValue);
24+
private static readonly BigInteger MinULongAsBigInteger = new(ulong.MinValue);
25+
26+
private static readonly BigInteger MaxDoubleAsBigInteger = new(double.MaxValue);
27+
private static readonly BigInteger MinDoubleAsBigInteger = new(double.MinValue);
28+
29+
public override object ReadInt(DbDataReader reader, int index)
30+
{
31+
var typeOfValue = reader.GetFieldType(index);
32+
if (typeOfValue == BigIntegerType) {
33+
var value = reader.GetFieldValue<BigInteger>(index);
34+
if (value > MaxIntAsBigInteger || value < MinIntAsBigInteger)
35+
throw new ArgumentOutOfRangeException();
36+
return (int) value;
37+
}
38+
return base.ReadInt(reader, index);
39+
}
40+
41+
public override object ReadUInt(DbDataReader reader, int index)
42+
{
43+
var typeOfValue = reader.GetFieldType(index);
44+
if (typeOfValue == BigIntegerType) {
45+
var value = reader.GetFieldValue<BigInteger>(index);
46+
if (value > MaxUIntAsBigInteger || value < MinUIntAsBigInteger)
47+
throw new ArgumentOutOfRangeException();
48+
return (uint) value;
49+
}
50+
return base.ReadUInt(reader, index);
51+
}
52+
53+
public override object ReadLong(DbDataReader reader, int index)
54+
{
55+
var typeOfValue = reader.GetFieldType(index);
56+
if(typeOfValue == BigIntegerType) {
57+
var value = reader.GetFieldValue<BigInteger>(index);
58+
if (value > MaxLongAsBigInteger || value < MinLongAsBigInteger)
59+
throw new ArgumentOutOfRangeException();
60+
return (long) value;
61+
}
62+
return base.ReadLong(reader, index);
63+
}
64+
65+
public override object ReadULong(DbDataReader reader, int index)
66+
{
67+
var typeOfValue = reader.GetFieldType(index);
68+
if (typeOfValue == BigIntegerType) {
69+
var value = reader.GetFieldValue<BigInteger>(index);
70+
if (value > MaxULongAsBigInteger || value < MinULongAsBigInteger)
71+
throw new ArgumentOutOfRangeException();
72+
return (ulong) value;
73+
}
74+
return base.ReadULong(reader, index);
75+
}
76+
77+
public override object ReadDouble(DbDataReader reader, int index)
78+
{
79+
var typeOfValue = reader.GetFieldType(index);
80+
if (typeOfValue == BigIntegerType) {
81+
var value = reader.GetFieldValue<BigInteger>(index);
82+
if (value > MaxDoubleAsBigInteger || value < MinDoubleAsBigInteger)
83+
throw new ArgumentOutOfRangeException();
84+
return (double) value;
85+
}
86+
return base.ReadDouble(reader, index);
87+
}
88+
989
public TypeMapper(SqlDriver driver)
1090
: base(driver)
1191
{

0 commit comments

Comments
 (0)