Skip to content

Commit 6243dfa

Browse files
committed
Add driver for managed Oracle data provider (NH-3349)
1 parent 9f77c90 commit 6243dfa

File tree

8 files changed

+170
-19
lines changed

8 files changed

+170
-19
lines changed

src/NHibernate.Test/NHSpecificTest/NH1507/Fixture.cs

+27-19
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,57 @@
11
using System;
22
using System.Collections;
3+
using NHibernate.Driver;
34
using NUnit.Framework;
45

56
namespace NHibernate.Test.NHSpecificTest.NH1507
67
{
78
[TestFixture]
89
public class Fixture : BugTestCase
910
{
11+
protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
12+
{
13+
return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
14+
}
15+
1016
protected override void OnSetUp()
1117
{
1218
CreateData();
1319
}
20+
1421
protected override void OnTearDown()
1522
{
1623
CleanupData();
1724
}
25+
1826
private void CreateData()
1927
{
2028
//Employee
2129
var emp = new Employee
22-
{
23-
Address = "Zombie street",
24-
City = "Bitonto",
25-
PostalCode = "66666",
26-
FirstName = "tomb",
27-
LastName = "mutilated"
28-
};
30+
{
31+
Address = "Zombie street",
32+
City = "Bitonto",
33+
PostalCode = "66666",
34+
FirstName = "tomb",
35+
LastName = "mutilated"
36+
};
2937

3038
//and his related orders
3139
var order = new Order
32-
{OrderDate = DateTime.Now, Employee = emp, ShipAddress = "dead zone 1", ShipCountry = "Deadville"};
40+
{OrderDate = DateTime.Now, Employee = emp, ShipAddress = "dead zone 1", ShipCountry = "Deadville"};
3341

3442
var order2 = new Order
35-
{OrderDate = DateTime.Now, Employee = emp, ShipAddress = "dead zone 2", ShipCountry = "Deadville"};
43+
{OrderDate = DateTime.Now, Employee = emp, ShipAddress = "dead zone 2", ShipCountry = "Deadville"};
3644

3745
//Employee with no related orders but with same PostalCode
3846
var emp2 = new Employee
39-
{
40-
Address = "Gut street",
41-
City = "Mariotto",
42-
Country = "Arised",
43-
PostalCode = "66666",
44-
FirstName = "carcass",
45-
LastName = "purulent"
46-
};
47+
{
48+
Address = "Gut street",
49+
City = "Mariotto",
50+
Country = "Arised",
51+
PostalCode = "66666",
52+
FirstName = "carcass",
53+
LastName = "purulent"
54+
};
4755

4856
//Order with no related employee but with same ShipCountry
4957
var order3 = new Order {OrderDate = DateTime.Now, ShipAddress = "dead zone 2", ShipCountry = "Deadville"};
@@ -88,7 +96,7 @@ public void ExplicitJoin()
8896
//explicit join
8997
IList results =
9098
session.CreateQuery("select count(*) from Order as entity join entity.Employee ee "
91-
+ "where ee.PostalCode='66666' or entity.ShipCountry='Deadville'").List();
99+
+ "where ee.PostalCode='66666' or entity.ShipCountry='Deadville'").List();
92100

93101
//Debug.Assert(list[0].Equals(191), "Wrong number of orders, returned: " + list[0].ToString());
94102
Assert.AreEqual(2, results[0]);
@@ -103,7 +111,7 @@ public void ImplicitJoinFailingTest()
103111
//implicit join
104112
IList results =
105113
session.CreateQuery("select count(*) from Order as entity "
106-
+ "where entity.Employee.PostalCode='66666' or entity.ShipCountry='Deadville'").List();
114+
+ "where entity.Employee.PostalCode='66666' or entity.ShipCountry='Deadville'").List();
107115

108116
Assert.AreEqual(2, results[0]);
109117
}

src/NHibernate.Test/NHSpecificTest/NH2296/Fixture.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Linq;
2+
using NHibernate.Driver;
23
using NUnit.Framework;
34
using SharpTestsEx;
45

@@ -7,6 +8,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2296
78
[TestFixture]
89
public class Fixture : BugTestCase
910
{
11+
protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
12+
{
13+
return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
14+
}
15+
1016
protected override void OnSetUp()
1117
{
1218
base.OnSetUp();

src/NHibernate.Test/NHSpecificTest/NH2846/Fixture.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Linq;
2+
using NHibernate.Driver;
23
using NHibernate.Linq;
34
using NUnit.Framework;
45

@@ -7,6 +8,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2846
78
[TestFixture]
89
public class Fixture : BugTestCase
910
{
11+
protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
12+
{
13+
return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
14+
}
15+
1016
protected override void OnSetUp()
1117
{
1218
base.OnSetUp();

src/NHibernate.Test/NHSpecificTest/NH2852/Fixture.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Linq;
2+
using NHibernate.Driver;
23
using NHibernate.Linq;
34
using NUnit.Framework;
45

@@ -7,6 +8,11 @@ namespace NHibernate.Test.NHSpecificTest.NH2852
78
[TestFixture]
89
public class Fixture : BugTestCase
910
{
11+
protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
12+
{
13+
return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
14+
}
15+
1016
protected override void OnSetUp()
1117
{
1218
using (var session = OpenSession())

src/NHibernate.Test/NHSpecificTest/NH3142/ChildrenTest.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using NHibernate.Driver;
45
using NUnit.Framework;
56

67
namespace NHibernate.Test.NHSpecificTest.NH3142
78
{
89
[TestFixture]
910
public class ChildrenTest : BugTestCase
1011
{
12+
protected override bool AppliesTo(Engine.ISessionFactoryImplementor factory)
13+
{
14+
return !(factory.ConnectionProvider.Driver is OracleManagedDataClientDriver);
15+
}
16+
1117
protected override void OnSetUp()
1218
{
1319
base.OnSetUp();

src/NHibernate.sln.DotSettings

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/EXPLICIT_INTERNAL_MODIFIER/@EntryValue">True</s:Boolean>
33
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/EXPLICIT_PRIVATE_MODIFIER/@EntryValue">True</s:Boolean>
44
<s:Boolean x:Key="/Default/CodeStyle/CSharpUsing/AddImportsToDeepestScope/@EntryValue">False</s:Boolean>
5+
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
56
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /&gt;</s:String>
67
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
78
<s:Boolean x:Key="/Default/PatternsAndTemplates/StructuralSearch/Pattern/=0BE95D01E0F2244E97F5FEFAD1EB1A63/@KeyIndexDefined">True</s:Boolean>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
using System;
2+
using System.Data;
3+
using System.Reflection;
4+
using NHibernate.AdoNet;
5+
using NHibernate.Engine.Query;
6+
using NHibernate.SqlTypes;
7+
using NHibernate.Util;
8+
9+
namespace NHibernate.Driver
10+
{
11+
/// <summary>
12+
/// A NHibernate Driver for using the Oracle.ManagedDataAccess DataProvider
13+
/// </summary>
14+
public class OracleManagedDataClientDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider
15+
{
16+
private const string driverAssemblyName = "Oracle.ManagedDataAccess";
17+
private const string connectionTypeName = "Oracle.ManagedDataAccess.Client.OracleConnection";
18+
private const string commandTypeName = "Oracle.ManagedDataAccess.Client.OracleCommand";
19+
private static readonly SqlType GuidSqlType = new SqlType(DbType.Binary, 16);
20+
private readonly PropertyInfo oracleCommandBindByName;
21+
private readonly PropertyInfo oracleDbType;
22+
private readonly object oracleDbTypeRefCursor;
23+
24+
/// <summary>
25+
/// Initializes a new instance of <see cref="OracleDataClientDriver"/>.
26+
/// </summary>
27+
/// <exception cref="HibernateException">
28+
/// Thrown when the <c>Oracle.ManagedDataAccess</c> assembly can not be loaded.
29+
/// </exception>
30+
public OracleManagedDataClientDriver()
31+
: base(
32+
"Oracle.ManagedDataAccess.Client",
33+
driverAssemblyName,
34+
connectionTypeName,
35+
commandTypeName)
36+
{
37+
var oracleCommandType = ReflectHelper.TypeFromAssembly("Oracle.ManagedDataAccess.Client.OracleCommand", driverAssemblyName, false);
38+
oracleCommandBindByName = oracleCommandType.GetProperty("BindByName");
39+
40+
var parameterType = ReflectHelper.TypeFromAssembly("Oracle.ManagedDataAccess.Client.OracleParameter", driverAssemblyName, false);
41+
oracleDbType = parameterType.GetProperty("OracleDbType");
42+
43+
var oracleDbTypeEnum = ReflectHelper.TypeFromAssembly("Oracle.ManagedDataAccess.Client.OracleDbType", driverAssemblyName, false);
44+
oracleDbTypeRefCursor = Enum.Parse(oracleDbTypeEnum, "RefCursor");
45+
}
46+
47+
/// <summary></summary>
48+
public override string NamedPrefix
49+
{
50+
get { return ":"; }
51+
}
52+
53+
/// <summary></summary>
54+
public override bool UseNamedPrefixInParameter
55+
{
56+
get { return true; }
57+
}
58+
59+
/// <summary></summary>
60+
public override bool UseNamedPrefixInSql
61+
{
62+
get { return true; }
63+
}
64+
65+
/// <remarks>
66+
/// This adds logic to ensure that a DbType.Boolean parameter is not created since
67+
/// ODP.NET doesn't support it.
68+
/// </remarks>
69+
protected override void InitializeParameter(IDbDataParameter dbParam, string name, SqlType sqlType)
70+
{
71+
// if the parameter coming in contains a boolean then we need to convert it
72+
// to another type since ODP.NET doesn't support DbType.Boolean
73+
switch (sqlType.DbType)
74+
{
75+
case DbType.Boolean:
76+
base.InitializeParameter(dbParam, name, SqlTypeFactory.Int16);
77+
break;
78+
case DbType.Guid:
79+
base.InitializeParameter(dbParam, name, GuidSqlType);
80+
break;
81+
default:
82+
base.InitializeParameter(dbParam, name, sqlType);
83+
break;
84+
}
85+
}
86+
87+
protected override void OnBeforePrepare(IDbCommand command)
88+
{
89+
base.OnBeforePrepare(command);
90+
91+
// need to explicitly turn on named parameter binding
92+
// http://tgaw.wordpress.com/2006/03/03/ora-01722-with-odp-and-command-parameters/
93+
oracleCommandBindByName.SetValue(command, true, null);
94+
95+
var detail = CallableParser.Parse(command.CommandText);
96+
97+
if (!detail.IsCallable)
98+
return;
99+
100+
command.CommandType = CommandType.StoredProcedure;
101+
command.CommandText = detail.FunctionName;
102+
oracleCommandBindByName.SetValue(command, false, null);
103+
104+
var outCursor = command.CreateParameter();
105+
oracleDbType.SetValue(outCursor, oracleDbTypeRefCursor, null);
106+
107+
outCursor.Direction = detail.HasReturn ? ParameterDirection.ReturnValue : ParameterDirection.Output;
108+
109+
command.Parameters.Insert(0, outCursor);
110+
}
111+
112+
System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass
113+
{
114+
get { return typeof (OracleDataClientBatchingBatcherFactory); }
115+
}
116+
}
117+
}

src/NHibernate/NHibernate.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@
176176
<Compile Include="Driver\OleDbDriver.cs" />
177177
<Compile Include="Driver\OracleClientDriver.cs" />
178178
<Compile Include="Driver\OracleDataClientDriver.cs" />
179+
<Compile Include="Driver\OracleManagedDataClientDriver.cs" />
179180
<Compile Include="Driver\Sql2008ClientDriver.cs" />
180181
<Compile Include="Driver\SqlClientDriver.cs" />
181182
<Compile Include="Driver\BasicResultSetsCommand.cs" />

0 commit comments

Comments
 (0)