Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / Data / Microsoft / SqlServer / Server / SmiMetaDataProperty.cs / 1 / SmiMetaDataProperty.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //----------------------------------------------------------------------------- namespace Microsoft.SqlServer.Server { using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Diagnostics; using System.Globalization; // SmiMetaDataProperty defines an extended, optional property to be used on the SmiMetaData class // This approach to adding properties is added combat the growing number of sparsely-used properties // that are specially handled on the base classes internal enum SmiPropertySelector { DefaultFields = 0x0, SortOrder = 0x1, UniqueKey = 0x2, } // Simple collection for properties. Could extend to IDictionary support if needed in future. internal class SmiMetaDataPropertyCollection { private const int SelectorCount = 3; // number of elements in SmiPropertySelector private SmiMetaDataProperty[] _properties; private bool _isReadOnly; internal static readonly SmiMetaDataPropertyCollection EmptyInstance; // Singleton empty instances to ensure each property is always non-null private static readonly SmiDefaultFieldsProperty __emptyDefaultFields = new SmiDefaultFieldsProperty(new List()); private static readonly SmiOrderProperty __emptySortOrder = new SmiOrderProperty(new List ()); private static readonly SmiUniqueKeyProperty __emptyUniqueKey = new SmiUniqueKeyProperty(new List ()); static SmiMetaDataPropertyCollection() { EmptyInstance = new SmiMetaDataPropertyCollection(); EmptyInstance.SetReadOnly(); } internal SmiMetaDataPropertyCollection() { _properties = new SmiMetaDataProperty[SelectorCount]; _isReadOnly = false; _properties[(int)SmiPropertySelector.DefaultFields] = __emptyDefaultFields; _properties[(int)SmiPropertySelector.SortOrder] = __emptySortOrder; _properties[(int)SmiPropertySelector.UniqueKey] = __emptyUniqueKey; } internal SmiMetaDataProperty this[SmiPropertySelector key] { get { return _properties[(int)key]; } set { if (null == value) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } EnsureWritable(); _properties[(int)key] = value; } } internal bool IsReadOnly { get { return _isReadOnly; } } internal IEnumerable Values { get { return new List (_properties); } } // Allow switching to read only, but not back. internal void SetReadOnly() { _isReadOnly = true; } private void EnsureWritable() { if (IsReadOnly) { throw System.Data.Common.ADP.InternalError(System.Data.Common.ADP.InternalErrorCode.InvalidSmiCall); } } } // Base class for properties internal abstract class SmiMetaDataProperty { internal abstract string TraceString(); } // Property defining a list of column ordinals that define a unique key internal class SmiUniqueKeyProperty : SmiMetaDataProperty { private IList _columns; internal SmiUniqueKeyProperty(IList columnIsKey) { _columns = new List (columnIsKey).AsReadOnly(); } // indexed by column ordinal indicating for each column whether it is key or not internal bool this[int ordinal] { get { if (_columns.Count <= ordinal) { return false; } else { return _columns[ordinal]; } } } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { Debug.Assert(0 == _columns.Count || countToMatch == _columns.Count, "SmiDefaultFieldsProperty.CheckCount: DefaultFieldsProperty size (" + _columns.Count + ") not equal to checked size (" + countToMatch + ")" ); } internal override string TraceString() { string returnValue = "UniqueKey("; bool delimit = false; for (int columnOrd = 0; columnOrd < _columns.Count; columnOrd++) { if (delimit) { returnValue += ","; } else { delimit = true; } if (_columns[columnOrd]) { returnValue += columnOrd.ToString(CultureInfo.InvariantCulture); } } returnValue += ")"; return returnValue; } } // Property defining a sort order for a set of columns (by ordinal and ASC/DESC). internal class SmiOrderProperty : SmiMetaDataProperty { internal struct SmiColumnOrder { internal int SortOrdinal; internal SortOrder Order; internal string TraceString() { return String.Format(CultureInfo.InvariantCulture, "{0} {1}", SortOrdinal, Order); } } private IList _columns; internal SmiOrderProperty(IList columnOrders) { _columns = new List (columnOrders).AsReadOnly(); } // Readonly list of the columnorder instances making up the sort order // order in list indicates precedence internal SmiColumnOrder this[int ordinal] { get { if (_columns.Count <= ordinal) { SmiColumnOrder order = new SmiColumnOrder(); order.Order = SortOrder.Unspecified; order.SortOrdinal = -1; return order; } else { return _columns[ordinal]; } } } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { Debug.Assert(0 == _columns.Count || countToMatch == _columns.Count, "SmiDefaultFieldsProperty.CheckCount: DefaultFieldsProperty size (" + _columns.Count + ") not equal to checked size (" + countToMatch + ")" ); } internal override string TraceString() { string returnValue = "SortOrder("; bool delimit = false; foreach(SmiColumnOrder columnOrd in _columns) { if (delimit) { returnValue += ","; } else { delimit = true; } if (System.Data.SqlClient.SortOrder.Unspecified != columnOrd.Order) { returnValue += columnOrd.TraceString(); } } returnValue += ")"; return returnValue; } } // property defining inheritance relationship(s) internal class SmiDefaultFieldsProperty : SmiMetaDataProperty { #region private fields private IList _defaults; #endregion #region internal interface internal SmiDefaultFieldsProperty(IList defaultFields) { _defaults = new List (defaultFields).AsReadOnly(); } internal bool this[int ordinal] { get { if (_defaults.Count <= ordinal) { return false; } else { return _defaults[ordinal]; } } } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { Debug.Assert(0 == _defaults.Count || countToMatch == _defaults.Count, "SmiDefaultFieldsProperty.CheckCount: DefaultFieldsProperty size (" + _defaults.Count + ") not equal to checked size (" + countToMatch + ")" ); } internal override string TraceString() { string returnValue = "DefaultFields("; bool delimit = false; for(int columnOrd = 0; columnOrd < _defaults.Count; columnOrd++) { if (delimit) { returnValue += ","; } else { delimit = true; } if (_defaults[columnOrd]) { returnValue += columnOrd; } } returnValue += ")"; return returnValue; } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //----------------------------------------------------------------------------- namespace Microsoft.SqlServer.Server { using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Diagnostics; using System.Globalization; // SmiMetaDataProperty defines an extended, optional property to be used on the SmiMetaData class // This approach to adding properties is added combat the growing number of sparsely-used properties // that are specially handled on the base classes internal enum SmiPropertySelector { DefaultFields = 0x0, SortOrder = 0x1, UniqueKey = 0x2, } // Simple collection for properties. Could extend to IDictionary support if needed in future. internal class SmiMetaDataPropertyCollection { private const int SelectorCount = 3; // number of elements in SmiPropertySelector private SmiMetaDataProperty[] _properties; private bool _isReadOnly; internal static readonly SmiMetaDataPropertyCollection EmptyInstance; // Singleton empty instances to ensure each property is always non-null private static readonly SmiDefaultFieldsProperty __emptyDefaultFields = new SmiDefaultFieldsProperty(new List()); private static readonly SmiOrderProperty __emptySortOrder = new SmiOrderProperty(new List ()); private static readonly SmiUniqueKeyProperty __emptyUniqueKey = new SmiUniqueKeyProperty(new List ()); static SmiMetaDataPropertyCollection() { EmptyInstance = new SmiMetaDataPropertyCollection(); EmptyInstance.SetReadOnly(); } internal SmiMetaDataPropertyCollection() { _properties = new SmiMetaDataProperty[SelectorCount]; _isReadOnly = false; _properties[(int)SmiPropertySelector.DefaultFields] = __emptyDefaultFields; _properties[(int)SmiPropertySelector.SortOrder] = __emptySortOrder; _properties[(int)SmiPropertySelector.UniqueKey] = __emptyUniqueKey; } internal SmiMetaDataProperty this[SmiPropertySelector key] { get { return _properties[(int)key]; } set { if (null == value) { throw ADP.InternalError(ADP.InternalErrorCode.InvalidSmiCall); } EnsureWritable(); _properties[(int)key] = value; } } internal bool IsReadOnly { get { return _isReadOnly; } } internal IEnumerable Values { get { return new List (_properties); } } // Allow switching to read only, but not back. internal void SetReadOnly() { _isReadOnly = true; } private void EnsureWritable() { if (IsReadOnly) { throw System.Data.Common.ADP.InternalError(System.Data.Common.ADP.InternalErrorCode.InvalidSmiCall); } } } // Base class for properties internal abstract class SmiMetaDataProperty { internal abstract string TraceString(); } // Property defining a list of column ordinals that define a unique key internal class SmiUniqueKeyProperty : SmiMetaDataProperty { private IList _columns; internal SmiUniqueKeyProperty(IList columnIsKey) { _columns = new List (columnIsKey).AsReadOnly(); } // indexed by column ordinal indicating for each column whether it is key or not internal bool this[int ordinal] { get { if (_columns.Count <= ordinal) { return false; } else { return _columns[ordinal]; } } } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { Debug.Assert(0 == _columns.Count || countToMatch == _columns.Count, "SmiDefaultFieldsProperty.CheckCount: DefaultFieldsProperty size (" + _columns.Count + ") not equal to checked size (" + countToMatch + ")" ); } internal override string TraceString() { string returnValue = "UniqueKey("; bool delimit = false; for (int columnOrd = 0; columnOrd < _columns.Count; columnOrd++) { if (delimit) { returnValue += ","; } else { delimit = true; } if (_columns[columnOrd]) { returnValue += columnOrd.ToString(CultureInfo.InvariantCulture); } } returnValue += ")"; return returnValue; } } // Property defining a sort order for a set of columns (by ordinal and ASC/DESC). internal class SmiOrderProperty : SmiMetaDataProperty { internal struct SmiColumnOrder { internal int SortOrdinal; internal SortOrder Order; internal string TraceString() { return String.Format(CultureInfo.InvariantCulture, "{0} {1}", SortOrdinal, Order); } } private IList _columns; internal SmiOrderProperty(IList columnOrders) { _columns = new List (columnOrders).AsReadOnly(); } // Readonly list of the columnorder instances making up the sort order // order in list indicates precedence internal SmiColumnOrder this[int ordinal] { get { if (_columns.Count <= ordinal) { SmiColumnOrder order = new SmiColumnOrder(); order.Order = SortOrder.Unspecified; order.SortOrdinal = -1; return order; } else { return _columns[ordinal]; } } } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { Debug.Assert(0 == _columns.Count || countToMatch == _columns.Count, "SmiDefaultFieldsProperty.CheckCount: DefaultFieldsProperty size (" + _columns.Count + ") not equal to checked size (" + countToMatch + ")" ); } internal override string TraceString() { string returnValue = "SortOrder("; bool delimit = false; foreach(SmiColumnOrder columnOrd in _columns) { if (delimit) { returnValue += ","; } else { delimit = true; } if (System.Data.SqlClient.SortOrder.Unspecified != columnOrd.Order) { returnValue += columnOrd.TraceString(); } } returnValue += ")"; return returnValue; } } // property defining inheritance relationship(s) internal class SmiDefaultFieldsProperty : SmiMetaDataProperty { #region private fields private IList _defaults; #endregion #region internal interface internal SmiDefaultFieldsProperty(IList defaultFields) { _defaults = new List (defaultFields).AsReadOnly(); } internal bool this[int ordinal] { get { if (_defaults.Count <= ordinal) { return false; } else { return _defaults[ordinal]; } } } [Conditional("DEBUG")] internal void CheckCount(int countToMatch) { Debug.Assert(0 == _defaults.Count || countToMatch == _defaults.Count, "SmiDefaultFieldsProperty.CheckCount: DefaultFieldsProperty size (" + _defaults.Count + ") not equal to checked size (" + countToMatch + ")" ); } internal override string TraceString() { string returnValue = "DefaultFields("; bool delimit = false; for(int columnOrd = 0; columnOrd < _defaults.Count; columnOrd++) { if (delimit) { returnValue += ","; } else { delimit = true; } if (_defaults[columnOrd]) { returnValue += columnOrd; } } returnValue += ")"; return returnValue; } #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
- OutputScopeManager.cs
- SlipBehavior.cs
- CorrelationTokenInvalidatedHandler.cs
- PropertyMetadata.cs
- Drawing.cs
- Invariant.cs
- ImageDrawing.cs
- CheckBox.cs
- ApplicationGesture.cs
- Visitor.cs
- PersonalizableTypeEntry.cs
- ListBindableAttribute.cs
- DocumentApplication.cs
- DebugView.cs
- CorrelationTokenTypeConvertor.cs
- SimpleExpression.cs
- RowParagraph.cs
- SymLanguageType.cs
- DataPagerCommandEventArgs.cs
- MachineKeyConverter.cs
- ResourceAttributes.cs
- processwaithandle.cs
- RemotingClientProxy.cs
- FlowDocumentReaderAutomationPeer.cs
- QilCloneVisitor.cs
- MatrixTransform3D.cs
- NetworkAddressChange.cs
- TextReader.cs
- SelectQueryOperator.cs
- CodeTypeDeclarationCollection.cs
- SystemGatewayIPAddressInformation.cs
- XPathNavigatorKeyComparer.cs
- wgx_commands.cs
- HiddenField.cs
- AddingNewEventArgs.cs
- HandleTable.cs
- SystemWebCachingSectionGroup.cs
- SqlUdtInfo.cs
- TreeNodeMouseHoverEvent.cs
- PriorityBindingExpression.cs
- ClientRoleProvider.cs
- InfoCardKeyedHashAlgorithm.cs
- Domain.cs
- SystemWebExtensionsSectionGroup.cs
- WsdlImporterElement.cs
- ProviderSettings.cs
- RoutedCommand.cs
- WhiteSpaceTrimStringConverter.cs
- BoundConstants.cs
- FontSizeConverter.cs
- TabItemAutomationPeer.cs
- ImportFileRequest.cs
- UnsafeNativeMethods.cs
- StandardToolWindows.cs
- SystemResourceKey.cs
- MessageBodyDescription.cs
- WmlPageAdapter.cs
- EventMappingSettingsCollection.cs
- BindingCollection.cs
- RuleInfoComparer.cs
- DataError.cs
- FigureHelper.cs
- Point3D.cs
- TextMetrics.cs
- Trace.cs
- MemoryPressure.cs
- DispatcherExceptionFilterEventArgs.cs
- SessionMode.cs
- ConfigurationSectionHelper.cs
- XamlSerializerUtil.cs
- MenuItemAutomationPeer.cs
- ObjectStateEntryDbDataRecord.cs
- ExpandoClass.cs
- DataGridViewRowContextMenuStripNeededEventArgs.cs
- ProcessInputEventArgs.cs
- FileInfo.cs
- ServiceOperationUIEditor.cs
- TreeBuilder.cs
- StylusShape.cs
- FlowLayoutPanel.cs
- ConfigurationSectionCollection.cs
- StylusButtonCollection.cs
- BindingMAnagerBase.cs
- StringArrayConverter.cs
- FormViewUpdatedEventArgs.cs
- OleDbPermission.cs
- SQLMoney.cs
- SendMailErrorEventArgs.cs
- StrokeSerializer.cs
- SystemParameters.cs
- peernodestatemanager.cs
- DocumentPaginator.cs
- BitmapEffectInput.cs
- ValuePatternIdentifiers.cs
- AutoResizedEvent.cs
- Configuration.cs
- SourceInterpreter.cs
- SystemInfo.cs
- EntityDataSourceMemberPath.cs
- HeaderedItemsControl.cs