Sitelet https://github.com/npgsql/npgsql/pull/5948/files
Skip to content
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
40 changes: 20 additions & 20 deletions src/Npgsql/Internal/Converters/Temporal/DateConverters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,88 +4,88 @@
// ReSharper disable once CheckNamespace
namespace Npgsql.Internal.Converters;

sealed class DateTimeDateConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<DateTime>
sealed class DateOnlyDateConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<DateOnly>
Comment thread
vonzshik marked this conversation as resolved.
{
static readonly DateTime BaseValue = new(2000, 1, 1, 0, 0, 0);
static readonly DateOnly BaseValue = new(2000, 1, 1);

public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(int));
return format is DataFormat.Binary;
}

protected override DateTime ReadCore(PgReader reader)
protected override DateOnly ReadCore(PgReader reader)
=> reader.ReadInt32() switch
{
int.MaxValue => dateTimeInfinityConversions
? DateTime.MaxValue
? DateOnly.MaxValue
: throw new InvalidCastException(NpgsqlStrings.CannotReadInfinityValue),
int.MinValue => dateTimeInfinityConversions
? DateTime.MinValue
? DateOnly.MinValue
: throw new InvalidCastException(NpgsqlStrings.CannotReadInfinityValue),
var value => BaseValue + TimeSpan.FromDays(value)
var value => BaseValue.AddDays(value)
};

protected override void WriteCore(PgWriter writer, DateTime value)
protected override void WriteCore(PgWriter writer, DateOnly value)
{
if (dateTimeInfinityConversions)
{
if (value == DateTime.MaxValue)
if (value == DateOnly.MaxValue)
{
writer.WriteInt32(int.MaxValue);
return;
}

if (value == DateTime.MinValue)
if (value == DateOnly.MinValue)
{
writer.WriteInt32(int.MinValue);
return;
}
}

writer.WriteInt32((value.Date - BaseValue).Days);
writer.WriteInt32(value.DayNumber - BaseValue.DayNumber);
}
}

sealed class DateOnlyDateConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<DateOnly>
sealed class DateTimeDateConverter(bool dateTimeInfinityConversions) : PgBufferedConverter<DateTime>
{
static readonly DateOnly BaseValue = new(2000, 1, 1);
static readonly DateTime BaseValue = new(2000, 1, 1, 0, 0, 0);

public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(int));
return format is DataFormat.Binary;
}

protected override DateOnly ReadCore(PgReader reader)
protected override DateTime ReadCore(PgReader reader)
=> reader.ReadInt32() switch
{
int.MaxValue => dateTimeInfinityConversions
? DateOnly.MaxValue
? DateTime.MaxValue
: throw new InvalidCastException(NpgsqlStrings.CannotReadInfinityValue),
int.MinValue => dateTimeInfinityConversions
? DateOnly.MinValue
? DateTime.MinValue
: throw new InvalidCastException(NpgsqlStrings.CannotReadInfinityValue),
var value => BaseValue.AddDays(value)
var value => BaseValue + TimeSpan.FromDays(value)
};

protected override void WriteCore(PgWriter writer, DateOnly value)
protected override void WriteCore(PgWriter writer, DateTime value)
{
if (dateTimeInfinityConversions)
{
if (value == DateOnly.MaxValue)
if (value == DateTime.MaxValue)
{
writer.WriteInt32(int.MaxValue);
return;
}

if (value == DateOnly.MinValue)
if (value == DateTime.MinValue)
{
writer.WriteInt32(int.MinValue);
return;
}
}

writer.WriteInt32(value.DayNumber - BaseValue.DayNumber);
writer.WriteInt32((value.Date - BaseValue).Days);
}
}
12 changes: 6 additions & 6 deletions src/Npgsql/Internal/Converters/Temporal/TimeConverters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,26 @@
// ReSharper disable once CheckNamespace
namespace Npgsql.Internal.Converters;

sealed class TimeSpanTimeConverter : PgBufferedConverter<TimeSpan>
sealed class TimeOnlyTimeConverter : PgBufferedConverter<TimeOnly>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(long));
return format is DataFormat.Binary;
}
protected override TimeSpan ReadCore(PgReader reader) => new(reader.ReadInt64() * 10);
protected override void WriteCore(PgWriter writer, TimeSpan value) => writer.WriteInt64(value.Ticks / 10);
protected override TimeOnly ReadCore(PgReader reader) => new(reader.ReadInt64() * 10);
protected override void WriteCore(PgWriter writer, TimeOnly value) => writer.WriteInt64(value.Ticks / 10);
}

