/*
* Firebird ADO.NET Data provider for .NET and Mono
*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.firebirdsql.org/index.php?op=doc&id=idpl
*
* Software distributed under the License is distributed on
* an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for the specific
* language governing rights and limitations under the License.
*
* Copyright (c) 2002, 2005 Carlos Guzman Alvarez
* All Rights Reserved.
*/
using System;
using System.Data;
using System.ComponentModel;
using System.Collections;
using System.Globalization;
using FirebirdSql.Data.Common;
namespace FirebirdSql.Data.Firebird
{
///
#if (NET)
[ListBindable(false)]
[Editor(typeof(Design.FbParameterCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))]
#endif
public sealed class FbParameterCollection : MarshalByRefObject, IDataParameterCollection, IList, ICollection, IEnumerable
{
#region Fields
private ArrayList parameters;
#endregion
#region Indexers
///
#if (!NETCF)
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
#endif
public FbParameter this[string parameterName]
{
get { return (FbParameter)this[this.IndexOf(parameterName)]; }
set { this[this.IndexOf(parameterName)] = (FbParameter)value; }
}
object IDataParameterCollection.this[string parameterName]
{
get { return this[parameterName]; }
set { this[parameterName] = (FbParameter)value; }
}
///
#if (!NETCF)
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
#endif
public FbParameter this[int index]
{
get { return (FbParameter)this.parameters[index]; }
set { this.parameters[index] = (FbParameter)value; }
}
object IList.this[int index]
{
get { return (FbParameter)this[index]; }
set { this[index] = (FbParameter)value; }
}
#endregion
#region Constructors
internal FbParameterCollection()
{
this.parameters = ArrayList.Synchronized(new ArrayList());
}
#endregion
#region IList Properties
bool IList.IsFixedSize
{
get { return this.parameters.IsFixedSize; }
}
bool IList.IsReadOnly
{
get { return this.parameters.IsReadOnly; }
}
#endregion
#region ICollection Properties
///
#if (!NETCF)
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
#endif
public int Count
{
get { return this.parameters.Count; }
}
bool ICollection.IsSynchronized
{
get { return this.parameters.IsSynchronized; }
}
object ICollection.SyncRoot
{
get { return this.parameters.SyncRoot; }
}
#endregion
#region ICollection Methods
///
public void CopyTo(Array array, int index)
{
this.parameters.CopyTo(array, index);
}
#endregion
#region IList Methods
///
public void Clear()
{
this.parameters.Clear();
}
#endregion
#region IEnumerable Methods
///
public IEnumerator GetEnumerator()
{
return this.parameters.GetEnumerator();
}
#endregion
#region Methods
///
public bool Contains(object value)
{
return this.parameters.Contains(value);
}
///
public bool Contains(string parameterName)
{
return (-1 != this.IndexOf(parameterName));
}
///
public int IndexOf(object value)
{
return this.parameters.IndexOf(value);
}
///
public int IndexOf(string parameterName)
{
int index = 0;
foreach (FbParameter item in this.parameters)
{
if (GlobalizationHelper.CultureAwareCompare(item.ParameterName, parameterName))
{
return index;
}
index++;
}
return -1;
}
///
public void Insert(int index, object value)
{
this.parameters.Insert(index, value);
}
///
public void Remove(object value)
{
if (!(value is FbParameter))
{
throw new InvalidCastException("The parameter passed was not a FbParameter.");
}
if (!this.Contains(value))
{
throw new SystemException("The parameter does not exist in the collection.");
}
this.parameters.Remove(value);
((FbParameter)value).Parent = null;
}
///
public void RemoveAt(int index)
{
if (index < 0 || index > this.Count)
{
throw new IndexOutOfRangeException("The specified index does not exist.");
}
FbParameter parameter = this[index];
this.parameters.RemoveAt(index);
parameter.Parent = null;
}
///
public void RemoveAt(string parameterName)
{
this.RemoveAt(this.IndexOf(parameterName));
}
///
public FbParameter Add(string parameterName, object value)
{
FbParameter param = new FbParameter(parameterName, value);
return this.Add(param);
}
///
public FbParameter Add(string parameterName, FbDbType type)
{
FbParameter param = new FbParameter(parameterName, type);
return this.Add(param);
}
///
public FbParameter Add(string parameterName, FbDbType fbType, int size)
{
FbParameter param = new FbParameter(parameterName, fbType, size);
return this.Add(param);
}
///
public FbParameter Add(
string parameterName, FbDbType fbType, int size, string sourceColumn)
{
FbParameter param = new FbParameter(parameterName, fbType, size, sourceColumn);
return this.Add(param);
}
///
public int Add(object value)
{
if (!(value is FbParameter))
{
throw new InvalidCastException("The parameter passed was not a FbParameter.");
}
return this.IndexOf(this.Add(value as FbParameter));
}
///
public FbParameter Add(FbParameter value)
{
lock (this.parameters.SyncRoot)
{
if (value == null)
{
throw new ArgumentException("The value parameter is null.");
}
if (value.Parent != null)
{
throw new ArgumentException("The FbParameter specified in the value parameter is already added to this or another FbParameterCollection.");
}
if (value.ParameterName == null ||
value.ParameterName.Length == 0)
{
value.ParameterName = this.GenerateParameterName();
}
else
{
if (this.IndexOf(value) != -1)
{
throw new ArgumentException("FbParameterCollection already contains FbParameter with ParameterName '" + value.ParameterName + "'.");
}
}
this.parameters.Add(value);
return value;
}
}
#endregion
#region Private Methods
private string GenerateParameterName()
{
int index = this.Count + 1;
string name = String.Empty;
while (index > 0)
{
name = "Parameter" + index.ToString(CultureInfo.InvariantCulture);
if (this.IndexOf(name) == -1)
{
index = -1;
}
else
{
index++;
}
}
return name;
}
#endregion
}
}