Skip to content

Commit 7b23854

Browse files
authored
Merge pull request #155 from DataObjects-NET/master-connection-handlers
API to access to DbConnection in certain points
2 parents 27294bb + 03fdc5a commit 7b23854

File tree

25 files changed

+2106
-168
lines changed

25 files changed

+2106
-168
lines changed

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

Lines changed: 61 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-2021 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: Csaba Beer
@@ -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.DbConnectionAccessors.Count > 0)
37+
OpenConnectionWithNotification(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.DbConnectionAccessors.Count > 0)
51+
await OpenConnectionWithNotification(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,58 @@ protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
118122
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
119123
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);
120124

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

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

Lines changed: 65 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-2021 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.DbConnectionAccessors.Count > 0)
74+
OpenConnectionWithNotification(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.DbConnectionAccessors.Count > 0)
94+
await OpenConnectionWithNotification(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,61 @@ 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 OpenConnectionWithNotification(MySqlConnection connection,
155+
SqlDriverConfiguration configuration,
156+
bool isAsync,
157+
CancellationToken cancellationToken = default)
158+
{
159+
var acessors = configuration.DbConnectionAccessors;
160+
if (!isAsync) {
161+
SqlHelper.NotifyConnectionOpening(acessors, connection);
162+
try {
163+
connection.Open();
164+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
165+
SqlHelper.NotifyConnectionInitializing(acessors, connection, configuration.ConnectionInitializationSql);
166+
SqlHelper.ExecuteInitializationSql(connection, configuration);
167+
SqlHelper.NotifyConnectionOpened(acessors, connection);
168+
}
169+
catch (Exception ex) {
170+
SqlHelper.NotifyConnectionOpeningFailed(acessors, connection, ex);
171+
throw;
172+
}
173+
}
174+
else {
175+
await SqlHelper.NotifyConnectionOpeningAsync(acessors, connection, false, cancellationToken).ConfigureAwait(false);
176+
try {
177+
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
178+
179+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
180+
await SqlHelper.NotifyConnectionInitializingAsync(acessors,
181+
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
182+
.ConfigureAwait(false);
183+
}
184+
185+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
186+
await SqlHelper.NotifyConnectionOpenedAsync(acessors, connection, false, cancellationToken).ConfigureAwait(false);
187+
}
188+
catch (Exception ex) {
189+
await SqlHelper.NotifyConnectionOpeningFailedAsync(acessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
190+
throw;
191+
}
192+
}
193+
}
134194
}
135195
}

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

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2020 Xtensive LLC.
1+
// Copyright (C) 2009-2021 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: Denis Krjuchkov
@@ -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.DbConnectionAccessors.Count > 0)
75+
OpenConnectionWithNotification(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.DbConnectionAccessors.Count > 0)
92+
await OpenConnectionWithNotification(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,61 @@ 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 OpenConnectionWithNotification(OracleConnection connection,
148+
SqlDriverConfiguration configuration,
149+
bool isAsync,
150+
CancellationToken cancellationToken = default)
151+
{
152+
var accessors = configuration.DbConnectionAccessors;
153+
if (!isAsync) {
154+
SqlHelper.NotifyConnectionOpening(accessors, connection);
155+
try {
156+
connection.Open();
157+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
158+
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
159+
SqlHelper.ExecuteInitializationSql(connection, configuration);
160+
SqlHelper.NotifyConnectionOpened(accessors, connection);
161+
}
162+
catch (Exception ex) {
163+
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
164+
throw;
165+
}
166+
}
167+
else {
168+
await SqlHelper.NotifyConnectionOpeningAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
169+
try {
170+
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
171+
172+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
173+
await SqlHelper.NotifyConnectionInitializingAsync(accessors,
174+
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
175+
.ConfigureAwait(false);
176+
}
177+
178+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
179+
await SqlHelper.NotifyConnectionOpenedAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
180+
}
181+
catch (Exception ex) {
182+
await SqlHelper.NotifyConnectionOpeningFailedAsync(accessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
183+
throw;
184+
}
185+
}
186+
}
127187
}
128188
}

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

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2009-2020 Xtensive LLC.
1+
// Copyright (C) 2009-2021 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: Denis Krjuchkov
@@ -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.DbConnectionAccessors.Count > 0)
65+
OpenConnectionWithNotification(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.DbConnectionAccessors.Count > 0)
80+
await OpenConnectionWithNotification(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,63 @@ 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 OpenConnectionWithNotification(NpgsqlConnection connection,
154+
SqlDriverConfiguration configuration,
155+
bool isAsync,
156+
CancellationToken cancellationToken = default)
157+
{
158+
var accessors = configuration.DbConnectionAccessors;
159+
if (!isAsync) {
160+
SqlHelper.NotifyConnectionOpening(accessors, connection);
161+
try {
162+
connection.Open();
163+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
164+
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
165+
}
166+
167+
SqlHelper.ExecuteInitializationSql(connection, configuration);
168+
SqlHelper.NotifyConnectionOpened(accessors, connection);
169+
}
170+
catch (Exception ex) {
171+
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
172+
throw;
173+
}
174+
}
175+
else {
176+
await SqlHelper.NotifyConnectionOpeningAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
177+
try {
178+
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);
179+
180+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
181+
await SqlHelper.NotifyConnectionInitializingAsync(accessors,
182+
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
183+
.ConfigureAwait(false);
184+
}
185+
186+
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
187+
await SqlHelper.NotifyConnectionOpenedAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
188+
}
189+
catch (Exception ex) {
190+
await SqlHelper.NotifyConnectionOpeningFailedAsync(accessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
191+
throw;
192+
}
193+
}
194+
}
133195
}
134196
}

0 commit comments

Comments
 (0)