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
11 changes: 0 additions & 11 deletions src/Npgsql.GeoJSON/Internal/GeoJSONTypeHandlerResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,16 +76,5 @@ internal GeoJSONTypeHandlerResolver(NpgsqlConnector connector, GeoJSONOptions op
? "geography"
: "geometry";

public override TypeMappingInfo? GetMappingByPostgresType(PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

internal static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"geometry" => new(NpgsqlDbType.Geometry, "geometry"),
"geography" => new(NpgsqlDbType.Geography, "geography"),
_ => null
};

PostgresType? PgType(string pgTypeName) => _databaseInfo.TryGetPostgresTypeByName(pgTypeName, out var pgType) ? pgType : null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,5 @@ public GeoJSONTypeHandlerResolverFactory(GeoJSONOptions options, bool geographyA
public override TypeHandlerResolver Create(TypeMapper typeMapper, NpgsqlConnector connector)
=> new GeoJSONTypeHandlerResolver(connector, _options, _geographyAsDefault);

public override string? GetDataTypeNameByClrType(Type type)
=> GeoJSONTypeHandlerResolver.ClrTypeToDataTypeName(type, _geographyAsDefault);

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> GeoJSONTypeHandlerResolver.DoGetMappingByDataTypeName(dataTypeName);
public override TypeMappingResolver CreateMappingResolver() => new GeoJsonTypeMappingResolver(_geographyAsDefault);
}
31 changes: 31 additions & 0 deletions src/Npgsql.GeoJSON/Internal/GeoJsonTypeMappingResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using Npgsql.Internal.TypeHandling;
using Npgsql.Internal.TypeMapping;
using Npgsql.PostgresTypes;
using NpgsqlTypes;

namespace Npgsql.GeoJSON.Internal;

public class GeoJsonTypeMappingResolver : TypeMappingResolver
{
readonly bool _geographyAsDefault;

public GeoJsonTypeMappingResolver(bool geographyAsDefault) => _geographyAsDefault = geographyAsDefault;

public override string? GetDataTypeNameByClrType(Type type)
=> GeoJSONTypeHandlerResolver.ClrTypeToDataTypeName(type, _geographyAsDefault);

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> DoGetMappingByDataTypeName(dataTypeName);

public override TypeMappingInfo? GetMappingByPostgresType(TypeMapper mapper, PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"geometry" => new(NpgsqlDbType.Geometry, "geometry"),
"geography" => new(NpgsqlDbType.Geography, "geography"),
_ => null
};
}
11 changes: 0 additions & 11 deletions src/Npgsql.Json.NET/Internal/JsonNetTypeHandlerResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,5 @@ internal JsonNetTypeHandlerResolver(
internal static string? ClrTypeToDataTypeName(Type type, Dictionary<Type, string> clrTypes)
=> clrTypes.TryGetValue(type, out var dataTypeName) ? dataTypeName : null;

public override TypeMappingInfo? GetMappingByPostgresType(PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

internal static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"jsonb" => new(NpgsqlDbType.Jsonb, "jsonb"),
"json" => new(NpgsqlDbType.Json, "json"),
_ => null
};

PostgresType PgType(string pgTypeName) => _databaseInfo.GetPostgresTypeByName(pgTypeName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,5 @@ public JsonNetTypeHandlerResolverFactory(
public override TypeHandlerResolver Create(TypeMapper typeMapper, NpgsqlConnector connector)
=> new JsonNetTypeHandlerResolver(connector, _byType, _settings);

public override string? GetDataTypeNameByClrType(Type type)
=> JsonNetTypeHandlerResolver.ClrTypeToDataTypeName(type, _byType);

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> JsonNetTypeHandlerResolver.DoGetMappingByDataTypeName(dataTypeName);

public override TypeMappingResolver CreateMappingResolver() => new JsonNetTypeMappingResolver(_byType);
}
32 changes: 32 additions & 0 deletions src/Npgsql.Json.NET/Internal/JsonNetTypeMappingResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using Npgsql.Internal.TypeHandling;
using Npgsql.Internal.TypeMapping;
using Npgsql.PostgresTypes;
using NpgsqlTypes;

namespace Npgsql.Json.NET.Internal;

public class JsonNetTypeMappingResolver : TypeMappingResolver
{
readonly Dictionary<Type, string> _byType;

public JsonNetTypeMappingResolver(Dictionary<Type, string> byType) => _byType = byType;

public override string? GetDataTypeNameByClrType(Type type)
=> JsonNetTypeHandlerResolver.ClrTypeToDataTypeName(type, _byType);

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> DoGetMappingByDataTypeName(dataTypeName);

public override TypeMappingInfo? GetMappingByPostgresType(TypeMapper typeMapper, PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"jsonb" => new(NpgsqlDbType.Jsonb, "jsonb"),
"json" => new(NpgsqlDbType.Json, "json"),
_ => null
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,27 +47,9 @@ internal NetTopologySuiteTypeHandlerResolver(
};

public override NpgsqlTypeHandler? ResolveByClrType(Type type)
=> ClrTypeToDataTypeName(type, _geographyAsDefault) is { } dataTypeName && ResolveByDataTypeName(dataTypeName) is { } handler
=> NetTopologySuiteTypeMappingResolver.ClrTypeToDataTypeName(type, _geographyAsDefault) is { } dataTypeName && ResolveByDataTypeName(dataTypeName) is { } handler
? handler
: null;

internal static string? ClrTypeToDataTypeName(Type type, bool geographyAsDefault)
=> type != typeof(Geometry) && type.BaseType != typeof(Geometry) && type.BaseType != typeof(GeometryCollection)
? null
: geographyAsDefault
? "geography"
: "geometry";

public override TypeMappingInfo? GetMappingByPostgresType(PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

internal static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"geometry" => new(NpgsqlDbType.Geometry, "geometry"),
"geography" => new(NpgsqlDbType.Geography, "geography"),
_ => null
};

PostgresType? PgType(string pgTypeName) => _databaseInfo.TryGetPostgresTypeByName(pgTypeName, out var pgType) ? pgType : null;
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
using System;
using System.Data;
using NetTopologySuite;
using NetTopologySuite.Geometries;
using Npgsql.Internal;
using Npgsql.Internal.TypeHandling;
using Npgsql.Internal.TypeMapping;
using Npgsql.TypeMapping;

namespace Npgsql.NetTopologySuite.Internal;

Expand All @@ -32,9 +29,5 @@ public override TypeHandlerResolver Create(TypeMapper typeMapper, NpgsqlConnecto
=> new NetTopologySuiteTypeHandlerResolver(connector, _coordinateSequenceFactory, _precisionModel, _handleOrdinates,
_geographyAsDefault);

public override string? GetDataTypeNameByClrType(Type type)
=> NetTopologySuiteTypeHandlerResolver.ClrTypeToDataTypeName(type, _geographyAsDefault);

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> NetTopologySuiteTypeHandlerResolver.DoGetMappingByDataTypeName(dataTypeName);
public override TypeMappingResolver CreateMappingResolver() => new NetTopologySuiteTypeMappingResolver(_geographyAsDefault);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using NetTopologySuite.Geometries;
using Npgsql.Internal.TypeHandling;
using Npgsql.Internal.TypeMapping;
using Npgsql.PostgresTypes;
using NpgsqlTypes;

namespace Npgsql.NetTopologySuite.Internal;

public class NetTopologySuiteTypeMappingResolver : TypeMappingResolver
{
readonly bool _geographyAsDefault;

public NetTopologySuiteTypeMappingResolver(bool geographyAsDefault) => _geographyAsDefault = geographyAsDefault;

public override string? GetDataTypeNameByClrType(Type type)
=> ClrTypeToDataTypeName(type, _geographyAsDefault);

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> DoGetMappingByDataTypeName(dataTypeName);

public override TypeMappingInfo? GetMappingByPostgresType(TypeMapper typeMapper, PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

internal static string? ClrTypeToDataTypeName(Type type, bool geographyAsDefault)
=> type != typeof(Geometry) && type.BaseType != typeof(Geometry) && type.BaseType != typeof(GeometryCollection)
? null
: geographyAsDefault
? "geography"
: "geometry";

static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"geometry" => new(NpgsqlDbType.Geometry, "geometry"),
"geography" => new(NpgsqlDbType.Geography, "geography"),
_ => null
};
}
87 changes: 1 addition & 86 deletions src/Npgsql.NodaTime/Internal/NodaTimeTypeHandlerResolver.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using NodaTime;
using Npgsql.Internal;
using Npgsql.Internal.TypeHandlers;
Expand Down Expand Up @@ -74,7 +73,7 @@ internal NodaTimeTypeHandlerResolver(NpgsqlConnector connector)
};

public override NpgsqlTypeHandler? ResolveByClrType(Type type)
=> ClrTypeToDataTypeName(type) is { } dataTypeName && ResolveByDataTypeName(dataTypeName) is { } handler
=> NodaTimeTypeMappingResolver.ClrTypeToDataTypeName(type) is { } dataTypeName && ResolveByDataTypeName(dataTypeName) is { } handler
? handler
: null;

Expand Down Expand Up @@ -131,90 +130,6 @@ internal NodaTimeTypeHandlerResolver(NpgsqlConnector connector)
return null;
}

internal static string? ClrTypeToDataTypeName(Type type)
{
if (type == typeof(Instant))
return LegacyTimestampBehavior ? "timestamp without time zone" : "timestamp with time zone";

if (type == typeof(LocalDateTime))
return "timestamp without time zone";
if (type == typeof(ZonedDateTime) || type == typeof(OffsetDateTime))
return "timestamp with time zone";
if (type == typeof(LocalDate))
return "date";
if (type == typeof(LocalTime))
return "time without time zone";
if (type == typeof(OffsetTime))
return "time with time zone";
if (type == typeof(Period) || type == typeof(Duration))
return "interval";

// Ranges
if (type == typeof(NpgsqlRange<LocalDateTime>))
return "tsrange";

if (type == typeof(Interval) ||
type == typeof(NpgsqlRange<Instant>) ||
type == typeof(NpgsqlRange<ZonedDateTime>) ||
type == typeof(NpgsqlRange<OffsetDateTime>))
{
return "tstzrange";
}

if (type == typeof(DateInterval) || type == typeof(NpgsqlRange<LocalDate>))
return "daterange";

// Multiranges
if (type == typeof(NpgsqlRange<LocalDateTime>[]) || type == typeof(List<NpgsqlRange<LocalDateTime>>))
return "tsmultirange";

if (type == typeof(Interval[]) ||
type == typeof(List<Interval>) ||
type == typeof(NpgsqlRange<Instant>[]) ||
type == typeof(List<NpgsqlRange<Instant>>) ||
type == typeof(NpgsqlRange<ZonedDateTime>[]) ||
type == typeof(List<NpgsqlRange<ZonedDateTime>>) ||
type == typeof(NpgsqlRange<OffsetDateTime>[]) ||
type == typeof(List<NpgsqlRange<OffsetDateTime>>))
{
return "tstzmultirange";
}
if (type == typeof(DateInterval[]) ||
type == typeof(List<DateInterval>) ||
type == typeof(NpgsqlRange<LocalDate>[]) ||
type == typeof(List<NpgsqlRange<LocalDate>>))
{
return "datemultirange";
}

return null;
}

public override TypeMappingInfo? GetMappingByPostgresType(PostgresType type)
=> DoGetMappingByDataTypeName(type.Name);

internal static TypeMappingInfo? DoGetMappingByDataTypeName(string dataTypeName)
=> dataTypeName switch
{
"timestamp" or "timestamp without time zone" => new(NpgsqlDbType.Timestamp, "timestamp without time zone"),
"timestamptz" or "timestamp with time zone" => new(NpgsqlDbType.TimestampTz, "timestamp with time zone"),
"date" => new(NpgsqlDbType.Date, "date"),
"time without time zone" => new(NpgsqlDbType.Time, "time without time zone"),
"time with time zone" => new(NpgsqlDbType.TimeTz, "time with time zone"),
"interval" => new(NpgsqlDbType.Interval, "interval"),

"tsrange" => new(NpgsqlDbType.TimestampRange, "tsrange"),
"tstzrange" => new(NpgsqlDbType.TimestampTzRange, "tstzrange"),
"daterange" => new(NpgsqlDbType.DateRange, "daterange"),

"tsmultirange" => new(NpgsqlDbType.TimestampMultirange, "tsmultirange"),
"tstzmultirange" => new(NpgsqlDbType.TimestampTzMultirange, "tstzmultirange"),
"datemultirange" => new(NpgsqlDbType.DateMultirange, "datemultirange"),

_ => null
};


PostgresType PgType(string pgTypeName) => _databaseInfo.GetPostgresTypeByName(pgTypeName);

TimestampTzRangeHandler TsTzRange()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System;
using Npgsql.Internal;
using Npgsql.Internal.TypeHandling;
using Npgsql.Internal.TypeMapping;
using Npgsql.TypeMapping;

namespace Npgsql.NodaTime.Internal;

Expand All @@ -11,9 +9,7 @@ public class NodaTimeTypeHandlerResolverFactory : TypeHandlerResolverFactory
public override TypeHandlerResolver Create(TypeMapper typeMapper, NpgsqlConnector connector)
=> new NodaTimeTypeHandlerResolver(connector);

public override string? GetDataTypeNameByClrType(Type type)
=> NodaTimeTypeHandlerResolver.ClrTypeToDataTypeName(type);
public override TypeMappingResolver CreateMappingResolver() => new NodaTimeTypeMappingResolver();

public override TypeMappingInfo? GetMappingByDataTypeName(string dataTypeName)
=> NodaTimeTypeHandlerResolver.DoGetMappingByDataTypeName(dataTypeName);
public override TypeMappingResolver CreateGlobalMappingResolver() => new NodaTimeTypeMappingResolver();
}
Loading