[jit] Fix the saving of the 'cfg->ret_var_set' flag when inlining, it was set to...
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / SQLiteParameter.cs
1 /********************************************************\r
2  * ADO.NET 2.0 Data Provider for SQLite Version 3.X\r
3  * Written by Robert Simpson (robert@blackcastlesoft.com)\r
4  * \r
5  * Released to the public domain, use at your own risk!\r
6  ********************************************************/\r
7 \r
8 namespace Mono.Data.Sqlite\r
9 {\r
10   using System;\r
11   using System.Data;\r
12   using System.Data.Common;\r
13   using System.ComponentModel;\r
14 \r
15   /// <summary>\r
16   /// SQLite implementation of DbParameter.\r
17   /// </summary>\r
18   public sealed class SqliteParameter : DbParameter, ICloneable\r
19   {\r
20     /// <summary>\r
21     /// The data type of the parameter\r
22     /// </summary>\r
23     internal int            _dbType;\r
24     /// <summary>\r
25     /// The version information for mapping the parameter\r
26     /// </summary>\r
27     private DataRowVersion _rowVersion;\r
28     /// <summary>\r
29     /// The value of the data in the parameter\r
30     /// </summary>\r
31     private Object         _objValue;\r
32     /// <summary>\r
33     /// The source column for the parameter\r
34     /// </summary>\r
35     private string         _sourceColumn;\r
36     /// <summary>\r
37     /// The column name\r
38     /// </summary>\r
39     private string         _parameterName;\r
40     /// <summary>\r
41     /// The data size, unused by SQLite\r
42     /// </summary>\r
43     private int            _dataSize;\r
44 \r
45     private bool           _nullable;\r
46     private bool           _nullMapping;\r
47 \r
48     /// <summary>\r
49     /// Default constructor\r
50     /// </summary>\r
51     public SqliteParameter() \r
52       : this(null, (DbType)(-1), 0, null, DataRowVersion.Current)\r
53     {\r
54     }\r
55 \r
56     /// <summary>\r
57     /// Constructs a named parameter given the specified parameter name\r
58     /// </summary>\r
59     /// <param name="parameterName">The parameter name</param>\r
60     public SqliteParameter(string parameterName)\r
61       : this(parameterName, (DbType)(-1), 0, null, DataRowVersion.Current)\r
62     {\r
63     }\r
64 \r
65     /// <summary>\r
66     /// Constructs a named parameter given the specified parameter name and initial value\r
67     /// </summary>\r
68     /// <param name="parameterName">The parameter name</param>\r
69     /// <param name="value">The initial value of the parameter</param>\r
70     public SqliteParameter(string parameterName, object value)\r
71       : this(parameterName, (DbType)(-1), 0, null, DataRowVersion.Current)\r
72     {\r
73       Value = value;\r
74     }\r
75 \r
76     /// <summary>\r
77     /// Constructs a named parameter of the specified type\r
78     /// </summary>\r
79     /// <param name="parameterName">The parameter name</param>\r
80     /// <param name="dbType">The datatype of the parameter</param>\r
81     public SqliteParameter(string parameterName, DbType dbType)\r
82       : this(parameterName, dbType, 0, null, DataRowVersion.Current)\r
83     {\r
84     }\r
85 \r
86     /// <summary>\r
87     /// Constructs a named parameter of the specified type and source column reference\r
88     /// </summary>\r
89     /// <param name="parameterName">The parameter name</param>\r
90     /// <param name="dbType">The data type</param>\r
91     /// <param name="sourceColumn">The source column</param>\r
92     public SqliteParameter(string parameterName, DbType dbType, string sourceColumn)\r
93       : this(parameterName, dbType, 0, sourceColumn, DataRowVersion.Current)\r
94     {\r
95     }\r
96 \r
97     /// <summary>\r
98     /// Constructs a named parameter of the specified type, source column and row version\r
99     /// </summary>\r
100     /// <param name="parameterName">The parameter name</param>\r
101     /// <param name="dbType">The data type</param>\r
102     /// <param name="sourceColumn">The source column</param>\r
103     /// <param name="rowVersion">The row version information</param>\r
104     public SqliteParameter(string parameterName, DbType dbType, string sourceColumn, DataRowVersion rowVersion)\r
105       : this(parameterName, dbType, 0, sourceColumn, rowVersion)\r
106     {\r
107     }\r
108 \r
109     /// <summary>\r
110     /// Constructs an unnamed parameter of the specified data type\r
111     /// </summary>\r
112     /// <param name="dbType">The datatype of the parameter</param>\r
113     public SqliteParameter(DbType dbType)\r
114       : this(null, dbType, 0, null, DataRowVersion.Current)\r
115     {\r
116     }\r
117 \r
118     /// <summary>\r
119     /// Constructs an unnamed parameter of the specified data type and sets the initial value\r
120     /// </summary>\r
121     /// <param name="dbType">The datatype of the parameter</param>\r
122     /// <param name="value">The initial value of the parameter</param>\r
123     public SqliteParameter(DbType dbType, object value)\r
124       : this(null, dbType, 0, null, DataRowVersion.Current)\r
125     {\r
126       Value = value;\r
127     }\r
128 \r
129     /// <summary>\r
130     /// Constructs an unnamed parameter of the specified data type and source column\r
131     /// </summary>\r
132     /// <param name="dbType">The datatype of the parameter</param>\r
133     /// <param name="sourceColumn">The source column</param>\r
134     public SqliteParameter(DbType dbType, string sourceColumn)\r
135       : this(null, dbType, 0, sourceColumn, DataRowVersion.Current)\r
136     {\r
137     }\r
138 \r
139     /// <summary>\r
140     /// Constructs an unnamed parameter of the specified data type, source column and row version\r
141     /// </summary>\r
142     /// <param name="dbType">The data type</param>\r
143     /// <param name="sourceColumn">The source column</param>\r
144     /// <param name="rowVersion">The row version information</param>\r
145     public SqliteParameter(DbType dbType, string sourceColumn, DataRowVersion rowVersion)\r
146       : this(null, dbType, 0, sourceColumn, rowVersion)\r
147     {\r
148     }\r
149 \r
150     /// <summary>\r
151     /// Constructs a named parameter of the specified type and size\r
152     /// </summary>\r
153     /// <param name="parameterName">The parameter name</param>\r
154     /// <param name="parameterType">The data type</param>\r
155     /// <param name="parameterSize">The size of the parameter</param>\r
156     public SqliteParameter(string parameterName, DbType parameterType, int parameterSize)\r
157       : this(parameterName, parameterType, parameterSize, null, DataRowVersion.Current)\r
158     {\r
159     }\r
160 \r
161     /// <summary>\r
162     /// Constructs a named parameter of the specified type, size and source column\r
163     /// </summary>\r
164     /// <param name="parameterName">The name of the parameter</param>\r
165     /// <param name="parameterType">The data type</param>\r
166     /// <param name="parameterSize">The size of the parameter</param>\r
167     /// <param name="sourceColumn">The source column</param>\r
168     public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn)\r
169       : this(parameterName, parameterType, parameterSize, sourceColumn, DataRowVersion.Current)\r
170     {\r
171     }\r
172 \r
173     /// <summary>\r
174     /// Constructs a named parameter of the specified type, size, source column and row version\r
175     /// </summary>\r
176     /// <param name="parameterName">The name of the parameter</param>\r
177     /// <param name="parameterType">The data type</param>\r
178     /// <param name="parameterSize">The size of the parameter</param>\r
179     /// <param name="sourceColumn">The source column</param>\r
180     /// <param name="rowVersion">The row version information</param>\r
181     public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion)      \r
182     {\r
183       _parameterName = parameterName;\r
184       _dbType = (int)parameterType;\r
185       _sourceColumn = sourceColumn;\r
186       _rowVersion = rowVersion;\r
187       _objValue = null;\r
188       _dataSize = parameterSize;\r
189       _nullMapping = false;\r
190       _nullable = true;\r
191     }\r
192 \r
193     private SqliteParameter(SqliteParameter source)\r
194       : this(source.ParameterName, (DbType)source._dbType, 0, source.Direction, source.IsNullable, 0, 0, source.SourceColumn, source.SourceVersion, source.Value)\r
195     {\r
196       _nullMapping = source._nullMapping;\r
197     }\r
198 \r
199     /// <summary>\r
200     /// Constructs a named parameter of the specified type, size, source column and row version\r
201     /// </summary>\r
202     /// <param name="parameterName">The name of the parameter</param>\r
203     /// <param name="parameterType">The data type</param>\r
204     /// <param name="parameterSize">The size of the parameter</param>\r
205     /// <param name="direction">Only input parameters are supported in SQLite</param>\r
206     /// <param name="isNullable">Ignored</param>\r
207     /// <param name="precision">Ignored</param>\r
208     /// <param name="scale">Ignored</param>\r
209     /// <param name="sourceColumn">The source column</param>\r
210     /// <param name="rowVersion">The row version information</param>\r
211     /// <param name="value">The initial value to assign the parameter</param>   \r
212 #if !PLATFORM_COMPACTFRAMEWORK\r
213     [EditorBrowsable(EditorBrowsableState.Advanced)]\r
214 #endif\r
215     public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, object value)\r
216       : this(parameterName, parameterType, parameterSize, sourceColumn, rowVersion)\r
217     {\r
218       Direction = direction;\r
219       IsNullable = isNullable;\r
220       Value = value;\r
221     }\r
222 \r
223     /// <summary>\r
224     /// Constructs a named parameter, yet another flavor\r
225     /// </summary>\r
226     /// <param name="parameterName">The name of the parameter</param>\r
227     /// <param name="parameterType">The data type</param>\r
228     /// <param name="parameterSize">The size of the parameter</param>\r
229     /// <param name="direction">Only input parameters are supported in SQLite</param>\r
230     /// <param name="precision">Ignored</param>\r
231     /// <param name="scale">Ignored</param>\r
232     /// <param name="sourceColumn">The source column</param>\r
233     /// <param name="rowVersion">The row version information</param>\r
234     /// <param name="sourceColumnNullMapping">Whether or not this parameter is for comparing NULL's</param>\r
235     /// <param name="value">The intial value to assign the parameter</param>\r
236 #if !PLATFORM_COMPACTFRAMEWORK\r
237     [EditorBrowsable(EditorBrowsableState.Advanced)]\r
238 #endif\r
239     public SqliteParameter(string parameterName, DbType parameterType, int parameterSize, ParameterDirection direction, byte precision, byte scale, string sourceColumn, DataRowVersion rowVersion, bool sourceColumnNullMapping, object value)\r
240       : this(parameterName, parameterType, parameterSize, sourceColumn, rowVersion)\r
241     {\r
242       Direction = direction;\r
243       SourceColumnNullMapping = sourceColumnNullMapping;\r
244       Value = value;\r
245     }\r
246 \r
247     /// <summary>\r
248     /// Constructs an unnamed parameter of the specified type and size\r
249     /// </summary>\r
250     /// <param name="parameterType">The data type</param>\r
251     /// <param name="parameterSize">The size of the parameter</param>\r
252     public SqliteParameter(DbType parameterType, int parameterSize)\r
253       : this(null, parameterType, parameterSize, null, DataRowVersion.Current)\r
254     {\r
255     }\r
256 \r
257     /// <summary>\r
258     /// Constructs an unnamed parameter of the specified type, size, and source column\r
259     /// </summary>\r
260     /// <param name="parameterType">The data type</param>\r
261     /// <param name="parameterSize">The size of the parameter</param>\r
262     /// <param name="sourceColumn">The source column</param>\r
263     public SqliteParameter(DbType parameterType, int parameterSize, string sourceColumn)\r
264       : this(null, parameterType, parameterSize, sourceColumn, DataRowVersion.Current)\r
265     {\r
266     }\r
267 \r
268     /// <summary>\r
269     /// Constructs an unnamed parameter of the specified type, size, source column and row version\r
270     /// </summary>\r
271     /// <param name="parameterType">The data type</param>\r
272     /// <param name="parameterSize">The size of the parameter</param>\r
273     /// <param name="sourceColumn">The source column</param>\r
274     /// <param name="rowVersion">The row version information</param>\r
275     public SqliteParameter(DbType parameterType, int parameterSize, string sourceColumn, DataRowVersion rowVersion)\r
276       : this(null, parameterType, parameterSize, sourceColumn, rowVersion)\r
277     {\r
278     }\r
279 \r
280     /// <summary>\r
281     /// Whether or not the parameter can contain a null value\r
282     /// </summary>\r
283     public override bool IsNullable\r
284     {\r
285       get\r
286       {\r
287         return _nullable;\r
288       }\r
289       set \r
290       {\r
291         _nullable = value;\r
292       }\r
293     }\r
294 \r
295     /// <summary>\r
296     /// Returns the datatype of the parameter\r
297     /// </summary>\r
298 #if !PLATFORM_COMPACTFRAMEWORK\r
299     [DbProviderSpecificTypeProperty(true)]\r
300     [RefreshProperties(RefreshProperties.All)]\r
301 #endif\r
302     public override DbType DbType\r
303     {\r
304       get\r
305       {\r
306         if (_dbType == -1)\r
307         {\r
308           if (_objValue != null && _objValue != DBNull.Value)\r
309           {\r
310             return SqliteConvert.TypeToDbType(_objValue.GetType());\r
311           }\r
312           return DbType.String; // Unassigned default value is String\r
313         }\r
314         return (DbType)_dbType;\r
315       }\r
316       set\r
317       {\r
318         _dbType = (int)value;\r
319       }\r
320     }\r
321 \r
322     /// <summary>\r
323     /// Supports only input parameters\r
324     /// </summary>\r
325     public override ParameterDirection Direction\r
326     {\r
327       get\r
328       {\r
329         return ParameterDirection.Input;\r
330       }\r
331       set\r
332       {\r
333         if (value != ParameterDirection.Input)\r
334           throw new NotSupportedException();\r
335       }\r
336     }\r
337 \r
338     /// <summary>\r
339     /// Returns the parameter name\r
340     /// </summary>\r
341     public override string ParameterName\r
342     {\r
343       get\r
344       {\r
345         return _parameterName;\r
346       }\r
347       set\r
348       {\r
349         _parameterName = value;\r
350       }\r
351     }\r
352 \r
353     /// <summary>\r
354     /// Resets the DbType of the parameter so it can be inferred from the value\r
355     /// </summary>\r
356     public override void ResetDbType()\r
357     {\r
358       _dbType = -1;\r
359     }\r
360 \r
361     /// <summary>\r
362     /// Returns the size of the parameter\r
363     /// </summary>\r
364 #if !PLATFORM_COMPACTFRAMEWORK\r
365     [DefaultValue((int)0)]\r
366 #endif\r
367     public override int Size\r
368     {\r
369       get\r
370       {\r
371         return _dataSize;\r
372       }\r
373       set\r
374       {\r
375         _dataSize = value;\r
376       }\r
377     }\r
378 \r
379     /// <summary>\r
380     /// Gets/sets the source column\r
381     /// </summary>\r
382     public override string SourceColumn\r
383     {\r
384       get\r
385       {\r
386         return _sourceColumn;\r
387       }\r
388       set\r
389       {\r
390         _sourceColumn = value;\r
391       }\r
392     }\r
393 \r
394     /// <summary>\r
395     /// Used by DbCommandBuilder to determine the mapping for nullable fields\r
396     /// </summary>\r
397     public override bool SourceColumnNullMapping\r
398     {\r
399       get\r
400       {\r
401         return _nullMapping;\r
402       }\r
403       set\r
404       {\r
405         _nullMapping = value;\r
406       }\r
407     }\r
408 \r
409     /// <summary>\r
410     /// Gets and sets the row version\r
411     /// </summary>\r
412     public override DataRowVersion SourceVersion\r
413     {\r
414       get\r
415       {\r
416         return _rowVersion;\r
417       }\r
418       set\r
419       {\r
420         _rowVersion = value;\r
421       }\r
422     }\r
423 \r
424     /// <summary>\r
425     /// Gets and sets the parameter value.  If no datatype was specified, the datatype will assume the type from the value given.\r
426     /// </summary>\r
427 #if !PLATFORM_COMPACTFRAMEWORK\r
428     [TypeConverter(typeof(StringConverter)), RefreshProperties(RefreshProperties.All)]\r
429 #endif\r
430     public override object Value\r
431     {\r
432       get\r
433       {\r
434         return _objValue;\r
435       }\r
436       set\r
437       {\r
438         _objValue = value;\r
439         if (_dbType == -1 && _objValue != null && _objValue != DBNull.Value) // If the DbType has never been assigned, try to glean one from the value's datatype \r
440           _dbType = (int)SqliteConvert.TypeToDbType(_objValue.GetType());\r
441       }\r
442     }\r
443 \r
444     /// <summary>\r
445     /// Clones a parameter\r
446     /// </summary>\r
447     /// <returns>A new, unassociated SqliteParameter</returns>\r
448     public object Clone()\r
449     {\r
450       SqliteParameter newparam = new SqliteParameter(this);\r
451 \r
452       return newparam;\r
453     }\r
454   }\r
455 }\r