Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Data / Microsoft / SqlServer / Server / SmiContextFactory.cs / 3 / SmiContextFactory.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace Microsoft.SqlServer.Server {
using System;
using System.Data.Common;
using System.Data.SqlClient;
using System.Diagnostics;
sealed internal class SmiContextFactory {
public static readonly SmiContextFactory Instance = new SmiContextFactory();
private readonly SmiLink _smiLink;
private readonly ulong _negotiatedSmiVersion;
private readonly byte _majorVersion;
private readonly byte _minorVersion;
private readonly short _buildNum;
private readonly string _serverVersion;
private readonly SmiEventSink_Default _eventSinkForGetCurrentContext;
internal const ulong YukonVersion = 100;
internal const ulong KatmaiVersion = 210;
internal const ulong LatestVersion = KatmaiVersion;
private readonly ulong[] __supportedSmiVersions = new ulong[] {YukonVersion, KatmaiVersion};
// Used as the key for SmiContext.GetContextValue()
internal enum ContextKey {
Connection = 0,
SqlContext = 1
}
private SmiContextFactory() {
if (InOutOfProcHelper.InProc) {
Type smiLinkType = Type.GetType("Microsoft.SqlServer.Server.InProcLink, SqlAccess, PublicKeyToken=89845dcd8080cc91");
if (null == smiLinkType) {
Debug.Assert(false, "could not get InProcLink type");
throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server.
}
System.Reflection.FieldInfo instanceField = GetStaticField(smiLinkType, "Instance");
if (instanceField != null) {
_smiLink = (SmiLink)GetValue(instanceField);
}
else {
Debug.Assert(false, "could not get InProcLink.Instance");
throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server.
}
System.Reflection.FieldInfo buildVersionField = GetStaticField(smiLinkType, "BuildVersion");
if (buildVersionField != null) {
UInt32 buildVersion = (UInt32)GetValue(buildVersionField);
_majorVersion = (byte)(buildVersion >> 24);
_minorVersion = (byte)((buildVersion >> 16) & 0xff);
_buildNum = (short)(buildVersion & 0xffff);
_serverVersion = (String.Format((IFormatProvider)null, "{0:00}.{1:00}.{2:0000}", _majorVersion, (short) _minorVersion, _buildNum));
}
else {
_serverVersion = String.Empty; // default value if nothing exists.
}
_negotiatedSmiVersion = _smiLink.NegotiateVersion(SmiLink.InterfaceVersion);
bool isSupportedVersion = false;
for(int i=0; !isSupportedVersion && i<__supportedSmiVersions.Length; i++) {
if (__supportedSmiVersions[i] == _negotiatedSmiVersion) {
isSupportedVersion = true;
}
}
// Disconnect if we didn't get a supported version!!
if (!isSupportedVersion) {
_smiLink = null;
}
_eventSinkForGetCurrentContext = new SmiEventSink_Default();
}
}
internal ulong NegotiatedSmiVersion {
get {
if (null == _smiLink) {
throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server, or not be SqlCLR
}
return _negotiatedSmiVersion;
}
}
internal string ServerVersion {
get {
if (null == _smiLink) {
throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server, or not be SqlCLR
}
return _serverVersion;
}
}
internal SmiContext GetCurrentContext() {
if (null == _smiLink) {
throw SQL.ContextUnavailableOutOfProc(); // Must not be a valid version of Sql Server, or not be SqlCLR
}
object result = _smiLink.GetCurrentContext(_eventSinkForGetCurrentContext);
_eventSinkForGetCurrentContext.ProcessMessagesAndThrow();
if (null == result) {
throw SQL.ContextUnavailableWhileInProc();
}
Debug.Assert(typeof(SmiContext).IsInstanceOfType(result), "didn't get SmiContext from GetCurrentContext?");
return (SmiContext)result;
}
[System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess=true)]
private object GetValue(System.Reflection.FieldInfo fieldInfo) {
object result = fieldInfo.GetValue(null);
return result;
}
[System.Security.Permissions.ReflectionPermission(System.Security.Permissions.SecurityAction.Assert, MemberAccess=true)]
private System.Reflection.FieldInfo GetStaticField(Type aType, string fieldName) {
System.Reflection.FieldInfo result = aType.GetField(fieldName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.GetField);
return result;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Region.cs
- QueueProcessor.cs
- VoiceInfo.cs
- SpAudioStreamWrapper.cs
- DataError.cs
- AppSettingsReader.cs
- AnonymousIdentificationModule.cs
- ConfigurationElementCollection.cs
- FontCacheUtil.cs
- MouseWheelEventArgs.cs
- OptimalBreakSession.cs
- EncryptedType.cs
- Cursor.cs
- GrowingArray.cs
- StringValidatorAttribute.cs
- FloaterParagraph.cs
- XPathDocument.cs
- WmlImageAdapter.cs
- DataGridViewCellMouseEventArgs.cs
- BamlReader.cs
- SubordinateTransaction.cs
- TextServicesCompartmentContext.cs
- PopupControlService.cs
- ReflectTypeDescriptionProvider.cs
- ICspAsymmetricAlgorithm.cs
- ExternalFile.cs
- ToolStripContentPanel.cs
- TriggerCollection.cs
- XmlResolver.cs
- EnumerableCollectionView.cs
- IPPacketInformation.cs
- QilXmlWriter.cs
- CapabilitiesRule.cs
- SoapCodeExporter.cs
- SqlFileStream.cs
- WebConfigurationManager.cs
- AvTraceDetails.cs
- ControlBindingsCollection.cs
- View.cs
- FontWeightConverter.cs
- PreviewPrintController.cs
- BrowserCapabilitiesCodeGenerator.cs
- ManipulationInertiaStartingEventArgs.cs
- AutomationAttributeInfo.cs
- EndpointAddressAugust2004.cs
- CompModHelpers.cs
- TaskFormBase.cs
- WebPartConnectionsDisconnectVerb.cs
- DbConnectionPool.cs
- SpecularMaterial.cs
- CompModSwitches.cs
- FixedPage.cs
- AnnotationAdorner.cs
- MetadataItem.cs
- RelatedPropertyManager.cs
- SizeChangedInfo.cs
- TimeSpanValidator.cs
- WorkflowMarkupElementEventArgs.cs
- MediaContextNotificationWindow.cs
- KeyValueInternalCollection.cs
- PropertyExpression.cs
- ConstructorBuilder.cs
- LinkUtilities.cs
- ControllableStoryboardAction.cs
- WpfXamlMember.cs
- ExecutionEngineException.cs
- NetCodeGroup.cs
- CalendarDay.cs
- TextServicesHost.cs
- DesignerSerializationOptionsAttribute.cs
- ThreadSafeMessageFilterTable.cs
- DataFormats.cs
- XamlSerializationHelper.cs
- SBCSCodePageEncoding.cs
- GPRECT.cs
- WebBrowserNavigatedEventHandler.cs
- GeneralTransform3DTo2D.cs
- DataSourceCache.cs
- XamlBrushSerializer.cs
- LineServicesRun.cs
- XmlIlVisitor.cs
- WindowsListView.cs
- ClientScriptManager.cs
- ResourceLoader.cs
- TableCell.cs
- RoleGroup.cs
- FontConverter.cs
- PageThemeParser.cs
- WebPartMovingEventArgs.cs
- CodeDesigner.cs
- DrawingVisual.cs
- ObjectListFieldCollection.cs
- CalendarData.cs
- PropertyPathConverter.cs
- DriveInfo.cs
- XmlSchemaValidationException.cs
- XmlBinaryReader.cs
- documentsequencetextcontainer.cs
- FrameworkElementFactoryMarkupObject.cs
- CompiledQueryCacheEntry.cs