Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlNamer.cs / 1305376 / SqlNamer.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Linq;
using System.Diagnostics.CodeAnalysis;
namespace System.Data.Linq.SqlClient {
internal class SqlNamer {
Visitor visitor;
internal SqlNamer() {
this.visitor = new Visitor();
}
internal SqlNode AssignNames(SqlNode node) {
return this.visitor.Visit(node);
}
class Visitor : SqlVisitor {
int aliasCount;
SqlAlias alias;
bool makeUnique;
bool useMappedNames;
string lastName;
internal Visitor() {
this.makeUnique = true;
this.useMappedNames = false;
}
internal string GetNextAlias() {
return "t" + (aliasCount++);
}
internal override SqlAlias VisitAlias(SqlAlias sqlAlias) {
SqlAlias save = this.alias;
this.alias = sqlAlias;
sqlAlias.Node = this.Visit(sqlAlias.Node);
sqlAlias.Name = this.GetNextAlias();
this.alias = save;
return sqlAlias;
}
internal override SqlExpression VisitScalarSubSelect(SqlSubSelect ss) {
base.VisitScalarSubSelect(ss);
if (ss.Select.Row.Columns.Count > 0) {
System.Diagnostics.Debug.Assert(ss != null && ss.Select != null && ss.Select.Row != null && ss.Select.Row.Columns.Count == 1);
// make sure these scalar subselects don't get redundantly named
ss.Select.Row.Columns[0].Name = "";
}
return ss;
}
internal override SqlStatement VisitInsert(SqlInsert insert) {
bool saveMakeUnique = this.makeUnique;
this.makeUnique = false;
bool saveUseMappedNames = this.useMappedNames;
this.useMappedNames = true;
SqlStatement stmt = base.VisitInsert(insert);
this.makeUnique = saveMakeUnique;
this.useMappedNames = saveUseMappedNames;
return stmt;
}
internal override SqlStatement VisitUpdate(SqlUpdate update) {
bool saveMakeUnique = this.makeUnique;
this.makeUnique = false;
bool saveUseMappedNames = this.useMappedNames;
this.useMappedNames = true;
SqlStatement stmt = base.VisitUpdate(update);
this.makeUnique = saveMakeUnique;
this.useMappedNames = saveUseMappedNames;
return stmt;
}
internal override SqlSelect VisitSelect(SqlSelect select) {
select = base.VisitSelect(select);
string[] names = new string[select.Row.Columns.Count];
for (int i = 0, n = names.Length; i < n; i++) {
SqlColumn c = select.Row.Columns[i];
string name = c.Name;
if (name == null) {
name = SqlNamer.DiscoverName(c);
}
names[i] = name;
c.Name = null;
}
var reservedNames = this.GetColumnNames(select.OrderBy);
for (int i = 0, n = select.Row.Columns.Count; i < n; i++) {
SqlColumn c = select.Row.Columns[i];
string rootName = names[i];
string name = rootName;
if (this.makeUnique) {
int iName = 1;
while (!this.IsUniqueName(select.Row.Columns, reservedNames, c, name)) {
iName++;
name = rootName + iName;
}
}
c.Name = name;
c.Ordinal = i;
}
return select;
}
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")]
private bool IsUniqueName(List columns, ICollection reservedNames, SqlColumn c, string name) {
foreach (SqlColumn sc in columns) {
if (sc != c && string.Compare(sc.Name, name, StringComparison.OrdinalIgnoreCase) == 0)
return false;
}
if (!IsSimpleColumn(c, name)) {
return !reservedNames.Contains(name);
}
return true;
}
///
/// An expression is a simple reprojection if it's a column node whose expression is null, or
/// whose expression is a column whose name matches the name of the given name or where
/// where the given name is null or empty.
///
///
///
private static bool IsSimpleColumn(SqlColumn c, string name) {
if (c.Expression != null) {
switch (c.Expression.NodeType) {
case SqlNodeType.ColumnRef:
var colRef = c.Expression as SqlColumnRef;
return String.IsNullOrEmpty(name) || string.Compare(name, colRef.Column.Name, StringComparison.OrdinalIgnoreCase) == 0;
default:
return false;
}
}
return true;
}
internal override SqlExpression VisitExpression(SqlExpression expr) {
string saveLastName = this.lastName;
this.lastName = null;
try {
return (SqlExpression)this.Visit(expr);
}
finally {
this.lastName = saveLastName;
}
}
private SqlExpression VisitNamedExpression(SqlExpression expr, string name) {
string saveLastName = this.lastName;
this.lastName = name;
try {
return (SqlExpression)this.Visit(expr);
}
finally {
this.lastName = saveLastName;
}
}
internal override SqlExpression VisitColumnRef(SqlColumnRef cref) {
if (cref.Column.Name == null && this.lastName != null) {
cref.Column.Name = this.lastName;
}
return cref;
}
internal override SqlExpression VisitNew(SqlNew sox) {
if (sox.Constructor != null) {
System.Reflection.ParameterInfo[] pis = sox.Constructor.GetParameters();
for (int i = 0, n = sox.Args.Count; i < n; i++) {
sox.Args[i] = this.VisitNamedExpression(sox.Args[i], pis[i].Name);
}
}
else {
for (int i = 0, n = sox.Args.Count; i < n; i++) {
sox.Args[i] = this.VisitExpression(sox.Args[i]);
}
}
foreach (SqlMemberAssign ma in sox.Members) {
string n = ma.Member.Name;
if (this.useMappedNames) {
n = sox.MetaType.GetDataMember(ma.Member).MappedName;
}
ma.Expression = this.VisitNamedExpression(ma.Expression, n);
}
return sox;
}
internal override SqlExpression VisitGrouping(SqlGrouping g) {
g.Key = this.VisitNamedExpression(g.Key, "Key");
g.Group = this.VisitNamedExpression(g.Group, "Group");
return g;
}
internal override SqlExpression VisitOptionalValue(SqlOptionalValue sov) {
sov.HasValue = this.VisitNamedExpression(sov.HasValue, "test");
sov.Value = this.VisitExpression(sov.Value);
return sov;
}
internal override SqlExpression VisitMethodCall(SqlMethodCall mc) {
mc.Object = this.VisitExpression(mc.Object);
System.Reflection.ParameterInfo[] pis = mc.Method.GetParameters();
for (int i = 0, n = mc.Arguments.Count; i < n; i++) {
mc.Arguments[i] = this.VisitNamedExpression(mc.Arguments[i], pis[i].Name);
}
return mc;
}
ICollection GetColumnNames(IEnumerable orderList)
{
var visitor = new ColumnNameGatherer();
foreach (var expr in orderList) {
visitor.Visit(expr.Expression);
}
return visitor.Names;
}
}
internal static string DiscoverName(SqlExpression e) {
if (e != null) {
switch (e.NodeType) {
case SqlNodeType.Column:
return DiscoverName(((SqlColumn)e).Expression);
case SqlNodeType.ColumnRef:
SqlColumnRef cref = (SqlColumnRef)e;
if (cref.Column.Name != null) return cref.Column.Name;
return DiscoverName(cref.Column);
case SqlNodeType.ExprSet:
SqlExprSet eset = (SqlExprSet)e;
return DiscoverName(eset.Expressions[0]);
}
}
return "value";
}
class ColumnNameGatherer : SqlVisitor {
public HashSet Names { get; set; }
public ColumnNameGatherer()
: base() {
this.Names = new HashSet();
}
internal override SqlExpression VisitColumn(SqlColumn col) {
if (!String.IsNullOrEmpty(col.Name)) {
this.Names.Add(col.Name);
}
return base.VisitColumn(col);
}
internal override SqlExpression VisitColumnRef(SqlColumnRef cref) {
Visit(cref.Column);
return base.VisitColumnRef(cref);
}
}
}
}
// 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
- FileAuthorizationModule.cs
- CrossSiteScriptingValidation.cs
- XmlParser.cs
- XamlStyleSerializer.cs
- smtppermission.cs
- ExecutedRoutedEventArgs.cs
- ExtensionWindowResizeGrip.cs
- AutomationPatternInfo.cs
- MemoryStream.cs
- AlignmentXValidation.cs
- Permission.cs
- Rights.cs
- RemotingConfigParser.cs
- ObjectContext.cs
- CodeDefaultValueExpression.cs
- ConfigXmlText.cs
- cookiecontainer.cs
- ListViewPagedDataSource.cs
- NamespaceMapping.cs
- MediaContext.cs
- CodeTypeConstructor.cs
- xdrvalidator.cs
- StreamGeometry.cs
- StreamingContext.cs
- IndexExpression.cs
- ComplexPropertyEntry.cs
- PassportAuthenticationEventArgs.cs
- UInt32Converter.cs
- CustomErrorsSectionWrapper.cs
- QuotaThrottle.cs
- JumpList.cs
- HasCopySemanticsAttribute.cs
- SuppressMergeCheckAttribute.cs
- HyperLinkField.cs
- DataColumn.cs
- TabControlCancelEvent.cs
- LowerCaseStringConverter.cs
- TraceSource.cs
- InteropAutomationProvider.cs
- ChannelManager.cs
- ListMarkerLine.cs
- AutomationPeer.cs
- LocalizabilityAttribute.cs
- XmlDataImplementation.cs
- RecipientInfo.cs
- WebPartHeaderCloseVerb.cs
- DrawingVisualDrawingContext.cs
- ColorConvertedBitmap.cs
- xdrvalidator.cs
- TreeNode.cs
- ListenDesigner.cs
- Tuple.cs
- Material.cs
- Maps.cs
- SchemaDeclBase.cs
- ZipIORawDataFileBlock.cs
- DBDataPermission.cs
- TileBrush.cs
- ImageListImageEditor.cs
- WindowsListViewGroupHelper.cs
- BounceEase.cs
- OdbcPermission.cs
- EntitySetBase.cs
- UserInitiatedNavigationPermission.cs
- Figure.cs
- ExtendedProperty.cs
- SqlUtils.cs
- IntPtr.cs
- ResourceDictionary.cs
- ContourSegment.cs
- ExtensionQuery.cs
- GridViewColumnCollection.cs
- BinaryCommonClasses.cs
- ToolStripItemBehavior.cs
- Delegate.cs
- MenuItemStyleCollectionEditor.cs
- ColumnMapTranslator.cs
- SqlLiftIndependentRowExpressions.cs
- UnhandledExceptionEventArgs.cs
- ListViewUpdatedEventArgs.cs
- SatelliteContractVersionAttribute.cs
- ImageMetadata.cs
- PersistenceTypeAttribute.cs
- AddInAdapter.cs
- ConstraintStruct.cs
- KeyValuePair.cs
- Sql8ExpressionRewriter.cs
- ClassDataContract.cs
- _KerberosClient.cs
- initElementDictionary.cs
- CreateUserWizard.cs
- ScriptRef.cs
- Int32KeyFrameCollection.cs
- FacetEnabledSchemaElement.cs
- Transform3DCollection.cs
- PropertyMetadata.cs
- ParsedAttributeCollection.cs
- IncrementalReadDecoders.cs
- SqlXml.cs
- Walker.cs