2 // Mono.Data.SqliteClient.SqliteParameterCollection.cs
4 // Represents a collection of parameters relevant to a SqliteCommand as well as
5 // their respective mappings to columns in a DataSet.
7 //Author(s): Vladimir Vukicevic <vladimir@pobox.com>
8 // Everaldo Canuto <everaldo_canuto@yahoo.com.br>
9 // Chris Turchin <chris@turchin.net>
10 // Jeroen Zwartepoorte <jeroen@xs4all.nl>
11 // Thomas Zoechling <thomas.zoechling@gmx.at>
13 // Copyright (C) 2002 Vladimir Vukicevic
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 using System.Collections;
39 namespace Mono.Data.SqliteClient
41 public class SqliteParameterCollection : IDataParameterCollection, IList
46 ArrayList numeric_param_list = new ArrayList();
47 Hashtable named_param_hash = new Hashtable();
51 #region Private Methods
53 private void CheckSqliteParam (object value)
55 if (!(value is SqliteParameter))
56 throw new InvalidCastException ("Can only use SqliteParameter objects");
57 SqliteParameter sqlp = value as SqliteParameter;
58 if (sqlp.ParameterName == null || sqlp.ParameterName.Length == 0)
59 sqlp.ParameterName = this.GenerateParameterName();
62 private void RecreateNamedHash ()
64 for (int i = 0; i < numeric_param_list.Count; i++)
66 named_param_hash[((SqliteParameter) numeric_param_list[i]).ParameterName] = i;
70 //FIXME: if the user is calling Insert at various locations with unnamed parameters, this is not going to work....
71 private string GenerateParameterName()
73 int index = this.Count + 1;
74 string name = String.Empty;
78 name = ":" + index.ToString();
79 if (this.IndexOf(name) == -1)
91 object IList.this[int index] {
98 CheckSqliteParam (value);
99 this[index] = (SqliteParameter) value;
103 object IDataParameterCollection.this[string parameterName] {
106 return this[parameterName];
110 CheckSqliteParam (value);
111 this[parameterName] = (SqliteParameter) value;
115 public SqliteParameter this[string parameterName]
119 if (this.Contains(parameterName))
120 return this[(int) named_param_hash[parameterName]];
122 throw new IndexOutOfRangeException("The specified name does not exist: " + parameterName);
126 if (this.Contains(parameterName))
127 numeric_param_list[(int) named_param_hash[parameterName]] = value;
129 throw new IndexOutOfRangeException("The specified name does not exist: " + parameterName);
133 public SqliteParameter this[int parameterIndex]
137 if (this.Count >= parameterIndex+1)
138 return (SqliteParameter) numeric_param_list[parameterIndex];
140 throw new IndexOutOfRangeException("The specified parameter index does not exist: " + parameterIndex.ToString());
144 if (this.Count >= parameterIndex+1)
145 numeric_param_list[parameterIndex] = value;
147 throw new IndexOutOfRangeException("The specified parameter index does not exist: " + parameterIndex.ToString());
156 return this.numeric_param_list.Count;
160 bool IList.IsFixedSize
164 return this.numeric_param_list.IsFixedSize;
168 bool IList.IsReadOnly
172 return this.numeric_param_list.IsReadOnly;
177 bool ICollection.IsSynchronized
181 return this.numeric_param_list.IsSynchronized;
186 object ICollection.SyncRoot
190 return this.numeric_param_list.SyncRoot;
196 #region Public Methods
198 public int Add (object value)
200 CheckSqliteParam (value);
201 SqliteParameter sqlp = value as SqliteParameter;
202 if (named_param_hash.Contains (sqlp.ParameterName))
203 throw new DuplicateNameException ("Parameter collection already contains the a SqliteParameter with the given ParameterName.");
204 named_param_hash[sqlp.ParameterName] = numeric_param_list.Add(value);
205 return (int) named_param_hash[sqlp.ParameterName];
208 public SqliteParameter Add (SqliteParameter param)
214 public SqliteParameter Add (string name, object value)
216 return Add (new SqliteParameter (name, value));
219 public SqliteParameter Add (string name, DbType type)
221 return Add (new SqliteParameter (name, type));
226 numeric_param_list.Clear ();
227 named_param_hash.Clear ();
230 public void CopyTo (Array array, int index)
232 this.numeric_param_list.CopyTo(array, index);
235 bool IList.Contains (object value)
237 return Contains ((SqliteParameter) value);
240 public bool Contains (string parameterName)
242 return named_param_hash.Contains (parameterName);
245 public bool Contains (SqliteParameter param)
247 return Contains (param.ParameterName);
250 public IEnumerator GetEnumerator ()
252 return this.numeric_param_list.GetEnumerator();
255 int IList.IndexOf (object param)
257 return IndexOf ((SqliteParameter) param);
260 public int IndexOf (string parameterName)
262 if (named_param_hash.Contains(parameterName))
263 return (int) named_param_hash[parameterName];
268 public int IndexOf (SqliteParameter param)
270 return IndexOf (param.ParameterName);
273 public void Insert (int index, object value)
275 CheckSqliteParam (value);
276 if (numeric_param_list.Count == index)
282 numeric_param_list.Insert (index, value);
283 RecreateNamedHash ();
286 public void Remove (object value)
288 CheckSqliteParam (value);
289 RemoveAt ((SqliteParameter) value);
292 public void RemoveAt (int index)
294 RemoveAt (((SqliteParameter) numeric_param_list[index]).ParameterName);
297 public void RemoveAt (string parameterName)
299 if (!named_param_hash.Contains (parameterName))
300 throw new ApplicationException ("Parameter " + parameterName + " not found");
302 numeric_param_list.RemoveAt ((int) named_param_hash[parameterName]);
303 named_param_hash.Remove (parameterName);
305 RecreateNamedHash ();
308 public void RemoveAt (SqliteParameter param)
310 RemoveAt (param.ParameterName);