Skip to content

Commit 192bab0

Browse files
committed
Force supports reading for the array mappings
1 parent f9c1f87 commit 192bab0

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

src/Npgsql/Internal/TypeInfoMapping.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public readonly struct TypeInfoMapping(Type type, string dataTypeName, TypeInfoF
7272

7373
public bool TypeEquals(Type type) => TypeMatchPredicate?.Invoke(type) ?? Type == type;
7474

75-
private bool DataTypeNameEqualsCore(string dataTypeName)
75+
bool DataTypeNameEqualsCore(string dataTypeName)
7676
{
7777
var span = DataTypeName.AsSpan();
7878
return Postgres.DataTypeName.IsFullyQualified(span)
@@ -196,7 +196,7 @@ TypeInfoMapping GetMapping(Type type, string dataTypeName)
196196
=> TryGetMapping(type, dataTypeName, out var info) ? info : throw new InvalidOperationException($"Could not find mapping for {type} <-> {dataTypeName}");
197197

198198
// Helper to eliminate generic display class duplication.
199-
static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping innerMapping, Func<TypeInfoMapping, PgTypeInfo, PgConverter> mapper, bool copyPreferredFormat = false, bool supportsWriting = true)
199+
static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping innerMapping, Func<TypeInfoMapping, PgTypeInfo, PgConverter> mapper, bool copyPreferredFormat = false, bool? supportsReading = null, bool? supportsWriting = null)
200200
=> (options, mapping, requiresDataTypeName) =>
201201
{
202202
var resolvedInnerMapping = innerMapping;
@@ -207,8 +207,8 @@ static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping i
207207
var converter = mapper(mapping, innerInfo);
208208
var preferredFormat = copyPreferredFormat ? innerInfo.PreferredFormat : null;
209209
var unboxedType = ComputeUnboxedType(defaultType: mappingType, converter.TypeToConvert, mapping.Type);
210-
var readingSupported = innerInfo.SupportsReading && PgTypeInfo.GetDefaultSupportsReading(converter.TypeToConvert, unboxedType);
211-
var writingSupported = supportsWriting && innerInfo.SupportsWriting;
210+
var readingSupported = innerInfo.SupportsReading && (supportsReading ?? PgTypeInfo.GetDefaultSupportsReading(converter.TypeToConvert, unboxedType));
211+
var writingSupported = innerInfo.SupportsWriting && (supportsWriting ?? true);
212212

213213
return new PgTypeInfo(options, converter, options.GetCanonicalTypeId(new DataTypeName(mapping.DataTypeName)), unboxedType)
214214
{
@@ -219,7 +219,7 @@ static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping i
219219
};
220220

221221
// Helper to eliminate generic display class duplication.
222-
static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping innerMapping, Func<TypeInfoMapping, PgResolverTypeInfo, PgConverterResolver> mapper, bool copyPreferredFormat = false, bool supportsWriting = true)
222+
static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping innerMapping, Func<TypeInfoMapping, PgResolverTypeInfo, PgConverterResolver> mapper, bool copyPreferredFormat = false, bool? supportsReading = null, bool? supportsWriting = null)
223223
=> (options, mapping, requiresDataTypeName) =>
224224
{
225225
var resolvedInnerMapping = innerMapping;
@@ -230,8 +230,8 @@ static TypeInfoFactory CreateComposedFactory(Type mappingType, TypeInfoMapping i
230230
var resolver = mapper(mapping, innerInfo);
231231
var preferredFormat = copyPreferredFormat ? innerInfo.PreferredFormat : null;
232232
var unboxedType = ComputeUnboxedType(defaultType: mappingType, resolver.TypeToConvert, mapping.Type);
233-
var readingSupported = innerInfo.SupportsReading && PgTypeInfo.GetDefaultSupportsReading(resolver.TypeToConvert, unboxedType);
234-
var writingSupported = supportsWriting && innerInfo.SupportsWriting;
233+
var readingSupported = innerInfo.SupportsReading && (supportsReading ?? PgTypeInfo.GetDefaultSupportsReading(resolver.TypeToConvert, unboxedType));
234+
var writingSupported = innerInfo.SupportsWriting && (supportsWriting ?? true);
235235
// We include the data type name if the inner info did so as well.
236236
// This way we can rely on its logic around resolvedDataTypeName, including when it ignores that flag.
237237
PgTypeId? pgTypeId = innerInfo.PgTypeId is not null
@@ -355,7 +355,7 @@ public void AddArrayType<TElement>(TypeInfoMapping elementMapping, bool suppress
355355

356356
void AddArrayType(TypeInfoMapping elementMapping, Type type, Func<TypeInfoMapping, PgTypeInfo, PgConverter> converter, Func<Type?, bool>? typeMatchPredicate = null, bool suppressObjectMapping = false)
357357
{
358-
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter))
358+
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter, supportsReading: true))
359359
{
360360
MatchRequirement = elementMapping.MatchRequirement,
361361
TypeMatchPredicate = typeMatchPredicate
@@ -395,7 +395,7 @@ public void AddResolverArrayType<TElement>(TypeInfoMapping elementMapping, bool
395395

396396
void AddResolverArrayType(TypeInfoMapping elementMapping, Type type, Func<TypeInfoMapping, PgResolverTypeInfo, PgConverterResolver> converter, Func<Type?, bool>? typeMatchPredicate = null, bool suppressObjectMapping = false)
397397
{
398-
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter))
398+
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter, supportsReading: true))
399399
{
400400
MatchRequirement = elementMapping.MatchRequirement,
401401
TypeMatchPredicate = typeMatchPredicate
@@ -487,12 +487,12 @@ void AddStructArrayType(TypeInfoMapping elementMapping, TypeInfoMapping nullable
487487
Func<Type?, bool>? typeMatchPredicate, Func<Type?, bool>? nullableTypeMatchPredicate, bool suppressObjectMapping)
488488
{
489489
var arrayDataTypeName = GetArrayDataTypeName(elementMapping.DataTypeName);
490-
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter))
490+
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter, supportsReading: true))
491491
{
492492
MatchRequirement = elementMapping.MatchRequirement,
493493
TypeMatchPredicate = typeMatchPredicate
494494
};
495-
var nullableArrayMapping = new TypeInfoMapping(nullableType, arrayDataTypeName, CreateComposedFactory(nullableType, nullableElementMapping, nullableConverter))
495+
var nullableArrayMapping = new TypeInfoMapping(nullableType, arrayDataTypeName, CreateComposedFactory(nullableType, nullableElementMapping, nullableConverter, supportsReading: true))
496496
{
497497
MatchRequirement = arrayMapping.MatchRequirement,
498498
TypeMatchPredicate = nullableTypeMatchPredicate
@@ -605,12 +605,12 @@ void AddResolverStructArrayType(TypeInfoMapping elementMapping, TypeInfoMapping
605605
{
606606
var arrayDataTypeName = GetArrayDataTypeName(elementMapping.DataTypeName);
607607

608-
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter))
608+
var arrayMapping = new TypeInfoMapping(type, arrayDataTypeName, CreateComposedFactory(type, elementMapping, converter, supportsReading: true))
609609
{
610610
MatchRequirement = elementMapping.MatchRequirement,
611611
TypeMatchPredicate = typeMatchPredicate
612612
};
613-
var nullableArrayMapping = new TypeInfoMapping(nullableType, arrayDataTypeName, CreateComposedFactory(nullableType, nullableElementMapping, nullableConverter))
613+
var nullableArrayMapping = new TypeInfoMapping(nullableType, arrayDataTypeName, CreateComposedFactory(nullableType, nullableElementMapping, nullableConverter, supportsReading: true))
614614
{
615615
MatchRequirement = elementMapping.MatchRequirement,
616616
TypeMatchPredicate = nullableTypeMatchPredicate
@@ -658,7 +658,7 @@ void AddPolymorphicResolverArrayType(TypeInfoMapping elementMapping, Type type,
658658
{
659659
var arrayDataTypeName = GetArrayDataTypeName(elementMapping.DataTypeName);
660660
var mapping = new TypeInfoMapping(type, arrayDataTypeName,
661-
CreateComposedFactory(typeof(Array), elementMapping, converter, supportsWriting: false))
661+
CreateComposedFactory(typeof(Array), elementMapping, converter, supportsReading: true, supportsWriting: false))
662662
{
663663
MatchRequirement = elementMapping.MatchRequirement,
664664
TypeMatchPredicate = typeMatchPredicate

0 commit comments

Comments
 (0)