bde7bdeb3dafee0e39a050753dff01fdc5887be8
[mono.git] / mcs / class / Mono.Data.Sqlite / Mono.Data.Sqlite_2.0 / UnsafeNativeMethods.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.Security;\r
12   using System.Runtime.InteropServices;\r
13 \r
14 #if !PLATFORM_COMPACTFRAMEWORK\r
15   [SuppressUnmanagedCodeSecurity]\r
16 #endif\r
17   internal static class UnsafeNativeMethods\r
18   {\r
19 #if !SQLITE_STANDARD\r
20 \r
21 #if !USE_INTEROP_DLL\r
22 \r
23 #if !PLATFORM_COMPACTFRAMEWORK\r
24     private const string SQLITE_DLL = "Mono.Data.Sqlite.DLL";\r
25 #else\r
26     internal const string SQLITE_DLL = "SQLite.Interop.061.DLL";\r
27 #endif // PLATFORM_COMPACTFRAMEWORK\r
28 \r
29 #else\r
30     private const string SQLITE_DLL = "SQLite.Interop.DLL";\r
31 #endif // USE_INTEROP_DLL\r
32 \r
33 #else\r
34     private const string SQLITE_DLL = "sqlite3";\r
35 #endif\r
36 \r
37     // This section uses interop calls that also fetch text length to optimize conversion.  \r
38     // When using the standard dll, we can replace these calls with normal sqlite calls and do unoptimized conversions instead afterwards\r
39     #region interop added textlength calls\r
40 \r
41 #if !SQLITE_STANDARD\r
42     [DllImport(SQLITE_DLL)]\r
43     internal static extern IntPtr sqlite3_bind_parameter_name_interop(IntPtr stmt, int index, out int len);\r
44 \r
45     [DllImport(SQLITE_DLL)]\r
46     internal static extern IntPtr sqlite3_column_database_name_interop(IntPtr stmt, int index, out int len);\r
47 \r
48     [DllImport(SQLITE_DLL)]\r
49     internal static extern IntPtr sqlite3_column_database_name16_interop(IntPtr stmt, int index, out int len);\r
50 \r
51     [DllImport(SQLITE_DLL)]\r
52     internal static extern IntPtr sqlite3_column_decltype_interop(IntPtr stmt, int index, out int len);\r
53 \r
54     [DllImport(SQLITE_DLL)]\r
55     internal static extern IntPtr sqlite3_column_decltype16_interop(IntPtr stmt, int index, out int len);\r
56 \r
57     [DllImport(SQLITE_DLL)]\r
58     internal static extern IntPtr sqlite3_column_name_interop(IntPtr stmt, int index, out int len);\r
59 \r
60     [DllImport(SQLITE_DLL)]\r
61     internal static extern IntPtr sqlite3_column_name16_interop(IntPtr stmt, int index, out int len);\r
62 \r
63     [DllImport(SQLITE_DLL)]\r
64     internal static extern IntPtr sqlite3_column_origin_name_interop(IntPtr stmt, int index, out int len);\r
65 \r
66     [DllImport(SQLITE_DLL)]\r
67     internal static extern IntPtr sqlite3_column_origin_name16_interop(IntPtr stmt, int index, out int len);\r
68 \r
69     [DllImport(SQLITE_DLL)]\r
70     internal static extern IntPtr sqlite3_column_table_name_interop(IntPtr stmt, int index, out int len);\r
71 \r
72     [DllImport(SQLITE_DLL)]\r
73     internal static extern IntPtr sqlite3_column_table_name16_interop(IntPtr stmt, int index, out int len);\r
74 \r
75     [DllImport(SQLITE_DLL)]\r
76     internal static extern IntPtr sqlite3_column_text_interop(IntPtr stmt, int index, out int len);\r
77 \r
78     [DllImport(SQLITE_DLL)]\r
79     internal static extern IntPtr sqlite3_column_text16_interop(IntPtr stmt, int index, out int len);\r
80 \r
81     [DllImport(SQLITE_DLL)]\r
82     internal static extern IntPtr sqlite3_errmsg_interop(IntPtr db, out int len);\r
83 \r
84     [DllImport(SQLITE_DLL)]\r
85     internal static extern int sqlite3_prepare_interop(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain, out int nRemain);\r
86 \r
87     [DllImport(SQLITE_DLL)]\r
88     internal static extern int sqlite3_table_column_metadata_interop(IntPtr db, byte[] dbName, byte[] tblName, byte[] colName, out IntPtr ptrDataType, out IntPtr ptrCollSeq, out int notNull, out int primaryKey, out int autoInc, out int dtLen, out int csLen);\r
89 \r
90     [DllImport(SQLITE_DLL)]\r
91     internal static extern IntPtr sqlite3_value_text_interop(IntPtr p, out int len);\r
92 \r
93     [DllImport(SQLITE_DLL)]\r
94     internal static extern IntPtr sqlite3_value_text16_interop(IntPtr p, out int len);\r
95 #endif\r
96 \r
97     #endregion\r
98 \r
99     // These functions add existing functionality on top of SQLite and require a little effort to\r
100     // get working when using the standard SQLite library.\r
101     #region interop added functionality\r
102 \r
103 #if !SQLITE_STANDARD\r
104     [DllImport(SQLITE_DLL)]\r
105     internal static extern int sqlite3_close_interop(IntPtr db);\r
106 \r
107     [DllImport(SQLITE_DLL)]\r
108     internal static extern int sqlite3_create_function_interop(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal, int needCollSeq);\r
109 \r
110     [DllImport(SQLITE_DLL)]\r
111     internal static extern int sqlite3_finalize_interop(IntPtr stmt);\r
112 \r
113     [DllImport(SQLITE_DLL)]\r
114     internal static extern int sqlite3_open_interop(byte[] utf8Filename, int flags, out IntPtr db);\r
115 \r
116     [DllImport(SQLITE_DLL)]\r
117     internal static extern int sqlite3_open16_interop(byte[] utf8Filename, int flags, out IntPtr db);\r
118 \r
119     [DllImport(SQLITE_DLL)]\r
120     internal static extern int sqlite3_reset_interop(IntPtr stmt);\r
121 \r
122 #endif\r
123 \r
124     #endregion\r
125 \r
126     // The standard api call equivalents of the above interop calls\r
127     #region standard versions of interop functions\r
128 \r
129 #if SQLITE_STANDARD\r
130 #if !PLATFORM_COMPACTFRAMEWORK\r
131     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
132 #else\r
133     [DllImport(SQLITE_DLL)]\r
134 #endif\r
135     internal static extern int sqlite3_close(IntPtr db);\r
136 \r
137 #if !PLATFORM_COMPACTFRAMEWORK\r
138     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
139 #else\r
140     [DllImport(SQLITE_DLL)]\r
141 #endif\r
142     internal static extern int sqlite3_create_function(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal);\r
143 \r
144 #if !PLATFORM_COMPACTFRAMEWORK\r
145                 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
146 #else\r
147                 [DllImport(SQLITE_DLL)]\r
148 #endif\r
149                 internal static extern int sqlite3_create_function_v2(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal, SQLiteFinalCallback fdestroy);\r
150 \r
151 #if !PLATFORM_COMPACTFRAMEWORK\r
152     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
153 #else\r
154     [DllImport(SQLITE_DLL)]\r
155 #endif\r
156     internal static extern int sqlite3_finalize(IntPtr stmt);\r
157 \r
158 #if !PLATFORM_COMPACTFRAMEWORK\r
159     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
160 #else\r
161     [DllImport(SQLITE_DLL)]\r
162 #endif\r
163     internal static extern int sqlite3_open_v2(byte[] utf8Filename, out IntPtr db, int flags, IntPtr vfs);\r
164 \r
165     // Compatibility with versions < 3.5.0\r
166 #if !PLATFORM_COMPACTFRAMEWORK\r
167     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
168 #else\r
169     [DllImport(SQLITE_DLL)]\r
170 #endif\r
171     internal static extern int sqlite3_open(byte[] utf8Filename, out IntPtr db);\r
172 \r
173 #if !PLATFORM_COMPACTFRAMEWORK\r
174     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
175 #else\r
176     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
177 #endif\r
178     internal static extern int sqlite3_open16(string fileName, out IntPtr db);\r
179 \r
180 #if !PLATFORM_COMPACTFRAMEWORK\r
181     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
182 #else\r
183     [DllImport(SQLITE_DLL)]\r
184 #endif\r
185     internal static extern int sqlite3_reset(IntPtr stmt);\r
186 \r
187 #if !PLATFORM_COMPACTFRAMEWORK\r
188     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
189 #else\r
190     [DllImport(SQLITE_DLL)]\r
191 #endif\r
192     internal static extern IntPtr sqlite3_bind_parameter_name(IntPtr stmt, int index);\r
193 \r
194 #if !PLATFORM_COMPACTFRAMEWORK\r
195     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
196 #else\r
197     [DllImport(SQLITE_DLL)]\r
198 #endif\r
199     internal static extern IntPtr sqlite3_column_database_name(IntPtr stmt, int index);\r
200 \r
201 #if !PLATFORM_COMPACTFRAMEWORK\r
202     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
203 #else\r
204     [DllImport(SQLITE_DLL)]\r
205 #endif\r
206     internal static extern IntPtr sqlite3_column_database_name16(IntPtr stmt, int index);\r
207 \r
208 #if !PLATFORM_COMPACTFRAMEWORK\r
209     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
210 #else\r
211     [DllImport(SQLITE_DLL)]\r
212 #endif\r
213     internal static extern IntPtr sqlite3_column_decltype(IntPtr stmt, int index);\r
214 \r
215 #if !PLATFORM_COMPACTFRAMEWORK\r
216     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
217 #else\r
218     [DllImport(SQLITE_DLL)]\r
219 #endif\r
220     internal static extern IntPtr sqlite3_column_decltype16(IntPtr stmt, int index);\r
221 \r
222 #if !PLATFORM_COMPACTFRAMEWORK\r
223     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
224 #else\r
225     [DllImport(SQLITE_DLL)]\r
226 #endif\r
227     internal static extern IntPtr sqlite3_column_name(IntPtr stmt, int index);\r
228 \r
229 #if !PLATFORM_COMPACTFRAMEWORK\r
230     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
231 #else\r
232     [DllImport(SQLITE_DLL)]\r
233 #endif\r
234     internal static extern IntPtr sqlite3_column_name16(IntPtr stmt, int index);\r
235 \r
236 #if !PLATFORM_COMPACTFRAMEWORK\r
237     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
238 #else\r
239     [DllImport(SQLITE_DLL)]\r
240 #endif\r
241     internal static extern IntPtr sqlite3_column_origin_name(IntPtr stmt, int index);\r
242 \r
243 #if !PLATFORM_COMPACTFRAMEWORK\r
244     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
245 #else\r
246     [DllImport(SQLITE_DLL)]\r
247 #endif\r
248     internal static extern IntPtr sqlite3_column_origin_name16(IntPtr stmt, int index);\r
249 \r
250 #if !PLATFORM_COMPACTFRAMEWORK\r
251     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
252 #else\r
253     [DllImport(SQLITE_DLL)]\r
254 #endif\r
255     internal static extern IntPtr sqlite3_column_table_name(IntPtr stmt, int index);\r
256 \r
257 #if !PLATFORM_COMPACTFRAMEWORK\r
258     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
259 #else\r
260     [DllImport(SQLITE_DLL)]\r
261 #endif\r
262     internal static extern IntPtr sqlite3_column_table_name16(IntPtr stmt, int index);\r
263 \r
264 #if !PLATFORM_COMPACTFRAMEWORK\r
265     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
266 #else\r
267     [DllImport(SQLITE_DLL)]\r
268 #endif\r
269     internal static extern IntPtr sqlite3_column_text(IntPtr stmt, int index);\r
270 \r
271 #if !PLATFORM_COMPACTFRAMEWORK\r
272     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
273 #else\r
274     [DllImport(SQLITE_DLL)]\r
275 #endif\r
276     internal static extern IntPtr sqlite3_column_text16(IntPtr stmt, int index);\r
277 \r
278 #if !PLATFORM_COMPACTFRAMEWORK\r
279     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
280 #else\r
281     [DllImport(SQLITE_DLL)]\r
282 #endif\r
283     internal static extern IntPtr sqlite3_errmsg(IntPtr db);\r
284 \r
285 #if !PLATFORM_COMPACTFRAMEWORK\r
286     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
287 #else\r
288     [DllImport(SQLITE_DLL)]\r
289 #endif\r
290     internal static extern int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);\r
291 \r
292 #if !PLATFORM_COMPACTFRAMEWORK\r
293     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
294 #else\r
295     [DllImport(SQLITE_DLL)]\r
296 #endif\r
297     internal static extern int sqlite3_table_column_metadata(IntPtr db, byte[] dbName, byte[] tblName, byte[] colName, out IntPtr ptrDataType, out IntPtr ptrCollSeq, out int notNull, out int primaryKey, out int autoInc);\r
298 \r
299 #if !PLATFORM_COMPACTFRAMEWORK\r
300     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
301 #else\r
302     [DllImport(SQLITE_DLL)]\r
303 #endif\r
304     internal static extern IntPtr sqlite3_value_text(IntPtr p);\r
305 \r
306 #if !PLATFORM_COMPACTFRAMEWORK\r
307     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
308 #else\r
309     [DllImport(SQLITE_DLL)]\r
310 #endif\r
311     internal static extern IntPtr sqlite3_value_text16(IntPtr p);\r
312 #endif\r
313 \r
314     #endregion\r
315 \r
316     // These functions are custom and have no equivalent standard library method.\r
317     // All of them are "nice to haves" and not necessarily "need to haves".\r
318     #region no equivalent standard method\r
319 \r
320 #if !SQLITE_STANDARD\r
321     [DllImport(SQLITE_DLL)]\r
322     internal static extern IntPtr sqlite3_context_collseq(IntPtr context, out int type, out int enc, out int len);\r
323 \r
324     [DllImport(SQLITE_DLL)]\r
325     internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);\r
326 \r
327     [DllImport(SQLITE_DLL)]\r
328     internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);\r
329 \r
330     [DllImport(SQLITE_DLL)]\r
331     internal static extern int sqlite3_index_column_info_interop(IntPtr db, byte[] catalog, byte[] IndexName, byte[] ColumnName, out int sortOrder, out int onError, out IntPtr Collation, out int colllen);\r
332 \r
333     [DllImport(SQLITE_DLL)]\r
334     internal static extern void sqlite3_resetall_interop(IntPtr db);\r
335 \r
336     [DllImport(SQLITE_DLL)]\r
337     internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);\r
338 #endif\r
339 \r
340     #endregion\r
341 \r
342     // These are obsolete and will be removed in the future \r
343     #region windows ntfs filesystem only\r
344 \r
345 #if !SQLITE_STANDARD\r
346     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
347     internal static extern int sqlite3_compressfile(string fileName);\r
348 \r
349     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
350     internal static extern int sqlite3_decompressfile(string fileName);\r
351 #endif\r
352 \r
353     #endregion\r
354 \r
355     // Standard API calls global across versions.  There are a few instances of interop calls\r
356     // scattered in here, but they are only active when PLATFORM_COMPACTFRAMEWORK is declared.\r
357     #region standard sqlite api calls\r
358 \r
359 #if !PLATFORM_COMPACTFRAMEWORK\r
360     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
361 #else\r
362     [DllImport(SQLITE_DLL)]\r
363 #endif\r
364     internal static extern IntPtr sqlite3_libversion();\r
365 \r
366 #if !PLATFORM_COMPACTFRAMEWORK\r
367     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
368 #else\r
369     [DllImport(SQLITE_DLL)]\r
370 #endif\r
371     internal static extern void sqlite3_interrupt(IntPtr db);\r
372 \r
373 #if !PLATFORM_COMPACTFRAMEWORK\r
374     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
375 #else\r
376     [DllImport(SQLITE_DLL)]\r
377 #endif\r
378     internal static extern int sqlite3_changes(IntPtr db);\r
379 \r
380 #if !PLATFORM_COMPACTFRAMEWORK\r
381     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
382 #else\r
383     [DllImport(SQLITE_DLL)]\r
384 #endif\r
385     internal static extern int sqlite3_busy_timeout(IntPtr db, int ms);\r
386 \r
387 #if !PLATFORM_COMPACTFRAMEWORK\r
388     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
389 #else\r
390     [DllImport(SQLITE_DLL)]\r
391 #endif\r
392     internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);\r
393 \r
394 #if !PLATFORM_COMPACTFRAMEWORK\r
395     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
396     internal static extern int sqlite3_bind_double(IntPtr stmt, int index, double value);\r
397 #else\r
398     [DllImport(SQLITE_DLL)]\r
399     internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);\r
400 #endif\r
401 \r
402 #if !PLATFORM_COMPACTFRAMEWORK\r
403     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
404 #else\r
405     [DllImport(SQLITE_DLL)]\r
406 #endif\r
407     internal static extern int sqlite3_bind_int(IntPtr stmt, int index, int value);\r
408 \r
409 #if !PLATFORM_COMPACTFRAMEWORK\r
410     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
411     internal static extern int sqlite3_bind_int64(IntPtr stmt, int index, long value);\r
412 #else\r
413     [DllImport(SQLITE_DLL)]\r
414     internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long value);\r
415 #endif\r
416 \r
417 #if !PLATFORM_COMPACTFRAMEWORK\r
418     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
419 #else\r
420     [DllImport(SQLITE_DLL)]\r
421 #endif\r
422     internal static extern int sqlite3_bind_null(IntPtr stmt, int index);\r
423 \r
424 #if !PLATFORM_COMPACTFRAMEWORK\r
425     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
426 #else\r
427     [DllImport(SQLITE_DLL)]\r
428 #endif\r
429     internal static extern int sqlite3_bind_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);\r
430 \r
431 #if !PLATFORM_COMPACTFRAMEWORK\r
432     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
433 #else\r
434     [DllImport(SQLITE_DLL)]\r
435 #endif\r
436     internal static extern int sqlite3_bind_parameter_count(IntPtr stmt);\r
437 \r
438 #if !PLATFORM_COMPACTFRAMEWORK\r
439     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
440 #else\r
441     [DllImport(SQLITE_DLL)]\r
442 #endif\r
443     internal static extern int sqlite3_bind_parameter_index(IntPtr stmt, byte[] strName);\r
444 \r
445 #if !PLATFORM_COMPACTFRAMEWORK\r
446     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
447 #else\r
448     [DllImport(SQLITE_DLL)]\r
449 #endif\r
450     internal static extern int sqlite3_column_count(IntPtr stmt);\r
451 \r
452 #if !PLATFORM_COMPACTFRAMEWORK\r
453     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
454 #else\r
455     [DllImport(SQLITE_DLL)]\r
456 #endif\r
457     internal static extern int sqlite3_step(IntPtr stmt);\r
458 \r
459 #if !PLATFORM_COMPACTFRAMEWORK\r
460     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
461     internal static extern double sqlite3_column_double(IntPtr stmt, int index);\r
462 #else\r
463     [DllImport(SQLITE_DLL)]\r
464     internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);\r
465 #endif\r
466 \r
467 #if !PLATFORM_COMPACTFRAMEWORK\r
468     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
469 #else\r
470     [DllImport(SQLITE_DLL)]\r
471 #endif\r
472     internal static extern int sqlite3_column_int(IntPtr stmt, int index);\r
473 \r
474 #if !PLATFORM_COMPACTFRAMEWORK\r
475     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
476     internal static extern long sqlite3_column_int64(IntPtr stmt, int index);\r
477 #else\r
478     [DllImport(SQLITE_DLL)]\r
479     internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long value);\r
480 #endif\r
481 \r
482 #if !PLATFORM_COMPACTFRAMEWORK\r
483     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
484 #else\r
485     [DllImport(SQLITE_DLL)]\r
486 #endif\r
487     internal static extern IntPtr sqlite3_column_blob(IntPtr stmt, int index);\r
488 \r
489 #if !PLATFORM_COMPACTFRAMEWORK\r
490     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
491 #else\r
492     [DllImport(SQLITE_DLL)]\r
493 #endif\r
494     internal static extern int sqlite3_column_bytes(IntPtr stmt, int index);\r
495 \r
496 #if !PLATFORM_COMPACTFRAMEWORK\r
497     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
498 #else\r
499     [DllImport(SQLITE_DLL)]\r
500 #endif\r
501     internal static extern TypeAffinity sqlite3_column_type(IntPtr stmt, int index);\r
502 \r
503 #if !PLATFORM_COMPACTFRAMEWORK\r
504     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
505 #else\r
506     [DllImport(SQLITE_DLL)]\r
507 #endif\r
508     internal static extern int sqlite3_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);\r
509 \r
510 #if !PLATFORM_COMPACTFRAMEWORK\r
511     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
512 #else\r
513     [DllImport(SQLITE_DLL)]\r
514 #endif\r
515     internal static extern int sqlite3_aggregate_count(IntPtr context);\r
516 \r
517 #if !PLATFORM_COMPACTFRAMEWORK\r
518     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
519 #else\r
520     [DllImport(SQLITE_DLL)]\r
521 #endif\r
522     internal static extern IntPtr sqlite3_value_blob(IntPtr p);\r
523 \r
524 #if !PLATFORM_COMPACTFRAMEWORK\r
525     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
526 #else\r
527     [DllImport(SQLITE_DLL)]\r
528 #endif\r
529     internal static extern int sqlite3_value_bytes(IntPtr p);\r
530 \r
531 #if !PLATFORM_COMPACTFRAMEWORK\r
532     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
533     internal static extern double sqlite3_value_double(IntPtr p);\r
534 #else\r
535     [DllImport(SQLITE_DLL)]\r
536     internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);\r
537 #endif\r
538 \r
539 #if !PLATFORM_COMPACTFRAMEWORK\r
540     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
541 #else\r
542     [DllImport(SQLITE_DLL)]\r
543 #endif\r
544     internal static extern int sqlite3_value_int(IntPtr p);\r
545 \r
546 #if !PLATFORM_COMPACTFRAMEWORK\r
547     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
548     internal static extern long sqlite3_value_int64(IntPtr p);\r
549 #else\r
550     [DllImport(SQLITE_DLL)]\r
551     internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 value);\r
552 #endif\r
553 \r
554 #if !PLATFORM_COMPACTFRAMEWORK\r
555     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
556 #else\r
557     [DllImport(SQLITE_DLL)]\r
558 #endif\r
559     internal static extern TypeAffinity sqlite3_value_type(IntPtr p);\r
560 \r
561 #if !PLATFORM_COMPACTFRAMEWORK\r
562     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
563 #else\r
564     [DllImport(SQLITE_DLL)]\r
565 #endif\r
566     internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);\r
567 \r
568 #if !PLATFORM_COMPACTFRAMEWORK\r
569     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
570     internal static extern void sqlite3_result_double(IntPtr context, double value);\r
571 #else\r
572     [DllImport(SQLITE_DLL)]\r
573     internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);\r
574 #endif\r
575 \r
576 #if !PLATFORM_COMPACTFRAMEWORK\r
577     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
578 #else\r
579     [DllImport(SQLITE_DLL)]\r
580 #endif\r
581     internal static extern void sqlite3_result_error(IntPtr context, byte[] strErr, int nLen);\r
582 \r
583 #if !PLATFORM_COMPACTFRAMEWORK\r
584     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
585 #else\r
586     [DllImport(SQLITE_DLL)]\r
587 #endif\r
588     internal static extern void sqlite3_result_int(IntPtr context, int value);\r
589 \r
590 #if !PLATFORM_COMPACTFRAMEWORK\r
591     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
592     internal static extern void sqlite3_result_int64(IntPtr context, long value);\r
593 #else\r
594     [DllImport(SQLITE_DLL)]\r
595     internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);\r
596 #endif\r
597 \r
598 #if !PLATFORM_COMPACTFRAMEWORK\r
599     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
600 #else\r
601     [DllImport(SQLITE_DLL)]\r
602 #endif\r
603     internal static extern void sqlite3_result_null(IntPtr context);\r
604 \r
605 #if !PLATFORM_COMPACTFRAMEWORK\r
606     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
607 #else\r
608     [DllImport(SQLITE_DLL)]\r
609 #endif\r
610     internal static extern void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);\r
611 \r
612 #if !PLATFORM_COMPACTFRAMEWORK\r
613     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
614 #else\r
615     [DllImport(SQLITE_DLL)]\r
616 #endif\r
617     internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);\r
618 \r
619 #if !PLATFORM_COMPACTFRAMEWORK\r
620     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
621 #else\r
622     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
623 #endif\r
624     internal static extern int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);\r
625 \r
626 #if !PLATFORM_COMPACTFRAMEWORK\r
627     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
628 #else\r
629     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
630 #endif\r
631     internal static extern void sqlite3_result_error16(IntPtr context, string strName, int nLen);\r
632 \r
633 #if !PLATFORM_COMPACTFRAMEWORK\r
634     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
635 #else\r
636     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
637 #endif\r
638     internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);\r
639 \r
640 #if !PLATFORM_COMPACTFRAMEWORK\r
641     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
642 #else\r
643     [DllImport(SQLITE_DLL)]\r
644 #endif\r
645     internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);\r
646 \r
647 #if !PLATFORM_COMPACTFRAMEWORK\r
648     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
649 #else\r
650     [DllImport(SQLITE_DLL)]\r
651 #endif\r
652     internal static extern int sqlite3_rekey(IntPtr db, byte[] key, int keylen);\r
653 \r
654 #if !PLATFORM_COMPACTFRAMEWORK\r
655     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
656 #else\r
657     [DllImport(SQLITE_DLL)]\r
658 #endif\r
659     internal static extern IntPtr sqlite3_update_hook(IntPtr db, SQLiteUpdateCallback func, IntPtr pvUser);\r
660 \r
661 #if !PLATFORM_COMPACTFRAMEWORK\r
662     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
663 #else\r
664     [DllImport(SQLITE_DLL)]\r
665 #endif\r
666     internal static extern IntPtr sqlite3_commit_hook(IntPtr db, SQLiteCommitCallback func, IntPtr pvUser);\r
667 \r
668 #if !PLATFORM_COMPACTFRAMEWORK\r
669     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
670 #else\r
671     [DllImport(SQLITE_DLL)]\r
672 #endif\r
673     internal static extern IntPtr sqlite3_rollback_hook(IntPtr db, SQLiteRollbackCallback func, IntPtr pvUser);\r
674 \r
675 #if !PLATFORM_COMPACTFRAMEWORK\r
676     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
677 #else\r
678     [DllImport(SQLITE_DLL)]\r
679 #endif\r
680     internal static extern IntPtr sqlite3_db_handle(IntPtr stmt);\r
681 \r
682 #if !PLATFORM_COMPACTFRAMEWORK\r
683     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
684 #else\r
685     [DllImport(SQLITE_DLL)]\r
686 #endif\r
687     internal static extern IntPtr sqlite3_next_stmt(IntPtr db, IntPtr stmt);\r
688 \r
689 #if !PLATFORM_COMPACTFRAMEWORK\r
690     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
691 #else\r
692     [DllImport(SQLITE_DLL)]\r
693 #endif\r
694     internal static extern int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);\r
695 \r
696 #if !PLATFORM_COMPACTFRAMEWORK\r
697     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
698 #else\r
699     [DllImport(SQLITE_DLL)]\r
700 #endif\r
701     internal static extern int sqlite3_config (SQLiteConfig config);\r
702 \r
703 #if !PLATFORM_COMPACTFRAMEWORK\r
704                 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
705 #else\r
706                 [DllImport(SQLITE_DLL)]\r
707 #endif\r
708                 internal static extern IntPtr sqlite3_user_data (IntPtr context);\r
709 \r
710 #if !PLATFORM_COMPACTFRAMEWORK\r
711     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
712 #else\r
713     [DllImport(SQLITE_DLL)]\r
714 #endif\r
715     internal static extern int sqlite3_free (IntPtr ptr);\r
716 \r
717     #endregion\r
718   }\r
719 \r
720 #if PLATFORM_COMPACTFRAMEWORK\r
721   internal abstract class CriticalHandle : IDisposable\r
722   {\r
723     private bool _isClosed;\r
724     protected IntPtr handle;\r
725     \r
726     protected CriticalHandle(IntPtr invalidHandleValue)\r
727     {\r
728       handle = invalidHandleValue;\r
729       _isClosed = false;\r
730     }\r
731 \r
732     ~CriticalHandle()\r
733     {\r
734       Dispose(false);\r
735     }\r
736 \r
737     private void Cleanup()\r
738     {\r
739       if (!IsClosed)\r
740       {\r
741         this._isClosed = true;\r
742         if (!IsInvalid)\r
743         {\r
744           ReleaseHandle();\r
745           GC.SuppressFinalize(this);\r
746         }\r
747       }\r
748     }\r
749 \r
750     public void Close()\r
751     {\r
752       Dispose(true);\r
753     }\r
754 \r
755     public void Dispose()\r
756     {\r
757       Dispose(true);\r
758     }\r
759 \r
760     protected virtual void Dispose(bool disposing)\r
761     {\r
762       Cleanup();\r
763     }\r
764 \r
765     protected abstract bool ReleaseHandle();\r
766 \r
767     protected void SetHandle(IntPtr value)\r
768     {\r
769       handle = value;\r
770     }\r
771 \r
772     public void SetHandleAsInvalid()\r
773     {\r
774       _isClosed = true;\r
775       GC.SuppressFinalize(this);\r
776     }\r
777 \r
778     public bool IsClosed\r
779     {\r
780       get { return _isClosed; }\r
781     }\r
782 \r
783     public abstract bool IsInvalid\r
784     {\r
785       get;\r
786     }\r
787 \r
788   }\r
789 \r
790 #endif\r
791 \r
792   // Handles the unmanaged database pointer, and provides finalization support for it.\r
793   internal class SqliteConnectionHandle : CriticalHandle\r
794   {\r
795     public static implicit operator IntPtr(SqliteConnectionHandle db)\r
796     {\r
797       return db.handle;\r
798     }\r
799 \r
800     public static implicit operator SqliteConnectionHandle(IntPtr db)\r
801     {\r
802       return new SqliteConnectionHandle(db);\r
803     }\r
804 \r
805     private SqliteConnectionHandle(IntPtr db)\r
806       : this()\r
807     {\r
808       SetHandle(db);\r
809     }\r
810 \r
811     internal SqliteConnectionHandle()\r
812       : base(IntPtr.Zero)\r
813     {\r
814     }\r
815 \r
816     protected override bool ReleaseHandle()\r
817     {\r
818       try\r
819       {\r
820         SQLiteBase.CloseConnection(this);\r
821       }\r
822       catch (SqliteException)\r
823       {\r
824       }\r
825       return true;\r
826     }\r
827 \r
828     public override bool IsInvalid\r
829     {\r
830       get { return (handle == IntPtr.Zero); }\r
831     }\r
832   }\r
833 \r
834   // Provides finalization support for unmanaged SQLite statements.\r
835   internal class SqliteStatementHandle : CriticalHandle\r
836   {\r
837     public static implicit operator IntPtr(SqliteStatementHandle stmt)\r
838     {\r
839       return stmt.handle;\r
840     }\r
841 \r
842     public static implicit operator SqliteStatementHandle(IntPtr stmt)\r
843     {\r
844       return new SqliteStatementHandle(stmt);\r
845     }\r
846 \r
847     private SqliteStatementHandle(IntPtr stmt)\r
848       : this()\r
849     {\r
850       SetHandle(stmt);\r
851     }\r
852 \r
853     internal SqliteStatementHandle()\r
854       : base(IntPtr.Zero)\r
855     {\r
856     }\r
857 \r
858     protected override bool ReleaseHandle()\r
859     {\r
860       try\r
861       {\r
862         SQLiteBase.FinalizeStatement(this);\r
863       }\r
864       catch (SqliteException)\r
865       {\r
866       }\r
867       return true;\r
868     }\r
869 \r
870     public override bool IsInvalid\r
871     {\r
872       get { return (handle == IntPtr.Zero); }\r
873     }\r
874   }\r
875 }\r