Skip to content

Access to DbConnection for DO 6 #157

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 12 commits into from
Aug 27, 2021
Merged
3 changes: 2 additions & 1 deletion ChangeLog/6.0.7_dev.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[main] Fixed issue of actual NULL constant being treated as a caching value
[main] Fixed rare case of infinite loop on batching commands
[main] Improved VS compatibility by not processing design-time builds
[main] Improved VS compatibility by not processing design-time builds
[main] Introduced IDbConnectionAccessor that gives access to certain stages of connection opening
73 changes: 54 additions & 19 deletions Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/DriverFactory.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (C) 2003-2010 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// 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
// Created: 2011.01.08

Expand Down Expand Up @@ -34,24 +34,36 @@ public class DriverFactory : SqlDriverFactory
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
{
using (var connection = new FbConnection(connectionString)) {
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
var dataSource = new FbConnectionStringBuilder(connectionString).DataSource;
if (configuration.DbConnectionAccessors.Count > 0)
OpenConnectionWithNotification(connection, configuration);
else
OpenConnectionFast(connection, configuration);
var defaultSchema = GetDefaultSchema(connection);
var coreServerInfo = new CoreServerInfo {
ServerVersion = GetVersionFromServerVersionString(connection.ServerVersion),
ConnectionString = connectionString,
MultipleActiveResultSets = true,
DatabaseName = defaultSchema.Database,
DefaultSchemaName = defaultSchema.Schema,
};

if (Int32.Parse(coreServerInfo.ServerVersion.Major.ToString() + coreServerInfo.ServerVersion.Minor.ToString()) < 25)
throw new NotSupportedException(Strings.ExFirebirdBelow25IsNotSupported);
if (coreServerInfo.ServerVersion.Major==2 && coreServerInfo.ServerVersion.Minor==5)
return new v2_5.Driver(coreServerInfo);
return null;
return CreateDriverInstance(
connectionString, GetVersionFromServerVersionString(connection.ServerVersion), defaultSchema);
}
}

private static SqlDriver CreateDriverInstance(
string connectionString, Version version, DefaultSchemaInfo defaultSchema)
{
var coreServerInfo = new CoreServerInfo {
ServerVersion = version,
ConnectionString = connectionString,
MultipleActiveResultSets = true,
DatabaseName = defaultSchema.Database,
DefaultSchemaName = defaultSchema.Schema,
};

if (coreServerInfo.ServerVersion < new Version(2, 5)) {
throw new NotSupportedException(Strings.ExFirebirdBelow25IsNotSupported);
}

if (coreServerInfo.ServerVersion.Major == 2 && coreServerInfo.ServerVersion.Minor == 5) {
return new v2_5.Driver(coreServerInfo);
}

return null;
}

/// <inheritdoc/>
Expand Down Expand Up @@ -94,6 +106,29 @@ protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection,
return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction);
}

private void OpenConnectionFast(FbConnection connection, SqlDriverConfiguration configuration)
{
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}

private void OpenConnectionWithNotification(FbConnection connection, SqlDriverConfiguration configuration)
{
var accessors = configuration.DbConnectionAccessors;
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;
}
}

private Version GetVersionFromServerVersionString(string serverVersionString)
{
var matcher = new Regex(ServerVersionParser);
Expand Down
78 changes: 54 additions & 24 deletions Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (C) 2003-2010 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// 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
// Created: 2011.02.25

Expand Down Expand Up @@ -66,8 +66,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);
else
OpenConnectionFast(connection, configuration);
var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion)
? connection.ServerVersion
: configuration.ForcedServerVersion;
Expand All @@ -76,32 +78,60 @@ protected override SqlDriver CreateDriver(string connectionString, SqlDriverConf
var builder = new MySqlConnectionStringBuilder(connectionString);
var dataSource = string.Format(DataSourceFormat, builder.Server, builder.Port, builder.Database);
var defaultSchema = GetDefaultSchema(connection);
var coreServerInfo = new CoreServerInfo {
ServerVersion = version,
ConnectionString = connectionString,
MultipleActiveResultSets = false,
DatabaseName = defaultSchema.Database,
DefaultSchemaName = defaultSchema.Schema,
};

if (version.Major < 5)
throw new NotSupportedException(Strings.ExMySqlBelow50IsNotSupported);
if (version.Major==5 && version.Minor==0)
return new v5_0.Driver(coreServerInfo);
if (version.Major==5 && version.Minor==1)
return new v5_1.Driver(coreServerInfo);
if (version.Major==5 && version.Minor==5)
return new v5_5.Driver(coreServerInfo);
if (version.Major==5 && version.Minor==6)
return new v5_6.Driver(coreServerInfo);
return new v5_6.Driver(coreServerInfo);
return CreateDriverInstance(connectionString, version, defaultSchema);
}
}