sealed class TimeOnlyTimeConverter : PgBufferedConverter<TimeOnly>
sealed class TimeSpanTimeConverter : PgBufferedConverter<TimeSpan>
{
public override bool CanConvert(DataFormat format, out BufferRequirements bufferRequirements)
{
bufferRequirements = BufferRequirements.CreateFixedSize(sizeof(long));
return format is DataFormat.Binary;
}
protected override TimeOnly ReadCore(PgReader reader) => new(reader.ReadInt64() * 10);
protected override void WriteCore(PgWriter writer, TimeOnly value) => writer.WriteInt64(value.Ticks / 10);
protected override TimeSpan ReadCore(PgReader reader) => new(reader.ReadInt64() * 10);
protected override void WriteCore(PgWriter writer, TimeSpan value) => writer.WriteInt64(value.Ticks / 10);
}

sealed class DateTimeOffsetTimeTzConverter : PgBufferedConverter<DateTimeOffset>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,24 +159,23 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
CreateListMultirangeConverter(CreateRangeConverter(new Int8Converter<long>(), options), options)));

// datemultirange
mappings.AddType<NpgsqlRange<DateTime>[]>(DataTypeNames.DateMultirange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateArrayMultirangeConverter(
CreateRangeConverter(new DateTimeDateConverter(options.EnableDateTimeInfinityConversions), options), options)),
isDefault: true);
mappings.AddType<List<NpgsqlRange<DateTime>>>(DataTypeNames.DateMultirange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateListMultirangeConverter(
CreateRangeConverter(new DateTimeDateConverter(options.EnableDateTimeInfinityConversions), options), options)));
mappings.AddType<NpgsqlRange<DateOnly>[]>(DataTypeNames.DateMultirange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateArrayMultirangeConverter(
CreateRangeConverter(new DateOnlyDateConverter(options.EnableDateTimeInfinityConversions), options), options)),
isDefault: true);
mappings.AddType<NpgsqlRange<DateTime>[]>(DataTypeNames.DateMultirange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateArrayMultirangeConverter(
CreateRangeConverter(new DateTimeDateConverter(options.EnableDateTimeInfinityConversions), options), options)));
mappings.AddType<List<NpgsqlRange<DateOnly>>>(DataTypeNames.DateMultirange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateListMultirangeConverter(
CreateRangeConverter(new DateOnlyDateConverter(options.EnableDateTimeInfinityConversions), options), options)));
mappings.AddType<List<NpgsqlRange<DateTime>>>(DataTypeNames.DateMultirange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateListMultirangeConverter(
CreateRangeConverter(new DateTimeDateConverter(options.EnableDateTimeInfinityConversions), options), options)));

return mappings;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,16 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
static (options, mapping, _) => mapping.CreateInfo(options, CreateRangeConverter(new Int8Converter<long>(), options)));

// daterange
mappings.AddStructType<NpgsqlRange<DateOnly>>(DataTypeNames.DateRange,
static (options, mapping, _) =>
mapping.CreateInfo(options,
CreateRangeConverter(new DateOnlyDateConverter(options.EnableDateTimeInfinityConversions), options)),
isDefault: true);
mappings.AddStructType<NpgsqlRange<DateTime>>(DataTypeNames.DateRange,
static (options, mapping, _) => mapping.CreateInfo(options,
CreateRangeConverter(new DateTimeDateConverter(options.EnableDateTimeInfinityConversions), options)),
isDefault: true);
CreateRangeConverter(new DateTimeDateConverter(options.EnableDateTimeInfinityConversions), options)));
mappings.AddStructType<NpgsqlRange<int>>(DataTypeNames.DateRange,
static (options, mapping, _) => mapping.CreateInfo(options, CreateRangeConverter(new Int4Converter<int>(), options)));
mappings.AddStructType<NpgsqlRange<DateOnly>>(DataTypeNames.DateRange,
static (options, mapping, _) =>
mapping.CreateInfo(options, CreateRangeConverter(new DateOnlyDateConverter(options.EnableDateTimeInfinityConversions), options)));

return mappings;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,14 +230,15 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
static (options, mapping, _) => mapping.CreateInfo(options, new Int8Converter<long>()));

