[ http://issues.apache.org/jira/browse/IBATISNET-118?page=all ]
Gilles Bayon closed IBATISNET-118:
----------------------------------
Fix Version: DataMapper 1.3
Resolution: Fixed
Assign To: Gilles Bayon
Invalid patch but solve by another way
In SVN
> CacheKey.Equals(object) override can return true when the parameters have the
> same HashCode but are not equal.
> --------------------------------------------------------------------------------------------------------------
>
> Key: IBATISNET-118
> URL: http://issues.apache.org/jira/browse/IBATISNET-118
> Project: iBatis for .NET
> Type: Bug
> Components: DataMapper
> Versions: DataMapper 1.2.1
> Environment: Windows
> Reporter: Thomas Tannahill
> Assignee: Gilles Bayon
> Fix For: DataMapper 1.3
>
> CacheKey.Equals(object) override can return true when the parameters have the
> same HashCode but are not equal. This can cause false cache hits.
> Only an issue for complex parameters.
> Failing NUnit test:
> ---- UNIT TEST BEGIN ----
> using IBatisNet.DataMapper;
> using IBatisNet.DataMapper.TypeHandlers;
> using NUnit.Framework;
> namespace IBatisNet.DataAccess
> {
> [TestFixture]
> public class CacheKeyTests
> {
> private const long A_LONG = 1L;
> private const long ANOTHER_LONG_WITH_SAME_HASHCODE =
> -9223372034707292159;
>
> public CacheKeyTests()
> {
> }
> [Test]
> public void
> ShouldNotBeConsideredEqualWhenParametersHaveTheSameHashCodeButAreNotEqual()
> {
> TypeHandlerFactory factory = new TypeHandlerFactory();
> // Two cache keys are equal except for the parameter.
> CacheKey key = new CacheKey(factory, "STATEMENT",
> "SQL", new TestClass(A_LONG), new string[] {"AProperty"}, 0, 0,
> CacheKeyType.Object);
> CacheKey aDifferentKey = new CacheKey(factory,
> "STATEMENT", "SQL", new TestClass(ANOTHER_LONG_WITH_SAME_HASHCODE), new
> string[] {"AProperty"}, 0, 0, CacheKeyType.Object);
> Assert.IsFalse(aDifferentKey.Equals(key)); // should
> not be equal.
> }
> }
> public class TestClass
> {
> private long aProperty;
> public TestClass(long aProperty)
> {
> this.aProperty = aProperty;
> }
> public long AProperty
> {
> get { return aProperty; }
> set { aProperty = value; }
> }
> }
> }
> ---- UNIT TEST END ----
> The test passes if you replace this line in CacheKey.Equals():
> if (_hashCode != cacheKey._hashCode) return false;
> with something like this:
> if (this._parameter == null && cacheKey._parameter != null)
> return false;
> if (this._parameter != null && cacheKey._parameter == null)
> return false;
> if (!this._parameter.Equals(cacheKey._parameter)) return false;
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira