Skip to content

Commit d06e8fd

Browse files
authored
Merge pull request #157 from DataObjects-NET/6.0-connection-handlers
API to access to DbConnection in certain points
2 parents 9d7af48 + 0a2509b commit d06e8fd

File tree

25 files changed

+1482
-231
lines changed

25 files changed

+1482
-231
lines changed

ChangeLog/6.0.7_dev.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
[main] Fixed issue of actual NULL constant being treated as a caching value
22
[main] Fixed rare case of infinite loop on batching commands
3-
[main] Improved VS compatibility by not processing design-time builds
3+
[main] Improved VS compatibility by not processing design-time builds
4+
[main] Introduced IDbConnectionAccessor that gives access to certain stages of connection opening

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

Lines changed: 54 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2010 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2011-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Csaba Beer
55
// Created: 2011.01.08
66

@@ -34,24 +34,36 @@ public class DriverFactory : SqlDriverFactory
3434
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
3535
{
3636
using (var connection = new FbConnection(connectionString)) {
37-
connection.Open();
38-
SqlHelper.ExecuteInitializationSql(connection, configuration);
39-
var dataSource = new FbConnectionStringBuilder(connectionString).DataSource;
37+
if (configuration.DbConnectionAccessors.Count > 0)
38+
OpenConnectionWithNotification(connection, configuration);
39+
else
40+
OpenConnectionFast(connection, configuration);
4041
var defaultSchema = GetDefaultSchema(connection);
41-
var coreServerInfo = new CoreServerInfo {
42-
ServerVersion = GetVersionFromServerVersionString(connection.ServerVersion),
43-
ConnectionString = connectionString,
44-
MultipleActiveResultSets = true,
45-
DatabaseName = defaultSchema.Database,
46-
DefaultSchemaName = defaultSchema.Schema,
47-
};
48-
49-
if (Int32.Parse(coreServerInfo.ServerVersion.Major.ToString() + coreServerInfo.ServerVersion.Minor.ToString()) < 25)
50-
throw new NotSupportedException(Strings.ExFirebirdBelow25IsNotSupported);
51-
if (coreServerInfo.ServerVersion.Major==2 && coreServerInfo.ServerVersion.Minor==5)
52-
return new v2_5.Driver(coreServerInfo);
53-
return null;
42+
return CreateDriverInstance(
43+
connectionString, GetVersionFromServerVersionString(connection.ServerVersion), defaultSchema);
44+
}
45+
}
46+
47+
private static SqlDriver CreateDriverInstance(
48+
string connectionString, Version version, DefaultSchemaInfo defaultSchema)
49+
{
50+
var coreServerInfo = new CoreServerInfo {
51+
ServerVersion = version,
52+
ConnectionString = connectionString,
53+
MultipleActiveResultSets = true,
54+
DatabaseName = defaultSchema.Database,
55+
DefaultSchemaName = defaultSchema.Schema,
56+
};
57+
58+
if (coreServerInfo.ServerVersion < new Version(2, 5)) {
59+
throw new NotSupportedException(Strings.ExFirebirdBelow25IsNotSupported);
5460
}
61+
62+
if (coreServerInfo.ServerVersion.Major == 2 && coreServerInfo.ServerVersion.Minor == 5) {
63+
return new v2_5.Driver(coreServerInfo);
64+
}
65+
66+
return null;
5567
}
5668

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

