Merge pull request #349 from JamesB7/229b363ef861ab9456f8bdc428c550e2241688e9
[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 #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_free (IntPtr ptr);\r
702 \r
703     #endregion\r
704   }\r
705 \r
706 #if PLATFORM_COMPACTFRAMEWORK\r
707   internal abstract class CriticalHandle : IDisposable\r
708   {\r
709     private bool _isClosed;\r
710     protected IntPtr handle;\r
711     \r
712     protected CriticalHandle(IntPtr invalidHandleValue)\r
713     {\r
714       handle = invalidHandleValue;\r
715       _isClosed = false;\r
716     }\r
717 \r
718     ~CriticalHandle()\r
719     {\r
720       Dispose(false);\r
721     }\r
722 \r
723     private void Cleanup()\r
724     {\r
725       if (!IsClosed)\r
726       {\r
727         this._isClosed = true;\r
728         if (!IsInvalid)\r
729         {\r
730           ReleaseHandle();\r
731           GC.SuppressFinalize(this);\r
732         }\r
733       }\r
734     }\r
735 \r
736     public void Close()\r
737     {\r
738       Dispose(true);\r
739     }\r
740 \r
741     public void Dispose()\r
742     {\r
743       Dispose(true);\r
744     }\r
745 \r
746     protected virtual void Dispose(bool disposing)\r
747     {\r
748       Cleanup();\r
749     }\r
750 \r
751     protected abstract bool ReleaseHandle();\r
752 \r
753     protected void SetHandle(IntPtr value)\r
754     {\r
755       handle = value;\r
756     }\r
757 \r
758     public void SetHandleAsInvalid()\r
759     {\r
760       _isClosed = true;\r
761       GC.SuppressFinalize(this);\r
762     }\r
763 \r
764     public bool IsClosed\r
765     {\r
766       get { return _isClosed; }\r
767     }\r
768 \r
769     public abstract bool IsInvalid\r
770     {\r
771       get;\r
772     }\r
773 \r
774   }\r
775 \r
776 #endif\r
777 \r
778   // Handles the unmanaged database pointer, and provides finalization support for it.\r
779   internal class SqliteConnectionHandle : CriticalHandle\r
780   {\r
781     public static implicit operator IntPtr(SqliteConnectionHandle db)\r
782     {\r
783       return db.handle;\r
784     }\r
785 \r
786     public static implicit operator SqliteConnectionHandle(IntPtr db)\r
787     {\r
788       return new SqliteConnectionHandle(db);\r
789     }\r
790 \r
791     private SqliteConnectionHandle(IntPtr db)\r
792       : this()\r
793     {\r
794       SetHandle(db);\r
795     }\r
796 \r
797     internal SqliteConnectionHandle()\r
798       : base(IntPtr.Zero)\r
799     {\r
800     }\r
801 \r
802     protected override bool ReleaseHandle()\r
803     {\r
804       try\r
805       {\r
806         SQLiteBase.CloseConnection(this);\r
807       }\r
808       catch (SqliteException)\r
809       {\r
810       }\r
811       return true;\r
812     }\r
813 \r
814     public override bool IsInvalid\r
815     {\r
816       get { return (handle == IntPtr.Zero); }\r
817     }\r
818   }\r
819 \r
820   // Provides finalization support for unmanaged SQLite statements.\r
821   internal class SqliteStatementHandle : CriticalHandle\r
822   {\r
823     public static implicit operator IntPtr(SqliteStatementHandle stmt)\r
824     {\r
825       return stmt.handle;\r
826     }\r
827 \r
828     public static implicit operator SqliteStatementHandle(IntPtr stmt)\r
829     {\r
830       return new SqliteStatementHandle(stmt);\r
831     }\r
832 \r
833     private SqliteStatementHandle(IntPtr stmt)\r
834       : this()\r
835     {\r
836       SetHandle(stmt);\r
837     }\r
838 \r
839     internal SqliteStatementHandle()\r
840       : base(IntPtr.Zero)\r
841     {\r
842     }\r
843 \r
844     protected override bool ReleaseHandle()\r
845     {\r
846       try\r
847       {\r
848         SQLiteBase.FinalizeStatement(this);\r
849       }\r
850       catch (SqliteException)\r
851       {\r
852       }\r
853       return true;\r
854     }\r
855 \r
856     public override bool IsInvalid\r
857     {\r
858       get { return (handle == IntPtr.Zero); }\r
859     }\r
860   }\r
861 }\r