2 // Mono.Data.Sqlite.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.Sqlite
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 private bool isPrefixed (string parameterName)
117 return parameterName.Length > 1 && (parameterName[0] == ':' || parameterName[0] == '$');
120 SqliteParameter GetParameter (int parameterIndex)
122 if (this.Count >= parameterIndex+1)
123 return (SqliteParameter) numeric_param_list[parameterIndex];
125 throw new IndexOutOfRangeException("The specified parameter index does not exist: " + parameterIndex.ToString());
128 SqliteParameter GetParameter (string parameterName)
130 if (this.Contains(parameterName))
131 return this[(int) named_param_hash[parameterName]];
132 else if (isPrefixed(parameterName) && this.Contains(parameterName.Substring(1)))
133 return this[(int) named_param_hash[parameterName.Substring(1)]];
135 throw new IndexOutOfRangeException("The specified name does not exist: " + parameterName);
138 void SetParameter (int parameterIndex, SqliteParameter parameter)
140 if (this.Count >= parameterIndex+1)
141 numeric_param_list[parameterIndex] = parameter;
143 throw new IndexOutOfRangeException("The specified parameter index does not exist: " + parameterIndex.ToString());
146 void SetParameter (string parameterName, SqliteParameter parameter)
148 if (this.Contains(parameterName))
149 numeric_param_list[(int) named_param_hash[parameterName]] = parameter;
150 else if (parameterName.Length > 1 && this.Contains(parameterName.Substring(1)))
151 numeric_param_list[(int) named_param_hash[parameterName.Substring(1)]] = parameter;
153 throw new IndexOutOfRangeException("The specified name does not exist: " + parameterName);
156 public SqliteParameter this[string parameterName]
158 get { return GetParameter (parameterName); }
159 set { SetParameter (parameterName, value); }
162 public SqliteParameter this[int parameterIndex]
164 get { return GetParameter (parameterIndex); }
165 set { SetParameter (parameterIndex, value); }
169 get { return this.numeric_param_list.Count; }
172 bool IList.IsFixedSize
176 return this.numeric_param_list.IsFixedSize;
180 bool IList.IsReadOnly {
181 get { return this.numeric_param_list.IsReadOnly; }
185 bool ICollection.IsSynchronized {
186 get { return this.numeric_param_list.IsSynchronized; }
189 object ICollection.SyncRoot {
190 get { return this.numeric_param_list.SyncRoot; }
195 #region Public Methods
197 public int Add (object value)
199 CheckSqliteParam (value);
200 SqliteParameter sqlp = value as SqliteParameter;
201 if (named_param_hash.Contains (sqlp.ParameterName))
202 throw new DuplicateNameException ("Parameter collection already contains the a SqliteParameter with the given ParameterName.");
203 named_param_hash[sqlp.ParameterName] = numeric_param_list.Add(value);
204 return (int) named_param_hash[sqlp.ParameterName];
207 public SqliteParameter Add (SqliteParameter param)
213 public SqliteParameter Add (string name, object value)
215 return Add (new SqliteParameter (name, value));
218 public SqliteParameter Add (string name, DbType type)
220 return Add (new SqliteParameter (name, type));
225 numeric_param_list.Clear ();
226 named_param_hash.Clear ();
229 public void CopyTo (Array array, int index)
231 this.numeric_param_list.CopyTo(array, index);
234 bool IList.Contains (object value)
236 return Contains ((SqliteParameter) value);
239 public bool Contains (string parameterName)
241 return named_param_hash.Contains (parameterName);
244 public bool Contains (SqliteParameter param)
246 return Contains (param.ParameterName);
249 public IEnumerator GetEnumerator ()
251 return this.numeric_param_list.GetEnumerator();
254 int IList.IndexOf (object param)
256 return IndexOf ((SqliteParameter) param);
259 public int IndexOf (string parameterName)
261 if (isPrefixed (parameterName)){
262 string sub = parameterName.Substring (1);
263 if (named_param_hash.Contains(sub))
264 return (int) named_param_hash [sub];
266 if (named_param_hash.Contains(parameterName))
267 return (int) named_param_hash[parameterName];
272 public int IndexOf (SqliteParameter param)
274 return IndexOf (param.ParameterName);
277 public void Insert (int index, object value)
279 CheckSqliteParam (value);
280 if (numeric_param_list.Count == index)
286 numeric_param_list.Insert (index, value);
287 RecreateNamedHash ();
290 public void Remove (object value)
292 CheckSqliteParam (value);
293 RemoveAt ((SqliteParameter) value);
296 public void RemoveAt (int index)
298 RemoveAt (((SqliteParameter) numeric_param_list[index]).ParameterName);
301 public void RemoveAt (string parameterName)
303 if (!named_param_hash.Contains (parameterName))
304 throw new ApplicationException ("Parameter " + parameterName + " not found");
306 numeric_param_list.RemoveAt ((int) named_param_hash[parameterName]);
307 named_param_hash.Remove (parameterName);
309 RecreateNamedHash ();
312 public void RemoveAt (SqliteParameter param)
314 RemoveAt (param.ParameterName);