Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Data / System / Data / SqlClient / SqlConnectionPoolGroupProviderInfo.cs / 1 / SqlConnectionPoolGroupProviderInfo.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.SqlClient
{
using System;
using System.Data;
using System.Data.Common;
using System.Data.ProviderBase;
sealed internal class SqlConnectionPoolGroupProviderInfo : DbConnectionPoolGroupProviderInfo {
private string _alias;
private System.Security.PermissionSet _failoverPermissionSet;
private string _failoverPartner;
private bool _useFailoverPartner;
internal SqlConnectionPoolGroupProviderInfo(SqlConnectionString connectionOptions) {
// This is for the case where the user specified the failover partner
// in the connection string and we have not yet connected to get the
// env change.
_failoverPartner = connectionOptions.FailoverPartner;
if (ADP.IsEmpty(_failoverPartner)) {
_failoverPartner = null;
}
}
internal string FailoverPartner {
get {
return _failoverPartner;
}
}
internal bool UseFailoverPartner {
get {
return _useFailoverPartner;
}
}
internal void AliasCheck(string server) {
if (_alias != server) {
lock(this) {
if (null == _alias) {
_alias = server;
}
else if (_alias != server) {
Bid.Trace(" alias change detected. Clearing PoolGroup\n");
base.PoolGroup.Clear();
_alias = server;
}
}
}
}
private System.Security.PermissionSet CreateFailoverPermission(SqlConnectionString userConnectionOptions, string actualFailoverPartner) {
string keywordToReplace;
// RULES FOR CONSTRUCTING THE CONNECTION STRING TO DEMAND ON:
//
// 1) If no Failover Partner was specified in the original string:
//
// Server=actualFailoverPartner
//
// 2) If Failover Partner was specified in the original string:
//
// Server=originalValue; Failover Partner=actualFailoverPartner
//
// NOTE: in all cases, when we get a failover partner name from
// the server, we will use that name over what was specified
// in the original connection string.
if (null == userConnectionOptions[SqlConnectionString.KEY.FailoverPartner]) {
keywordToReplace = SqlConnectionString.KEY.Data_Source;
}
else {
keywordToReplace = SqlConnectionString.KEY.FailoverPartner;
}
string failoverConnectionString = userConnectionOptions.ExpandKeyword(keywordToReplace, actualFailoverPartner);
return (new SqlConnectionString(failoverConnectionString)).CreatePermissionSet();
}
internal void FailoverCheck(SqlInternalConnection connection, bool actualUseFailoverPartner, SqlConnectionString userConnectionOptions, string actualFailoverPartner) {
if (UseFailoverPartner != actualUseFailoverPartner) {
//
Bid.Trace(" Failover detected. failover partner='%ls'. Clearing PoolGroup\n", actualFailoverPartner);
base.PoolGroup.Clear();
_useFailoverPartner = actualUseFailoverPartner;
}
// Only construct a new permission set when we're connecting to the
// primary data source, not the failover partner.
if (!_useFailoverPartner && _failoverPartner != actualFailoverPartner) {
// NOTE: we optimisitically generate the permission set to keep
// lock short, but we only do this when we get a new
// failover partner.
//
System.Security.PermissionSet failoverPermissionSet = CreateFailoverPermission(userConnectionOptions, actualFailoverPartner);
lock (this) {
if (_failoverPartner != actualFailoverPartner) {
_failoverPartner = actualFailoverPartner;
_failoverPermissionSet = failoverPermissionSet;
}
}
}
}
internal void FailoverPermissionDemand() {
if (_useFailoverPartner) {
// Note that we only demand when there is a permission set, which only
// happens once we've identified a failover situation in FailoverCheck
System.Security.PermissionSet failoverPermissionSet = _failoverPermissionSet;
if (null != failoverPermissionSet) {
// demand on pooled failover connections
failoverPermissionSet.Demand();
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.SqlClient
{
using System;
using System.Data;
using System.Data.Common;
using System.Data.ProviderBase;
sealed internal class SqlConnectionPoolGroupProviderInfo : DbConnectionPoolGroupProviderInfo {
private string _alias;
private System.Security.PermissionSet _failoverPermissionSet;
private string _failoverPartner;
private bool _useFailoverPartner;
internal SqlConnectionPoolGroupProviderInfo(SqlConnectionString connectionOptions) {
// This is for the case where the user specified the failover partner
// in the connection string and we have not yet connected to get the
// env change.
_failoverPartner = connectionOptions.FailoverPartner;
if (ADP.IsEmpty(_failoverPartner)) {
_failoverPartner = null;
}
}
internal string FailoverPartner {
get {
return _failoverPartner;
}
}
internal bool UseFailoverPartner {
get {
return _useFailoverPartner;
}
}
internal void AliasCheck(string server) {
if (_alias != server) {
lock(this) {
if (null == _alias) {
_alias = server;
}
else if (_alias != server) {
Bid.Trace(" alias change detected. Clearing PoolGroup\n");
base.PoolGroup.Clear();
_alias = server;
}
}
}
}
private System.Security.PermissionSet CreateFailoverPermission(SqlConnectionString userConnectionOptions, string actualFailoverPartner) {
string keywordToReplace;
// RULES FOR CONSTRUCTING THE CONNECTION STRING TO DEMAND ON:
//
// 1) If no Failover Partner was specified in the original string:
//
// Server=actualFailoverPartner
//
// 2) If Failover Partner was specified in the original string:
//
// Server=originalValue; Failover Partner=actualFailoverPartner
//
// NOTE: in all cases, when we get a failover partner name from
// the server, we will use that name over what was specified
// in the original connection string.
if (null == userConnectionOptions[SqlConnectionString.KEY.FailoverPartner]) {
keywordToReplace = SqlConnectionString.KEY.Data_Source;
}
else {
keywordToReplace = SqlConnectionString.KEY.FailoverPartner;
}
string failoverConnectionString = userConnectionOptions.ExpandKeyword(keywordToReplace, actualFailoverPartner);
return (new SqlConnectionString(failoverConnectionString)).CreatePermissionSet();
}
internal void FailoverCheck(SqlInternalConnection connection, bool actualUseFailoverPartner, SqlConnectionString userConnectionOptions, string actualFailoverPartner) {
if (UseFailoverPartner != actualUseFailoverPartner) {
//
Bid.Trace(" Failover detected. failover partner='%ls'. Clearing PoolGroup\n", actualFailoverPartner);
base.PoolGroup.Clear();
_useFailoverPartner = actualUseFailoverPartner;
}
// Only construct a new permission set when we're connecting to the
// primary data source, not the failover partner.
if (!_useFailoverPartner && _failoverPartner != actualFailoverPartner) {
// NOTE: we optimisitically generate the permission set to keep
// lock short, but we only do this when we get a new
// failover partner.
//
System.Security.PermissionSet failoverPermissionSet = CreateFailoverPermission(userConnectionOptions, actualFailoverPartner);
lock (this) {
if (_failoverPartner != actualFailoverPartner) {
_failoverPartner = actualFailoverPartner;
_failoverPermissionSet = failoverPermissionSet;
}
}
}
}
internal void FailoverPermissionDemand() {
if (_useFailoverPartner) {
// Note that we only demand when there is a permission set, which only
// happens once we've identified a failover situation in FailoverCheck
System.Security.PermissionSet failoverPermissionSet = _failoverPermissionSet;
if (null != failoverPermissionSet) {
// demand on pooled failover connections
failoverPermissionSet.Demand();
}
}
}
}
}
// 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
- DecimalKeyFrameCollection.cs
- SqlTrackingQuery.cs
- LineMetrics.cs
- PeerCollaboration.cs
- RequestCacheManager.cs
- DrawingGroup.cs
- AssociatedControlConverter.cs
- UICuesEvent.cs
- CodeDOMUtility.cs
- Assembly.cs
- WindowsToolbar.cs
- ListDictionary.cs
- ProxyHwnd.cs
- RowParagraph.cs
- ToolTipAutomationPeer.cs
- ServiceSettingsResponseInfo.cs
- UnsignedPublishLicense.cs
- ProtocolsConfigurationEntry.cs
- SafeLibraryHandle.cs
- FixedPageAutomationPeer.cs
- UrlAuthFailedErrorFormatter.cs
- LayoutInformation.cs
- WebGetAttribute.cs
- DetailsViewAutoFormat.cs
- BaseProcessProtocolHandler.cs
- CorrelationScope.cs
- SessionIDManager.cs
- InstanceDataCollectionCollection.cs
- QuadraticBezierSegment.cs
- MailSettingsSection.cs
- Compiler.cs
- SchemaSetCompiler.cs
- ProtocolsConfigurationHandler.cs
- RoleBoolean.cs
- PenLineJoinValidation.cs
- EventPrivateKey.cs
- UpdatePanelTrigger.cs
- MessageEncodingBindingElementImporter.cs
- HelpEvent.cs
- BaseCollection.cs
- _StreamFramer.cs
- GridViewColumn.cs
- WebResourceUtil.cs
- CriticalFinalizerObject.cs
- RepeaterCommandEventArgs.cs
- Thumb.cs
- SoapEnvelopeProcessingElement.cs
- ConfigXmlWhitespace.cs
- WebPartDeleteVerb.cs
- WebPartDescriptionCollection.cs
- ControlAdapter.cs
- DtdParser.cs
- HttpResponse.cs
- ClientProtocol.cs
- ToolStripControlHost.cs
- XmlUtf8RawTextWriter.cs
- WSFederationHttpSecurity.cs
- ToolStripContentPanelRenderEventArgs.cs
- UInt32Converter.cs
- elementinformation.cs
- TemplateAction.cs
- WorkflowElementDialogWindow.xaml.cs
- DataObjectSettingDataEventArgs.cs
- bindurihelper.cs
- PointUtil.cs
- ServiceEndpoint.cs
- CreateUserWizard.cs
- Rotation3DAnimationBase.cs
- RequestTimeoutManager.cs
- MethodBody.cs
- ForeignConstraint.cs
- LiteralControl.cs
- XmlSchemaObject.cs
- AnnotationComponentManager.cs
- ExpandCollapseProviderWrapper.cs
- Int32KeyFrameCollection.cs
- SecurityHeaderTokenResolver.cs
- BatchStream.cs
- _NetworkingPerfCounters.cs
- RangeValuePattern.cs
- AttachedAnnotationChangedEventArgs.cs
- SplitterDesigner.cs
- PropertyIDSet.cs
- ThreadStateException.cs
- DefaultValueMapping.cs
- IntSecurity.cs
- NameObjectCollectionBase.cs
- ResourceReferenceKeyNotFoundException.cs
- EventMappingSettings.cs
- Control.cs
- PTManager.cs
- Label.cs
- MessageSmuggler.cs
- IdentityElement.cs
- AspNetSynchronizationContext.cs
- SystemResourceHost.cs
- DefaultTraceListener.cs
- ServicePointManager.cs
- XmlObjectSerializerReadContext.cs
- ToolBarButton.cs