Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Data / System / Data / Filter / DataExpression.cs / 1 / DataExpression.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data {
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.SqlTypes;
using System.Data.Common;
internal sealed class DataExpression : IFilter {
internal string originalExpression = null; // original, unoptimized string
private bool parsed = false;
private bool bound = false;
private ExpressionNode expr = null;
private DataTable table = null;
private readonly StorageType _storageType;
private readonly Type _dataType; // This set if the expression is part of ExpressionCoulmn
private DataColumn[] dependency = DataTable.zeroColumns;
internal DataExpression(DataTable table, string expression) : this(table, expression, null) {
}
internal DataExpression(DataTable table, string expression, Type type) {
ExpressionParser parser = new ExpressionParser(table);
parser.LoadExpression(expression);
originalExpression = expression;
expr = null;
if (expression != null) {
_storageType = DataStorage.GetStorageType(type);
_dataType = type;
expr = parser.Parse();
parsed = true;
if (expr != null && table != null) {
this.Bind(table);
}
else {
bound = false;
}
}
}
internal string Expression {
get {
return (originalExpression != null ? originalExpression : ""); //
}
}
internal ExpressionNode ExpressionNode {
get {
return expr;
}
}
internal bool HasValue {
get {
return (null != expr);
}
}
internal void Bind(DataTable table) {
this.table = table;
if (table == null)
return;
if (expr != null) {
Debug.Assert(parsed, "Invalid calling order: Bind() before Parse()");
List list = new List();
expr.Bind(table, list);
expr = expr.Optimize();
this.table = table;
bound = true;
dependency = list.ToArray();
}
}
internal bool DependsOn(DataColumn column) {
if (expr != null) {
return expr.DependsOn(column);
}
else {
return false;
}
}
internal object Evaluate() {
return Evaluate((DataRow)null, DataRowVersion.Default);
}
internal object Evaluate(DataRow row, DataRowVersion version) {
object result;
if (!bound) {
this.Bind(this.table);
}
if (expr != null) {
result = expr.Eval(row, version);
// if the type is a SqlType (StorageType.Uri < _storageType), convert DBNull values.
if (result != DBNull.Value || StorageType.Uri < _storageType) {
// we need to convert the return value to the column.Type;
try {
if (StorageType.Object != _storageType) {
result = SqlConvert.ChangeType2(result, _storageType, _dataType, table.FormatProvider);
}
}
catch (Exception e) {
//
if (!ADP.IsCatchableExceptionType(e)) {
throw;
}
ExceptionBuilder.TraceExceptionForCapture(e);
//
throw ExprException.DatavalueConvertion(result, _dataType, e);
}
}
}
else {
result = null;
}
return result;
}
internal object Evaluate(DataRow[] rows) {
return Evaluate(rows, DataRowVersion.Default);
}
internal object Evaluate(DataRow[] rows, DataRowVersion version) {
if (!bound) {
this.Bind(this.table);
}
if (expr != null) {
List recordList = new List();
foreach(DataRow row in rows) {
if (row.RowState == DataRowState.Deleted)
continue;
if (version == DataRowVersion.Original && row.oldRecord == -1)
continue;
recordList.Add(row.GetRecordFromVersion(version));
}
int[] records = recordList.ToArray();
return expr.Eval(records);
}
else {
return DBNull.Value;
}
}
public bool Invoke(DataRow row, DataRowVersion version) {
if (expr == null)
return true;
if (row == null) {
throw ExprException.InvokeArgument();
}
object val = expr.Eval(row, version);
bool result;
try {
result = ToBoolean(val);
}
catch (EvaluateException) {
throw ExprException.FilterConvertion(Expression);
}
return result;
}
internal DataColumn[] GetDependency() {
Debug.Assert(dependency != null, "GetDependencies: null, we should have created an empty list");
return dependency;
}
internal bool IsTableAggregate() {
if (expr != null)
return expr.IsTableConstant();
else
return false;
}
internal static bool IsUnknown(object value) {
return DataStorage.IsObjectNull(value);
}
internal bool HasLocalAggregate() {
if (expr != null)
return expr.HasLocalAggregate();
else
return false;
}
internal bool HasRemoteAggregate() {
if (expr != null)
return expr.HasRemoteAggregate();
else
return false;
}
internal static bool ToBoolean(object value) {
if (IsUnknown(value))
return false;
if (value is bool)
return(bool)value;
if (value is SqlBoolean){
return (((SqlBoolean)value).IsTrue);
}
//check for SqlString is not added, value for true and false should be given with String, not with SqlString
if (value is string) {
try {
return Boolean.Parse((string)value);
}
catch (Exception e) {
//
if (!ADP.IsCatchableExceptionType(e)) {
throw;
}
ExceptionBuilder.TraceExceptionForCapture(e);
//
throw ExprException.DatavalueConvertion(value, typeof(bool), e);
}
}
throw ExprException.DatavalueConvertion(value, typeof(bool), null);
}
}
}
// 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
- ProcessHost.cs
- HostingEnvironment.cs
- ValidationHelpers.cs
- SystemTcpStatistics.cs
- CreateRefExpr.cs
- WindowsFormsSectionHandler.cs
- ClientSettingsProvider.cs
- DbMetaDataColumnNames.cs
- CodePropertyReferenceExpression.cs
- ClientRolePrincipal.cs
- M3DUtil.cs
- HiddenField.cs
- ProtocolsSection.cs
- OdbcCommandBuilder.cs
- TaiwanCalendar.cs
- ExchangeUtilities.cs
- KeyedHashAlgorithm.cs
- FileStream.cs
- CompositeFontInfo.cs
- DescendantOverDescendantQuery.cs
- OleDbTransaction.cs
- MembershipAdapter.cs
- ImageConverter.cs
- SrgsSemanticInterpretationTag.cs
- RegexWriter.cs
- PassportAuthentication.cs
- Processor.cs
- ExpressionBuilder.cs
- InternalBase.cs
- PrimitiveCodeDomSerializer.cs
- DataGrid.cs
- NodeCounter.cs
- RSACryptoServiceProvider.cs
- SystemResourceKey.cs
- ProfilePropertySettings.cs
- LastQueryOperator.cs
- BaseParser.cs
- PrintPreviewControl.cs
- WebControlAdapter.cs
- HybridDictionary.cs
- LinqDataSourceStatusEventArgs.cs
- EntityDataSourceColumn.cs
- DrawingContextWalker.cs
- AsynchronousChannel.cs
- NativeMethods.cs
- parserscommon.cs
- DataSetSchema.cs
- FlowLayout.cs
- xsdvalidator.cs
- DeadLetterQueue.cs
- WebBrowserProgressChangedEventHandler.cs
- PrintPreviewGraphics.cs
- RawUIStateInputReport.cs
- SafeHandles.cs
- NullRuntimeConfig.cs
- RectKeyFrameCollection.cs
- AsyncOperation.cs
- SoapReflectionImporter.cs
- EmptyReadOnlyDictionaryInternal.cs
- InvokeMethodActivityDesigner.cs
- CodeNamespaceImportCollection.cs
- InvalidFilterCriteriaException.cs
- IQueryable.cs
- CommandManager.cs
- TreeNodeSelectionProcessor.cs
- HandleCollector.cs
- SystemResources.cs
- DesignerTransactionCloseEvent.cs
- ThaiBuddhistCalendar.cs
- DeferredTextReference.cs
- ClickablePoint.cs
- Mappings.cs
- GeometryHitTestParameters.cs
- TemplateComponentConnector.cs
- DiscreteKeyFrames.cs
- AnnotationMap.cs
- followingquery.cs
- ManagementEventWatcher.cs
- CqlWriter.cs
- ActiveDocumentEvent.cs
- URLEditor.cs
- ColumnWidthChangingEvent.cs
- CheckableControlBaseAdapter.cs
- unsafeIndexingFilterStream.cs
- XmlNamespaceMapping.cs
- CatalogPartCollection.cs
- RoutedEventConverter.cs
- ApplicationDirectory.cs
- AuthenticationService.cs
- ResXResourceSet.cs
- CharUnicodeInfo.cs
- ToolBarButtonClickEvent.cs
- LabelLiteral.cs
- ArrayListCollectionBase.cs
- CompositeClientFormatter.cs
- DataRelation.cs
- FilterInvalidBodyAccessException.cs
- DataGridViewMethods.cs
- ShapeTypeface.cs
- DataGridViewColumnStateChangedEventArgs.cs