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
- Dynamic.cs
- SettingsPropertyValueCollection.cs
- WindowsTooltip.cs
- UserControlBuildProvider.cs
- XmlTextEncoder.cs
- BitmapSource.cs
- ClientSponsor.cs
- GridViewDeleteEventArgs.cs
- complextypematerializer.cs
- NegatedCellConstant.cs
- RuleConditionDialog.cs
- DateBoldEvent.cs
- ImageKeyConverter.cs
- DockPatternIdentifiers.cs
- TableHeaderCell.cs
- SmtpLoginAuthenticationModule.cs
- AddInContractAttribute.cs
- QilInvoke.cs
- WindowsEditBox.cs
- WinEventTracker.cs
- FocusManager.cs
- SimpleType.cs
- HandlerFactoryWrapper.cs
- GraphicsContext.cs
- BinaryNode.cs
- SelectedGridItemChangedEvent.cs
- TableLayoutPanelCellPosition.cs
- ExceptionHandlersDesigner.cs
- ListBase.cs
- QuotedPrintableStream.cs
- MenuItem.cs
- SqlExpressionNullability.cs
- ItemContainerProviderWrapper.cs
- MetadataItemEmitter.cs
- WebBaseEventKeyComparer.cs
- HtmlSelect.cs
- ContentPresenter.cs
- ReachDocumentReferenceSerializerAsync.cs
- ObjectDataSource.cs
- HtmlInputButton.cs
- InputLanguageSource.cs
- XamlVector3DCollectionSerializer.cs
- Variable.cs
- Parser.cs
- CardSpaceSelector.cs
- FormViewAutoFormat.cs
- LocalizationParserHooks.cs
- OdbcConnectionPoolProviderInfo.cs
- XmlTypeAttribute.cs
- TypefaceCollection.cs
- MenuAutomationPeer.cs
- DataServiceHost.cs
- ThrowHelper.cs
- XXXInfos.cs
- AppLevelCompilationSectionCache.cs
- FieldAccessException.cs
- StringWriter.cs
- StrongNameUtility.cs
- WSSecurityPolicy.cs
- _ConnectOverlappedAsyncResult.cs
- OperandQuery.cs
- PresentationTraceSources.cs
- WindowsListView.cs
- _UriTypeConverter.cs
- SiteMapProvider.cs
- SingleStorage.cs
- ScriptingSectionGroup.cs
- HtmlTableRow.cs
- TdsParserStaticMethods.cs
- EntityProviderFactory.cs
- PrefixHandle.cs
- WaitHandle.cs
- AsyncOperationManager.cs
- XmlMtomWriter.cs
- WindowsListViewItemStartMenu.cs
- SecurityDescriptor.cs
- DbParameterHelper.cs
- ChannelSinkStacks.cs
- CodeGroup.cs
- TreeNodeSelectionProcessor.cs
- DatagridviewDisplayedBandsData.cs
- SecurityContextKeyIdentifierClause.cs
- QilTargetType.cs
- MDIClient.cs
- StylusPointProperty.cs
- ImageBrush.cs
- StringHelper.cs
- XhtmlBasicControlAdapter.cs
- WrappedIUnknown.cs
- ProbeDuplexAsyncResult.cs
- XsdBuildProvider.cs
- DataGridViewRowsRemovedEventArgs.cs
- EventRouteFactory.cs
- ContainerParagraph.cs
- GuidelineSet.cs
- OptimalBreakSession.cs
- FloaterBaseParagraph.cs
- DependencySource.cs
- APCustomTypeDescriptor.cs
- KeyPressEvent.cs