Symbol.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / SqlClient / SqlGen / Symbol.cs / 2 / Symbol.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner  [....], [....]
//--------------------------------------------------------------------- 
 
using System;
using System.Collections.Generic; 
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Data.SqlClient; 
using System.Data.Metadata.Edm;
using System.Data.Common.CommandTrees; 
 
namespace System.Data.SqlClient.SqlGen
{ 
    /// 
    /// 
    /// This class represents an extent/nested select statement,
    /// or a column. 
    ///
    /// The important fields are Name, Type and NewName. 
    /// NewName starts off the same as Name, and is then modified as necessary. 
    ///
    /// 
    /// The rest are used by special symbols.
    /// e.g. NeedsRenaming is used by columns to indicate that a new name must
    /// be picked for the column in the second phase of translation.
    /// 
    /// IsUnnest is used by symbols for a collection expression used as a from clause.
    /// This allows  to add the column list 
    /// after the alias. 
    ///
    ///  
    internal class Symbol : ISqlFragment
    {
        private Dictionary columns;
        internal Dictionary Columns 
        {
            get 
            { 
                if (null == columns)
                { 
                    columns = new Dictionary(StringComparer.OrdinalIgnoreCase);
                }
                return columns;
            } 
        }
 
        private bool needsRenaming; 
        internal bool NeedsRenaming
        { 
            get { return needsRenaming; }
            set { needsRenaming = value; }
        }
 
        private bool outputColumnsRenamed;
        internal bool OutputColumnsRenamed 
        { 
            get { return outputColumnsRenamed; }
            set { outputColumnsRenamed = value; } 
        }

        private string name;
        public string Name 
        {
            get { return name; } 
        } 

        private string newName; 
        public string NewName
        {
            get { return newName; }
            set { newName = value; } 
        }
 
        private TypeUsage type; 
        internal TypeUsage Type
        { 
            get { return type; }
            set { type = value; }
        }
 
        public Symbol(string name, TypeUsage type)
        { 
            this.name = name; 
            this.newName = name;
            this.Type = type; 
        }

        /// 
        /// Use this constructor the symbol represents a SqlStatement with renamed output columns. 
        /// 
        ///  
        ///  
        /// 
        public Symbol(string name, TypeUsage type, Dictionary columns) 
        {
            this.name = name;
            this.newName = name;
            this.Type = type; 
            this.columns = columns;
            this.OutputColumnsRenamed = true; 
        } 

        #region ISqlFragment Members 

        /// 
        /// Write this symbol out as a string for sql.  This is just
        /// the new name of the symbol (which could be the same as the old name). 
        ///
        /// We rename columns here if necessary. 
        ///  
        /// 
        ///  
        public void WriteSql(SqlWriter writer, SqlGenerator sqlGenerator)
        {
            if (this.NeedsRenaming)
            { 
                int i;
 
                if (sqlGenerator.AllColumnNames.TryGetValue(this.NewName, out i)) 
                {
                    string newNameCandidate; 
                    do
                    {
                        ++i;
                        newNameCandidate = this.NewName + i.ToString(System.Globalization.CultureInfo.InvariantCulture); 
                    } while (sqlGenerator.AllColumnNames.ContainsKey(newNameCandidate));
 
                    sqlGenerator.AllColumnNames[this.NewName] = i; 

                    this.NewName = newNameCandidate; 
                }

                // Add this column name to list of known names so that there are no subsequent
                // collisions 
                sqlGenerator.AllColumnNames[this.NewName] = 0;
 
                // Prevent it from being renamed repeatedly. 
                this.NeedsRenaming = false;
            } 
            writer.Write(SqlGenerator.QuoteIdentifier(this.NewName));
        }

        #endregion 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner  [....], [....]
//--------------------------------------------------------------------- 
 
using System;
using System.Collections.Generic; 
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Data.SqlClient; 
using System.Data.Metadata.Edm;
using System.Data.Common.CommandTrees; 
 
namespace System.Data.SqlClient.SqlGen
{ 
    /// 
    /// 
    /// This class represents an extent/nested select statement,
    /// or a column. 
    ///
    /// The important fields are Name, Type and NewName. 
    /// NewName starts off the same as Name, and is then modified as necessary. 
    ///
    /// 
    /// The rest are used by special symbols.
    /// e.g. NeedsRenaming is used by columns to indicate that a new name must
    /// be picked for the column in the second phase of translation.
    /// 
    /// IsUnnest is used by symbols for a collection expression used as a from clause.
    /// This allows  to add the column list 
    /// after the alias. 
    ///
    ///  
    internal class Symbol : ISqlFragment
    {
        private Dictionary columns;
        internal Dictionary Columns 
        {
            get 
            { 
                if (null == columns)
                { 
                    columns = new Dictionary(StringComparer.OrdinalIgnoreCase);
                }
                return columns;
            } 
        }
 
        private bool needsRenaming; 
        internal bool NeedsRenaming
        { 
            get { return needsRenaming; }
            set { needsRenaming = value; }
        }
 
        private bool outputColumnsRenamed;
        internal bool OutputColumnsRenamed 
        { 
            get { return outputColumnsRenamed; }
            set { outputColumnsRenamed = value; } 
        }

        private string name;
        public string Name 
        {
            get { return name; } 
        } 

        private string newName; 
        public string NewName
        {
            get { return newName; }
            set { newName = value; } 
        }
 
        private TypeUsage type; 
        internal TypeUsage Type
        { 
            get { return type; }
            set { type = value; }
        }
 
        public Symbol(string name, TypeUsage type)
        { 
            this.name = name; 
            this.newName = name;
            this.Type = type; 
        }

        /// 
        /// Use this constructor the symbol represents a SqlStatement with renamed output columns. 
        /// 
        ///  
        ///  
        /// 
        public Symbol(string name, TypeUsage type, Dictionary columns) 
        {
            this.name = name;
            this.newName = name;
            this.Type = type; 
            this.columns = columns;
            this.OutputColumnsRenamed = true; 
        } 

        #region ISqlFragment Members 

        /// 
        /// Write this symbol out as a string for sql.  This is just
        /// the new name of the symbol (which could be the same as the old name). 
        ///
        /// We rename columns here if necessary. 
        ///  
        /// 
        ///  
        public void WriteSql(SqlWriter writer, SqlGenerator sqlGenerator)
        {
            if (this.NeedsRenaming)
            { 
                int i;
 
                if (sqlGenerator.AllColumnNames.TryGetValue(this.NewName, out i)) 
                {
                    string newNameCandidate; 
                    do
                    {
                        ++i;
                        newNameCandidate = this.NewName + i.ToString(System.Globalization.CultureInfo.InvariantCulture); 
                    } while (sqlGenerator.AllColumnNames.ContainsKey(newNameCandidate));
 
                    sqlGenerator.AllColumnNames[this.NewName] = i; 

                    this.NewName = newNameCandidate; 
                }

                // Add this column name to list of known names so that there are no subsequent
                // collisions 
                sqlGenerator.AllColumnNames[this.NewName] = 0;
 
                // Prevent it from being renamed repeatedly. 
                this.NeedsRenaming = false;
            } 
            writer.Write(SqlGenerator.QuoteIdentifier(this.NewName));
        }

        #endregion 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK