Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 05cf150

Browse files
author
TroyDycavinu-AI
committed
Fixed Oracle Provider Bugs
- Removed the OracleDoubleConverter - Wrapped the OracleConnection, OracleDbReader, OracleCommand and OracleValue objects to hide their functionality and make it more consistent with OrmLite - Fixed issues where it did not work with mini-profiler - Fixed issues with ordering of parameters because Oracle expects parameters to come in order - Fixed Oracle specific syntax issue for CROSS JOIN - Fixed Oracle specific syntax issue for COUNT - Fixed an issue with inconsistencies for quoted table names - Fixed inconsistencies where enums where sometimes expecting the string and other times expecting the integer value - Fixed an issue with flag enums - Added "INDEX" to the reserved word for ORACLE - Fixed some unit tests that did not work for ORACLE - Fixed an issue related to Oracles handling of ROWNUM NOTE: it would be good to remove the OracleTimestampConverter
1 parent 9aa606c commit 05cf150

22 files changed

+830
-181
lines changed

src/ServiceStack.OrmLite.Oracle.Tests/ServiceStack.OrmLite.Oracle.Tests.csproj

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<DefineConstants>DEBUG;TRACE</DefineConstants>
2323
<ErrorReport>prompt</ErrorReport>
2424
<WarningLevel>4</WarningLevel>
25-
<PlatformTarget>AnyCPU</PlatformTarget>
25+
<PlatformTarget>x86</PlatformTarget>
2626
<Prefer32Bit>false</Prefer32Bit>
2727
</PropertyGroup>
2828
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -33,13 +33,14 @@
3333
<ErrorReport>prompt</ErrorReport>
3434
<WarningLevel>4</WarningLevel>
3535
<Prefer32Bit>false</Prefer32Bit>
36+
<PlatformTarget>x86</PlatformTarget>
3637
</PropertyGroup>
3738
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Signed|AnyCPU'">
3839
<OutputPath>bin\Signed\</OutputPath>
3940
<DefineConstants>TRACE</DefineConstants>
4041
<Optimize>true</Optimize>
4142
<DebugType>pdbonly</DebugType>
42-
<PlatformTarget>AnyCPU</PlatformTarget>
43+
<PlatformTarget>x86</PlatformTarget>
4344
<ErrorReport>prompt</ErrorReport>
4445
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
4546
<Prefer32Bit>false</Prefer32Bit>
@@ -58,6 +59,9 @@
5859
<Reference Include="ServiceStack">
5960
<HintPath>..\..\lib\ServiceStack.dll</HintPath>
6061
</Reference>
62+
<Reference Include="ServiceStack.Client">
63+
<HintPath>..\..\lib\ServiceStack.Client.dll</HintPath>
64+
</Reference>
6165
<Reference Include="ServiceStack.Common">
6266
<HintPath>..\..\lib\ServiceStack.Common.dll</HintPath>
6367
</Reference>
@@ -78,6 +82,9 @@
7882
<Reference Include="System.Xml" />
7983
</ItemGroup>
8084
<ItemGroup>
85+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\CaptureSqlFilterTests.cs">
86+
<Link>CaptureSqlFilterTests.cs</Link>
87+
</Compile>
8188
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\CompositeKeyTests.cs">
8289
<Link>CompositeKeyTests.cs</Link>
8390
</Compile>
@@ -96,6 +103,9 @@
96103
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\AdditiveExpressionsTest.cs">
97104
<Link>Expression\AdditiveExpressionsTest.cs</Link>
98105
</Compile>
106+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\ComplexJoinTests.cs">
107+
<Link>Expression\ComplexJoinTests.cs</Link>
108+
</Compile>
99109
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\ConditionalExpressionTest.cs">
100110
<Link>Expression\ConditionalExpressionTest.cs</Link>
101111
</Compile>
@@ -111,6 +121,12 @@
111121
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\ExpressionUsingCustomSerializedEnumTests.cs">
112122
<Link>Expression\ExpressionUsingCustomSerializedEnumTests.cs</Link>
113123
</Compile>
124+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\FromExpressionTests.cs">
125+
<Link>Expression\FromExpressionTests.cs</Link>
126+
</Compile>
127+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\GenericTableExpressions.cs">
128+
<Link>Expression\GenericTableExpressions.cs</Link>
129+
</Compile>
114130
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\LogicalExpressionsTest.cs">
115131
<Link>Expression\LogicalExpressionsTest.cs</Link>
116132
</Compile>
@@ -144,6 +160,21 @@
144160
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Expression\UnaryExpressionsTest.cs">
145161
<Link>Expression\UnaryExpressionsTest.cs</Link>
146162
</Compile>
163+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Issues\ComplexJoinWithAlias.cs">
164+
<Link>Issues\ComplexJoinWithAlias.cs</Link>
165+
</Compile>
166+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Issues\MismatchSchemaTests.cs">
167+
<Link>Issues\MismatchSchemaTests.cs</Link>
168+
</Compile>
169+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Issues\MultithreadingIssueTests.cs">
170+
<Link>Issues\MultithreadingIssueTests.cs</Link>
171+
</Compile>
172+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Issues\SchemaTests.cs">
173+
<Link>Issues\SchemaTests.cs</Link>
174+
</Compile>
175+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Issues\SelectIntoTests.cs">
176+
<Link>Issues\SelectIntoTests.cs</Link>
177+
</Compile>
147178
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\JoinSqlBuilderTests.cs">
148179
<Link>JoinSqlBuilderTests.cs</Link>
149180
</Compile>
@@ -312,6 +343,9 @@
312343
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\SqlFormatTests.cs">
313344
<Link>SqlFormatTests.cs</Link>
314345
</Compile>
346+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\StringSerializerTests.cs">
347+
<Link>StringSerializerTests.cs</Link>
348+
</Compile>
315349
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\TestHelpers.cs">
316350
<Link>TestHelpers.cs</Link>
317351
</Compile>
@@ -389,4 +423,4 @@
389423
<Target Name="AfterBuild">
390424
</Target>
391425
-->
392-
</Project>
426+
</Project>
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
using System.Collections.Generic;
2+
using System.Data;
3+
using System.Data.Common;
4+
using System.Linq;
5+
using System.Text.RegularExpressions;
6+
7+
namespace ServiceStack.OrmLite.Oracle
8+
{
9+
public class OracleCommand : DbCommand
10+
{
11+
private readonly DbCommand _command;
12+
public OracleCommand(DbCommand command)
13+
{
14+
_command = command;
15+
}
16+
17+
public override void Prepare()
18+
{
19+
_command.Prepare();
20+
}
21+
22+
public override string CommandText
23+
{
24+
get { return _command.CommandText; }
25+
set { _command.CommandText = value; }
26+
}
27+
28+
public override int CommandTimeout
29+
{
30+
get { return _command.CommandTimeout; }
31+
set { _command.CommandTimeout = value; }
32+
}
33+
34+
public override CommandType CommandType
35+
{
36+
get { return _command.CommandType; }
37+
set { _command.CommandType = value; }
38+
}
39+
40+
protected override DbConnection DbConnection
41+
{
42+
get { return _command.Connection; }
43+
set
44+
{
45+
_command.Connection = value;
46+
}
47+
}
48+
49+
protected override DbParameterCollection DbParameterCollection
50+
{
51+
get { return _command.Parameters; }
52+
}
53+
54+
protected override DbTransaction DbTransaction
55+
{
56+
get { return _command.Transaction; }
57+
set { _command.Transaction = value; }
58+
}
59+
60+
public override bool DesignTimeVisible
61+
{
62+
get { return _command.DesignTimeVisible; }
63+
set { _command.DesignTimeVisible = value; }
64+
}
65+
66+
public override UpdateRowSource UpdatedRowSource
67+
{
68+
get { return _command.UpdatedRowSource; }
69+
set { _command.UpdatedRowSource = value; }
70+
}
71+
72+
public override void Cancel()
73+
{
74+
_command.Cancel();
75+
}
76+
77+
protected override DbParameter CreateDbParameter()
78+
{
79+
return _command.CreateParameter();
80+
}
81+
82+
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
83+
{
84+
ReorderParameters();
85+
var reader = _command.ExecuteReader(behavior);
86+
return new OracleDataReader(reader);
87+
}
88+
89+
private void ReorderParameters()
90+
{
91+
var parameters = new Dictionary<int, IDbDataParameter>();
92+
93+
foreach (DbParameter parameter in Parameters)
94+
{
95+
var parameterName = GetParameterName(parameter);
96+
var indexes = GetParameterIndexes(CommandText, parameterName);
97+
98+
foreach (var index in indexes)
99+
{
100+
if (parameters.ContainsKey(index)) continue;
101+
102+
//var p = _command.CreateParam(parameter.ParameterName.TrimStart(':'), parameter.Value, parameter.Direction, parameter.DbType);
103+
parameters.Add(index, parameter);
104+
}
105+
}
106+
107+
Parameters.Clear();
108+
109+
foreach (var item in parameters.OrderBy(p => p.Key))
110+
{
111+
_command.Parameters.Add(item.Value);
112+
}
113+
}
114+
115+
private IEnumerable<int> GetParameterIndexes(string commandText, string parameterName)
116+
{
117+
var regex = new Regex(parameterName + "[\\W?]", RegexOptions.IgnoreCase | RegexOptions.Multiline);
118+
var matches = regex.Matches(string.Format("{0} ", commandText));
119+
return from Match m in matches select m.Index;
120+
}
121+
122+
private string GetParameterName(DbParameter parameter)
123+
{
124+
return parameter.ParameterName.StartsWith(":")
125+
? parameter.ParameterName
126+
: string.Format(":{0}", parameter.ParameterName);
127+
}
128+
129+
public override int ExecuteNonQuery()
130+
{
131+
ReorderParameters();
132+
return _command.ExecuteNonQuery();
133+
}
134+
135+
public override object ExecuteScalar()
136+
{
137+
ReorderParameters();
138+
return _command.ExecuteScalar();
139+
}
140+
141+
protected override void Dispose(bool disposing)
142+
{
143+
if (disposing)
144+
{
145+
_command.Dispose();
146+
}
147+
base.Dispose(disposing);
148+
}
149+
}
150+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
using System.Data;
2+
using System.Data.Common;
3+
4+
namespace ServiceStack.OrmLite.Oracle
5+
{
6+
public class OracleConnection : DbConnection
7+
{
8+
private DbConnection _connection;
9+
public OracleConnection(DbConnection connection)
10+
{
11+
_connection = connection;
12+
}
13+
14+
protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel)
15+
{
16+
return _connection.BeginTransaction(isolationLevel);
17+
}
18+
19+
public override void Close()
20+
{
21+
_connection.Close();
22+
}
23+
24+
public override void ChangeDatabase(string databaseName)
25+
{
26+
_connection.ChangeDatabase(databaseName);
27+
}
28+
29+
public override void Open()
30+
{
31+
if (_connection.State != ConnectionState.Open)
32+
_connection.Open();
33+
}
34+
35+
public override string ConnectionString
36+
{
37+
get { return _connection.ConnectionString; }
38+
set { _connection.ConnectionString = value; }
39+
}
40+
41+
public override string Database
42+
{
43+
get { return _connection.Database; }
44+
}
45+
46+
public override string DataSource
47+
{
48+
get { return _connection.DataSource; }
49+
}
50+
51+
public override ConnectionState State
52+
{
53+
get { return _connection.State; }
54+
}
55+
56+
public override string ServerVersion
57+
{
58+
get { return _connection.ServerVersion; }
59+
}
60+
61+
protected override DbCommand CreateDbCommand()
62+
{
63+
return new OracleCommand(_connection.CreateCommand());
64+
}
65+
66+
protected override void Dispose(bool disposing)
67+
{
68+
if (disposing && _connection != null)
69+
{
70+
_connection.Dispose();
71+
}
72+
_connection = null;
73+
base.Dispose(disposing);
74+
}
75+
}
76+
}

0 commit comments

Comments
 (0)