Skip to content

Avoid boxing of value-type field values during reading #192

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ root = true

[*]
charset = utf-8
max_line_length = 120
max_line_length = 140

# Markdown Files
[*.md]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,21 +59,21 @@ public override SqlValueType MapSByte(int? length, int? precision, int? scale)
return base.MapShort(length, precision, scale);
}

public override object ReadGuid(DbDataReader reader, int index)
public override Guid ReadGuid(DbDataReader reader, int index)
{
string s = reader.GetString(index);
if (string.IsNullOrEmpty(s))
return null;
return default;
return SqlHelper.GuidFromString(s);
}

public override object ReadChar(DbDataReader reader, int index)
public override char ReadChar(DbDataReader reader, int index)
{
char c = (char) base.ReadChar(reader, index);
if (char.IsControl(c) || char.IsPunctuation(c))
return c;
if (char.IsWhiteSpace(c))
return null;
return '\0';
return c;
}

Expand All @@ -88,7 +88,7 @@ public override void BindChar(DbParameter parameter, object value)
parameter.Value = _char==default(char) ? string.Empty : _char.ToString();
}

public override object ReadString(DbDataReader reader, int index)
public override string ReadString(DbDataReader reader, int index)
{
string s = (string) base.ReadString(reader, index);
if (s!=null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal class TypeMapper : v2_5.TypeMapper
private static readonly BigInteger MaxDoubleAsBigInteger = new(double.MaxValue);
private static readonly BigInteger MinDoubleAsBigInteger = new(double.MinValue);

public override object ReadInt(DbDataReader reader, int index)
public override int ReadInt(DbDataReader reader, int index)
{
var typeOfValue = reader.GetFieldType(index);
if (typeOfValue == BigIntegerType) {
Expand All @@ -41,7 +41,7 @@ public override object ReadInt(DbDataReader reader, int index)
return base.ReadInt(reader, index);
}

public override object ReadUInt(DbDataReader reader, int index)
public override uint ReadUInt(DbDataReader reader, int index)
{
var typeOfValue = reader.GetFieldType(index);
if (typeOfValue == BigIntegerType) {
Expand All @@ -53,7 +53,7 @@ public override object ReadUInt(DbDataReader reader, int index)
return base.ReadUInt(reader, index);
}

public override object ReadLong(DbDataReader reader, int index)
public override long ReadLong(DbDataReader reader, int index)
{
var typeOfValue = reader.GetFieldType(index);
if(typeOfValue == BigIntegerType) {
Expand All @@ -65,7 +65,7 @@ public override object ReadLong(DbDataReader reader, int index)
return base.ReadLong(reader, index);
}

public override object ReadULong(DbDataReader reader, int index)
public override ulong ReadULong(DbDataReader reader, int index)
{
var typeOfValue = reader.GetFieldType(index);
if (typeOfValue == BigIntegerType) {
Expand All @@ -77,7 +77,7 @@ public override object ReadULong(DbDataReader reader, int index)
return base.ReadULong(reader, index);
}

public override object ReadDouble(DbDataReader reader, int index)
public override double ReadDouble(DbDataReader reader, int index)
{
var typeOfValue = reader.GetFieldType(index);
if (typeOfValue == BigIntegerType) {
Expand All @@ -94,4 +94,4 @@ public TypeMapper(SqlDriver driver)
{
}
}
}
}
4 changes: 2 additions & 2 deletions Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/TypeMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,13 @@ public override SqlValueType MapGuid(int? length, int? precision, int? scale)
}

/// <inheritdoc/>
public override object ReadByte(DbDataReader reader, int index)
public override byte ReadByte(DbDataReader reader, int index)
{
return Convert.ToByte(reader[index]);
}

/// <inheritdoc/>
public override object ReadGuid(DbDataReader reader, int index)
public override Guid ReadGuid(DbDataReader reader, int index)
{
return SqlHelper.GuidFromString(reader.GetString(index));
}
Expand Down
2 changes: 1 addition & 1 deletion Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Driver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ protected override Info.ServerInfoProvider CreateServerInfoProvider()
protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder)
{
builder.Add(typeof (DateTimeOffset),
builder.Mapper.ReadDateTimeOffset,
builder.Mapper.ReadBoxedDateTimeOffset,
builder.Mapper.BindDateTimeOffset,
builder.Mapper.MapDateTimeOffset);
}
Expand Down
30 changes: 15 additions & 15 deletions Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/TypeMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,89 +138,89 @@ public override void BindString(DbParameter parameter, object value)
nativeParameter.Value = value ?? DBNull.Value;
}

public override object ReadBoolean(DbDataReader reader, int index)
public override bool ReadBoolean(DbDataReader reader, int index)
{
//return reader.GetDecimal(index)!=0.0m;
return Math.Abs(ReadDecimalSafely(reader, index, BooleanPrecision, 0)) > 0.3m;
}

public override object ReadByte(DbDataReader reader, int index)
public override byte ReadByte(DbDataReader reader, int index)
{
//return (byte) reader.GetDecimal(index);
return (byte) ReadDecimalSafely(reader, index, BytePrecision, 0);
}

public override object ReadSByte(DbDataReader reader, int index)
public override sbyte ReadSByte(DbDataReader reader, int index)
{
//return (sbyte) reader.GetDecimal(index);
return (sbyte) ReadDecimalSafely(reader, index, BytePrecision, 0);
}

public override object ReadShort(DbDataReader reader, int index)
public override short ReadShort(DbDataReader reader, int index)
{
//return (short) reader.GetDecimal(index);
return (short) ReadDecimalSafely(reader, index, ShortPrecision, 0);
}

public override object ReadUShort(DbDataReader reader, int index)
public override ushort ReadUShort(DbDataReader reader, int index)
{
//return (ushort) reader.GetDecimal(index);
return (ushort) ReadDecimalSafely(reader, index, ShortPrecision, 0);
}

public override object ReadInt(DbDataReader reader, int index)
public override int ReadInt(DbDataReader reader, int index)
{
//return (int) reader.GetDecimal(index);
return (int) ReadDecimalSafely(reader, index, IntPrecision, 0);
}

public override object ReadUInt(DbDataReader reader, int index)
public override uint ReadUInt(DbDataReader reader, int index)
{
//return (uint) reader.GetDecimal(index);
return (uint) ReadDecimalSafely(reader, index, IntPrecision, 0);
}

public override object ReadLong(DbDataReader reader, int index)
public override long ReadLong(DbDataReader reader, int index)
{
//return (long) reader.GetDecimal(index);
return (long) ReadDecimalSafely(reader, index, LongPrecision, 0);
}

public override object ReadULong(DbDataReader reader, int index)
public override ulong ReadULong(DbDataReader reader, int index)
{
//return (ulong) reader.GetDecimal(index);
return (ulong) ReadDecimalSafely(reader, index, LongPrecision, 0);
}

public override object ReadDecimal(DbDataReader reader, int index)
public override decimal ReadDecimal(DbDataReader reader, int index)
{
return ReadDecimalSafely(reader, index, MaxDecimalPrecision.Value, MaxDecimalPrecision.Value / 2);
}

public override object ReadFloat(DbDataReader reader, int index)
public override float ReadFloat(DbDataReader reader, int index)
{
return Convert.ToSingle(reader[index]);
}

public override object ReadDouble(DbDataReader reader, int index)
public override double ReadDouble(DbDataReader reader, int index)
{
return Convert.ToDouble(reader[index]);
}

public override object ReadDateTimeOffset(DbDataReader reader, int index)
public override DateTimeOffset ReadDateTimeOffset(DbDataReader reader, int index)
{
var nativeReader = (OracleDataReader) reader;
var timeStampTZ = nativeReader.GetOracleTimeStampTZ(index);
return new DateTimeOffset(timeStampTZ.Value, timeStampTZ.GetTimeZoneOffset());
}

public override object ReadTimeSpan(DbDataReader reader, int index)
public override TimeSpan ReadTimeSpan(DbDataReader reader, int index)
{
var nativeReader = (OracleDataReader) reader;
return (TimeSpan) nativeReader.GetOracleIntervalDS(index);
}

public override object ReadGuid(DbDataReader reader, int index)
public override Guid ReadGuid(DbDataReader reader, int index)
{
return SqlHelper.GuidFromString(reader.GetString(index));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builde
builder.Add(new PolygonMapper());
builder.Add(new CircleMapper());
builder.Add(WellKnownTypes.DateTimeOffsetType,
builder.Mapper.ReadDateTimeOffset,
builder.Mapper.ReadBoxedDateTimeOffset,
builder.Mapper.BindDateTimeOffset,
builder.Mapper.MapDateTimeOffset);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,31 +167,31 @@ public override SqlValueType MapTimeSpan(int? length, int? precision, int? scale
return new SqlValueType(SqlType.Interval);
}

public override object ReadByte(DbDataReader reader, int index)
public override byte ReadByte(DbDataReader reader, int index)
{
return Convert.ToByte(reader[index]);
}

public override object ReadGuid(DbDataReader reader, int index)
public override Guid ReadGuid(DbDataReader reader, int index)
{
return SqlHelper.GuidFromString(reader.GetString(index));
}

[SecuritySafeCritical]
public override object ReadTimeSpan(DbDataReader reader, int index)
public override TimeSpan ReadTimeSpan(DbDataReader reader, int index)
{
var nativeReader = (NpgsqlDataReader) reader;
return (TimeSpan) nativeReader.GetInterval(index);
}

public override object ReadDecimal(DbDataReader reader, int index)
public override decimal ReadDecimal(DbDataReader reader, int index)
{
var nativeReader = (NpgsqlDataReader) reader;
return nativeReader.GetDecimal(index);
}

[SecuritySafeCritical]
public override object ReadDateTimeOffset(DbDataReader reader, int index)
public override DateTimeOffset ReadDateTimeOffset(DbDataReader reader, int index)
{
var nativeReader = (NpgsqlDataReader) reader;
var value = nativeReader.GetFieldValue<DateTimeOffset>(index);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public override void BindGuid(DbParameter parameter, object value)
parameter.Value = value ?? DBNull.Value;
}

public override object ReadGuid(DbDataReader reader, int index) => reader.GetGuid(index);
public override Guid ReadGuid(DbDataReader reader, int index) => reader.GetGuid(index);

public override SqlValueType MapGuid(int? length, int? precision, int? scale) => new SqlValueType(SqlType.Guid);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ protected override Info.ServerInfoProvider CreateServerInfoProvider()
protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder)
{
builder.Add(typeof (DateTimeOffset),
builder.Mapper.ReadDateTimeOffset,
builder.Mapper.ReadBoxedDateTimeOffset,
builder.Mapper.BindDateTimeOffset,
builder.Mapper.MapDateTimeOffset);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public override SqlValueType MapULong(int? length, int? precision, int? scale)
return new SqlValueType(SqlType.Decimal, 20, 0);
}

public override object ReadDecimal(DbDataReader reader, int index)
public override decimal ReadDecimal(DbDataReader reader, int index)
{
var nativeReader = (SqlDataReader) reader;
var sqlDecimal = nativeReader.GetSqlDecimal(index);
Expand All @@ -125,15 +125,13 @@ public override object ReadDecimal(DbDataReader reader, int index)
return InternalHelpers.TruncateToNetDecimal(sqlDecimal);
}

public override object ReadDateTimeOffset(DbDataReader reader, int index)
{
return ((SqlDataReader) reader).GetDateTimeOffset(index);
}
public override DateTimeOffset ReadDateTimeOffset(DbDataReader reader, int index) =>
((SqlDataReader) reader).GetDateTimeOffset(index);

public override object ReadDateOnly(DbDataReader reader, int index) =>
public override DateOnly ReadDateOnly(DbDataReader reader, int index) =>
reader.GetFieldValue<DateOnly>(index);

public override object ReadTimeOnly(DbDataReader reader, int index) =>
public override TimeOnly ReadTimeOnly(DbDataReader reader, int index) =>
reader.GetFieldValue<TimeOnly>(index);

public override void Initialize()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public override void BindDateTime(DbParameter parameter, object value)
parameter.Value = value ?? DBNull.Value;
}

public override object ReadDateTime(DbDataReader reader, int index)
public override DateTime ReadDateTime(DbDataReader reader, int index)
{
string type = reader.GetDataTypeName(index);
if (type=="time") {
Expand Down
4 changes: 2 additions & 2 deletions Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/Driver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ protected override Info.ServerInfoProvider CreateServerInfoProvider()
protected override void RegisterCustomMappings(TypeMappingRegistryBuilder builder)
{
builder.Add(typeof (DateTimeOffset),
builder.Mapper.ReadDateTimeOffset,
builder.Mapper.ReadBoxedDateTimeOffset,
builder.Mapper.BindDateTimeOffset,
builder.Mapper.MapDateTimeOffset);
}
Expand All @@ -57,4 +57,4 @@ public Driver(CoreServerInfo coreServerInfo)
{
}
}
}
}
10 changes: 5 additions & 5 deletions Orm/Xtensive.Orm.Sqlite/Sql.Drivers.Sqlite/v3/TypeMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,25 +26,25 @@ internal class TypeMapper : Sql.TypeMapper
private const string DateFormat = "yyyy-MM-dd";
private const string TimeFormat = "HH:mm:ss.fffffff";

public override object ReadBoolean(DbDataReader reader, int index)
public override bool ReadBoolean(DbDataReader reader, int index)
{
var value = reader.GetDecimal(index);
return SQLiteConvert.ToBoolean(value);
}

public override object ReadDateOnly(DbDataReader reader, int index)
public override DateOnly ReadDateOnly(DbDataReader reader, int index)
{
var value = reader.GetString(index);
return DateOnly.ParseExact(value, DateFormat, CultureInfo.InvariantCulture);
}

public override object ReadTimeOnly(DbDataReader reader, int index)
public override TimeOnly ReadTimeOnly(DbDataReader reader, int index)
{
var value = reader.GetString(index);
return TimeOnly.ParseExact(value, TimeFormat, CultureInfo.InvariantCulture);
}

public override object ReadDateTimeOffset(DbDataReader reader, int index)
public override DateTimeOffset ReadDateTimeOffset(DbDataReader reader, int index)
{
var value = reader.GetString(index);
return DateTimeOffset.ParseExact(value, DateTimeOffsetFormat, CultureInfo.InvariantCulture);
Expand Down Expand Up @@ -179,4 +179,4 @@ public TypeMapper(SqlDriver driver)
{
}
}
}
}
Loading
Loading