Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataWeb / Server / System / Data / Services / Caching / MetadataCache.cs / 1 / MetadataCache.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Provides a class to cache metadata information.
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Caching
{
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading;
using System.Data.Objects;
using System.Data.Common;
using System.Data.EntityClient;
///
/// Use this class to cache metadata through MetadataCacheItem instances.
///
internal static class MetadataCache
{
/// AppDomain-wide cache for metadata items.
private static Dictionary cache = new Dictionary(new MetadataCacheKey.Comparer());
/// Reader/writer lock for AppDomain .
private static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
/// Adds a new cache item, and returns the item that is put in the cache.
/// Type of service with metadata being cached.
///
/// Data context instance being cached, possibly segmenting the cache
/// space for .
///
/// Item being added.
/// The item being put in the cache (possibly an existing one).
/// This method is thread-safe but not re-entrant.
internal static MetadataCacheItem AddCacheItem(Type serviceType, object dataContextInstance, MetadataCacheItem item)
{
Debug.Assert(serviceType != null, "serviceType != null");
Debug.Assert(dataContextInstance != null, "dataContextInstance != null");
Debug.Assert(item != null, "item != null");
MetadataCacheKey key = new MetadataCacheKey(serviceType, dataContextInstance as ObjectContext);
MetadataCacheItem result;
cacheLock.EnterWriteLock();
try
{
// If another thread beat the current thread, we return the
// previously created item, which has a higher chance of
// having survived a garbage collection already.
if (!cache.TryGetValue(key, out result))
{
cache.Add(key, item);
result = item;
}
}
finally
{
cacheLock.ExitWriteLock();
}
Debug.Assert(result != null, "result != null -- a null item is never returned.");
Debug.Assert(
result == TryLookup(serviceType, dataContextInstance),
"result == TryLookup(serviceType, dataContextInstance) -- instance from cache is being returned.");
return result;
}
/// Tries to look up metadata for the specifed service type and context instance.
/// Type of service with metadata being cached.
///
/// Data context instance being cached, possibly segmenting the cache
/// space for .
///
/// The cached metadata item, if one exists.
/// This method is thread-safe but not re-entrant.
internal static MetadataCacheItem TryLookup(Type serviceType, object dataContextInstance)
{
Debug.Assert(serviceType != null, "serviceType != null");
Debug.Assert(dataContextInstance != null, "dataContextInstance != null");
MetadataCacheKey key = new MetadataCacheKey(serviceType, dataContextInstance as ObjectContext);
MetadataCacheItem result;
cacheLock.EnterReadLock();
try
{
cache.TryGetValue(key, out result);
}
finally
{
cacheLock.ExitReadLock();
}
return result;
}
/// This type is used as the key in the metadata cache.
internal struct MetadataCacheKey
{
/// Connection string used to segment service type.
private readonly string dataContextConnection;
/// Hash code for this instance.
private readonly int hashCode;
/// Service type.
private readonly Type serviceType;
/// Initializes a new MetadataCacheKey instance.
/// Service type for key.
/// Data context instace for key, possibly null.
internal MetadataCacheKey(Type serviceType, ObjectContext dataContextInstance)
{
Debug.Assert(serviceType != null, "serviceType != null");
this.serviceType = serviceType;
this.dataContextConnection = null;
this.hashCode = this.serviceType.GetHashCode();
if (dataContextInstance != null)
{
EntityConnection connection = dataContextInstance.Connection as EntityConnection;
if (connection != null)
{
this.dataContextConnection = new EntityConnectionStringBuilder(connection.ConnectionString).Metadata;
this.hashCode ^= this.dataContextConnection.GetHashCode();
}
}
}
/// Comparer for metadata cache keys.
internal class Comparer : IEqualityComparer
{
/// Compares the specified keys.
/// First key.
/// Second key.
/// true if equals , false otherwise.
public bool Equals(MetadataCacheKey x, MetadataCacheKey y)
{
return x.dataContextConnection == y.dataContextConnection && x.serviceType == y.serviceType;
}
/// Gets the hash code for the object.
/// Object.
/// The hash code for this key.
public int GetHashCode(MetadataCacheKey obj)
{
return obj.hashCode;
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Provides a class to cache metadata information.
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Caching
{
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading;
using System.Data.Objects;
using System.Data.Common;
using System.Data.EntityClient;
///
/// Use this class to cache metadata through MetadataCacheItem instances.
///
internal static class MetadataCache
{
/// AppDomain-wide cache for metadata items.
private static Dictionary cache = new Dictionary(new MetadataCacheKey.Comparer());
/// Reader/writer lock for AppDomain .
private static ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
/// Adds a new cache item, and returns the item that is put in the cache.
/// Type of service with metadata being cached.
///
/// Data context instance being cached, possibly segmenting the cache
/// space for .
///
/// Item being added.
/// The item being put in the cache (possibly an existing one).
/// This method is thread-safe but not re-entrant.
internal static MetadataCacheItem AddCacheItem(Type serviceType, object dataContextInstance, MetadataCacheItem item)
{
Debug.Assert(serviceType != null, "serviceType != null");
Debug.Assert(dataContextInstance != null, "dataContextInstance != null");
Debug.Assert(item != null, "item != null");
MetadataCacheKey key = new MetadataCacheKey(serviceType, dataContextInstance as ObjectContext);
MetadataCacheItem result;
cacheLock.EnterWriteLock();
try
{
// If another thread beat the current thread, we return the
// previously created item, which has a higher chance of
// having survived a garbage collection already.
if (!cache.TryGetValue(key, out result))
{
cache.Add(key, item);
result = item;
}
}
finally
{
cacheLock.ExitWriteLock();
}
Debug.Assert(result != null, "result != null -- a null item is never returned.");
Debug.Assert(
result == TryLookup(serviceType, dataContextInstance),
"result == TryLookup(serviceType, dataContextInstance) -- instance from cache is being returned.");
return result;
}
/// Tries to look up metadata for the specifed service type and context instance.
/// Type of service with metadata being cached.
///
/// Data context instance being cached, possibly segmenting the cache
/// space for .
///
/// The cached metadata item, if one exists.
/// This method is thread-safe but not re-entrant.
internal static MetadataCacheItem TryLookup(Type serviceType, object dataContextInstance)
{
Debug.Assert(serviceType != null, "serviceType != null");
Debug.Assert(dataContextInstance != null, "dataContextInstance != null");
MetadataCacheKey key = new MetadataCacheKey(serviceType, dataContextInstance as ObjectContext);
MetadataCacheItem result;
cacheLock.EnterReadLock();
try
{
cache.TryGetValue(key, out result);
}
finally
{
cacheLock.ExitReadLock();
}
return result;
}
/// This type is used as the key in the metadata cache.
internal struct MetadataCacheKey
{
/// Connection string used to segment service type.
private readonly string dataContextConnection;
/// Hash code for this instance.
private readonly int hashCode;
/// Service type.
private readonly Type serviceType;
/// Initializes a new MetadataCacheKey instance.
/// Service type for key.
/// Data context instace for key, possibly null.
internal MetadataCacheKey(Type serviceType, ObjectContext dataContextInstance)
{
Debug.Assert(serviceType != null, "serviceType != null");
this.serviceType = serviceType;
this.dataContextConnection = null;
this.hashCode = this.serviceType.GetHashCode();
if (dataContextInstance != null)
{
EntityConnection connection = dataContextInstance.Connection as EntityConnection;
if (connection != null)
{
this.dataContextConnection = new EntityConnectionStringBuilder(connection.ConnectionString).Metadata;
this.hashCode ^= this.dataContextConnection.GetHashCode();
}
}
}
/// Comparer for metadata cache keys.
internal class Comparer : IEqualityComparer
{
/// Compares the specified keys.
/// First key.
/// Second key.
/// true if equals , false otherwise.
public bool Equals(MetadataCacheKey x, MetadataCacheKey y)
{
return x.dataContextConnection == y.dataContextConnection && x.serviceType == y.serviceType;
}
/// Gets the hash code for the object.
/// Object.
/// The hash code for this key.
public int GetHashCode(MetadataCacheKey obj)
{
return obj.hashCode;
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataSourceView.cs
- HotCommands.cs
- SamlEvidence.cs
- BindingValueChangedEventArgs.cs
- MatchAttribute.cs
- EntityKeyElement.cs
- DataGridAutoFormatDialog.cs
- DataGridHeaderBorder.cs
- UriTemplate.cs
- BrowserCapabilitiesFactory.cs
- StylusPointPropertyUnit.cs
- DataColumnPropertyDescriptor.cs
- InternalControlCollection.cs
- RegexStringValidator.cs
- TextPenaltyModule.cs
- SingleObjectCollection.cs
- DataServiceStreamProviderWrapper.cs
- CallSiteHelpers.cs
- AuthenticatedStream.cs
- DesignerView.cs
- NativeConfigurationLoader.cs
- UpdatePanelControlTrigger.cs
- BooleanAnimationBase.cs
- CultureSpecificStringDictionary.cs
- UriSection.cs
- IsolationInterop.cs
- XmlTextWriter.cs
- SqlRowUpdatedEvent.cs
- followingsibling.cs
- PowerModeChangedEventArgs.cs
- RightsDocument.cs
- ResourcesBuildProvider.cs
- OneOfScalarConst.cs
- SecurityKeyEntropyMode.cs
- DataControlButton.cs
- OrderPreservingPipeliningMergeHelper.cs
- WebBodyFormatMessageProperty.cs
- TextSerializer.cs
- GeneralTransform3D.cs
- MethodExpression.cs
- CssTextWriter.cs
- LifetimeServices.cs
- URIFormatException.cs
- FormViewInsertedEventArgs.cs
- DetailsViewDeletedEventArgs.cs
- XmlCollation.cs
- Baml2006KeyRecord.cs
- XmlNamespaceDeclarationsAttribute.cs
- NumberFunctions.cs
- AutomationElementIdentifiers.cs
- VarRemapper.cs
- UpdateException.cs
- ArgIterator.cs
- BamlRecords.cs
- activationcontext.cs
- TextBoxBase.cs
- ColorConverter.cs
- ParameterCollection.cs
- DelegateHelpers.Generated.cs
- NopReturnReader.cs
- InlineCollection.cs
- HtmlInputFile.cs
- ValueSerializerAttribute.cs
- QueryOutputWriter.cs
- ContextStaticAttribute.cs
- UpDownBase.cs
- DetailsViewPagerRow.cs
- _HeaderInfo.cs
- Compiler.cs
- PropertyGeneratedEventArgs.cs
- ArglessEventHandlerProxy.cs
- ThreadPool.cs
- ConnectionStringEditor.cs
- AggregateNode.cs
- Win32PrintDialog.cs
- XamlSerializationHelper.cs
- MimeFormatter.cs
- TextTreeObjectNode.cs
- ApplyTemplatesAction.cs
- XmlEventCache.cs
- PersonalizableAttribute.cs
- ScriptIgnoreAttribute.cs
- OdbcEnvironmentHandle.cs
- Soap.cs
- PeerEndPoint.cs
- AssociatedControlConverter.cs
- SqlCaseSimplifier.cs
- __Error.cs
- EntityContainerRelationshipSet.cs
- CustomAttribute.cs
- List.cs
- CodePropertyReferenceExpression.cs
- XmlSchemaSimpleTypeList.cs
- StatusBarAutomationPeer.cs
- EnumConverter.cs
- StdRegProviderWrapper.cs
- ConfigurationStrings.cs
- ProcessModelInfo.cs
- Descriptor.cs
- MsmqIntegrationBinding.cs