bb01c8a10915e75212be5b4d04f5d1ae06cf4d6b
[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     // Compatibility with versions < 3.5.0\r
159 #if !PLATFORM_COMPACTFRAMEWORK\r
160     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
161 #else\r
162     [DllImport(SQLITE_DLL)]\r
163 #endif\r
164     internal static extern int sqlite3_open(byte[] utf8Filename, out IntPtr db);\r
165 \r
166 #if !PLATFORM_COMPACTFRAMEWORK\r
167     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
168 #else\r
169     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
170 #endif\r
171     internal static extern int sqlite3_open16(string fileName, out IntPtr db);\r
172 \r
173 #if !PLATFORM_COMPACTFRAMEWORK\r
174     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
175 #else\r
176     [DllImport(SQLITE_DLL)]\r
177 #endif\r
178     internal static extern int sqlite3_reset(IntPtr stmt);\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 IntPtr sqlite3_bind_parameter_name(IntPtr stmt, int index);\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_column_database_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_name16(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_decltype(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_decltype16(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_name(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_name16(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_origin_name(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_name16(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_table_name(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_name16(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_text(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_text16(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_errmsg(IntPtr db);\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 int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);\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_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
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 IntPtr sqlite3_value_text(IntPtr p);\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_text16(IntPtr p);\r
305 #endif\r
306 \r
307     #endregion\r
308 \r
309     // These functions are custom and have no equivalent standard library method.\r
310     // All of them are "nice to haves" and not necessarily "need to haves".\r
311     #region no equivalent standard method\r
312 \r
313 #if !SQLITE_STANDARD\r
314     [DllImport(SQLITE_DLL)]\r
315     internal static extern IntPtr sqlite3_context_collseq(IntPtr context, out int type, out int enc, out int len);\r
316 \r
317     [DllImport(SQLITE_DLL)]\r
318     internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);\r
319 \r
320     [DllImport(SQLITE_DLL)]\r
321     internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);\r
322 \r
323     [DllImport(SQLITE_DLL)]\r
324     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
325 \r
326     [DllImport(SQLITE_DLL)]\r
327     internal static extern void sqlite3_resetall_interop(IntPtr db);\r
328 \r
329     [DllImport(SQLITE_DLL)]\r
330     internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);\r
331 #endif\r
332 \r
333     #endregion\r
334 \r
335     // These are obsolete and will be removed in the future \r
336     #region windows ntfs filesystem only\r
337 \r
338 #if !SQLITE_STANDARD\r
339     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
340     internal static extern int sqlite3_compressfile(string fileName);\r
341 \r
342     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
343     internal static extern int sqlite3_decompressfile(string fileName);\r
344 #endif\r
345 \r
346     #endregion\r
347 \r
348     // Standard API calls global across versions.  There are a few instances of interop calls\r
349     // scattered in here, but they are only active when PLATFORM_COMPACTFRAMEWORK is declared.\r
350     #region standard sqlite api calls\r
351 \r
352 #if !PLATFORM_COMPACTFRAMEWORK\r
353     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
354 #else\r
355     [DllImport(SQLITE_DLL)]\r
356 #endif\r
357     internal static extern IntPtr sqlite3_libversion();\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 void sqlite3_interrupt(IntPtr db);\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 int sqlite3_changes(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_busy_timeout(IntPtr db, int ms);\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_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);\r
386 \r
387 #if !PLATFORM_COMPACTFRAMEWORK\r
388     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
389     internal static extern int sqlite3_bind_double(IntPtr stmt, int index, double value);\r
390 #else\r
391     [DllImport(SQLITE_DLL)]\r
392     internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);\r
393 #endif\r
394 \r
395 #if !PLATFORM_COMPACTFRAMEWORK\r
396     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
397 #else\r
398     [DllImport(SQLITE_DLL)]\r
399 #endif\r
400     internal static extern int sqlite3_bind_int(IntPtr stmt, int index, int value);\r
401 \r
402 #if !PLATFORM_COMPACTFRAMEWORK\r
403     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
404     internal static extern int sqlite3_bind_int64(IntPtr stmt, int index, long value);\r
405 #else\r
406     [DllImport(SQLITE_DLL)]\r
407     internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long value);\r
408 #endif\r
409 \r
410 #if !PLATFORM_COMPACTFRAMEWORK\r
411     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
412 #else\r
413     [DllImport(SQLITE_DLL)]\r
414 #endif\r
415     internal static extern int sqlite3_bind_null(IntPtr stmt, int index);\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_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);\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_parameter_count(IntPtr stmt);\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_index(IntPtr stmt, byte[] strName);\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_column_count(IntPtr stmt);\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_step(IntPtr stmt);\r
451 \r
452 #if !PLATFORM_COMPACTFRAMEWORK\r
453     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
454     internal static extern double sqlite3_column_double(IntPtr stmt, int index);\r
455 #else\r
456     [DllImport(SQLITE_DLL)]\r
457     internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);\r
458 #endif\r
459 \r
460 #if !PLATFORM_COMPACTFRAMEWORK\r
461     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
462 #else\r
463     [DllImport(SQLITE_DLL)]\r
464 #endif\r
465     internal static extern int sqlite3_column_int(IntPtr stmt, int index);\r
466 \r
467 #if !PLATFORM_COMPACTFRAMEWORK\r
468     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
469     internal static extern long sqlite3_column_int64(IntPtr stmt, int index);\r
470 #else\r
471     [DllImport(SQLITE_DLL)]\r
472     internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long value);\r
473 #endif\r
474 \r
475 #if !PLATFORM_COMPACTFRAMEWORK\r
476     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
477 #else\r
478     [DllImport(SQLITE_DLL)]\r
479 #endif\r
480     internal static extern IntPtr sqlite3_column_blob(IntPtr stmt, int index);\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 int sqlite3_column_bytes(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 TypeAffinity sqlite3_column_type(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 int sqlite3_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);\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_aggregate_count(IntPtr context);\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 IntPtr sqlite3_value_blob(IntPtr p);\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 int sqlite3_value_bytes(IntPtr p);\r
523 \r
524 #if !PLATFORM_COMPACTFRAMEWORK\r
525     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
526     internal static extern double sqlite3_value_double(IntPtr p);\r
527 #else\r
528     [DllImport(SQLITE_DLL)]\r
529     internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);\r
530 #endif\r
531 \r
532 #if !PLATFORM_COMPACTFRAMEWORK\r
533     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
534 #else\r
535     [DllImport(SQLITE_DLL)]\r
536 #endif\r
537     internal static extern int sqlite3_value_int(IntPtr p);\r
538 \r
539 #if !PLATFORM_COMPACTFRAMEWORK\r
540     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
541     internal static extern long sqlite3_value_int64(IntPtr p);\r
542 #else\r
543     [DllImport(SQLITE_DLL)]\r
544     internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 value);\r
545 #endif\r
546 \r
547 #if !PLATFORM_COMPACTFRAMEWORK\r
548     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
549 #else\r
550     [DllImport(SQLITE_DLL)]\r
551 #endif\r
552     internal static extern TypeAffinity sqlite3_value_type(IntPtr p);\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 void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);\r
560 \r
561 #if !PLATFORM_COMPACTFRAMEWORK\r
562     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
563     internal static extern void sqlite3_result_double(IntPtr context, double value);\r
564 #else\r
565     [DllImport(SQLITE_DLL)]\r
566     internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);\r
567 #endif\r
568 \r
569 #if !PLATFORM_COMPACTFRAMEWORK\r
570     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
571 #else\r
572     [DllImport(SQLITE_DLL)]\r
573 #endif\r
574     internal static extern void sqlite3_result_error(IntPtr context, byte[] strErr, int nLen);\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_int(IntPtr context, int value);\r
582 \r
583 #if !PLATFORM_COMPACTFRAMEWORK\r
584     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
585     internal static extern void sqlite3_result_int64(IntPtr context, long value);\r
586 #else\r
587     [DllImport(SQLITE_DLL)]\r
588     internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);\r
589 #endif\r
590 \r
591 #if !PLATFORM_COMPACTFRAMEWORK\r
592     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
593 #else\r
594     [DllImport(SQLITE_DLL)]\r
595 #endif\r
596     internal static extern void sqlite3_result_null(IntPtr context);\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_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);\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 IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);\r
611 \r
612 #if !PLATFORM_COMPACTFRAMEWORK\r
613     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
614 #else\r
615     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
616 #endif\r
617     internal static extern int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);\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 void sqlite3_result_error16(IntPtr context, string strName, int nLen);\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_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);\r
632 \r
633 #if !PLATFORM_COMPACTFRAMEWORK\r
634     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
635 #else\r
636     [DllImport(SQLITE_DLL)]\r
637 #endif\r
638     internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);\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_rekey(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 IntPtr sqlite3_update_hook(IntPtr db, SQLiteUpdateCallback func, IntPtr pvUser);\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_commit_hook(IntPtr db, SQLiteCommitCallback 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_rollback_hook(IntPtr db, SQLiteRollbackCallback 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_db_handle(IntPtr stmt);\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_next_stmt(IntPtr db, 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 int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);\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_config (SQLiteConfig config);\r
695 \r
696     #endregion\r
697   }\r
698 \r
699 #if PLATFORM_COMPACTFRAMEWORK\r
700   internal abstract class CriticalHandle : IDisposable\r
701   {\r
702     private bool _isClosed;\r
703     protected IntPtr handle;\r
704     \r
705     protected CriticalHandle(IntPtr invalidHandleValue)\r
706     {\r
707       handle = invalidHandleValue;\r
708       _isClosed = false;\r
709     }\r
710 \r
711     ~CriticalHandle()\r
712     {\r
713       Dispose(false);\r
714     }\r
715 \r
716     private void Cleanup()\r
717     {\r
718       if (!IsClosed)\r
719       {\r
720         this._isClosed = true;\r
721         if (!IsInvalid)\r
722         {\r
723           ReleaseHandle();\r
724           GC.SuppressFinalize(this);\r
725         }\r
726       }\r
727     }\r
728 \r
729     public void Close()\r
730     {\r
731       Dispose(true);\r
732     }\r
733 \r
734     public void Dispose()\r
735     {\r
736       Dispose(true);\r
737     }\r
738 \r
739     protected virtual void Dispose(bool disposing)\r
740     {\r
741       Cleanup();\r
742     }\r
743 \r
744     protected abstract bool ReleaseHandle();\r
745 \r
746     protected void SetHandle(IntPtr value)\r
747     {\r
748       handle = value;\r
749     }\r
750 \r
751     public void SetHandleAsInvalid()\r
752     {\r
753       _isClosed = true;\r
754       GC.SuppressFinalize(this);\r
755     }\r
756 \r
757     public bool IsClosed\r
758     {\r
759       get { return _isClosed; }\r
760     }\r
761 \r
762     public abstract bool IsInvalid\r
763     {\r
764       get;\r
765     }\r
766 \r
767   }\r
768 \r
769 #endif\r
770 \r
771   // Handles the unmanaged database pointer, and provides finalization support for it.\r
772   internal class SqliteConnectionHandle : CriticalHandle\r
773   {\r
774     public static implicit operator IntPtr(SqliteConnectionHandle db)\r
775     {\r
776       return db.handle;\r
777     }\r
778 \r
779     public static implicit operator SqliteConnectionHandle(IntPtr db)\r
780     {\r
781       return new SqliteConnectionHandle(db);\r
782     }\r
783 \r
784     private SqliteConnectionHandle(IntPtr db)\r
785       : this()\r
786     {\r
787       SetHandle(db);\r
788     }\r
789 \r
790     internal SqliteConnectionHandle()\r
791       : base(IntPtr.Zero)\r
792     {\r
793     }\r
794 \r
795     protected override bool ReleaseHandle()\r
796     {\r
797       try\r
798       {\r
799         SQLiteBase.CloseConnection(this);\r
800       }\r
801       catch (SqliteException)\r
802       {\r
803       }\r
804       return true;\r
805     }\r
806 \r
807     public override bool IsInvalid\r
808     {\r
809       get { return (handle == IntPtr.Zero); }\r
810     }\r
811   }\r
812 \r
813   // Provides finalization support for unmanaged SQLite statements.\r
814   internal class SqliteStatementHandle : CriticalHandle\r
815   {\r
816     public static implicit operator IntPtr(SqliteStatementHandle stmt)\r
817     {\r
818       return stmt.handle;\r
819     }\r
820 \r
821     public static implicit operator SqliteStatementHandle(IntPtr stmt)\r
822     {\r
823       return new SqliteStatementHandle(stmt);\r
824     }\r
825 \r
826     private SqliteStatementHandle(IntPtr stmt)\r
827       : this()\r
828     {\r
829       SetHandle(stmt);\r
830     }\r
831 \r
832     internal SqliteStatementHandle()\r
833       : base(IntPtr.Zero)\r
834     {\r
835     }\r
836 \r
837     protected override bool ReleaseHandle()\r
838     {\r
839       try\r
840       {\r
841         SQLiteBase.FinalizeStatement(this);\r
842       }\r
843       catch (SqliteException)\r
844       {\r
845       }\r
846       return true;\r
847     }\r
848 \r
849     public override bool IsInvalid\r
850     {\r
851       get { return (handle == IntPtr.Zero); }\r
852     }\r
853   }\r
854 }\r