- Moved all classes to the Mono.Data.Sqlite namespace.
[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_finalize(IntPtr stmt);\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_open_v2(byte[] utf8Filename, out IntPtr db, int flags, IntPtr vfs);\r
157 \r
158 #if !PLATFORM_COMPACTFRAMEWORK\r
159     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
160 #else\r
161     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
162 #endif\r
163     internal static extern int sqlite3_open16(string fileName, out IntPtr db);\r
164 \r
165 #if !PLATFORM_COMPACTFRAMEWORK\r
166     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
167 #else\r
168     [DllImport(SQLITE_DLL)]\r
169 #endif\r
170     internal static extern int sqlite3_reset(IntPtr stmt);\r
171 \r
172 #if !PLATFORM_COMPACTFRAMEWORK\r
173     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
174 #else\r
175     [DllImport(SQLITE_DLL)]\r
176 #endif\r
177     internal static extern IntPtr sqlite3_bind_parameter_name(IntPtr stmt, int index);\r
178 \r
179 #if !PLATFORM_COMPACTFRAMEWORK\r
180     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
181 #else\r
182     [DllImport(SQLITE_DLL)]\r
183 #endif\r
184     internal static extern IntPtr sqlite3_column_database_name(IntPtr stmt, int index);\r
185 \r
186 #if !PLATFORM_COMPACTFRAMEWORK\r
187     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
188 #else\r
189     [DllImport(SQLITE_DLL)]\r
190 #endif\r
191     internal static extern IntPtr sqlite3_column_database_name16(IntPtr stmt, int index);\r
192 \r
193 #if !PLATFORM_COMPACTFRAMEWORK\r
194     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
195 #else\r
196     [DllImport(SQLITE_DLL)]\r
197 #endif\r
198     internal static extern IntPtr sqlite3_column_decltype(IntPtr stmt, int index);\r
199 \r
200 #if !PLATFORM_COMPACTFRAMEWORK\r
201     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
202 #else\r
203     [DllImport(SQLITE_DLL)]\r
204 #endif\r
205     internal static extern IntPtr sqlite3_column_decltype16(IntPtr stmt, int index);\r
206 \r
207 #if !PLATFORM_COMPACTFRAMEWORK\r
208     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
209 #else\r
210     [DllImport(SQLITE_DLL)]\r
211 #endif\r
212     internal static extern IntPtr sqlite3_column_name(IntPtr stmt, int index);\r
213 \r
214 #if !PLATFORM_COMPACTFRAMEWORK\r
215     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
216 #else\r
217     [DllImport(SQLITE_DLL)]\r
218 #endif\r
219     internal static extern IntPtr sqlite3_column_name16(IntPtr stmt, int index);\r
220 \r
221 #if !PLATFORM_COMPACTFRAMEWORK\r
222     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
223 #else\r
224     [DllImport(SQLITE_DLL)]\r
225 #endif\r
226     internal static extern IntPtr sqlite3_column_origin_name(IntPtr stmt, int index);\r
227 \r
228 #if !PLATFORM_COMPACTFRAMEWORK\r
229     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
230 #else\r
231     [DllImport(SQLITE_DLL)]\r
232 #endif\r
233     internal static extern IntPtr sqlite3_column_origin_name16(IntPtr stmt, int index);\r
234 \r
235 #if !PLATFORM_COMPACTFRAMEWORK\r
236     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
237 #else\r
238     [DllImport(SQLITE_DLL)]\r
239 #endif\r
240     internal static extern IntPtr sqlite3_column_table_name(IntPtr stmt, int index);\r
241 \r
242 #if !PLATFORM_COMPACTFRAMEWORK\r
243     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
244 #else\r
245     [DllImport(SQLITE_DLL)]\r
246 #endif\r
247     internal static extern IntPtr sqlite3_column_table_name16(IntPtr stmt, int index);\r
248 \r
249 #if !PLATFORM_COMPACTFRAMEWORK\r
250     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
251 #else\r
252     [DllImport(SQLITE_DLL)]\r
253 #endif\r
254     internal static extern IntPtr sqlite3_column_text(IntPtr stmt, int index);\r
255 \r
256 #if !PLATFORM_COMPACTFRAMEWORK\r
257     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
258 #else\r
259     [DllImport(SQLITE_DLL)]\r
260 #endif\r
261     internal static extern IntPtr sqlite3_column_text16(IntPtr stmt, int index);\r
262 \r
263 #if !PLATFORM_COMPACTFRAMEWORK\r
264     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
265 #else\r
266     [DllImport(SQLITE_DLL)]\r
267 #endif\r
268     internal static extern IntPtr sqlite3_errmsg(IntPtr db);\r
269 \r
270 #if !PLATFORM_COMPACTFRAMEWORK\r
271     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
272 #else\r
273     [DllImport(SQLITE_DLL)]\r
274 #endif\r
275     internal static extern int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);\r
276 \r
277 #if !PLATFORM_COMPACTFRAMEWORK\r
278     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
279 #else\r
280     [DllImport(SQLITE_DLL)]\r
281 #endif\r
282     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
283 \r
284 #if !PLATFORM_COMPACTFRAMEWORK\r
285     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
286 #else\r
287     [DllImport(SQLITE_DLL)]\r
288 #endif\r
289     internal static extern IntPtr sqlite3_value_text(IntPtr p);\r
290 \r
291 #if !PLATFORM_COMPACTFRAMEWORK\r
292     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
293 #else\r
294     [DllImport(SQLITE_DLL)]\r
295 #endif\r
296     internal static extern IntPtr sqlite3_value_text16(IntPtr p);\r
297 #endif\r
298 \r
299     #endregion\r
300 \r
301     // These functions are custom and have no equivalent standard library method.\r
302     // All of them are "nice to haves" and not necessarily "need to haves".\r
303     #region no equivalent standard method\r
304 \r
305 #if !SQLITE_STANDARD\r
306     [DllImport(SQLITE_DLL)]\r
307     internal static extern IntPtr sqlite3_context_collseq(IntPtr context, out int type, out int enc, out int len);\r
308 \r
309     [DllImport(SQLITE_DLL)]\r
310     internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);\r
311 \r
312     [DllImport(SQLITE_DLL)]\r
313     internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);\r
314 \r
315     [DllImport(SQLITE_DLL)]\r
316     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
317 \r
318     [DllImport(SQLITE_DLL)]\r
319     internal static extern void sqlite3_resetall_interop(IntPtr db);\r
320 \r
321     [DllImport(SQLITE_DLL)]\r
322     internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);\r
323 #endif\r
324 \r
325     #endregion\r
326 \r
327     // These are obsolete and will be removed in the future \r
328     #region windows ntfs filesystem only\r
329 \r
330 #if !SQLITE_STANDARD\r
331     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
332     internal static extern int sqlite3_compressfile(string fileName);\r
333 \r
334     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
335     internal static extern int sqlite3_decompressfile(string fileName);\r
336 #endif\r
337 \r
338     #endregion\r
339 \r
340     // Standard API calls global across versions.  There are a few instances of interop calls\r
341     // scattered in here, but they are only active when PLATFORM_COMPACTFRAMEWORK is declared.\r
342     #region standard sqlite api calls\r
343 \r
344 #if !PLATFORM_COMPACTFRAMEWORK\r
345     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
346 #else\r
347     [DllImport(SQLITE_DLL)]\r
348 #endif\r
349     internal static extern IntPtr sqlite3_libversion();\r
350 \r
351 #if !PLATFORM_COMPACTFRAMEWORK\r
352     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
353 #else\r
354     [DllImport(SQLITE_DLL)]\r
355 #endif\r
356     internal static extern void sqlite3_interrupt(IntPtr db);\r
357 \r
358 #if !PLATFORM_COMPACTFRAMEWORK\r
359     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
360 #else\r
361     [DllImport(SQLITE_DLL)]\r
362 #endif\r
363     internal static extern int sqlite3_changes(IntPtr db);\r
364 \r
365 #if !PLATFORM_COMPACTFRAMEWORK\r
366     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
367 #else\r
368     [DllImport(SQLITE_DLL)]\r
369 #endif\r
370     internal static extern int sqlite3_busy_timeout(IntPtr db, int ms);\r
371 \r
372 #if !PLATFORM_COMPACTFRAMEWORK\r
373     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
374 #else\r
375     [DllImport(SQLITE_DLL)]\r
376 #endif\r
377     internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);\r
378 \r
379 #if !PLATFORM_COMPACTFRAMEWORK\r
380     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
381     internal static extern int sqlite3_bind_double(IntPtr stmt, int index, double value);\r
382 #else\r
383     [DllImport(SQLITE_DLL)]\r
384     internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);\r
385 #endif\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_int(IntPtr stmt, int index, int value);\r
393 \r
394 #if !PLATFORM_COMPACTFRAMEWORK\r
395     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
396     internal static extern int sqlite3_bind_int64(IntPtr stmt, int index, long value);\r
397 #else\r
398     [DllImport(SQLITE_DLL)]\r
399     internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long 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_null(IntPtr stmt, int index);\r
408 \r
409 #if !PLATFORM_COMPACTFRAMEWORK\r
410     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
411 #else\r
412     [DllImport(SQLITE_DLL)]\r
413 #endif\r
414     internal static extern int sqlite3_bind_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);\r
415 \r
416 #if !PLATFORM_COMPACTFRAMEWORK\r
417     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
418 #else\r
419     [DllImport(SQLITE_DLL)]\r
420 #endif\r
421     internal static extern int sqlite3_bind_parameter_count(IntPtr stmt);\r
422 \r
423 #if !PLATFORM_COMPACTFRAMEWORK\r
424     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
425 #else\r
426     [DllImport(SQLITE_DLL)]\r
427 #endif\r
428     internal static extern int sqlite3_bind_parameter_index(IntPtr stmt, byte[] strName);\r
429 \r
430 #if !PLATFORM_COMPACTFRAMEWORK\r
431     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
432 #else\r
433     [DllImport(SQLITE_DLL)]\r
434 #endif\r
435     internal static extern int sqlite3_column_count(IntPtr stmt);\r
436 \r
437 #if !PLATFORM_COMPACTFRAMEWORK\r
438     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
439 #else\r
440     [DllImport(SQLITE_DLL)]\r
441 #endif\r
442     internal static extern int sqlite3_step(IntPtr stmt);\r
443 \r
444 #if !PLATFORM_COMPACTFRAMEWORK\r
445     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
446     internal static extern double sqlite3_column_double(IntPtr stmt, int index);\r
447 #else\r
448     [DllImport(SQLITE_DLL)]\r
449     internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);\r
450 #endif\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_column_int(IntPtr stmt, int index);\r
458 \r
459 #if !PLATFORM_COMPACTFRAMEWORK\r
460     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
461     internal static extern long sqlite3_column_int64(IntPtr stmt, int index);\r
462 #else\r
463     [DllImport(SQLITE_DLL)]\r
464     internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long 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 IntPtr sqlite3_column_blob(IntPtr stmt, int index);\r
473 \r
474 #if !PLATFORM_COMPACTFRAMEWORK\r
475     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
476 #else\r
477     [DllImport(SQLITE_DLL)]\r
478 #endif\r
479     internal static extern int sqlite3_column_bytes(IntPtr stmt, int index);\r
480 \r
481 #if !PLATFORM_COMPACTFRAMEWORK\r
482     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
483 #else\r
484     [DllImport(SQLITE_DLL)]\r
485 #endif\r
486     internal static extern TypeAffinity sqlite3_column_type(IntPtr stmt, int index);\r
487 \r
488 #if !PLATFORM_COMPACTFRAMEWORK\r
489     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
490 #else\r
491     [DllImport(SQLITE_DLL)]\r
492 #endif\r
493     internal static extern int sqlite3_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);\r
494 \r
495 #if !PLATFORM_COMPACTFRAMEWORK\r
496     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
497 #else\r
498     [DllImport(SQLITE_DLL)]\r
499 #endif\r
500     internal static extern int sqlite3_aggregate_count(IntPtr context);\r
501 \r
502 #if !PLATFORM_COMPACTFRAMEWORK\r
503     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
504 #else\r
505     [DllImport(SQLITE_DLL)]\r
506 #endif\r
507     internal static extern IntPtr sqlite3_value_blob(IntPtr p);\r
508 \r
509 #if !PLATFORM_COMPACTFRAMEWORK\r
510     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
511 #else\r
512     [DllImport(SQLITE_DLL)]\r
513 #endif\r
514     internal static extern int sqlite3_value_bytes(IntPtr p);\r
515 \r
516 #if !PLATFORM_COMPACTFRAMEWORK\r
517     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
518     internal static extern double sqlite3_value_double(IntPtr p);\r
519 #else\r
520     [DllImport(SQLITE_DLL)]\r
521     internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);\r
522 #endif\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_int(IntPtr p);\r
530 \r
531 #if !PLATFORM_COMPACTFRAMEWORK\r
532     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
533     internal static extern long sqlite3_value_int64(IntPtr p);\r
534 #else\r
535     [DllImport(SQLITE_DLL)]\r
536     internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 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 TypeAffinity sqlite3_value_type(IntPtr p);\r
545 \r
546 #if !PLATFORM_COMPACTFRAMEWORK\r
547     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
548 #else\r
549     [DllImport(SQLITE_DLL)]\r
550 #endif\r
551     internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);\r
552 \r
553 #if !PLATFORM_COMPACTFRAMEWORK\r
554     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
555     internal static extern void sqlite3_result_double(IntPtr context, double value);\r
556 #else\r
557     [DllImport(SQLITE_DLL)]\r
558     internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);\r
559 #endif\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_error(IntPtr context, byte[] strErr, int nLen);\r
567 \r
568 #if !PLATFORM_COMPACTFRAMEWORK\r
569     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
570 #else\r
571     [DllImport(SQLITE_DLL)]\r
572 #endif\r
573     internal static extern void sqlite3_result_int(IntPtr context, int value);\r
574 \r
575 #if !PLATFORM_COMPACTFRAMEWORK\r
576     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
577     internal static extern void sqlite3_result_int64(IntPtr context, long value);\r
578 #else\r
579     [DllImport(SQLITE_DLL)]\r
580     internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);\r
581 #endif\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_null(IntPtr context);\r
589 \r
590 #if !PLATFORM_COMPACTFRAMEWORK\r
591     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
592 #else\r
593     [DllImport(SQLITE_DLL)]\r
594 #endif\r
595     internal static extern void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);\r
596 \r
597 #if !PLATFORM_COMPACTFRAMEWORK\r
598     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
599 #else\r
600     [DllImport(SQLITE_DLL)]\r
601 #endif\r
602     internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);\r
603 \r
604 #if !PLATFORM_COMPACTFRAMEWORK\r
605     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
606 #else\r
607     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
608 #endif\r
609     internal static extern int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);\r
610 \r
611 #if !PLATFORM_COMPACTFRAMEWORK\r
612     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
613 #else\r
614     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
615 #endif\r
616     internal static extern void sqlite3_result_error16(IntPtr context, string strName, int nLen);\r
617 \r
618 #if !PLATFORM_COMPACTFRAMEWORK\r
619     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
620 #else\r
621     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
622 #endif\r
623     internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);\r
624 \r
625 #if !PLATFORM_COMPACTFRAMEWORK\r
626     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
627 #else\r
628     [DllImport(SQLITE_DLL)]\r
629 #endif\r
630     internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);\r
631 \r
632 #if !PLATFORM_COMPACTFRAMEWORK\r
633     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
634 #else\r
635     [DllImport(SQLITE_DLL)]\r
636 #endif\r
637     internal static extern int sqlite3_rekey(IntPtr db, byte[] key, int keylen);\r
638 \r
639 #if !PLATFORM_COMPACTFRAMEWORK\r
640     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
641 #else\r
642     [DllImport(SQLITE_DLL)]\r
643 #endif\r
644     internal static extern IntPtr sqlite3_update_hook(IntPtr db, SQLiteUpdateCallback func, IntPtr pvUser);\r
645 \r
646 #if !PLATFORM_COMPACTFRAMEWORK\r
647     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
648 #else\r
649     [DllImport(SQLITE_DLL)]\r
650 #endif\r
651     internal static extern IntPtr sqlite3_commit_hook(IntPtr db, SQLiteCommitCallback func, IntPtr pvUser);\r
652 \r
653 #if !PLATFORM_COMPACTFRAMEWORK\r
654     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
655 #else\r
656     [DllImport(SQLITE_DLL)]\r
657 #endif\r
658     internal static extern IntPtr sqlite3_rollback_hook(IntPtr db, SQLiteRollbackCallback func, IntPtr pvUser);\r
659 \r
660 #if !PLATFORM_COMPACTFRAMEWORK\r
661     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
662 #else\r
663     [DllImport(SQLITE_DLL)]\r
664 #endif\r
665     internal static extern IntPtr sqlite3_db_handle(IntPtr stmt);\r
666 \r
667 #if !PLATFORM_COMPACTFRAMEWORK\r
668     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
669 #else\r
670     [DllImport(SQLITE_DLL)]\r
671 #endif\r
672     internal static extern IntPtr sqlite3_next_stmt(IntPtr db, IntPtr stmt);\r
673 \r
674 #if !PLATFORM_COMPACTFRAMEWORK\r
675     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
676 #else\r
677     [DllImport(SQLITE_DLL)]\r
678 #endif\r
679     internal static extern int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);\r
680 \r
681     #endregion\r
682   }\r
683 \r
684 #if PLATFORM_COMPACTFRAMEWORK\r
685   internal abstract class CriticalHandle : IDisposable\r
686   {\r
687     private bool _isClosed;\r
688     protected IntPtr handle;\r
689     \r
690     protected CriticalHandle(IntPtr invalidHandleValue)\r
691     {\r
692       handle = invalidHandleValue;\r
693       _isClosed = false;\r
694     }\r
695 \r
696     ~CriticalHandle()\r
697     {\r
698       Dispose(false);\r
699     }\r
700 \r
701     private void Cleanup()\r
702     {\r
703       if (!IsClosed)\r
704       {\r
705         this._isClosed = true;\r
706         if (!IsInvalid)\r
707         {\r
708           ReleaseHandle();\r
709           GC.SuppressFinalize(this);\r
710         }\r
711       }\r
712     }\r
713 \r
714     public void Close()\r
715     {\r
716       Dispose(true);\r
717     }\r
718 \r
719     public void Dispose()\r
720     {\r
721       Dispose(true);\r
722     }\r
723 \r
724     protected virtual void Dispose(bool disposing)\r
725     {\r
726       Cleanup();\r
727     }\r
728 \r
729     protected abstract bool ReleaseHandle();\r
730 \r
731     protected void SetHandle(IntPtr value)\r
732     {\r
733       handle = value;\r
734     }\r
735 \r
736     public void SetHandleAsInvalid()\r
737     {\r
738       _isClosed = true;\r
739       GC.SuppressFinalize(this);\r
740     }\r
741 \r
742     public bool IsClosed\r
743     {\r
744       get { return _isClosed; }\r
745     }\r
746 \r
747     public abstract bool IsInvalid\r
748     {\r
749       get;\r
750     }\r
751 \r
752   }\r
753 \r
754 #endif\r
755 \r
756   // Handles the unmanaged database pointer, and provides finalization support for it.\r
757   internal class SQLiteConnectionHandle : CriticalHandle\r
758   {\r
759     public static implicit operator IntPtr(SQLiteConnectionHandle db)\r
760     {\r
761       return db.handle;\r
762     }\r
763 \r
764     public static implicit operator SQLiteConnectionHandle(IntPtr db)\r
765     {\r
766       return new SQLiteConnectionHandle(db);\r
767     }\r
768 \r
769     private SQLiteConnectionHandle(IntPtr db)\r
770       : this()\r
771     {\r
772       SetHandle(db);\r
773     }\r
774 \r
775     internal SQLiteConnectionHandle()\r
776       : base(IntPtr.Zero)\r
777     {\r
778     }\r
779 \r
780     protected override bool ReleaseHandle()\r
781     {\r
782       try\r
783       {\r
784         SQLiteBase.CloseConnection(this);\r
785       }\r
786       catch (SQLiteException)\r
787       {\r
788       }\r
789       return true;\r
790     }\r
791 \r
792     public override bool IsInvalid\r
793     {\r
794       get { return (handle == IntPtr.Zero); }\r
795     }\r
796   }\r
797 \r
798   // Provides finalization support for unmanaged SQLite statements.\r
799   internal class SQLiteStatementHandle : CriticalHandle\r
800   {\r
801     public static implicit operator IntPtr(SQLiteStatementHandle stmt)\r
802     {\r
803       return stmt.handle;\r
804     }\r
805 \r
806     public static implicit operator SQLiteStatementHandle(IntPtr stmt)\r
807     {\r
808       return new SQLiteStatementHandle(stmt);\r
809     }\r
810 \r
811     private SQLiteStatementHandle(IntPtr stmt)\r
812       : this()\r
813     {\r
814       SetHandle(stmt);\r
815     }\r
816 \r
817     internal SQLiteStatementHandle()\r
818       : base(IntPtr.Zero)\r
819     {\r
820     }\r
821 \r
822     protected override bool ReleaseHandle()\r
823     {\r
824       try\r
825       {\r
826         SQLiteBase.FinalizeStatement(this);\r
827       }\r
828       catch (SQLiteException)\r
829       {\r
830       }\r
831       return true;\r
832     }\r
833 \r
834     public override bool IsInvalid\r
835     {\r
836       get { return (handle == IntPtr.Zero); }\r
837     }\r
838   }\r
839 }\r