#region Apache Notice /***************************************************************************** * $Header: $ * $Revision: $ * $Date: $ * * iBATIS.NET Data Mapper * Copyright (C) 2004 - Gilles Bayon * * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ********************************************************************************/ #endregion #region Using using System; using System.Collections; using IBatisNet.Common.Utilities.Objects; using IBatisNet.DataMapper.TypeHandlers; #endregion namespace IBatisNet.DataMapper { /// /// Summary description for FlushInterval. /// [Serializable] public class CacheKey { #region Fields private string[] _properties = null; private object _parameter = null; private string _sql = string.Empty; private string _statementName = string.Empty; private int _maxResults = 0 ; private int _skipRecords = 0; private CacheKeyType _type = CacheKeyType.Object; private TypeHandlerFactory _typeHandlerFactory = null; private string _hashCodeString = string.Empty; private int _hashCode = 0; #endregion /// /// /// /// /// /// /// /// /// /// /// public CacheKey(TypeHandlerFactory typeHandlerFactory, string statementName, string sql, object parameter, string[] properties, int skipRecords, int maxResults, CacheKeyType type) { _typeHandlerFactory = typeHandlerFactory; _statementName = statementName; _sql = sql; _parameter = parameter; _properties = properties; _skipRecords = skipRecords; _maxResults = maxResults; _type = type; _hashCode = GenerateHashCode(); _hashCodeString = Convert.ToString(_hashCode); } /// /// /// /// private int GenerateHashCode() { int result = 0; if (_parameter is Hashtable) { result = (_parameter != null ? _parameter.GetHashCode() : 0); } else if ( _parameter != null && _typeHandlerFactory.IsSimpleType(_parameter.GetType()) ) { result = (_parameter != null ? _parameter.GetHashCode() : 0); } else { result = (_parameter != null ? ObjectProbe.ObjectHashCode(_parameter, _properties) : 0); } result = 29 * result + (_statementName != null ? _statementName.GetHashCode() : 0); result = 29 * result + (_sql != null ? _sql.GetHashCode() : 0); result = 29 * result + _maxResults; result = 29 * result + _skipRecords; result = 29 * result + (int)_type; return result; } /// /// /// /// /// public override bool Equals(object obj) { //----------------------------------- if (this == obj) return true; if (!(obj is CacheKey)) return false; CacheKey cacheKey = (CacheKey)obj; if (_maxResults != cacheKey._maxResults) return false; if (_skipRecords != cacheKey._skipRecords) return false; if (_type != cacheKey._type) return false; if (_parameter is Hashtable) { if (_hashCode != cacheKey._hashCode) return false; if (!_parameter.Equals(cacheKey._parameter)) return false; } else if (_parameter != null && _typeHandlerFactory.IsSimpleType(_parameter.GetType())) { if (_parameter != null ? !_parameter.Equals(cacheKey._parameter) : cacheKey._parameter != null) return false; } else { if (_hashCode != cacheKey._hashCode) return false; } if (_sql != null ? !_sql.Equals(cacheKey._sql) : cacheKey._sql != null) return false; return true; } /// /// Get the HashCode for this CacheKey /// /// public override int GetHashCode() { return _hashCode; } /// /// ToString implementation. /// /// A string that give the CacheKey HashCode. public override string ToString() { return _hashCodeString; } } }