|
//------------------------------------------------------------------------------
// <copyright file="DataError.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
// <owner current="true" primary="true">Microsoft</owner>
// <owner current="true" primary="false">Microsoft</owner>
// <owner current="false" primary="false">Microsoft</owner>
//------------------------------------------------------------------------------
namespace System.Data {
using System;
using System.Diagnostics;
/// <devdoc>
/// <para>Represents an custom error that can be associated with a <see cref='System.Data.DataRow'/>.</para>
/// </devdoc>
internal sealed class DataError {
private string rowError = String.Empty;
// column-level errors
private int count;
private ColumnError[] errorList;
internal const int initialCapacity = 1;
internal DataError() {
}
internal DataError(string rowError) {
SetText(rowError);
}
internal string Text {
get {
return rowError;
}
set {
SetText(value);
}
}
internal bool HasErrors {
get {
return(rowError.Length != 0 || count != 0);
}
}
//
// this method resets the error to the new value.
//
internal void SetColumnError(DataColumn column, string error) {
Debug.Assert(column != null, "Invalid (null) argument");
Debug.Assert(column.Table != null, "Invalid (loose) column");
if (error == null || error.Length == 0) {
// remove error from the collection
Clear(column);
}
else {
if (errorList == null) {
errorList = new ColumnError[initialCapacity];
}
int i = IndexOf(column);
errorList[i].column = column;
errorList[i].error = error;
column.errors++;
if (i == count)
count++;
}
}
internal string GetColumnError(DataColumn column) {
for (int i = 0; i < count; i++) {
if (errorList[i].column == column) {
return errorList[i].error;
}
}
return String.Empty;
}
internal void Clear(DataColumn column) {
if (count == 0)
return;
for (int i = 0; i < count; i++) {
if (errorList[i].column == column) {
System.Array.Copy(errorList, i+1, errorList, i, count-i-1);
count--;
column.errors--;
Debug.Assert(column.errors >= 0, "missing error counts");
}
}
}
internal void Clear() {
for (int i = 0; i < count; i++) {
errorList[i].column.errors--;
Debug.Assert(errorList[i].column.errors >= 0, "missing error counts");
}
count = 0;
rowError = String.Empty;
}
internal DataColumn[] GetColumnsInError() {
DataColumn[] cols = new DataColumn[count];
for (int i = 0; i < count; i++) {
cols[i] = errorList[i].column;
}
return cols;
}
/// <devdoc>
/// <para>Sets the error message for the <see cref='System.Data.DataError'/>.</para>
/// </devdoc>
private void SetText(string errorText) {
if (null == errorText) {
errorText = String.Empty;
}
rowError = errorText;
}
internal int IndexOf (DataColumn column) {
// try to find the column
for (int i = 0; i < count; i++) {
if (errorList[i].column == column) {
return i;
}
}
if (count >= errorList.Length) {
int newCapacity = Math.Min(count*2, column.Table.Columns.Count);
ColumnError[] biggerList = new ColumnError[newCapacity];
System.Array.Copy(errorList, 0, biggerList, 0, count);
errorList = biggerList;
}
return count;
}
internal struct ColumnError {
internal DataColumn column;
internal string error;
};
}
}
|