Skip to content

Commit 3dd9251

Browse files
committed
Low-level support for all providers
1 parent ceac4a0 commit 3dd9251

File tree

11 files changed

+522
-47
lines changed

11 files changed

+522
-47
lines changed

Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ public class DriverFactory : SqlDriverFactory
3333
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
3434
{
3535
using var connection = new FbConnection(connectionString);
36-
connection.Open();
37-
SqlHelper.ExecuteInitializationSql(connection, configuration);
36+
if (configuration.ConnectionHandlers.Count > 0)
37+
OpenConnectionWithNotifications(connection, configuration, false).GetAwaiter().GetResult();
38+
else
39+
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
3840
var defaultSchema = GetDefaultSchema(connection);
3941
return CreateDriverInstance(
4042
connectionString, GetVersionFromServerVersionString(connection.ServerVersion), defaultSchema);
@@ -45,8 +47,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
4547
{
4648
var connection = new FbConnection(connectionString);
4749
await using (connection.ConfigureAwait(false)) {
48-
await connection.OpenAsync(token).ConfigureAwait(false);
49-
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
50+
if (configuration.ConnectionHandlers.Count > 0)
51+
await OpenConnectionWithNotifications(connection, configuration, true, token).ConfigureAwait(false);
52+
else
53+
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
5054
var defaultSchema = await GetDefaultSchemaAsync(connection, token: token).ConfigureAwait(false);
5155
return CreateDriverInstance(
5256
connectionString, GetVersionFromServerVersionString(connection.ServerVersion), defaultSchema);
@@ -118,6 +122,51 @@ protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
118122
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
119123
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);
120124

125+
private async ValueTask OpenConnectionFast(FbConnection connection, SqlDriverConfiguration configuration, bool isAsync, CancellationToken cancellationToken = default)
126+
{
127+
if (!isAsync) {
128+
connection.Open();
129+
SqlHelper.ExecuteInitializationSql(connection, configuration);
130+
}
131+
else {
132+
await connection.OpenAsync().ConfigureAwait(false);
133+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
134+
}
135+
}
136+
137+
private async ValueTask OpenConnectionWithNotifications(FbConnection connection, SqlDriverConfiguration configuration, bool isAsync, CancellationToken cancellationToken = default)
138+
{
139+
var handlers = configuration.ConnectionHandlers;
140+
if (!isAsync) {
141+
SqlHelper.NotifyConnectionOpening(handlers, connection);
142+
try {
143+
connection.Open();
144+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
145+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
146+
SqlHelper.ExecuteInitializationSql(connection, configuration);
147+
SqlHelper.NotifyConnectionOpened(handlers, connection);
148+
}
149+
catch(Exception ex) {
150+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
151+
throw;
152+
}
153+
}
154+
else {
155+
SqlHelper.NotifyConnectionOpening(handlers, connection);
156+
try {
157+
await connection.OpenAsync();
158+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
159+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
160+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken);
161+
SqlHelper.NotifyConnectionOpened(handlers, connection);
162+
}
163+
catch (Exception ex) {
164+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
165+
throw;
166+
}
167+
}
168+
}
169+
121170
private static Version GetVersionFromServerVersionString(string serverVersionString)
122171
{
123172
var matcher = new Regex(ServerVersionParser);

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2011-2020 Xtensive LLC.
1+
// Copyright (C) 2011-2020 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
@@ -70,8 +70,10 @@ private static Version ParseVersion(string version)
7070
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
7171
{
7272
using (var connection = new MySqlConnection(connectionString)) {
73-
connection.Open();
74-
SqlHelper.ExecuteInitializationSql(connection, configuration);
73+
if (configuration.ConnectionHandlers.Count > 0)
74+
OpenConnectionWithNotifications(connection, configuration, false).GetAwaiter().GetResult();
75+
else
76+
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
7577
var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion)
7678
? connection.ServerVersion
7779
: configuration.ForcedServerVersion;
@@ -88,8 +90,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
8890
{
8991
var connection = new MySqlConnection(connectionString);
9092
await using (connection.ConfigureAwait(false)) {
91-
await connection.OpenAsync(token).ConfigureAwait(false);
92-
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
93+
if (configuration.ConnectionHandlers.Count > 0)
94+
await OpenConnectionWithNotifications(connection, configuration, true, token).ConfigureAwait(false);
95+
else
96+
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
9397
var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion)
9498
? connection.ServerVersion
9599
: configuration.ForcedServerVersion;
@@ -131,5 +135,56 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
131135
protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
132136
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
133137
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);
138+
139+
private async ValueTask OpenConnectionFast(MySqlConnection connection,
140+
SqlDriverConfiguration configuration,
141+
bool isAsync,
142+
CancellationToken cancellationToken = default)
143+
{
144+
if (!isAsync) {
145+
connection.Open();
146+
SqlHelper.ExecuteInitializationSql(connection, configuration);
147+
}
148+
else {
149+
await connection.OpenAsync().ConfigureAwait(false);
150+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
151+
}
152+
}
153+
154+
private async ValueTask OpenConnectionWithNotifications(MySqlConnection connection,
155+
SqlDriverConfiguration configuration,
156+
bool isAsync,
157+
CancellationToken cancellationToken = default)
158+
{
159+
var handlers = configuration.ConnectionHandlers;
160+
if (!isAsync) {
161+
SqlHelper.NotifyConnectionOpening(handlers, connection);
162+
try {
163+
connection.Open();
164+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
165+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
166+
SqlHelper.ExecuteInitializationSql(connection, configuration);
167+
SqlHelper.NotifyConnectionOpened(handlers, connection);
168+
}
169+
catch (Exception ex) {
170+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
171+
throw;
172+
}
173+
}
174+
else {
175+
SqlHelper.NotifyConnectionOpening(handlers, connection);
176+
try {
177+
await connection.OpenAsync();
178+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
179+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
180+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken);
181+
SqlHelper.NotifyConnectionOpened(handlers, connection);
182+
}
183+
catch (Exception ex) {
184+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
185+
throw;
186+
}
187+
}
188+
}
134189
}
135190
}

Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ protected override string BuildConnectionString(UrlInfo url)
7171
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
7272
{
7373
using var connection = new OracleConnection(connectionString);
74-
connection.Open();
75-
SqlHelper.ExecuteInitializationSql(connection, configuration);
74+
if (configuration.ConnectionHandlers.Count > 0)
75+
OpenConnectionWithNotifications(connection, configuration, false).GetAwaiter().GetResult();
76+
else
77+
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
7678
var version = string.IsNullOrEmpty(configuration.ForcedServerVersion)
7779
? ParseVersion(connection.ServerVersion)
7880
: new Version(configuration.ForcedServerVersion);
@@ -86,8 +88,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
8688
{
8789
var connection = new OracleConnection(connectionString);
8890
await using (connection.ConfigureAwait(false)) {
89-
await connection.OpenAsync(token).ConfigureAwait(false);
90-
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
91+
if (configuration.ConnectionHandlers.Count > 0)
92+
await OpenConnectionWithNotifications(connection, configuration, true, token).ConfigureAwait(false);
93+
else
94+
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
9195
var version = string.IsNullOrEmpty(configuration.ForcedServerVersion)
9296
? ParseVersion(connection.ServerVersion)
9397
: new Version(configuration.ForcedServerVersion);
@@ -124,5 +128,56 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
124128
protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
125129
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
126130
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);
131+
132+
private async ValueTask OpenConnectionFast(OracleConnection connection,
133+
SqlDriverConfiguration configuration,
134+
bool isAsync,
135+
CancellationToken cancellationToken = default)
136+
{
137+
if (!isAsync) {
138+
connection.Open();
139+
SqlHelper.ExecuteInitializationSql(connection, configuration);
140+
}
141+
else {
142+
await connection.OpenAsync().ConfigureAwait(false);
143+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
144+
}
145+
}
146+
147+
private async ValueTask OpenConnectionWithNotifications(OracleConnection connection,
148+
SqlDriverConfiguration configuration,
149+
bool isAsync,
150+
CancellationToken cancellationToken = default)
151+
{
152+
var handlers = configuration.ConnectionHandlers;
153+
if (!isAsync) {
154+
SqlHelper.NotifyConnectionOpening(handlers, connection);
155+
try {
156+
connection.Open();
157+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
158+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
159+
SqlHelper.ExecuteInitializationSql(connection, configuration);
160+
SqlHelper.NotifyConnectionOpened(handlers, connection);
161+
}
162+
catch (Exception ex) {
163+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
164+
throw;
165+
}
166+
}
167+
else {
168+
SqlHelper.NotifyConnectionOpening(handlers, connection);
169+
try {
170+
await connection.OpenAsync();
171+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
172+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
173+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken);
174+
SqlHelper.NotifyConnectionOpened(handlers, connection);
175+
}
176+
catch (Exception ex) {
177+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
178+
throw;
179+
}
180+
}
181+
}
127182
}
128183
}

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/DriverFactory.cs

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ protected override string BuildConnectionString(UrlInfo url)
6161
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
6262
{
6363
using var connection = new NpgsqlConnection(connectionString);
64-
connection.Open();
65-
SqlHelper.ExecuteInitializationSql(connection, configuration);
64+
if (configuration.ConnectionHandlers.Count > 0)
65+
OpenConnectionWithNotifications(connection, configuration, false).GetAwaiter().GetResult();
66+
else
67+
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
6668
var version = GetVersion(configuration, connection);
6769
var defaultSchema = GetDefaultSchema(connection);
6870
return CreateDriverInstance(connectionString, version, defaultSchema);
@@ -74,8 +76,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
7476
{
7577
var connection = new NpgsqlConnection(connectionString);
7678
await using (connection.ConfigureAwait(false)) {
77-
await connection.OpenAsync(token).ConfigureAwait(false);
78-
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
79+
if (configuration.ConnectionHandlers.Count > 0)
80+
await OpenConnectionWithNotifications(connection, configuration, true, token).ConfigureAwait(false);
81+
else
82+
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
7983
var version = GetVersion(configuration, connection);
8084
var defaultSchema = await GetDefaultSchemaAsync(connection, token: token).ConfigureAwait(false);
8185
return CreateDriverInstance(connectionString, version, defaultSchema);
@@ -130,5 +134,56 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
130134
protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
131135
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
132136
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);
137+
138+
private async ValueTask OpenConnectionFast(NpgsqlConnection connection,
139+
SqlDriverConfiguration configuration,
140+
bool isAsync,
141+
CancellationToken cancellationToken = default)
142+
{
143+
if (!isAsync) {
144+
connection.Open();
145+
SqlHelper.ExecuteInitializationSql(connection, configuration);
146+
}
147+
else {
148+
await connection.OpenAsync().ConfigureAwait(false);
149+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
150+
}
151+
}
152+
153+
private async ValueTask OpenConnectionWithNotifications(NpgsqlConnection connection,
154+
SqlDriverConfiguration configuration,
155+
bool isAsync,
156+
CancellationToken cancellationToken = default)
157+
{
158+
var handlers = configuration.ConnectionHandlers;
159+
if (!isAsync) {
160+
SqlHelper.NotifyConnectionOpening(handlers, connection);
161+
try {
162+
connection.Open();
163+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
164+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
165+
SqlHelper.ExecuteInitializationSql(connection, configuration);
166+
SqlHelper.NotifyConnectionOpened(handlers, connection);
167+
}
168+
catch (Exception ex) {
169+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
170+
throw;
171+
}
172+
}
173+
else {
174+
SqlHelper.NotifyConnectionOpening(handlers, connection);
175+
try {
176+
await connection.OpenAsync();
177+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
178+
SqlHelper.NotifyConnectionInitializing(handlers, connection, configuration.ConnectionInitializationSql);
179+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken);
180+
SqlHelper.NotifyConnectionOpened(handlers, connection);
181+
}
182+
catch (Exception ex) {
183+
SqlHelper.NotifyConnectionOpeningFailed(handlers, connection, ex);
184+
throw;
185+
}
186+
}
187+
}
133188
}
134189
}

0 commit comments

Comments
 (0)