// Date
mappings.AddStructType<DateOnly>(DataTypeNames.Date,
static (options, mapping, _) =>
mapping.CreateInfo(options, new DateOnlyDateConverter(options.EnableDateTimeInfinityConversions)), isDefault: true);
mappings.AddStructType<DateTime>(DataTypeNames.Date,
static (options, mapping, _) =>
mapping.CreateInfo(options, new DateTimeDateConverter(options.EnableDateTimeInfinityConversions)),
MatchRequirement.DataTypeName);
mappings.AddStructType<int>(DataTypeNames.Date,
static (options, mapping, _) => mapping.CreateInfo(options, new Int4Converter<int>()));
mappings.AddStructType<DateOnly>(DataTypeNames.Date,
static (options, mapping, _) => mapping.CreateInfo(options, new DateOnlyDateConverter(options.EnableDateTimeInfinityConversions)));

// Interval
mappings.AddStructType<TimeSpan>(DataTypeNames.Interval,
Expand All @@ -246,12 +247,12 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
static (options, mapping, _) => mapping.CreateInfo(options, new NpgsqlIntervalConverter()));

// Time
mappings.AddStructType<TimeOnly>(DataTypeNames.Time,
static (options, mapping, _) => mapping.CreateInfo(options, new TimeOnlyTimeConverter()), isDefault: true);
mappings.AddStructType<TimeSpan>(DataTypeNames.Time,
static (options, mapping, _) => mapping.CreateInfo(options, new TimeSpanTimeConverter()), isDefault: true);
static (options, mapping, _) => mapping.CreateInfo(options, new TimeSpanTimeConverter()));
mappings.AddStructType<long>(DataTypeNames.Time,
static (options, mapping, _) => mapping.CreateInfo(options, new Int8Converter<long>()));
mappings.AddStructType<TimeOnly>(DataTypeNames.Time,
static (options, mapping, _) => mapping.CreateInfo(options, new TimeOnlyTimeConverter()));

// TimeTz
mappings.AddStructType<DateTimeOffset>(DataTypeNames.TimeTz,
Expand Down Expand Up @@ -446,9 +447,9 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
mappings.AddStructArrayType<long>(DataTypeNames.TimestampTz);

// Date
mappings.AddStructArrayType<DateOnly>(DataTypeNames.Date);
mappings.AddStructArrayType<DateTime>(DataTypeNames.Date);
mappings.AddStructArrayType<int>(DataTypeNames.Date);
mappings.AddStructArrayType<DateOnly>(DataTypeNames.Date);

// Interval
mappings.AddStructArrayType<TimeSpan>(DataTypeNames.Interval);
Expand Down
2 changes: 1 addition & 1 deletion test/Npgsql.Tests/CommandBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ PRIMARY KEY (Cod)

Assert.That(row[0], Is.EqualTo("key1"));
Assert.That(row[1], Is.EqualTo("description"));
Assert.That(row[2], Is.EqualTo(new DateTime(2018, 7, 3)));
Assert.That(row[2], Is.EqualTo(new DateOnly(2018, 7, 3)));
Assert.That(row[3], Is.EqualTo(new DateTime(2018, 7, 3, 7, 2, 0)));
Assert.That(row[4], Is.EqualTo(123));
Assert.That(row[5], Is.EqualTo(123.4));
Expand Down
3 changes: 3 additions & 0 deletions test/Npgsql.Tests/ExceptionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,8 @@ PostgresException CreateWithSqlState(string sqlState)

#pragma warning disable SYSLIB0011
#pragma warning disable SYSLIB0050

#if !NET9_0_OR_GREATER // BinaryFormatter serialization and deserialization have been removed. See https://aka.ms/binaryformatter for more information.
[Test]
public void Serialization()
{
Expand Down Expand Up @@ -283,6 +285,7 @@ public void Serialization()
Assert.That(expected.Line, Is.EqualTo(actual.Line));
Assert.That(expected.Routine, Is.EqualTo(actual.Routine));
}
#endif

SerializationInfo CreateSerializationInfo() => new(typeof(PostgresException), new FormatterConverter());
#pragma warning restore SYSLIB0011
Expand Down
2 changes: 1 addition & 1 deletion test/Npgsql.Tests/ReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ public async Task GetValues()
dr.Read();
var values = new object[4];
Assert.That(dr.GetValues(values), Is.EqualTo(3));
Assert.That(values, Is.EqualTo(new object?[] { "hello", 1, new DateTime(2014, 1, 1), null }));
Assert.That(values, Is.EqualTo(new object?[] { "hello", 1, new DateOnly(2014, 1, 1), null }));
}
using (var dr = await command.ExecuteReaderAsync(Behavior))
{
Expand Down
Loading