109+
private void OpenConnectionFast(FbConnection connection, SqlDriverConfiguration configuration)
110+
{
111+
connection.Open();
112+
SqlHelper.ExecuteInitializationSql(connection, configuration);
113+
}
114+
115+
private void OpenConnectionWithNotification(FbConnection connection, SqlDriverConfiguration configuration)
116+
{
117+
var accessors = configuration.DbConnectionAccessors;
118+
SqlHelper.NotifyConnectionOpening(accessors, connection);
119+
try {
120+
connection.Open();
121+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
122+
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
123+
SqlHelper.ExecuteInitializationSql(connection, configuration);
124+
SqlHelper.NotifyConnectionOpened(accessors, connection);
125+
}
126+
catch (Exception ex) {
127+
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
128+
throw;
129+
}
130+
}
131+
97132
private Version GetVersionFromServerVersionString(string serverVersionString)
98133
{
99134
var matcher = new Regex(ServerVersionParser);

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

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2010 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2011-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
55
// Created: 2011.02.25
66

@@ -66,8 +66,10 @@ private static Version ParseVersion(string version)
6666
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
6767
{
6868
using (var connection = new MySqlConnection(connectionString)) {
69-
connection.Open();
70-
SqlHelper.ExecuteInitializationSql(connection, configuration);
69+
if (configuration.DbConnectionAccessors.Count > 0)
70+
OpenConnectionWithNotification(connection, configuration);
71+
else
72+
OpenConnectionFast(connection, configuration);
7173
var versionString = string.IsNullOrEmpty(configuration.ForcedServerVersion)
7274
? connection.ServerVersion
7375
: configuration.ForcedServerVersion;
@@ -76,32 +78,60 @@ protected override SqlDriver CreateDriver(string connectionString, SqlDriverConf
7678
var builder = new MySqlConnectionStringBuilder(connectionString);
7779
var dataSource = string.Format(DataSourceFormat, builder.Server, builder.Port, builder.Database);
7880
var defaultSchema = GetDefaultSchema(connection);
79-
var coreServerInfo = new CoreServerInfo {
80-
ServerVersion = version,
81-
ConnectionString = connectionString,
82-
MultipleActiveResultSets = false,
83-
DatabaseName = defaultSchema.Database,
84-
DefaultSchemaName = defaultSchema.Schema,
85-
};
86-
87-
if (version.Major < 5)
88-
throw new NotSupportedException(Strings.ExMySqlBelow50IsNotSupported);
89-
if (version.Major==5 && version.Minor==0)
90-
return new v5_0.Driver(coreServerInfo);
91-
if (version.Major==5 && version.Minor==1)
92-
return new v5_1.Driver(coreServerInfo);
93-
if (version.Major==5 && version.Minor==5)
94-
return new v5_5.Driver(coreServerInfo);
95-
if (version.Major==5 && version.Minor==6)
96-
return new v5_6.Driver(coreServerInfo);
97-
return new v5_6.Driver(coreServerInfo);
81+
return CreateDriverInstance(connectionString, version, defaultSchema);
9882
}
9983
}
10084

85+
private static SqlDriver CreateDriverInstance(string connectionString, Version version, DefaultSchemaInfo defaultSchema)
86+
{
87+
var coreServerInfo = new CoreServerInfo {
88+
ServerVersion = version,
89+
ConnectionString = connectionString,
90+
MultipleActiveResultSets = false,
91+
DatabaseName = defaultSchema.Database,
92+
DefaultSchemaName = defaultSchema.Schema,
93+
};
94+
95+
if (version.Major < 5) {
96+
throw new NotSupportedException(Strings.ExMySqlBelow50IsNotSupported);
97+
}
98+
99+
return version.Major switch {
100+
5 when version.Minor == 0 => new v5_0.Driver(coreServerInfo),
101+
5 when version.Minor == 1 => new v5_1.Driver(coreServerInfo),
102+
5 when version.Minor == 5 => new v5_5.Driver(coreServerInfo),
103+
5 when version.Minor == 6 => new v5_6.Driver(coreServerInfo),
104+
_ => new v5_6.Driver(coreServerInfo)
105+
};
106+
}
107+
101108
/// <inheritdoc/>
102109
protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction)
103110
{
104111
return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction);
105112
}
113+
114+
private void OpenConnectionFast(MySqlConnection connection, SqlDriverConfiguration configuration)
115+
{
116+
connection.Open();
117+
SqlHelper.ExecuteInitializationSql(connection, configuration);
118+
}
119+
120+
private void OpenConnectionWithNotification(MySqlConnection connection, SqlDriverConfiguration configuration)
121+
{
122+
var accessors = configuration.DbConnectionAccessors;
123+
SqlHelper.NotifyConnectionOpening(accessors, connection);
124+
try {
125+
connection.Open();
126+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
127+
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
128+
SqlHelper.ExecuteInitializationSql(connection, configuration);
129+
SqlHelper.NotifyConnectionOpened(accessors, connection);
130+
}
131+
catch (Exception ex) {
132+
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
133+
throw;
134+
}
135+
}
106136
}
107137
}

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

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2010 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2009-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
55
// Created: 2009.07.16
66

