//---------------------------------------------------------------------
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//
// @owner  Microsoft
// @backupOwner Microsoft
//---------------------------------------------------------------------
namespace System.Data.Common
{
    using System.Data.Metadata.Edm;
    using System.Xml;
    /// 
    /// Metadata Interface for all CLR types types
    /// 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")]
    public abstract class DbProviderManifest
    {
        /// 
        /// Constructor
        /// 
        protected DbProviderManifest()
        {
        }
        /// Value to pass to GetInformation to get the StoreSchemaDefinition
        public static readonly string StoreSchemaDefinition = "StoreSchemaDefinition";
        /// Value to pass to GetInformation to get the StoreSchemaMapping
        public static readonly string StoreSchemaMapping = "StoreSchemaMapping";
        /// Value to pass to GetInformation to get the ConceptualSchemaDefinition
        public static readonly string ConceptualSchemaDefinition = "ConceptualSchemaDefinition";
        /// Value to pass to GetInformation to get the StoreSchemaDefinitionVersion3
        public static readonly string StoreSchemaDefinitionVersion3 = "StoreSchemaDefinitionVersion3";
        /// Value to pass to GetInformation to get the StoreSchemaMappingVersion3
        public static readonly string StoreSchemaMappingVersion3 = "StoreSchemaMappingVersion3";
        /// Value to pass to GetInformation to get the ConceptualSchemaDefinitionVersion3
        public static readonly string ConceptualSchemaDefinitionVersion3 = "ConceptualSchemaDefinitionVersion3";
        // System Facet Info
        /// 
        /// Name of the MaxLength Facet
        /// 
        internal const string MaxLengthFacetName = "MaxLength";
        /// 
        /// Name of the Unicode Facet
        /// 
        internal const string UnicodeFacetName = "Unicode";
        /// 
        /// Name of the FixedLength Facet
        /// 
        internal const string FixedLengthFacetName = "FixedLength";
        /// 
        /// Name of the Precision Facet
        /// 
        internal const string PrecisionFacetName = "Precision";
        /// 
        /// Name of the Scale Facet
        /// 
        internal const string ScaleFacetName = "Scale";
        /// 
        /// Name of the Nullable Facet
        /// 
        internal const string NullableFacetName = "Nullable";
        /// 
        /// Name of the DefaultValue Facet
        /// 
        internal const string DefaultValueFacetName = "DefaultValue";
        /// 
        /// Name of the Collation Facet
        /// 
        internal const string CollationFacetName = "Collation";
        /// 
        /// Name of the SRID Facet
        /// 
        internal const string SridFacetName = "SRID";
        /// 
        /// Name of the IsStrict Facet
        /// 
        internal const string IsStrictFacetName = "IsStrict";
       
        /// 
        /// Returns the namespace used by this provider manifest
        /// 
        public abstract string NamespaceName {get;}
                
        /// 
        /// Return the set of types supported by the store
        /// 
        /// A collection of primitive types
        public abstract System.Collections.ObjectModel.ReadOnlyCollection GetStoreTypes();
        /// 
        /// Returns all the edm functions supported by the provider manifest.
        /// 
        /// A collection of edm functions.
        public abstract System.Collections.ObjectModel.ReadOnlyCollection GetStoreFunctions();
        /// 
        /// Returns all the FacetDescriptions for a particular type
        /// 
        /// the type to return FacetDescriptions for
        /// The FacetDescriptions for the type given
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "edm")]
        public abstract System.Collections.ObjectModel.ReadOnlyCollection GetFacetDescriptions(EdmType edmType);
        /// 
        /// This method allows a provider writer to take a type and a set of facets
        /// and reason about what the best mapped equivalent type in EDM would be.
        /// 
        /// A TypeUsage encapsulating a store type and a set of facets
        /// A TypeUsage encapsulating an EDM type and a set of facets
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Edm")]
        public abstract TypeUsage GetEdmType(TypeUsage storeType);
        /// 
        /// This method allows a provider writer to take a type and a set of facets
        /// and reason about what the best mapped equivalent type in the store would be.
        /// 
        /// A TypeUsage encapsulating an EDM type and a set of facets
        /// A TypeUsage encapsulating a store type and a set of facets
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "edm")]
        public abstract TypeUsage GetStoreType(TypeUsage edmType);
        /// 
        /// Providers should override this to return information specific to their provider.  
        /// 
        /// This method should never return null.
        /// 
        /// The name of the information to be retrieved.
        /// An XmlReader at the begining of the information requested.
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Db")]
        protected abstract XmlReader GetDbInformation(string informationType);
        /// 
        /// Gets framework and provider specific information
        /// 
        /// This method should never return null.
        /// 
        /// The name of the information to be retrieved.
        /// An XmlReader at the begining of the information requested.
        public XmlReader GetInformation(string informationType)
        {
            XmlReader reader = null;
            try
            {
                reader = GetDbInformation(informationType);
            }
            catch (Exception e)
            {
                // we should not be wrapping all exceptions
                if (EntityUtil.IsCatchableExceptionType(e))
                {
                    // we don't want folks to have to know all the various types of exceptions that can 
                    // occur, so we just rethrow a ProviderIncompatibleException and make whatever we caught  
                    // the inner exception of it.
                    throw EntityUtil.ProviderIncompatible(
                            System.Data.Entity.Strings.EntityClient_FailedToGetInformation(informationType), e);
                }
                throw;
            }
            if (reader == null)
            {
                // if the provider returned null for the conceptual schema definition, return the default one
                if (informationType == ConceptualSchemaDefinitionVersion3 ||
                    informationType == ConceptualSchemaDefinition)
                {
                    return DbProviderServices.GetConceptualSchemaDefinition(informationType);
                }
                throw EntityUtil.ProviderIncompatible(System.Data.Entity.Strings.ProviderReturnedNullForGetDbInformation(informationType));
            }
            return reader;
        }
        /// 
        /// Does the provider support escaping strings to be used as patterns in a Like expression.
        /// If the provider overrides this method to return true,  should 
        /// also be overridden. 
        /// 
        /// If the provider supports escaping, the character that would be used
        /// as the escape character
        /// True, if this provider supports escaping strings to be used as patterns in a Like expression,
        /// false otherwise. The default implementation returns false.
        public virtual bool SupportsEscapingLikeArgument(out char escapeCharacter)
        {
            escapeCharacter = default(char);
            return false;
        }
        /// 
        /// Provider writers should override this method to returns the argument with the wildcards and the escape 
        /// character escaped.  This method is only used if  returns true.
        /// 
        /// The argument to be escaped
        /// The argument with the wildcards and the escape character escaped
        public virtual string EscapeLikeArgument(string argument)
        {
            throw EntityUtil.ProviderIncompatible(System.Data.Entity.Strings.ProviderShouldOverrideEscapeLikeArgument);
        }
    }
}