Skip to content

Access to DbConnection #155

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Aug 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 61 additions & 5 deletions Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2011-2020 Xtensive LLC.
// Copyright (C) 2011-2021 Xtensive LLC.
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.
// Created by: Csaba Beer
Expand Down Expand Up @@ -33,8 +33,10 @@ public class DriverFactory : SqlDriverFactory
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
{
using var connection = new FbConnection(connectionString);
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
if (configuration.DbConnectionAccessors.Count > 0)
OpenConnectionWithNotification(connection, configuration, false).GetAwaiter().GetResult();
else
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
var defaultSchema = GetDefaultSchema(connection);
return CreateDriverInstance(
connectionString, GetVersionFromServerVersionString(connection.ServerVersion), defaultSchema);
Expand All @@ -45,8 +47,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
{
var connection = new FbConnection(connectionString);
await using (connection.ConfigureAwait(false)) {
await connection.OpenAsync(token).ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
if (configuration.DbConnectionAccessors.Count > 0)
await OpenConnectionWithNotification(connection, configuration, true, token).ConfigureAwait(false);
else
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
var defaultSchema = await GetDefaultSchemaAsync(connection, token: token).ConfigureAwait(false);
return CreateDriverInstance(
connectionString, GetVersionFromServerVersionString(connection.ServerVersion), defaultSchema);
Expand Down Expand Up @@ -118,6 +122,58 @@ protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);

private static async ValueTask OpenConnectionFast(FbConnection connection,
SqlDriverConfiguration configuration, bool isAsync, CancellationToken cancellationToken = default)
{
if (!isAsync) {
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}
else {
await connection.OpenAsync().ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
}
}

private static async ValueTask OpenConnectionWithNotification(FbConnection connection,
SqlDriverConfiguration configuration, bool isAsync, CancellationToken cancellationToken = default)
{
var accessors = configuration.DbConnectionAccessors;
if (!isAsync) {
SqlHelper.NotifyConnectionOpening(accessors, connection);
try {
connection.Open();
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
SqlHelper.ExecuteInitializationSql(connection, configuration);
SqlHelper.NotifyConnectionOpened(accessors, connection);
}
catch(Exception ex) {
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
throw;
}
}
else {
await SqlHelper.NotifyConnectionOpeningAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
try {
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);

if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
await SqlHelper.NotifyConnectionInitializingAsync(accessors,
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
.ConfigureAwait(false);
}

await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
await SqlHelper.NotifyConnectionOpenedAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex) {
await SqlHelper.NotifyConnectionOpeningFailedAsync(accessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
throw;
}
}
}

private static Version GetVersionFromServerVersionString(string serverVersionString)
{
var matcher = new Regex(ServerVersionParser);
Expand Down
70 changes: 65 additions & 5 deletions Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2011-2020 Xtensive LLC.
// Copyright (C) 2011-2021 Xtensive LLC.
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.
// Created by: Malisa Ncube
Expand Down Expand Up @@ -70,8 +70,10 @@ private static Version ParseVersion(string version)
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
{
using (var connection = new MySqlConnection(connectionString)) {
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
if (configuration.DbConnectionAccessors.Count > 0)
OpenConnectionWithNotification(connection, configuration, false).GetAwaiter().GetResult();
else
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion)
? connection.ServerVersion
: configuration.ForcedServerVersion;
Expand All @@ -88,8 +90,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
{
var connection = new MySqlConnection(connectionString);
await using (connection.ConfigureAwait(false)) {
await connection.OpenAsync(token).ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
if (configuration.DbConnectionAccessors.Count > 0)
await OpenConnectionWithNotification(connection, configuration, true, token).ConfigureAwait(false);
else
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion)
? connection.ServerVersion
: configuration.ForcedServerVersion;
Expand Down Expand Up @@ -131,5 +135,61 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);

private async ValueTask OpenConnectionFast(MySqlConnection connection,
SqlDriverConfiguration configuration,
bool isAsync,
CancellationToken cancellationToken = default)
{
if (!isAsync) {
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}
else {
await connection.OpenAsync().ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
}
}

private async ValueTask OpenConnectionWithNotification(MySqlConnection connection,
SqlDriverConfiguration configuration,
bool isAsync,
CancellationToken cancellationToken = default)
{
var acessors = configuration.DbConnectionAccessors;
if (!isAsync) {
SqlHelper.NotifyConnectionOpening(acessors, connection);
try {
connection.Open();
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
SqlHelper.NotifyConnectionInitializing(acessors, connection, configuration.ConnectionInitializationSql);
SqlHelper.ExecuteInitializationSql(connection, configuration);
SqlHelper.NotifyConnectionOpened(acessors, connection);
}
catch (Exception ex) {
SqlHelper.NotifyConnectionOpeningFailed(acessors, connection, ex);
throw;
}
}
else {
await SqlHelper.NotifyConnectionOpeningAsync(acessors, connection, false, cancellationToken).ConfigureAwait(false);
try {
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);

if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
await SqlHelper.NotifyConnectionInitializingAsync(acessors,
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
.ConfigureAwait(false);
}

await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
await SqlHelper.NotifyConnectionOpenedAsync(acessors, connection, false, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex) {
await SqlHelper.NotifyConnectionOpeningFailedAsync(acessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
throw;
}
}
}
}
}
70 changes: 65 additions & 5 deletions Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2009-2020 Xtensive LLC.
// Copyright (C) 2009-2021 Xtensive LLC.
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.
// Created by: Denis Krjuchkov
Expand Down Expand Up @@ -71,8 +71,10 @@ protected override string BuildConnectionString(UrlInfo url)
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
{
using var connection = new OracleConnection(connectionString);
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
if (configuration.DbConnectionAccessors.Count > 0)
OpenConnectionWithNotification(connection, configuration, false).GetAwaiter().GetResult();
else
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
var version = string.IsNullOrEmpty(configuration.ForcedServerVersion)
? ParseVersion(connection.ServerVersion)
: new Version(configuration.ForcedServerVersion);
Expand All @@ -86,8 +88,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
{
var connection = new OracleConnection(connectionString);
await using (connection.ConfigureAwait(false)) {
await connection.OpenAsync(token).ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
if (configuration.DbConnectionAccessors.Count > 0)
await OpenConnectionWithNotification(connection, configuration, true, token).ConfigureAwait(false);
else
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
var version = string.IsNullOrEmpty(configuration.ForcedServerVersion)
? ParseVersion(connection.ServerVersion)
: new Version(configuration.ForcedServerVersion);
Expand Down Expand Up @@ -124,5 +128,61 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);

private async ValueTask OpenConnectionFast(OracleConnection connection,
SqlDriverConfiguration configuration,
bool isAsync,
CancellationToken cancellationToken = default)
{
if (!isAsync) {
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}
else {
await connection.OpenAsync().ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
}
}

private async ValueTask OpenConnectionWithNotification(OracleConnection connection,
SqlDriverConfiguration configuration,
bool isAsync,
CancellationToken cancellationToken = default)
{
var accessors = configuration.DbConnectionAccessors;
if (!isAsync) {
SqlHelper.NotifyConnectionOpening(accessors, connection);
try {
connection.Open();
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
SqlHelper.ExecuteInitializationSql(connection, configuration);
SqlHelper.NotifyConnectionOpened(accessors, connection);
}
catch (Exception ex) {
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
throw;
}
}
else {
await SqlHelper.NotifyConnectionOpeningAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
try {
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);

if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
await SqlHelper.NotifyConnectionInitializingAsync(accessors,
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
.ConfigureAwait(false);
}

await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
await SqlHelper.NotifyConnectionOpenedAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex) {
await SqlHelper.NotifyConnectionOpeningFailedAsync(accessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
throw;
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2009-2020 Xtensive LLC.
// Copyright (C) 2009-2021 Xtensive LLC.
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.
// Created by: Denis Krjuchkov
Expand Down Expand Up @@ -61,8 +61,10 @@ protected override string BuildConnectionString(UrlInfo url)
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
{
using var connection = new NpgsqlConnection(connectionString);
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
if (configuration.DbConnectionAccessors.Count > 0)
OpenConnectionWithNotification(connection, configuration, false).GetAwaiter().GetResult();
else
OpenConnectionFast(connection, configuration, false).GetAwaiter().GetResult();
var version = GetVersion(configuration, connection);
var defaultSchema = GetDefaultSchema(connection);
return CreateDriverInstance(connectionString, version, defaultSchema);
Expand All @@ -74,8 +76,10 @@ protected override async Task<SqlDriver> CreateDriverAsync(
{
var connection = new NpgsqlConnection(connectionString);
await using (connection.ConfigureAwait(false)) {
await connection.OpenAsync(token).ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, token).ConfigureAwait(false);
if (configuration.DbConnectionAccessors.Count > 0)
await OpenConnectionWithNotification(connection, configuration, true, token).ConfigureAwait(false);
else
await OpenConnectionFast(connection, configuration, true, token).ConfigureAwait(false);
var version = GetVersion(configuration, connection);
var defaultSchema = await GetDefaultSchemaAsync(connection, token: token).ConfigureAwait(false);
return CreateDriverInstance(connectionString, version, defaultSchema);
Expand Down Expand Up @@ -130,5 +134,63 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
protected override Task<DefaultSchemaInfo> ReadDefaultSchemaAsync(
DbConnection connection, DbTransaction transaction, CancellationToken token) =>
SqlHelper.ReadDatabaseAndSchemaAsync(DatabaseAndSchemaQuery, connection, transaction, token);

private async ValueTask OpenConnectionFast(NpgsqlConnection connection,
SqlDriverConfiguration configuration,
bool isAsync,
CancellationToken cancellationToken = default)
{
if (!isAsync) {
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}
else {
await connection.OpenAsync().ConfigureAwait(false);
await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
}
}

private async ValueTask OpenConnectionWithNotification(NpgsqlConnection connection,
SqlDriverConfiguration configuration,
bool isAsync,
CancellationToken cancellationToken = default)
{
var accessors = configuration.DbConnectionAccessors;
if (!isAsync) {
SqlHelper.NotifyConnectionOpening(accessors, connection);
try {
connection.Open();
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
}

SqlHelper.ExecuteInitializationSql(connection, configuration);
SqlHelper.NotifyConnectionOpened(accessors, connection);
}
catch (Exception ex) {
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
throw;
}
}
else {
await SqlHelper.NotifyConnectionOpeningAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
try {
await connection.OpenAsync(cancellationToken).ConfigureAwait(false);

if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) {
await SqlHelper.NotifyConnectionInitializingAsync(accessors,
connection, configuration.ConnectionInitializationSql, false, cancellationToken)
.ConfigureAwait(false);
}

await SqlHelper.ExecuteInitializationSqlAsync(connection, configuration, cancellationToken).ConfigureAwait(false);
await SqlHelper.NotifyConnectionOpenedAsync(accessors, connection, false, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex) {
await SqlHelper.NotifyConnectionOpeningFailedAsync(accessors, connection, ex, false, cancellationToken).ConfigureAwait(false);
throw;
}
}
}
}
}
Loading