@@ -66,34 +66,66 @@ protected override string BuildConnectionString(UrlInfo url)
6666
protected override SqlDriver CreateDriver(string connectionString, SqlDriverConfiguration configuration)
6767
{
6868
using (var connection = new OracleConnection(connectionString)) {
69-
connection.Open();
70-
SqlHelper.ExecuteInitializationSql(connection, configuration);
69+
if (configuration.DbConnectionAccessors.Count > 0)
70+
OpenConnectionWithNotification(connection, configuration);
71+
else
72+
OpenConnectionFast(connection, configuration);
7173
var version = string.IsNullOrEmpty(configuration.ForcedServerVersion)
7274
? ParseVersion(connection.ServerVersion)
7375
: new Version(configuration.ForcedServerVersion);
7476
var dataSource = new OracleConnectionStringBuilder(connectionString).DataSource;
7577
var defaultSchema = GetDefaultSchema(connection);
76-
var coreServerInfo = new CoreServerInfo {
77-
ServerVersion = version,
78-
ConnectionString = connectionString,
79-
MultipleActiveResultSets = true,
80-
DatabaseName = defaultSchema.Database,
81-
DefaultSchemaName = defaultSchema.Schema,
82-
};
83-
if (version.Major < 9 || version.Major==9 && version.Minor < 2)
84-
throw new NotSupportedException(Strings.ExOracleBelow9i2IsNotSupported);
85-
if (version.Major==9)
86-
return new v09.Driver(coreServerInfo);
87-
if (version.Major==10)
88-
return new v10.Driver(coreServerInfo);
89-
return new v11.Driver(coreServerInfo);
78+
return CreateDriverInstance(connectionString, version, defaultSchema);
9079
}
9180
}
9281

82+
private static SqlDriver CreateDriverInstance(string connectionString, Version version, DefaultSchemaInfo defaultSchema)
83+
{
84+
var coreServerInfo = new CoreServerInfo {
85+
ServerVersion = version,
86+
ConnectionString = connectionString,
87+
MultipleActiveResultSets = true,
88+
DatabaseName = defaultSchema.Database,
89+
DefaultSchemaName = defaultSchema.Schema,
90+
};
91+
if (version.Major < 9 || (version.Major == 9 && version.Minor < 2)) {
92+
throw new NotSupportedException(Strings.ExOracleBelow9i2IsNotSupported);
93+
}
94+
95+
return version.Major switch {
96+
9 => new v09.Driver(coreServerInfo),
97+
10 => new v10.Driver(coreServerInfo),
98+
_ => new v11.Driver(coreServerInfo)
99+
};
100+
}
101+
93102
/// <inheritdoc/>
94103
protected override DefaultSchemaInfo ReadDefaultSchema(DbConnection connection, DbTransaction transaction)
95104
{
96105
return SqlHelper.ReadDatabaseAndSchema(DatabaseAndSchemaQuery, connection, transaction);
97106
}
107+
108+
private void OpenConnectionFast(OracleConnection connection, SqlDriverConfiguration configuration)
109+
{
110+
connection.Open();
111+
SqlHelper.ExecuteInitializationSql(connection, configuration);
112+
}
113+
114+
private void OpenConnectionWithNotification(OracleConnection connection, SqlDriverConfiguration configuration)
115+
{
116+
var accessors = configuration.DbConnectionAccessors;
117+
SqlHelper.NotifyConnectionOpening(accessors, connection);
118+
try {
119+
connection.Open();
120+
if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql))
121+
SqlHelper.NotifyConnectionInitializing(accessors, connection, configuration.ConnectionInitializationSql);
122+
SqlHelper.ExecuteInitializationSql(connection, configuration);
123+
SqlHelper.NotifyConnectionOpened(accessors, connection);
124+
}
125+
catch (Exception ex) {
126+
SqlHelper.NotifyConnectionOpeningFailed(accessors, connection, ex);
127+
throw;
128+
}
129+
}
98130
}
99131
}

0 commit comments

Comments
 (0)