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