Merging from head
[beagle.git] / beagled / Mono.Data.SqliteClient / SqliteParameterCollection.cs
blob928ee232aa1777afd150fa11533db95b8e507a3b
1 //
2 // Mono.Data.SqliteClient.SqliteParameterCollection.cs
3 //
4 // Represents a collection of parameters relevant to a SqliteCommand as well as
5 // their respective mappings to columns in a DataSet.
6 //
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:
22 //
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 //
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.
35 using System;
36 using System.Data;
37 using System.Collections;
39 namespace Mono.Data.SqliteClient
41 public class SqliteParameterCollection : IDataParameterCollection, IList
44 #region Fields
46 ArrayList numeric_param_list = new ArrayList();
47 Hashtable named_param_hash = new Hashtable();
49 #endregion
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;
76 while (index > 0)
78 name = ":" + index.ToString();
79 if (this.IndexOf(name) == -1)
80 index = -1;
81 else
82 index++;
84 return name;
87 #endregion
89 #region Properties
91 object IList.this[int index] {
92 get
94 return this[index];
96 set
98 CheckSqliteParam (value);
99 this[index] = (SqliteParameter) value;
103 object IDataParameterCollection.this[string parameterName] {
104 get
106 return this[parameterName];
108 set
110 CheckSqliteParam (value);
111 this[parameterName] = (SqliteParameter) value;
115 private bool isPrefixed (string parameterName)
117 return parameterName.Length > 1 && (parameterName[0] == ':' || parameterName[0] == '$');
120 public SqliteParameter this[string parameterName]
122 get
124 if (this.Contains(parameterName))
125 return this[(int) named_param_hash[parameterName]];
126 else if (isPrefixed(parameterName) && this.Contains(parameterName.Substring(1)))
127 return this[(int) named_param_hash[parameterName.Substring(1)]];
128 else
129 throw new IndexOutOfRangeException("The specified name does not exist: " + parameterName);
133 if (this.Contains(parameterName))
134 numeric_param_list[(int) named_param_hash[parameterName]] = value;
135 else if (parameterName.Length > 1 && this.Contains(parameterName.Substring(1)))
136 numeric_param_list[(int) named_param_hash[parameterName.Substring(1)]] = value;
137 else
138 throw new IndexOutOfRangeException("The specified name does not exist: " + parameterName);
142 public SqliteParameter this[int parameterIndex]
146 if (this.Count >= parameterIndex+1)
147 return (SqliteParameter) numeric_param_list[parameterIndex];
148 else
149 throw new IndexOutOfRangeException("The specified parameter index does not exist: " + parameterIndex.ToString());
153 if (this.Count >= parameterIndex+1)
154 numeric_param_list[parameterIndex] = value;
155 else
156 throw new IndexOutOfRangeException("The specified parameter index does not exist: " + parameterIndex.ToString());
161 public int Count
165 return this.numeric_param_list.Count;
169 bool IList.IsFixedSize
173 return this.numeric_param_list.IsFixedSize;
177 bool IList.IsReadOnly
181 return this.numeric_param_list.IsReadOnly;
186 bool ICollection.IsSynchronized
190 return this.numeric_param_list.IsSynchronized;
195 object ICollection.SyncRoot
199 return this.numeric_param_list.SyncRoot;
203 #endregion
205 #region Public Methods
207 public int Add (object value)
209 CheckSqliteParam (value);
210 SqliteParameter sqlp = value as SqliteParameter;
211 if (named_param_hash.Contains (sqlp.ParameterName))
212 throw new DuplicateNameException ("Parameter collection already contains the a SqliteParameter with the given ParameterName.");
213 named_param_hash[sqlp.ParameterName] = numeric_param_list.Add(value);
214 return (int) named_param_hash[sqlp.ParameterName];
217 public SqliteParameter Add (SqliteParameter param)
219 Add ((object)param);
220 return param;
223 public SqliteParameter Add (string name, object value)
225 return Add (new SqliteParameter (name, value));
228 public SqliteParameter Add (string name, DbType type)
230 return Add (new SqliteParameter (name, type));
233 public void Clear ()
235 numeric_param_list.Clear ();
236 named_param_hash.Clear ();
239 public void CopyTo (Array array, int index)
241 this.numeric_param_list.CopyTo(array, index);
244 bool IList.Contains (object value)
246 return Contains ((SqliteParameter) value);
249 public bool Contains (string parameterName)
251 return named_param_hash.Contains (parameterName);
254 public bool Contains (SqliteParameter param)
256 return Contains (param.ParameterName);
259 public IEnumerator GetEnumerator ()
261 return this.numeric_param_list.GetEnumerator();
264 int IList.IndexOf (object param)
266 return IndexOf ((SqliteParameter) param);
269 public int IndexOf (string parameterName)
271 if (named_param_hash.Contains(parameterName))
272 return (int) named_param_hash[parameterName];
273 else
274 return -1;
277 public int IndexOf (SqliteParameter param)
279 return IndexOf (param.ParameterName);
282 public void Insert (int index, object value)
284 CheckSqliteParam (value);
285 if (numeric_param_list.Count == index)
287 Add (value);
288 return;
291 numeric_param_list.Insert (index, value);
292 RecreateNamedHash ();
295 public void Remove (object value)
297 CheckSqliteParam (value);
298 RemoveAt ((SqliteParameter) value);
301 public void RemoveAt (int index)
303 RemoveAt (((SqliteParameter) numeric_param_list[index]).ParameterName);
306 public void RemoveAt (string parameterName)
308 if (!named_param_hash.Contains (parameterName))
309 throw new ApplicationException ("Parameter " + parameterName + " not found");
311 numeric_param_list.RemoveAt ((int) named_param_hash[parameterName]);
312 named_param_hash.Remove (parameterName);
314 RecreateNamedHash ();
317 public void RemoveAt (SqliteParameter param)
319 RemoveAt (param.ParameterName);
322 #endregion