private static SqlDriver CreateDriverInstance(string connectionString, Version version, DefaultSchemaInfo defaultSchema)
{
var coreServerInfo = new CoreServerInfo {
ServerVersion = version,
ConnectionString = connectionString,
MultipleActiveResultSets = false,
DatabaseName = defaultSchema.Database,
DefaultSchemaName = defaultSchema.Schema,
};

if (version.Major < 5) {
throw new NotSupportedException(Strings.ExMySqlBelow50IsNotSupported);
}

return version.Major switch {
5 when version.Minor == 0 => new v5_0.Driver(coreServerInfo),
5 when version.Minor == 1 => new v5_1.Driver(coreServerInfo),
5 when version.Minor == 5 => new v5_5.Driver(coreServerInfo),
5 when version.Minor == 6 => new v5_6.Driver(coreServerInfo),
_ => new v5_6.Driver(coreServerInfo)
};
}

/// <inheritdoc/>
protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction)
{
return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction);
}

private void OpenConnectionFast(MySqlConnection connection, SqlDriverConfiguration configuration)
{
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}

private void OpenConnectionWithNotification(MySqlConnection connection, SqlDriverConfiguration configuration)
{
var accessors = configuration.DbConnectionAccessors;
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;
}
}
}
}
70 changes: 51 additions & 19 deletions Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/DriverFactory.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (C) 2003-2010 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// 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
// Created: 2009.07.16

Expand Down Expand Up @@ -66,34 +66,66 @@ 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);
else
OpenConnectionFast(connection, configuration);
var version = string.IsNullOrEmpty(configuration.ForcedServerVersion)
? ParseVersion(connection.ServerVersion)
: new Version(configuration.ForcedServerVersion);
var dataSource = new OracleConnectionStringBuilder(connectionString).DataSource;
var defaultSchema = GetDefaultSchema(connection);
var coreServerInfo = new CoreServerInfo {
ServerVersion = version,
ConnectionString = connectionString,
MultipleActiveResultSets = true,
DatabaseName = defaultSchema.Database,
DefaultSchemaName = defaultSchema.Schema,
};
if (version.Major < 9 || version.Major==9 && version.Minor < 2)
throw new NotSupportedException(Strings.ExOracleBelow9i2IsNotSupported);
if (version.Major==9)
return new v09.Driver(coreServerInfo);
if (version.Major==10)
return new v10.Driver(coreServerInfo);
return new v11.Driver(coreServerInfo);
return CreateDriverInstance(connectionString, version, defaultSchema);
}
}

private static SqlDriver CreateDriverInstance(string connectionString, Version version, DefaultSchemaInfo defaultSchema)
{
var coreServerInfo = new CoreServerInfo {
ServerVersion = version,
ConnectionString = connectionString,
MultipleActiveResultSets = true,
DatabaseName = defaultSchema.Database,
DefaultSchemaName = defaultSchema.Schema,
};
if (version.Major < 9 || (version.Major == 9 && version.Minor < 2)) {
throw new NotSupportedException(Strings.ExOracleBelow9i2IsNotSupported);
}

return version.Major switch {
9 => new v09.Driver(coreServerInfo),
10 => new v10.Driver(coreServerInfo),
_ => new v11.Driver(coreServerInfo)
};
}

/// <inheritdoc/>
protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction)
{
return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction);
}

private void OpenConnectionFast(OracleConnection connection, SqlDriverConfiguration configuration)
{
connection.Open();
SqlHelper.ExecuteInitializationSql(connection, configuration);
}

private void OpenConnectionWithNotification(OracleConnection connection, SqlDriverConfiguration configuration)
{
var accessors = configuration.DbConnectionAccessors;
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;
}
}
}
}
Loading