2016-08-03 10:59:49 +00:00
//---------------------------------------------------------------------
// <copyright file="EntityConnectionStringBuilder.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//
2017-08-21 15:34:15 +00:00
// @owner Microsoft
// @backupOwner Microsoft
2016-08-03 10:59:49 +00:00
//---------------------------------------------------------------------
namespace System.Data.EntityClient
{
using System.Collections ;
using System.ComponentModel ;
using System.Data.Common ;
using System.Data.Entity ;
using System.Diagnostics.CodeAnalysis ;
/// <summary>
/// Class representing a connection string builder for the entity client provider
/// </summary>
[SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix", Justification = "EntityConnectionStringBuilder follows the naming convention of DbConnectionStringBuilder.")]
[SuppressMessage("Microsoft.Design", "CA1035:ICollectionImplementationsHaveStronglyTypedMembers", Justification = "There is no applicable strongly-typed implementation of CopyTo.")]
public sealed class EntityConnectionStringBuilder : DbConnectionStringBuilder
{
// Names of parameters to look for in the connection string
internal const string NameParameterName = "name" ;
internal const string MetadataParameterName = "metadata" ;
internal const string ProviderParameterName = "provider" ;
internal const string ProviderConnectionStringParameterName = "provider connection string" ;
// An array to hold the keywords
private static readonly string [ ] s_validKeywords = new string [ ]
{
NameParameterName ,
MetadataParameterName ,
ProviderParameterName ,
ProviderConnectionStringParameterName
} ;
private static Hashtable s_synonyms ;
// Information and data used by the connection
private string _namedConnectionName ;
private string _providerName ;
private string _metadataLocations ;
private string _storeProviderConnectionString ;
/// <summary>
/// Constructs the EntityConnectionStringBuilder object
/// </summary>
public EntityConnectionStringBuilder ( )
{
// Everything just defaults to null
}
/// <summary>
/// Constructs the EntityConnectionStringBuilder object with a connection string
/// </summary>
/// <param name="connectionString">The connection string to initialize this builder</param>
public EntityConnectionStringBuilder ( string connectionString )
{
this . ConnectionString = connectionString ;
}
/// <summary>
/// Gets or sets the named connection name in the connection string
/// </summary>
[DisplayName("Name")]
[EntityResCategoryAttribute(EntityRes.EntityDataCategory_NamedConnectionString)]
[EntityResDescriptionAttribute(EntityRes.EntityConnectionString_Name)]
[RefreshProperties(RefreshProperties.All)]
public string Name
{
get
{
return this . _namedConnectionName ? ? "" ;
}
set
{
this . _namedConnectionName = value ;
base [ NameParameterName ] = value ;
}
}
/// <summary>
/// Gets or sets the name of the underlying .NET Framework data provider in the connection string
/// </summary>
[DisplayName("Provider")]
[EntityResCategoryAttribute(EntityRes.EntityDataCategory_Source)]
[EntityResDescriptionAttribute(EntityRes.EntityConnectionString_Provider)]
[RefreshProperties(RefreshProperties.All)]
public string Provider
{
get
{
return this . _providerName ? ? "" ;
}
set
{
this . _providerName = value ;
base [ ProviderParameterName ] = value ;
}
}
/// <summary>
/// Gets or sets the metadata locations in the connection string, which is a pipe-separated sequence
/// of paths to folders and individual files
/// </summary>
[DisplayName("Metadata")]
[EntityResCategoryAttribute(EntityRes.EntityDataCategory_Context)]
[EntityResDescriptionAttribute(EntityRes.EntityConnectionString_Metadata)]
[RefreshProperties(RefreshProperties.All)]
public string Metadata
{
get
{
return this . _metadataLocations ? ? "" ;
}
set
{
this . _metadataLocations = value ;
base [ MetadataParameterName ] = value ;
}
}
/// <summary>
/// Gets or sets the inner connection string in the connection string
/// </summary>
[DisplayName("Provider Connection String")]
[EntityResCategoryAttribute(EntityRes.EntityDataCategory_Source)]
[EntityResDescriptionAttribute(EntityRes.EntityConnectionString_ProviderConnectionString)]
[RefreshProperties(RefreshProperties.All)]
public string ProviderConnectionString
{
get
{
return this . _storeProviderConnectionString ? ? "" ;
}
set
{
this . _storeProviderConnectionString = value ;
base [ ProviderConnectionStringParameterName ] = value ;
}
}
/// <summary>
/// Gets whether the EntityConnectionStringBuilder has a fixed size
/// </summary>
public override bool IsFixedSize
{
get
{
return true ;
}
}
/// <summary>
/// Gets a collection of all keywords used by EntityConnectionStringBuilder
/// </summary>
public override ICollection Keys
{
get
{
return new System . Collections . ObjectModel . ReadOnlyCollection < string > ( s_validKeywords ) ;
}
}
/// <summary>
/// Returns a hash table object containing all the valid keywords. This is really the same as the Keys
/// property, it's just that the returned object is a hash table.
/// </summary>
internal static Hashtable Synonyms
{
get
{
// Build the synonyms table if we don't have one
if ( s_synonyms = = null )
{
Hashtable table = new Hashtable ( s_validKeywords . Length ) ;
foreach ( string keyword in s_validKeywords )
{
table . Add ( keyword , keyword ) ;
}
s_synonyms = table ;
}
return s_synonyms ;
}
}
/// <summary>
/// Gets or sets the value associated with the keyword
/// </summary>
public override object this [ string keyword ]
{
get
{
EntityUtil . CheckArgumentNull ( keyword , "keyword" ) ;
// Just access the properties to get the value since the fields, which the properties will be accessing, will
// have already been set when the connection string is set
if ( string . Compare ( keyword , MetadataParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
return this . Metadata ;
}
else if ( string . Compare ( keyword , ProviderConnectionStringParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
return this . ProviderConnectionString ;
}
else if ( string . Compare ( keyword , NameParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
return this . Name ;
}
else if ( string . Compare ( keyword , ProviderParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
return this . Provider ;
}
throw EntityUtil . KeywordNotSupported ( keyword ) ;
}
set
{
EntityUtil . CheckArgumentNull ( keyword , "keyword" ) ;
// If a null value is set, just remove the parameter and return
if ( value = = null )
{
this . Remove ( keyword ) ;
return ;
}
// Since all of our parameters must be string value, perform the cast here and check
string stringValue = value as string ;
if ( stringValue = = null )
{
throw EntityUtil . Argument ( System . Data . Entity . Strings . EntityClient_ValueNotString , "value" ) ;
}
// Just access the properties to get the value since the fields, which the properties will be accessing, will
// have already been set when the connection string is set
if ( string . Compare ( keyword , MetadataParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . Metadata = stringValue ;
}
else if ( string . Compare ( keyword , ProviderConnectionStringParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . ProviderConnectionString = stringValue ;
}
else if ( string . Compare ( keyword , NameParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . Name = stringValue ;
}
else if ( string . Compare ( keyword , ProviderParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . Provider = stringValue ;
}
else
{
throw EntityUtil . KeywordNotSupported ( keyword ) ;
}
}
}
/// <summary>
/// Clear all the parameters in the connection string
/// </summary>
public override void Clear ( )
{
base . Clear ( ) ;
this . _namedConnectionName = null ;
this . _providerName = null ;
this . _metadataLocations = null ;
this . _storeProviderConnectionString = null ;
}
/// <summary>
/// Determine if this connection string builder contains a specific key
/// </summary>
/// <param name="keyword">The keyword to find in this connection string builder</param>
/// <returns>True if this connections string builder contains the specific key</returns>
public override bool ContainsKey ( string keyword )
{
EntityUtil . CheckArgumentNull ( keyword , "keyword" ) ;
foreach ( string validKeyword in s_validKeywords )
{
if ( validKeyword . Equals ( keyword , StringComparison . OrdinalIgnoreCase ) )
{
return true ;
}
}
return false ;
}
/// <summary>
/// Gets the value of the given keyword, returns false if there isn't a value with the given keyword
/// </summary>
/// <param name="keyword">The keyword specifying the name of the parameter to retrieve</param>
/// <param name="value">The value retrieved</param>
/// <returns>True if the value is retrieved</returns>
public override bool TryGetValue ( string keyword , out object value )
{
EntityUtil . CheckArgumentNull ( keyword , "keyword" ) ;
if ( ContainsKey ( keyword ) )
{
value = this [ keyword ] ;
return true ;
}
value = null ;
return false ;
}
/// <summary>
/// Removes a parameter from the builder
/// </summary>
/// <param name="keyword">The keyword specifying the name of the parameter to remove</param>
/// <returns>True if the parameter is removed</returns>
public override bool Remove ( string keyword )
{
EntityUtil . CheckArgumentNull ( keyword , "keyword" ) ;
// Convert the given object into a string
if ( string . Compare ( keyword , MetadataParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . _metadataLocations = null ;
}
else if ( string . Compare ( keyword , ProviderConnectionStringParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . _storeProviderConnectionString = null ;
}
else if ( string . Compare ( keyword , NameParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . _namedConnectionName = null ;
}
else if ( string . Compare ( keyword , ProviderParameterName , StringComparison . OrdinalIgnoreCase ) = = 0 )
{
this . _providerName = null ;
}
return base . Remove ( keyword ) ;
}
}
}