Merge branch 'master' into common-logging-220-upgrade
This commit is contained in:
@@ -8,6 +8,7 @@ Changes (1.3.2 to 2.0)
|
||||
|
||||
3. Most of members marked as Obsolete before 2.0 release were removed.
|
||||
|
||||
4. DbProvider automatically sets BindByName to true for Oracle's ODP.NET OracleCommand instances when created
|
||||
|
||||
Changes (1.3.1 to 1.3.2)
|
||||
========================
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
|
||||
using Spring.Expressions;
|
||||
using Spring.Reflection.Dynamic;
|
||||
using Spring.Util;
|
||||
@@ -32,12 +33,13 @@ namespace Spring.Data.Common
|
||||
public class DbProvider : IDbProvider
|
||||
{
|
||||
private string connectionString;
|
||||
private IDbMetadata dbMetadata;
|
||||
private IDynamicConstructor newCommand;
|
||||
private IDynamicConstructor newConnection;
|
||||
private IDynamicConstructor newCommandBuilder;
|
||||
private IDynamicConstructor newDataAdapter;
|
||||
private IDynamicConstructor newParameter;
|
||||
private readonly IDbMetadata dbMetadata;
|
||||
private readonly IDynamicConstructor newCommand;
|
||||
private readonly IDynamicProperty commandBindByName;
|
||||
private readonly IDynamicConstructor newConnection;
|
||||
private readonly IDynamicConstructor newCommandBuilder;
|
||||
private readonly IDynamicConstructor newDataAdapter;
|
||||
private readonly IDynamicConstructor newParameter;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="DbProvider"/> class.
|
||||
@@ -47,6 +49,14 @@ namespace Spring.Data.Common
|
||||
{
|
||||
this.dbMetadata = dbMetadata;
|
||||
newCommand = DynamicConstructor.Create(dbMetadata.CommandType.GetConstructor(Type.EmptyTypes));
|
||||
|
||||
// Oracle needs custom bind by name property set to true as it's false by default
|
||||
var bindByNameProperty = dbMetadata.CommandType.GetProperty("BindByName");
|
||||
if (bindByNameProperty != null && bindByNameProperty.CanWrite)
|
||||
{
|
||||
commandBindByName = DynamicProperty.Create(bindByNameProperty);
|
||||
}
|
||||
|
||||
newConnection = DynamicConstructor.Create(dbMetadata.ConnectionType.GetConstructor(Type.EmptyTypes));
|
||||
newCommandBuilder = DynamicConstructor.Create(dbMetadata.CommandBuilderType.GetConstructor(Type.EmptyTypes));
|
||||
newDataAdapter = DynamicConstructor.Create(dbMetadata.DataAdapterType.GetConstructor(Type.EmptyTypes));
|
||||
@@ -60,7 +70,12 @@ namespace Spring.Data.Common
|
||||
/// <returns>An new <see cref="IDbCommand"/></returns>
|
||||
public IDbCommand CreateCommand()
|
||||
{
|
||||
return newCommand.Invoke(ObjectUtils.EmptyObjects) as IDbCommand;
|
||||
var command = newCommand.Invoke(ObjectUtils.EmptyObjects) as IDbCommand;
|
||||
if (command != null && commandBindByName != null)
|
||||
{
|
||||
commandBindByName.SetValue(command, dbMetadata.BindByName);
|
||||
}
|
||||
return command;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -188,20 +203,16 @@ namespace Spring.Data.Common
|
||||
/// <returns>The provider specific error code</returns>
|
||||
public string ExtractError(Exception e)
|
||||
{
|
||||
|
||||
if (!StringUtils.IsNullOrEmpty(dbMetadata.ErrorCodeExceptionExpression))
|
||||
{
|
||||
return ExpressionEvaluator.GetValue(e, dbMetadata.ErrorCodeExceptionExpression).ToString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Could not extract error code exception type." + e.GetType();
|
||||
return "Could not extract error code exception type." + e.GetType();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the provided exception is in fact related
|
||||
/// to database access. This can be provider dependent in .NET 1.1 since
|
||||
@@ -215,7 +226,6 @@ namespace Spring.Data.Common
|
||||
/// </returns>
|
||||
public bool IsDataAccessException(Exception e)
|
||||
{
|
||||
|
||||
if (e is System.Data.Common.DbException)
|
||||
{
|
||||
return true;
|
||||
@@ -225,21 +235,5 @@ namespace Spring.Data.Common
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether is data access exception in .NET 1.1 for the specified exception.
|
||||
/// </summary>
|
||||
/// <param name="e">The candidate exception.</param>
|
||||
/// <returns>
|
||||
/// <c>true</c> if is data access exception in .NET 1.1 for the specified exception; otherwise, <c>false</c>.
|
||||
/// </returns>
|
||||
private bool IsDataAccessExceptionBCL11(Exception e)
|
||||
{
|
||||
if (e == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return e.GetType().IsAssignableFrom(DbMetadata.ExceptionType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -500,7 +500,6 @@
|
||||
</object>
|
||||
</constructor-arg>
|
||||
</object>
|
||||
|
||||
|
||||
<object id="OracleODP-11-4.0" type="Spring.Data.Common.DbProvider, Spring.Data" singleton="false">
|
||||
<constructor-arg name="dbMetaData">
|
||||
@@ -551,11 +550,163 @@
|
||||
</property>
|
||||
</object>
|
||||
</constructor-arg>
|
||||
</object>
|
||||
|
||||
|
||||
</object>
|
||||
|
||||
<object id="OracleODP-12-2.0" type="Spring.Data.Common.DbProvider, Spring.Data" singleton="false">
|
||||
<constructor-arg name="dbMetaData">
|
||||
<object type="Spring.Data.Common.DbMetadata">
|
||||
<constructor-arg name="productName" value="Oracle, Oracle provider V2.121.1.0" />
|
||||
<constructor-arg name="assemblyName" value="Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="connectionType" value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandType" value="Oracle.DataAccess.Client.OracleCommand, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="parameterType" value="Oracle.DataAccess.Client.OracleParameter, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="dataAdapterType" value="Oracle.DataAccess.Client.OracleDataAdapter, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandBuilderType" value="Oracle.DataAccess.Client.OracleCommandBuilder, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandBuilderDeriveParametersMethod" value="DeriveParameters"/>
|
||||
<constructor-arg name="parameterDbType" value="Oracle.DataAccess.Client.OracleDbType, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="parameterDbTypeProperty" value="OracleDbType"/>
|
||||
<constructor-arg name="parameterIsNullableProperty" value="IsNullable"/>
|
||||
<constructor-arg name="parameterNamePrefix" value=":"/>
|
||||
<constructor-arg name="exceptionType" value="Oracle.DataAccess.Client.OracleException, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="useParameterNamePrefixInParameterCollection" value="false"/>
|
||||
<constructor-arg name="useParameterPrefixInSql" value="true"/>
|
||||
<constructor-arg name="bindByName" value="true"/>
|
||||
<!-- this is only true for .net 1.1 kept it here just in case we want to revert back to this strategy for
|
||||
obtaining error codes-->
|
||||
<constructor-arg name="errorCodeExceptionExpression" value="Number.ToString()"/>
|
||||
|
||||
<property name="ErrorCodes.BadSqlGrammarCodes">
|
||||
<value>900,903,904,917,936,942,17006</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.InvalidResultSetAccessCodes">
|
||||
<value>17003</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DuplicateKeyCodes">
|
||||
<value>1</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DataAccessResourceFailureCodes">
|
||||
<value>17002,17447</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DataIntegrityViolationCodes">
|
||||
<value>1,1400,1722,2291,2292</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.CannotAcquireLockCodes">
|
||||
<value>54</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.CannotSerializeTransactionCodes">
|
||||
<value>8177</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DeadlockLoserCodes">
|
||||
<value>60</value>
|
||||
</property>
|
||||
</object>
|
||||
</constructor-arg>
|
||||
</object>
|
||||
|
||||
<object id="OracleODP-12-4.0" type="Spring.Data.Common.DbProvider, Spring.Data" singleton="false">
|
||||
<constructor-arg name="dbMetaData">
|
||||
<object type="Spring.Data.Common.DbMetadata">
|
||||
<constructor-arg name="productName" value="Oracle, Oracle provider V4.121.1.0" />
|
||||
<constructor-arg name="assemblyName" value="Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="connectionType" value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandType" value="Oracle.DataAccess.Client.OracleCommand, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="parameterType" value="Oracle.DataAccess.Client.OracleParameter, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="dataAdapterType" value="Oracle.DataAccess.Client.OracleDataAdapter, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandBuilderType" value="Oracle.DataAccess.Client.OracleCommandBuilder, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandBuilderDeriveParametersMethod" value="DeriveParameters"/>
|
||||
<constructor-arg name="parameterDbType" value="Oracle.DataAccess.Client.OracleDbType, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="parameterDbTypeProperty" value="OracleDbType"/>
|
||||
<constructor-arg name="parameterIsNullableProperty" value="IsNullable"/>
|
||||
<constructor-arg name="parameterNamePrefix" value=":"/>
|
||||
<constructor-arg name="exceptionType" value="Oracle.DataAccess.Client.OracleException, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="useParameterNamePrefixInParameterCollection" value="false"/>
|
||||
<constructor-arg name="useParameterPrefixInSql" value="true"/>
|
||||
<constructor-arg name="bindByName" value="true"/>
|
||||
<!-- this is only true for .net 1.1 kept it here just in case we want to revert back to this strategy for
|
||||
obtaining error codes-->
|
||||
<constructor-arg name="errorCodeExceptionExpression" value="Number.ToString()"/>
|
||||
|
||||
<property name="ErrorCodes.BadSqlGrammarCodes">
|
||||
<value>900,903,904,917,936,942,17006</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.InvalidResultSetAccessCodes">
|
||||
<value>17003</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DuplicateKeyCodes">
|
||||
<value>1</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DataAccessResourceFailureCodes">
|
||||
<value>17002,17447</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DataIntegrityViolationCodes">
|
||||
<value>1,1400,1722,2291,2292</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.CannotAcquireLockCodes">
|
||||
<value>54</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.CannotSerializeTransactionCodes">
|
||||
<value>8177</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DeadlockLoserCodes">
|
||||
<value>60</value>
|
||||
</property>
|
||||
</object>
|
||||
</constructor-arg>
|
||||
</object>
|
||||
|
||||
<object id="OracleODP-Managed-12-4.0" type="Spring.Data.Common.DbProvider, Spring.Data" singleton="false">
|
||||
<constructor-arg name="dbMetaData">
|
||||
<object type="Spring.Data.Common.DbMetadata">
|
||||
<constructor-arg name="productName" value="Oracle, Oracle Managed provider V4.121.1.0" />
|
||||
<constructor-arg name="assemblyName" value="Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="connectionType" value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandType" value="Oracle.ManagedDataAccess.Client.OracleCommand, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="parameterType" value="Oracle.ManagedDataAccess.Client.OracleParameter, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="dataAdapterType" value="Oracle.ManagedDataAccess.Client.OracleDataAdapter, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandBuilderType" value="Oracle.ManagedDataAccess.Client.OracleCommandBuilder, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="commandBuilderDeriveParametersMethod" value="DeriveParameters"/>
|
||||
<constructor-arg name="parameterDbType" value="Oracle.ManagedDataAccess.Client.OracleDbType, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="parameterDbTypeProperty" value="OracleDbType"/>
|
||||
<constructor-arg name="parameterIsNullableProperty" value="IsNullable"/>
|
||||
<constructor-arg name="parameterNamePrefix" value=":"/>
|
||||
<constructor-arg name="exceptionType" value="Oracle.ManagedDataAccess.Client.OracleException, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
|
||||
<constructor-arg name="useParameterNamePrefixInParameterCollection" value="false"/>
|
||||
<constructor-arg name="useParameterPrefixInSql" value="true"/>
|
||||
<constructor-arg name="bindByName" value="true"/>
|
||||
<!-- this is only true for .net 1.1 kept it here just in case we want to revert back to this strategy for
|
||||
obtaining error codes-->
|
||||
<constructor-arg name="errorCodeExceptionExpression" value="Number.ToString()"/>
|
||||
|
||||
<property name="ErrorCodes.BadSqlGrammarCodes">
|
||||
<value>900,903,904,917,936,942,17006</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.InvalidResultSetAccessCodes">
|
||||
<value>17003</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DuplicateKeyCodes">
|
||||
<value>1</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DataAccessResourceFailureCodes">
|
||||
<value>17002,17447</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DataIntegrityViolationCodes">
|
||||
<value>1,1400,1722,2291,2292</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.CannotAcquireLockCodes">
|
||||
<value>54</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.CannotSerializeTransactionCodes">
|
||||
<value>8177</value>
|
||||
</property>
|
||||
<property name="ErrorCodes.DeadlockLoserCodes">
|
||||
<value>60</value>
|
||||
</property>
|
||||
</object>
|
||||
</constructor-arg>
|
||||
</object>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- My Sql -->
|
||||
|
||||
<!-- Connector/NET 1.0 -->
|
||||
|
||||
@@ -66,5 +66,10 @@ namespace Spring.Globalization
|
||||
{
|
||||
get { return Environment.OSVersion.Version.Major >= 6 && Environment.OSVersion.Version.Minor >= 2; }
|
||||
}
|
||||
|
||||
public static bool ClrIsVersion4OrLater
|
||||
{
|
||||
get { return Environment.Version.Major >= 4; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new CurrencyFormatter(CultureInfoUtils.SerbianLatinCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual("1.234,00 din.", fmt.Format(1234));
|
||||
Assert.AreEqual("1.234,56 din.", fmt.Format(1234.56));
|
||||
@@ -83,7 +83,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new CurrencyFormatter(CultureInfoUtils.SerbianCyrillicCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual("1.234,00 дин.", fmt.Format(1234));
|
||||
Assert.AreEqual("1.234,56 дин.", fmt.Format(1234.56));
|
||||
@@ -111,7 +111,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new CurrencyFormatter(CultureInfoUtils.SerbianLatinCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual(1234, fmt.Parse("1.234,00 din."));
|
||||
Assert.AreEqual(1234.56, fmt.Parse("1.234,56 din."));
|
||||
@@ -128,7 +128,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new CurrencyFormatter(CultureInfoUtils.SerbianCyrillicCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual(1234, fmt.Parse("1.234,00 дин."));
|
||||
Assert.AreEqual(1234.56, fmt.Parse("1.234,56 дин."));
|
||||
@@ -168,7 +168,7 @@ namespace Spring.Globalization.Formatters
|
||||
fmt.GroupSizes = new int[] { 1, 2 };
|
||||
fmt.GroupSeparator = "'";
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual("1'23'4,00 дин.", fmt.Format(1234));
|
||||
Assert.AreEqual("1'23'4,56 дин.", fmt.Format(1234.56));
|
||||
@@ -207,7 +207,7 @@ namespace Spring.Globalization.Formatters
|
||||
fmt.GroupSizes = new int[] { 1, 2 };
|
||||
fmt.GroupSeparator = "'";
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual(1234, fmt.Parse("1'23'4,00 дин."));
|
||||
Assert.AreEqual(1234.56, fmt.Parse("1'23'4,56 дин."));
|
||||
|
||||
@@ -68,7 +68,10 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new DateTimeFormatter("D", CultureInfoUtils.SerbianLatinCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
Console.WriteLine("Steve: " + Environment.Version);
|
||||
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual("14. avgust 2004.", fmt.Format(new DateTime(2004, 8, 14)));
|
||||
Assert.AreEqual("24. avgust 1974.", fmt.Format(new DateTime(1974, 8, 24)));
|
||||
@@ -81,7 +84,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new DateTimeFormatter("dd-MMM-yyyy", CultureInfoUtils.SerbianCyrillicCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual("14-авг.-2004", fmt.Format(new DateTime(2004, 8, 14)));
|
||||
Assert.AreEqual("24-авг.-1974", fmt.Format(new DateTime(1974, 8, 24)));
|
||||
@@ -107,7 +110,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new DateTimeFormatter("D", CultureInfoUtils.SerbianLatinCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual(new DateTime(2004, 8, 14), fmt.Parse("14. avgust 2004."));
|
||||
Assert.AreEqual(new DateTime(1974, 8, 24), fmt.Parse("24. avgust 1974."));
|
||||
@@ -120,7 +123,7 @@ namespace Spring.Globalization.Formatters
|
||||
|
||||
fmt = new DateTimeFormatter("dd-MMM-yyyy", CultureInfoUtils.SerbianCyrillicCultureName);
|
||||
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7)
|
||||
if (CultureInfoUtils.OperatingSystemIsLaterThanWindows7 && CultureInfoUtils.ClrIsVersion4OrLater)
|
||||
{
|
||||
Assert.AreEqual(new DateTime(2004, 8, 14), fmt.Parse("14-авг.-2004"));
|
||||
Assert.AreEqual(new DateTime(1974, 8, 24), fmt.Parse("24-авг.-1974"));
|
||||
|
||||
@@ -23,7 +23,9 @@ using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
using Spring.Context;
|
||||
using Spring.Context.Support;
|
||||
using Spring.Threading;
|
||||
@@ -41,7 +43,7 @@ namespace Spring.Data.Common
|
||||
|
||||
public class AsyncTestDbProviderFactory : AsyncTestTask
|
||||
{
|
||||
private string providerName;
|
||||
private readonly string providerName;
|
||||
|
||||
public AsyncTestDbProviderFactory(int iterations, string providerName)
|
||||
: base(iterations)
|
||||
@@ -66,12 +68,12 @@ namespace Spring.Data.Common
|
||||
//Other tests in this assembly will have already initialized the internal context that is part of DbProviderFactory
|
||||
//Reset it back to null so that tests for specifiying additional database providers will be able 're-initialize'
|
||||
//the internal Context of DbProviderFactory.
|
||||
//Spring.Objects.Factory.Xml.NamespaceParserRegistry.RegisterParser(typeof(Spring.Data.Config.DatabaseNamespaceParser));
|
||||
//Spring.Objects.Factory.Xml.NamespaceParserRegistry.RegisterParser(typeof(Spring.Data.Config.DatabaseNamespaceParser));
|
||||
if (DbProviderFactory.ApplicationContext != null)
|
||||
{
|
||||
FieldInfo fieldInfo = typeof (DbProviderFactory).GetField("ctx", BindingFlags.NonPublic | BindingFlags.Static);
|
||||
fieldInfo.SetValue(null, null);
|
||||
}
|
||||
FieldInfo fieldInfo = typeof (DbProviderFactory).GetField("ctx", BindingFlags.NonPublic | BindingFlags.Static);
|
||||
fieldInfo.SetValue(null, null);
|
||||
}
|
||||
ctx = new XmlApplicationContext("assembly://Spring.Data.Tests/Spring.Data.Common/DbProviderFactoryTests.xml");
|
||||
}
|
||||
|
||||
@@ -82,17 +84,16 @@ namespace Spring.Data.Common
|
||||
AsyncTestTask t2 = new AsyncTestDbProviderFactory(1000, "SqlServer-2.0").Start();
|
||||
AsyncTestTask t3 = new AsyncTestDbProviderFactory(1000, "SqlServer-2.0").Start();
|
||||
AsyncTestTask t4 = new AsyncTestDbProviderFactory(1000, "SqlServer-2.0").Start();
|
||||
|
||||
|
||||
t1.AssertNoException();
|
||||
t2.AssertNoException();
|
||||
t3.AssertNoException();
|
||||
t4.AssertNoException();
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AdditionalResourceName()
|
||||
{
|
||||
{
|
||||
IDbProvider provider = DbProviderFactory.GetDbProvider("Test-SqlServer-2.0");
|
||||
Assert.IsNotNull(provider);
|
||||
}
|
||||
@@ -100,11 +101,10 @@ namespace Spring.Data.Common
|
||||
[Test]
|
||||
public void BadErrorExpression()
|
||||
{
|
||||
|
||||
IDbProvider provider = DbProviderFactory.GetDbProvider("Test-SqlServer-2.0-BadErrorCodeExpression");
|
||||
Assert.IsNotNull(provider);
|
||||
string errorCode = provider.ExtractError(new Exception("foo"));
|
||||
Assert.AreEqual("156",errorCode);
|
||||
Assert.AreEqual("156", errorCode);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -126,8 +126,7 @@ namespace Spring.Data.Common
|
||||
Assert.IsNotNull(provider.CreateParameter());
|
||||
Assert.AreEqual("@Foo", provider.CreateParameterName("Foo"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithOleDb20()
|
||||
{
|
||||
@@ -140,7 +139,7 @@ namespace Spring.Data.Common
|
||||
Assert.IsNotNull(provider.CreateParameter());
|
||||
Assert.AreEqual("?", provider.CreateParameterName("Foo"));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithMicrsoftOracleClient20()
|
||||
{
|
||||
@@ -155,7 +154,7 @@ namespace Spring.Data.Common
|
||||
}
|
||||
|
||||
#if NET_4_0
|
||||
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithSqlServer40()
|
||||
{
|
||||
@@ -184,19 +183,82 @@ namespace Spring.Data.Common
|
||||
}
|
||||
#endif
|
||||
|
||||
//[Test]
|
||||
//Comment in for specific testing with oracle as can't put oracle client in public code repository
|
||||
public void DefaultInstanceWithOracleClient20()
|
||||
[Test]
|
||||
public void DefaultInstanceWithOracleClient10_20()
|
||||
{
|
||||
IDbProvider provider = DbProviderFactory.GetDbProvider("OracleODP-2.0");
|
||||
Assert.AreEqual("Oracle, Oracle provider V2.102.2.20", provider.DbMetadata.ProductName);
|
||||
Assert.IsNotNull(provider.CreateCommand());
|
||||
if (Type.GetType("Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342") == null)
|
||||
{
|
||||
Assert.Inconclusive("oracle data access libs not found, skipping test");
|
||||
}
|
||||
|
||||
AssertOracleProvider("OracleODP-2.0", "Oracle, Oracle provider V2.102.2.20");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithOracleClient11_20()
|
||||
{
|
||||
if (Type.GetType("Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342") == null)
|
||||
{
|
||||
Assert.Inconclusive("oracle data access libs not found, skipping test");
|
||||
}
|
||||
|
||||
AssertOracleProvider("OracleODP-11-2.0", "Oracle, Oracle provider V2.112.3.0");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithOracleClient12_20()
|
||||
{
|
||||
if (Type.GetType("Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342") == null)
|
||||
{
|
||||
Assert.Inconclusive("oracle data access libs not found, skipping test");
|
||||
}
|
||||
|
||||
AssertOracleProvider("OracleODP-12-2.0", "Oracle, Oracle provider V2.121.1.0");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithOracleClient12_40()
|
||||
{
|
||||
if (Type.GetType("Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342") == null)
|
||||
{
|
||||
Assert.Inconclusive("oracle data access libs not found, skipping test");
|
||||
}
|
||||
|
||||
AssertOracleProvider("OracleODP-12-4.0", "Oracle, Oracle provider V4.121.1.0");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DefaultInstanceWithOracleManagedClient11_40()
|
||||
{
|
||||
if (Type.GetType("Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342") == null)
|
||||
{
|
||||
Assert.Inconclusive("oracle data access libs not found, skipping test");
|
||||
}
|
||||
|
||||
AssertOracleProvider("OracleODP-Managed-12-4.0", "Oracle, Oracle Managed provider V4.121.1.0");
|
||||
}
|
||||
|
||||
private static void AssertOracleProvider(string providerName, string productName)
|
||||
{
|
||||
IDbProvider provider = DbProviderFactory.GetDbProvider(providerName);
|
||||
Assert.AreEqual(productName, provider.DbMetadata.ProductName);
|
||||
|
||||
var command = provider.CreateCommand();
|
||||
Assert.IsNotNull(command);
|
||||
|
||||
// check if parameter has readable BindByName property
|
||||
var property = command.GetType().GetProperty("BindByName");
|
||||
if (property != null)
|
||||
{
|
||||
var bindByNameValue = property.GetValue(command, null);
|
||||
Assert.That(bindByNameValue, Is.EqualTo(provider.DbMetadata.BindByName), "BindByName had wrong value");
|
||||
}
|
||||
|
||||
Assert.IsNotNull(provider.CreateCommandBuilder());
|
||||
Assert.IsNotNull(provider.CreateConnection());
|
||||
Assert.IsNotNull(provider.CreateDataAdapter());
|
||||
Assert.IsNotNull(provider.CreateParameter());
|
||||
Assert.AreEqual(":Foo", provider.CreateParameterName("Foo"));
|
||||
|
||||
Assert.AreEqual(":Foo", provider.CreateParameterName("Foo"));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -218,22 +280,21 @@ namespace Spring.Data.Common
|
||||
//Initialize internal application context. factory
|
||||
DbProviderFactory.GetDbProvider("SqlServer-2.0");
|
||||
IApplicationContext ctx = DbProviderFactory.ApplicationContext;
|
||||
IList<string> dbProviderNames = ctx.GetObjectNamesForType(typeof(IDbProvider));
|
||||
Assert.IsTrue(dbProviderNames.Count > 0);
|
||||
|
||||
IList<string> dbProviderNames = ctx.GetObjectNamesForType(typeof (IDbProvider));
|
||||
Assert.IsTrue(dbProviderNames.Count > 0);
|
||||
}
|
||||
|
||||
private void AssertIsSqlServer2005(IDbProvider provider)
|
||||
{
|
||||
Assert.AreEqual("Microsoft SQL Server, provider V2.0.0.0 in framework .NET V2.0",
|
||||
provider.DbMetadata.ProductName);
|
||||
provider.DbMetadata.ProductName);
|
||||
AssertCommonSqlServerErrorCodes(provider);
|
||||
}
|
||||
|
||||
private void AssertIsSqlServer40(IDbProvider provider)
|
||||
{
|
||||
Assert.AreEqual("Microsoft SQL Server, provider V4.0.0.0 in framework .NET V4.0",
|
||||
provider.DbMetadata.ProductName);
|
||||
provider.DbMetadata.ProductName);
|
||||
AssertCommonSqlServerErrorCodes(provider);
|
||||
}
|
||||
|
||||
@@ -248,4 +309,4 @@ namespace Spring.Data.Common
|
||||
Assert.IsFalse(Array.IndexOf(codes.BadSqlGrammarCodes, "1xx56") >= 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,6 +84,9 @@
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Oracle.ManagedDataAccess">
|
||||
<HintPath>..\..\..\packages\odp.net.managed.121.1.1\lib\net40\Oracle.ManagedDataAccess.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Rhino.Mocks, Version=2.9.6.40380, Culture=neutral, PublicKeyToken=0b3305902db7183f">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\Net\2.0\Rhino.Mocks.dll</HintPath>
|
||||
|
||||
@@ -2,4 +2,5 @@
|
||||
<packages>
|
||||
<package id="Common.Logging" version="2.1.2" targetFramework="net40" />
|
||||
<package id="NUnit" version="2.6.3" targetFramework="net40" />
|
||||
<package id="odp.net.managed" version="121.1.1" targetFramework="net40" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user