Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlSupersetValidator.cs / 1 / SqlSupersetValidator.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace System.Data.Linq.SqlClient {
///
/// Validates the integrity of super-SQL trees.
///
internal class SqlSupersetValidator {
List validators = new List();
///
/// Add a validator to the collection of validators to run.
///
internal void AddValidator(SqlVisitor validator) {
this.validators.Add(validator);
}
///
/// Execute each current validator.
///
internal void Validate(SqlNode node) {
foreach (SqlVisitor validator in this.validators) {
validator.Visit(node);
}
}
}
///
/// Column ClrType must agree with the expression that it points to.
///
internal class ColumnTypeValidator : SqlVisitor {
internal override SqlRow VisitRow(SqlRow row) {
for (int i = 0, n = row.Columns.Count; i < n; i++) {
SqlColumn col = row.Columns[i];
SqlExpression expr = this.VisitExpression(col.Expression);
if (expr != null) {
if (TypeSystem.GetNonNullableType(col.ClrType) != TypeSystem.GetNonNullableType(expr.ClrType)) {
throw Error.ColumnClrTypeDoesNotAgreeWithExpressionsClrType();
}
}
}
return row;
}
}
///
/// A validator that ensures literal values are reasonable.
///
internal class LiteralValidator : SqlVisitor {
internal override SqlExpression VisitValue(SqlValue value) {
if (!value.IsClientSpecified
&& value.ClrType.IsClass
&& value.ClrType != typeof(string)
&& value.ClrType != typeof(Type)
&& value.Value != null) {
throw Error.ClassLiteralsNotAllowed(value.ClrType);
}
return value;
}
internal override SqlExpression VisitBinaryOperator(SqlBinary bo) {
bo.Left = this.VisitExpression(bo.Left);
return bo;
}
}
///
/// A validator which enforces rationalized boolean expressions.
///
internal class ExpectRationalizedBooleans : SqlBooleanMismatchVisitor {
internal ExpectRationalizedBooleans() {
}
internal override SqlExpression ConvertValueToPredicate(SqlExpression bitExpression) {
throw Error.ExpectedPredicateFoundBit();
}
internal override SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression) {
throw Error.ExpectedBitFoundPredicate();
}
}
///
/// A validator which enforces that no more SqlMethodCall nodes exist in the tree.
///
internal class ExpectNoMethodCalls : SqlVisitor {
internal override SqlExpression VisitMethodCall(SqlMethodCall mc) {
// eventually we may support this type of stuff given the SQL CLR, but for now it is illegal
throw Error.MethodHasNoSupportConversionToSql(mc.Method.Name);
}
// check everything except selection expressions (which will be client or ignored)
internal override SqlSelect VisitSelect(SqlSelect select) {
select.From = this.VisitSource(select.From);
select.Where = this.VisitExpression(select.Where);
for (int i = 0, n = select.GroupBy.Count; i < n; i++) {
select.GroupBy[i] = this.VisitExpression(select.GroupBy[i]);
}
select.Having = this.VisitExpression(select.Having);
for (int i = 0, n = select.OrderBy.Count; i < n; i++) {
select.OrderBy[i].Expression = this.VisitExpression(select.OrderBy[i].Expression);
}
select.Top = this.VisitExpression(select.Top);
//select.Selection = this.VisitExpression(select.Selection);
select.Row = (SqlRow)this.Visit(select.Row);
return select;
}
}
internal class ExpectNoFloatingColumns : SqlVisitor {
internal override SqlRow VisitRow(SqlRow row) {
foreach (SqlColumn c in row.Columns) {
this.Visit(c.Expression);
}
return row;
}
internal override SqlTable VisitTable(SqlTable tab) {
foreach (SqlColumn c in tab.Columns) {
this.Visit(c.Expression);
}
return tab;
}
internal override SqlExpression VisitColumn(SqlColumn col) {
throw Error.UnexpectedFloatingColumn();
}
}
internal class ExpectNoAliasRefs : SqlVisitor {
internal override SqlExpression VisitAliasRef(SqlAliasRef aref) {
throw Error.UnexpectedNode(aref.NodeType);
}
}
internal class ExpectNoSharedExpressions : SqlVisitor {
internal override SqlExpression VisitSharedExpression(SqlSharedExpression shared) {
throw Error.UnexpectedSharedExpression();
}
internal override SqlExpression VisitSharedExpressionRef(SqlSharedExpressionRef sref) {
throw Error.UnexpectedSharedExpressionReference();
}
}
///
/// Determines if there is a boolean NText/Text/Image comparison and if so throws an exception
/// because this is not valid in SQLServer.
///
internal class ValidateNoInvalidComparison : SqlVisitor {
internal override SqlExpression VisitBinaryOperator(SqlBinary bo) {
if (bo.NodeType == SqlNodeType.EQ || bo.NodeType == SqlNodeType.NE ||
bo.NodeType == SqlNodeType.EQ2V || bo.NodeType == SqlNodeType.NE2V ||
bo.NodeType == SqlNodeType.GT || bo.NodeType == SqlNodeType.GE ||
bo.NodeType == SqlNodeType.LT || bo.NodeType == SqlNodeType.LE ) {
if (!bo.Left.SqlType.SupportsComparison ||
!bo.Right.SqlType.SupportsComparison){
throw Error.UnhandledStringTypeComparison();
}
}
bo.Left = this.VisitExpression(bo.Left);
bo.Right = this.VisitExpression(bo.Right);
return bo;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Collections.Generic;
using System.Text;
namespace System.Data.Linq.SqlClient {
///
/// Validates the integrity of super-SQL trees.
///
internal class SqlSupersetValidator {
List validators = new List();
///
/// Add a validator to the collection of validators to run.
///
internal void AddValidator(SqlVisitor validator) {
this.validators.Add(validator);
}
///
/// Execute each current validator.
///
internal void Validate(SqlNode node) {
foreach (SqlVisitor validator in this.validators) {
validator.Visit(node);
}
}
}
///
/// Column ClrType must agree with the expression that it points to.
///
internal class ColumnTypeValidator : SqlVisitor {
internal override SqlRow VisitRow(SqlRow row) {
for (int i = 0, n = row.Columns.Count; i < n; i++) {
SqlColumn col = row.Columns[i];
SqlExpression expr = this.VisitExpression(col.Expression);
if (expr != null) {
if (TypeSystem.GetNonNullableType(col.ClrType) != TypeSystem.GetNonNullableType(expr.ClrType)) {
throw Error.ColumnClrTypeDoesNotAgreeWithExpressionsClrType();
}
}
}
return row;
}
}
///
/// A validator that ensures literal values are reasonable.
///
internal class LiteralValidator : SqlVisitor {
internal override SqlExpression VisitValue(SqlValue value) {
if (!value.IsClientSpecified
&& value.ClrType.IsClass
&& value.ClrType != typeof(string)
&& value.ClrType != typeof(Type)
&& value.Value != null) {
throw Error.ClassLiteralsNotAllowed(value.ClrType);
}
return value;
}
internal override SqlExpression VisitBinaryOperator(SqlBinary bo) {
bo.Left = this.VisitExpression(bo.Left);
return bo;
}
}
///
/// A validator which enforces rationalized boolean expressions.
///
internal class ExpectRationalizedBooleans : SqlBooleanMismatchVisitor {
internal ExpectRationalizedBooleans() {
}
internal override SqlExpression ConvertValueToPredicate(SqlExpression bitExpression) {
throw Error.ExpectedPredicateFoundBit();
}
internal override SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression) {
throw Error.ExpectedBitFoundPredicate();
}
}
///
/// A validator which enforces that no more SqlMethodCall nodes exist in the tree.
///
internal class ExpectNoMethodCalls : SqlVisitor {
internal override SqlExpression VisitMethodCall(SqlMethodCall mc) {
// eventually we may support this type of stuff given the SQL CLR, but for now it is illegal
throw Error.MethodHasNoSupportConversionToSql(mc.Method.Name);
}
// check everything except selection expressions (which will be client or ignored)
internal override SqlSelect VisitSelect(SqlSelect select) {
select.From = this.VisitSource(select.From);
select.Where = this.VisitExpression(select.Where);
for (int i = 0, n = select.GroupBy.Count; i < n; i++) {
select.GroupBy[i] = this.VisitExpression(select.GroupBy[i]);
}
select.Having = this.VisitExpression(select.Having);
for (int i = 0, n = select.OrderBy.Count; i < n; i++) {
select.OrderBy[i].Expression = this.VisitExpression(select.OrderBy[i].Expression);
}
select.Top = this.VisitExpression(select.Top);
//select.Selection = this.VisitExpression(select.Selection);
select.Row = (SqlRow)this.Visit(select.Row);
return select;
}
}
internal class ExpectNoFloatingColumns : SqlVisitor {
internal override SqlRow VisitRow(SqlRow row) {
foreach (SqlColumn c in row.Columns) {
this.Visit(c.Expression);
}
return row;
}
internal override SqlTable VisitTable(SqlTable tab) {
foreach (SqlColumn c in tab.Columns) {
this.Visit(c.Expression);
}
return tab;
}
internal override SqlExpression VisitColumn(SqlColumn col) {
throw Error.UnexpectedFloatingColumn();
}
}
internal class ExpectNoAliasRefs : SqlVisitor {
internal override SqlExpression VisitAliasRef(SqlAliasRef aref) {
throw Error.UnexpectedNode(aref.NodeType);
}
}
internal class ExpectNoSharedExpressions : SqlVisitor {
internal override SqlExpression VisitSharedExpression(SqlSharedExpression shared) {
throw Error.UnexpectedSharedExpression();
}
internal override SqlExpression VisitSharedExpressionRef(SqlSharedExpressionRef sref) {
throw Error.UnexpectedSharedExpressionReference();
}
}
///
/// Determines if there is a boolean NText/Text/Image comparison and if so throws an exception
/// because this is not valid in SQLServer.
///
internal class ValidateNoInvalidComparison : SqlVisitor {
internal override SqlExpression VisitBinaryOperator(SqlBinary bo) {
if (bo.NodeType == SqlNodeType.EQ || bo.NodeType == SqlNodeType.NE ||
bo.NodeType == SqlNodeType.EQ2V || bo.NodeType == SqlNodeType.NE2V ||
bo.NodeType == SqlNodeType.GT || bo.NodeType == SqlNodeType.GE ||
bo.NodeType == SqlNodeType.LT || bo.NodeType == SqlNodeType.LE ) {
if (!bo.Left.SqlType.SupportsComparison ||
!bo.Right.SqlType.SupportsComparison){
throw Error.UnhandledStringTypeComparison();
}
}
bo.Left = this.VisitExpression(bo.Left);
bo.Right = this.VisitExpression(bo.Right);
return bo;
}
}
}
// 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
- MobileCategoryAttribute.cs
- ReceiveActivityDesignerTheme.cs
- TableLayoutPanelCellPosition.cs
- ComboBoxAutomationPeer.cs
- ComponentEditorPage.cs
- ZipIOCentralDirectoryFileHeader.cs
- RtfToXamlReader.cs
- NominalTypeEliminator.cs
- ClientSponsor.cs
- AttachedPropertyDescriptor.cs
- TemplateBuilder.cs
- ReferenceEqualityComparer.cs
- ReadOnlyTernaryTree.cs
- NavigationWindowAutomationPeer.cs
- DataTableReaderListener.cs
- PagedDataSource.cs
- SerializerProvider.cs
- NonSerializedAttribute.cs
- AtomParser.cs
- ZipIORawDataFileBlock.cs
- TextParaClient.cs
- OutputCacheProfileCollection.cs
- ContentIterators.cs
- WizardStepBase.cs
- ObjectViewQueryResultData.cs
- BatchServiceHost.cs
- SoapIgnoreAttribute.cs
- PageThemeBuildProvider.cs
- EndEvent.cs
- BlobPersonalizationState.cs
- FtpWebRequest.cs
- DispatcherExceptionEventArgs.cs
- SchemaElementLookUpTable.cs
- RectangleConverter.cs
- CreateInstanceBinder.cs
- ListViewItemMouseHoverEvent.cs
- CanExecuteRoutedEventArgs.cs
- DataColumnPropertyDescriptor.cs
- BaseProcessor.cs
- C14NUtil.cs
- XmlJsonWriter.cs
- DynamicEntity.cs
- ProfileBuildProvider.cs
- ActionFrame.cs
- RadioButton.cs
- EncodingFallbackAwareXmlTextWriter.cs
- Dispatcher.cs
- LineGeometry.cs
- EntityDataSourceWrapper.cs
- Range.cs
- TypeListConverter.cs
- Pair.cs
- InvalidFilterCriteriaException.cs
- IisTraceListener.cs
- Debugger.cs
- Assembly.cs
- StylusPointProperties.cs
- XmlDocumentFragment.cs
- ChineseLunisolarCalendar.cs
- SystemFonts.cs
- KnownBoxes.cs
- DbResourceAllocator.cs
- XPathSelectionIterator.cs
- ExternalFile.cs
- FrameworkElementFactory.cs
- InstanceCreationEditor.cs
- BoundField.cs
- DetailsViewDeletedEventArgs.cs
- ShaderEffect.cs
- DetailsViewDeletedEventArgs.cs
- PartManifestEntry.cs
- EditableTreeList.cs
- WmlCommandAdapter.cs
- MenuItemStyleCollection.cs
- MissingManifestResourceException.cs
- SmiEventStream.cs
- DBCommand.cs
- DateTimePicker.cs
- TileModeValidation.cs
- WebControl.cs
- FunctionDetailsReader.cs
- Brushes.cs
- BitStream.cs
- WorkflowMarkupSerializationException.cs
- FixedHighlight.cs
- TreeViewCancelEvent.cs
- TableLayoutSettingsTypeConverter.cs
- ISCIIEncoding.cs
- ConnectionOrientedTransportManager.cs
- TableAdapterManagerGenerator.cs
- RouteData.cs
- Point3DCollection.cs
- Propagator.JoinPropagator.cs
- TypeUtils.cs
- DerivedKeySecurityTokenStub.cs
- HtmlGenericControl.cs
- PolygonHotSpot.cs
- Facet.cs
- DiscoveryClientOutputChannel.cs
- ExceptionRoutedEventArgs.cs