Skip to content

Commit 318b907

Browse files
authored
Optimized and made AOT friendly composite mappings
1 parent 6f61b49 commit 318b907

2 files changed

Lines changed: 36 additions & 39 deletions

File tree

src/Npgsql/TypeMapping/INpgsqlTypeMapper.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ bool UnmapComposite<T>(
135135
/// If there is a discrepancy between the .NET type and database type while a composite is read or written,
136136
/// an exception will be raised.
137137
/// </remarks>
138-
/// <param name="compType">The .NET type to be mapped.</param>
138+
/// <param name="clrType">The .NET type to be mapped.</param>
139139
/// <param name="pgName">
140140
/// A PostgreSQL type name for the corresponding composite type in the database.
141141
/// If null, the name translator given in <paramref name="nameTranslator"/> will be used.
@@ -146,14 +146,14 @@ bool UnmapComposite<T>(
146146
/// </param>
147147
[NotNull]
148148
INpgsqlTypeMapper MapComposite(
149-
Type compType,
149+
Type clrType,
150150
string? pgName = null,
151151
INpgsqlNameTranslator? nameTranslator = null);
152152

153153
/// <summary>
154154
/// Removes an existing composite mapping.
155155
/// </summary>
156-
/// <param name="compType">The .NET type to be unmapped.</param>
156+
/// <param name="clrType">The .NET type to be unmapped.</param>
157157
/// <param name="pgName">
158158
/// A PostgreSQL type name for the corresponding composite type in the database.
159159
/// If null, the name translator given in <paramref name="nameTranslator"/> will be used.
@@ -163,7 +163,7 @@ INpgsqlTypeMapper MapComposite(
163163
/// Defaults to <see cref="NpgsqlSnakeCaseNameTranslator"/>
164164
/// </param>
165165
bool UnmapComposite(
166-
Type compType,
166+
Type clrType,
167167
string? pgName = null,
168168
INpgsqlNameTranslator? nameTranslator = null);
169169

src/Npgsql/TypeMapping/TypeMapperBase.cs

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -80,43 +80,40 @@ public bool UnmapEnum<TEnum>(string? pgName = null, INpgsqlNameTranslator? nameT
8080
#region Composite mapping
8181

8282
public INpgsqlTypeMapper MapComposite<T>(string? pgName = null, INpgsqlNameTranslator? nameTranslator = null)
83-
=> MapComposite(typeof(T), pgName, nameTranslator);
83+
=> MapComposite(pgName, nameTranslator, typeof(T), t => new CompositeTypeHandlerFactory<T>(t));
8484

85-
public bool UnmapComposite<T>(string? pgName = null, INpgsqlNameTranslator? nameTranslator = null)
86-
=> UnmapComposite(typeof(T), pgName, nameTranslator);
87-
88-
public INpgsqlTypeMapper MapComposite(Type compType, string? pgName = null, INpgsqlNameTranslator? nameTranslator = null) {
89-
if (pgName != null && pgName.Trim() == "")
90-
throw new ArgumentException("pgName can't be empty", nameof(pgName));
85+
public INpgsqlTypeMapper MapComposite(Type clrType, string? pgName = null, INpgsqlNameTranslator? nameTranslator = null)
86+
=> MapComposite(pgName, nameTranslator, clrType, t => (NpgsqlTypeHandlerFactory)
87+
Activator.CreateInstance(typeof(CompositeTypeHandlerFactory<>).MakeGenericType(clrType), t)!);
9188

92-
if (nameTranslator == null)
93-
nameTranslator = DefaultNameTranslator;
94-
if (pgName == null)
95-
pgName = GetPgName(compType, nameTranslator);
96-
97-
var thfType = typeof(CompositeTypeHandlerFactory<>);
98-
var thf = (NpgsqlTypeHandlerFactory)Activator.CreateInstance(
99-
thfType.MakeGenericType(compType),
100-
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
101-
binder: null,
102-
args: new object[] { nameTranslator },
103-
culture: null)!;
104-
105-
return AddMapping(new NpgsqlTypeMappingBuilder {
106-
PgTypeName = pgName,
107-
ClrTypes = new[] { compType },
108-
TypeHandlerFactory = thf,
109-
}.Build());
89+
INpgsqlTypeMapper MapComposite(string? pgName, INpgsqlNameTranslator? nameTranslator, Type type, Func<INpgsqlNameTranslator, NpgsqlTypeHandlerFactory> factory)
90+
{
91+
if (pgName != null && string.IsNullOrWhiteSpace(pgName))
92+
throw new ArgumentException("pgName can't be empty.", nameof(pgName));
93+
94+
nameTranslator ??= DefaultNameTranslator;
95+
pgName ??= GetPgName(type, nameTranslator);
96+
97+
return AddMapping(
98+
new NpgsqlTypeMappingBuilder
99+
{
100+
PgTypeName = pgName,
101+
ClrTypes = new[] { type },
102+
TypeHandlerFactory = factory(nameTranslator),
103+
}
104+
.Build());
110105
}
111106

112-
public bool UnmapComposite(Type compType, string? pgName = null, INpgsqlNameTranslator? nameTranslator = null) {
113-
if (pgName != null && pgName.Trim() == "")
114-
throw new ArgumentException("pgName can't be empty", nameof(pgName));
107+
public bool UnmapComposite<T>(string? pgName = null, INpgsqlNameTranslator? nameTranslator = null)
108+
=> UnmapComposite(typeof(T), pgName, nameTranslator);
115109

116-
if (nameTranslator == null)
117-
nameTranslator = DefaultNameTranslator;
118-
if (pgName == null)
119-
pgName = GetPgName(compType, nameTranslator);
110+
public bool UnmapComposite(Type clrType, string? pgName = null, INpgsqlNameTranslator? nameTranslator = null)
111+
{
112+
if (pgName != null && string.IsNullOrWhiteSpace(pgName))
113+
throw new ArgumentException("pgName can't be empty.", nameof(pgName));
114+
115+
nameTranslator ??= DefaultNameTranslator;
116+
pgName ??= GetPgName(clrType, nameTranslator);
120117

121118
return RemoveMapping(pgName);
122119
}
@@ -127,9 +124,9 @@ public bool UnmapComposite(Type compType, string? pgName = null, INpgsqlNameTran
127124

128125
// TODO: why does ReSharper think `GetCustomAttribute<T>` is non-nullable?
129126
// ReSharper disable once ConstantConditionalAccessQualifier ConstantNullCoalescingCondition
130-
static string GetPgName(Type compType, INpgsqlNameTranslator nameTranslator)
131-
=> compType.GetCustomAttribute<PgNameAttribute>()?.PgName
132-
?? nameTranslator.TranslateTypeName(compType.Name);
127+
static string GetPgName(Type clrType, INpgsqlNameTranslator nameTranslator)
128+
=> clrType.GetCustomAttribute<PgNameAttribute>()?.PgName
129+
?? nameTranslator.TranslateTypeName(clrType.Name);
133130

134131
#endregion Misc
135132
}

0 commit comments

Comments
 (0)