forked from npgsql/npgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNpgsqlFactory.cs
More file actions
128 lines (103 loc) · 4.74 KB
/
NpgsqlFactory.cs
File metadata and controls
128 lines (103 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Data.Common;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
namespace Npgsql;
/// <summary>
/// A factory to create instances of various Npgsql objects.
/// </summary>
[Serializable]
public sealed class NpgsqlFactory : DbProviderFactory, IServiceProvider
{
/// <summary>
/// Gets an instance of the <see cref="NpgsqlFactory"/>.
/// This can be used to retrieve strongly typed data objects.
/// </summary>
public static readonly NpgsqlFactory Instance = new();
NpgsqlFactory() {}
/// <summary>
/// Returns a strongly typed <see cref="DbCommand"/> instance.
/// </summary>
public override DbCommand CreateCommand() => new NpgsqlCommand();
/// <summary>
/// Returns a strongly typed <see cref="DbConnection"/> instance.
/// </summary>
public override DbConnection CreateConnection() => new NpgsqlConnection();
/// <summary>
/// Returns a strongly typed <see cref="DbParameter"/> instance.
/// </summary>
public override DbParameter CreateParameter() => new NpgsqlParameter();
/// <summary>
/// Returns a strongly typed <see cref="DbConnectionStringBuilder"/> instance.
/// </summary>
public override DbConnectionStringBuilder CreateConnectionStringBuilder() => new NpgsqlConnectionStringBuilder();
/// <summary>
/// Returns a strongly typed <see cref="DbCommandBuilder"/> instance.
/// </summary>
public override DbCommandBuilder CreateCommandBuilder() => new NpgsqlCommandBuilder();
/// <summary>
/// Returns a strongly typed <see cref="DbDataAdapter"/> instance.
/// </summary>
public override DbDataAdapter CreateDataAdapter() => new NpgsqlDataAdapter();
#if !NETSTANDARD2_0
/// <summary>
/// Specifies whether the specific <see cref="DbProviderFactory"/> supports the <see cref="DbDataAdapter"/> class.
/// </summary>
public override bool CanCreateDataAdapter => true;
/// <summary>
/// Specifies whether the specific <see cref="DbProviderFactory"/> supports the <see cref="DbCommandBuilder"/> class.
/// </summary>
public override bool CanCreateCommandBuilder => true;
#endif
#if NET6_0_OR_GREATER
/// <inheritdoc/>
public override bool CanCreateBatch => true;
/// <inheritdoc/>
public override DbBatch CreateBatch() => new NpgsqlBatch();
/// <inheritdoc/>
public override DbBatchCommand CreateBatchCommand() => new NpgsqlBatchCommand();
#endif
#if NET7_0_OR_GREATER
/// <inheritdoc/>
public override DbDataSource CreateDataSource(string connectionString)
=> NpgsqlDataSource.Create(connectionString);
#endif
#region IServiceProvider Members
/// <summary>
/// Gets the service object of the specified type.
/// </summary>
/// <param name="serviceType">An object that specifies the type of service object to get.</param>
/// <returns>A service object of type serviceType, or null if there is no service object of type serviceType.</returns>
[RequiresUnreferencedCode("Legacy EF5 method, not trimming-safe.")]
public object? GetService(Type serviceType)
{
if (serviceType == null)
throw new ArgumentNullException(nameof(serviceType));
// In legacy Entity Framework, this is the entry point for obtaining Npgsql's
// implementation of DbProviderServices. We use reflection for all types to
// avoid any dependencies on EF stuff in this project. EF6 (and of course EF Core) do not use this method.
if (serviceType.FullName != "System.Data.Common.DbProviderServices")
return null;
// User has requested a legacy EF DbProviderServices implementation. Check our cache first.
if (_legacyEntityFrameworkServices != null)
return _legacyEntityFrameworkServices;
// First time, attempt to find the EntityFramework5.Npgsql assembly and load the type via reflection
var assemblyName = typeof(NpgsqlFactory).GetTypeInfo().Assembly.GetName();
assemblyName.Name = "EntityFramework5.Npgsql";
Assembly npgsqlEfAssembly;
try {
npgsqlEfAssembly = Assembly.Load(new AssemblyName(assemblyName.FullName));
} catch {
return null;
}
Type? npgsqlServicesType;
if ((npgsqlServicesType = npgsqlEfAssembly.GetType("Npgsql.NpgsqlServices")) == null ||
npgsqlServicesType.GetProperty("Instance") == null)
throw new Exception("EntityFramework5.Npgsql assembly does not seem to contain the correct type!");
return _legacyEntityFrameworkServices = npgsqlServicesType
.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static)!
.GetMethod!.Invoke(null, new object[0]);
}
static object? _legacyEntityFrameworkServices;
#endregion
}