Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Metadata / CacheForPrimitiveTypes.cs / 1305376 / CacheForPrimitiveTypes.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.EntityModel;
using System.Diagnostics;
using System.Text;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.Schema;
using System.IO;
using System.Data.Common;
using System.Globalization;
namespace System.Data.Metadata.Edm
{
internal class CacheForPrimitiveTypes
{
#region Fields
// The primitive type kind is a list of enum which the EDM model
// Every specific instantiation of the model should map their
// primitive types to the edm primitive types.
// In this class, primitive type is to be cached
// Key for the cache: primitive type kind
// Value for the cache: List. A list is used because there an be multiple types mapping to the
// same primitive type kind. For example, sqlserver has multiple string types.
private List[] _primitiveTypeMap = new List[EdmConstants.NumPrimitiveTypes];
#endregion
#region Methods
///
/// Add the given primitive type to the primitive type cache
///
/// The primitive type to add
internal void Add(PrimitiveType type)
{
// Get to the list
List primitiveTypes = EntityUtil.CheckArgumentOutOfRange(_primitiveTypeMap, (int)type.PrimitiveTypeKind, "primitiveTypeKind");
// If there isn't a list for the given model type, create one and add it
if (primitiveTypes == null)
{
primitiveTypes = new List();
primitiveTypes.Add(type);
_primitiveTypeMap[(int)type.PrimitiveTypeKind] = primitiveTypes;
}
else
{
primitiveTypes.Add(type);
}
}
///
/// Try and get the mapped type for the given primitiveTypeKind in the given dataspace
///
/// The primitive type kind of the primitive type to retrieve
/// The facets to use in picking the primitive type
/// The resulting type
/// Whether a type was retrieved or not
internal bool TryGetType(PrimitiveTypeKind primitiveTypeKind, IEnumerable facets, out PrimitiveType type)
{
type = null;
// Now, see if we have any types for this model type, if so, loop through to find the best matching one
List primitiveTypes = EntityUtil.CheckArgumentOutOfRange(_primitiveTypeMap, (int)primitiveTypeKind, "primitiveTypeKind");
if ((null != primitiveTypes) && (0 < primitiveTypes.Count))
{
if (primitiveTypes.Count == 1)
{
type = primitiveTypes[0];
return true;
}
if (facets == null)
{
FacetDescription[] facetDescriptions = EdmProviderManifest.GetInitialFacetDescriptions(primitiveTypeKind);
if (facetDescriptions == null)
{
type = primitiveTypes[0];
return true;
}
Debug.Assert(facetDescriptions.Length > 0);
facets = CacheForPrimitiveTypes.CreateInitialFacets(facetDescriptions);
}
Debug.Assert(type == null, "type must be null here");
bool isMaxLengthSentinel = false;
// Create a dictionary of facets for easy lookup
foreach (Facet facet in facets)
{
if ((primitiveTypeKind == PrimitiveTypeKind.String ||
primitiveTypeKind == PrimitiveTypeKind.Binary) &&
facet.Value != null &&
facet.Name == EdmProviderManifest.MaxLengthFacetName &&
Helper.IsUnboundedFacetValue(facet))
{
// MaxLength has the sentinel value. So this facet need not be added.
isMaxLengthSentinel = true;
continue;
}
}
int maxLength = 0;
// Find a primitive type with the matching constraint
foreach (PrimitiveType primitiveType in primitiveTypes)
{
if (isMaxLengthSentinel)
{
if (type == null)
{
type = primitiveType;
maxLength = Helper.GetFacet(primitiveType.FacetDescriptions, EdmProviderManifest.MaxLengthFacetName).MaxValue.Value;
}
else
{
int newMaxLength = Helper.GetFacet(primitiveType.FacetDescriptions, EdmProviderManifest.MaxLengthFacetName).MaxValue.Value;
if (newMaxLength > maxLength)
{
type = primitiveType;
maxLength = newMaxLength;
}
}
}
else
{
type = primitiveType;
break;
}
}
Debug.Assert(type != null);
return true;
}
return false;
}
private static Facet[] CreateInitialFacets(FacetDescription[] facetDescriptions)
{
Debug.Assert(facetDescriptions != null && facetDescriptions.Length > 0);
Facet[] facets = new Facet[facetDescriptions.Length];
for (int i = 0; i < facetDescriptions.Length; ++i)
{
switch (facetDescriptions[i].FacetName)
{
case DbProviderManifest.MaxLengthFacetName:
facets[i] = Facet.Create(facetDescriptions[i], TypeUsage.DefaultMaxLengthFacetValue);
break;
case DbProviderManifest.UnicodeFacetName:
facets[i] = Facet.Create(facetDescriptions[i], TypeUsage.DefaultUnicodeFacetValue);
break;
case DbProviderManifest.FixedLengthFacetName:
facets[i] = Facet.Create(facetDescriptions[i], TypeUsage.DefaultFixedLengthFacetValue);
break;
case DbProviderManifest.PrecisionFacetName:
facets[i] = Facet.Create(facetDescriptions[i], TypeUsage.DefaultPrecisionFacetValue);
break;
case DbProviderManifest.ScaleFacetName:
facets[i] = Facet.Create(facetDescriptions[i], TypeUsage.DefaultScaleFacetValue);
break;
default:
Debug.Assert(false, "Unexpected facet");
break;
}
}
return facets;
}
///
/// Get the list of the primitive types for the given dataspace
///
///
internal System.Collections.ObjectModel.ReadOnlyCollection GetTypes()
{
List primitiveTypes = new List();
foreach (List types in _primitiveTypeMap)
{
if (null != types)
{
primitiveTypes.AddRange(types);
}
}
return primitiveTypes.AsReadOnly();
}
#endregion
}
}
// 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
- Maps.cs
- GetMemberBinder.cs
- MenuTracker.cs
- SinglePhaseEnlistment.cs
- UndoManager.cs
- GeneralTransformGroup.cs
- InputLangChangeEvent.cs
- DateTimeParse.cs
- ControlParameter.cs
- CoreChannel.cs
- PinnedBufferMemoryStream.cs
- RefreshEventArgs.cs
- ConsoleKeyInfo.cs
- CompilerTypeWithParams.cs
- ConsoleCancelEventArgs.cs
- WebSysDisplayNameAttribute.cs
- OutputWindow.cs
- WebBrowserBase.cs
- FileDialog.cs
- HandledMouseEvent.cs
- ScrollViewerAutomationPeer.cs
- SymbolResolver.cs
- CommandManager.cs
- PrintDialog.cs
- RuntimeCompatibilityAttribute.cs
- Bits.cs
- BasicExpressionVisitor.cs
- SequentialWorkflowRootDesigner.cs
- SynchronizingStream.cs
- MimeImporter.cs
- ConfigXmlReader.cs
- LazyLoadBehavior.cs
- CompatibleIComparer.cs
- LogSwitch.cs
- XPathAncestorQuery.cs
- WorkflowOperationInvoker.cs
- ResXBuildProvider.cs
- IndentedWriter.cs
- XmlSchemaSimpleTypeUnion.cs
- Normalization.cs
- Vector.cs
- RuntimeWrappedException.cs
- SharedConnectionInfo.cs
- SafeEventLogReadHandle.cs
- PropertyChangedEventArgs.cs
- HintTextConverter.cs
- ServerReliableChannelBinder.cs
- DiscoveryMessageSequenceCD1.cs
- DoubleAnimationBase.cs
- PackageFilter.cs
- CultureTable.cs
- SiteMapNodeItem.cs
- MultitargetingHelpers.cs
- GestureRecognizer.cs
- FlowDocumentScrollViewer.cs
- GeneralTransform.cs
- PolyLineSegment.cs
- RoleManagerSection.cs
- ResXBuildProvider.cs
- CharacterBuffer.cs
- ListView.cs
- ValidationHelper.cs
- DataSourceHelper.cs
- VBIdentifierDesigner.xaml.cs
- XmlSerializationGeneratedCode.cs
- SQLString.cs
- EventLogPermission.cs
- ObjectDataSourceStatusEventArgs.cs
- EditingCoordinator.cs
- EventSetter.cs
- BamlReader.cs
- ProcessProtocolHandler.cs
- SqlDataSource.cs
- ToolBarTray.cs
- CompositeControlDesigner.cs
- TableAutomationPeer.cs
- SplitterCancelEvent.cs
- GreenMethods.cs
- AxHostDesigner.cs
- UIElement.cs
- WindowsRegion.cs
- DbUpdateCommandTree.cs
- CodeGenerator.cs
- HttpTransportBindingElement.cs
- HtmlUtf8RawTextWriter.cs
- DataServiceRequestException.cs
- ModelItemCollectionImpl.cs
- SoapUnknownHeader.cs
- ReferencedType.cs
- AccessViolationException.cs
- _FtpControlStream.cs
- SqlConnectionPoolGroupProviderInfo.cs
- CodeDefaultValueExpression.cs
- HighlightOverlayGlyph.cs
- QueueProcessor.cs
- MenuItemCollection.cs
- HostedImpersonationContext.cs
- XamlTypeMapperSchemaContext.cs
- SQLBytes.cs
- Point4D.cs