[sgen] Make sure we don't sweep a block if we're not supposed to
[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_close_v2(IntPtr db);\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(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal);\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_create_function_v2(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal, SQLiteFinalCallback fdestroy);\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_finalize(IntPtr stmt);\r
166 \r
167 #if !PLATFORM_COMPACTFRAMEWORK\r
168     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
169 #else\r
170     [DllImport(SQLITE_DLL)]\r
171 #endif\r
172     internal static extern int sqlite3_open_v2(byte[] utf8Filename, out IntPtr db, int flags, IntPtr vfs);\r
173 \r
174     // Compatibility with versions < 3.5.0\r
175 #if !PLATFORM_COMPACTFRAMEWORK\r
176     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
177 #else\r
178     [DllImport(SQLITE_DLL)]\r
179 #endif\r
180     internal static extern int sqlite3_open(byte[] utf8Filename, out IntPtr db);\r
181 \r
182 #if !PLATFORM_COMPACTFRAMEWORK\r
183     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
184 #else\r
185     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
186 #endif\r
187     internal static extern int sqlite3_open16(string fileName, out IntPtr db);\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 int sqlite3_reset(IntPtr stmt);\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_bind_parameter_name(IntPtr stmt, int index);\r
202 \r
203 // Apple does not include those symbols in it's libsqlite3\r
204 #if !MONOTOUCH\r
205 #if !PLATFORM_COMPACTFRAMEWORK\r
206     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
207 #else\r
208     [DllImport(SQLITE_DLL)]\r
209 #endif\r
210     internal static extern IntPtr sqlite3_column_database_name(IntPtr stmt, int index);\r
211 \r
212 #if !PLATFORM_COMPACTFRAMEWORK\r
213     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
214 #else\r
215     [DllImport(SQLITE_DLL)]\r
216 #endif\r
217     internal static extern IntPtr sqlite3_column_database_name16(IntPtr stmt, int index);\r
218 #endif\r
219 \r
220 #if !PLATFORM_COMPACTFRAMEWORK\r
221     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
222 #else\r
223     [DllImport(SQLITE_DLL)]\r
224 #endif\r
225     internal static extern IntPtr sqlite3_column_decltype(IntPtr stmt, int index);\r
226 \r
227 #if !PLATFORM_COMPACTFRAMEWORK\r
228     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
229 #else\r
230     [DllImport(SQLITE_DLL)]\r
231 #endif\r
232     internal static extern IntPtr sqlite3_column_decltype16(IntPtr stmt, int index);\r
233 \r
234 #if !PLATFORM_COMPACTFRAMEWORK\r
235     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
236 #else\r
237     [DllImport(SQLITE_DLL)]\r
238 #endif\r
239     internal static extern IntPtr sqlite3_column_name(IntPtr stmt, int index);\r
240 \r
241 #if !PLATFORM_COMPACTFRAMEWORK\r
242     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
243 #else\r
244     [DllImport(SQLITE_DLL)]\r
245 #endif\r
246     internal static extern IntPtr sqlite3_column_name16(IntPtr stmt, int index);\r
247 \r
248 #if !MONOTOUCH\r
249 #if !PLATFORM_COMPACTFRAMEWORK\r
250     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
251 #else\r
252     [DllImport(SQLITE_DLL)]\r
253 #endif\r
254     internal static extern IntPtr sqlite3_column_origin_name(IntPtr stmt, int index);\r
255 \r
256 #if !PLATFORM_COMPACTFRAMEWORK\r
257     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
258 #else\r
259     [DllImport(SQLITE_DLL)]\r
260 #endif\r
261     internal static extern IntPtr sqlite3_column_origin_name16(IntPtr stmt, int index);\r
262 \r
263 #if !PLATFORM_COMPACTFRAMEWORK\r
264     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
265 #else\r
266     [DllImport(SQLITE_DLL)]\r
267 #endif\r
268     internal static extern IntPtr sqlite3_column_table_name(IntPtr stmt, int index);\r
269 \r
270 #if !PLATFORM_COMPACTFRAMEWORK\r
271     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
272 #else\r
273     [DllImport(SQLITE_DLL)]\r
274 #endif\r
275     internal static extern IntPtr sqlite3_column_table_name16(IntPtr stmt, int index);\r
276 #endif // !MONOTOUCH\r
277 \r
278 #if !PLATFORM_COMPACTFRAMEWORK\r
279     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
280 #else\r
281     [DllImport(SQLITE_DLL)]\r
282 #endif\r
283     internal static extern IntPtr sqlite3_column_text(IntPtr stmt, int index);\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 IntPtr sqlite3_column_text16(IntPtr stmt, int index);\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_errmsg(IntPtr db);\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 int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);\r
305 \r
306 #if !PLATFORM_COMPACTFRAMEWORK\r
307     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
308 #else\r
309     [DllImport(SQLITE_DLL)]\r
310 #endif\r
311     internal static extern 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
312 \r
313 #if !PLATFORM_COMPACTFRAMEWORK\r
314     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
315 #else\r
316     [DllImport(SQLITE_DLL)]\r
317 #endif\r
318     internal static extern IntPtr sqlite3_value_text(IntPtr p);\r
319 \r
320 #if !PLATFORM_COMPACTFRAMEWORK\r
321     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
322 #else\r
323     [DllImport(SQLITE_DLL)]\r
324 #endif\r
325     internal static extern IntPtr sqlite3_value_text16(IntPtr p);\r
326 #endif\r
327 \r
328     #endregion\r
329 \r
330     // These functions are custom and have no equivalent standard library method.\r
331     // All of them are "nice to haves" and not necessarily "need to haves".\r
332     #region no equivalent standard method\r
333 \r
334 #if !SQLITE_STANDARD\r
335     [DllImport(SQLITE_DLL)]\r
336     internal static extern IntPtr sqlite3_context_collseq(IntPtr context, out int type, out int enc, out int len);\r
337 \r
338     [DllImport(SQLITE_DLL)]\r
339     internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);\r
340 \r
341     [DllImport(SQLITE_DLL)]\r
342     internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);\r
343 \r
344     [DllImport(SQLITE_DLL)]\r
345     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
346 \r
347     [DllImport(SQLITE_DLL)]\r
348     internal static extern void sqlite3_resetall_interop(IntPtr db);\r
349 \r
350     [DllImport(SQLITE_DLL)]\r
351     internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);\r
352 #endif\r
353 \r
354     #endregion\r
355 \r
356     // These are obsolete and will be removed in the future \r
357     #region windows ntfs filesystem only\r
358 \r
359 #if !SQLITE_STANDARD\r
360     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
361     internal static extern int sqlite3_compressfile(string fileName);\r
362 \r
363     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
364     internal static extern int sqlite3_decompressfile(string fileName);\r
365 #endif\r
366 \r
367     #endregion\r
368 \r
369     // Standard API calls global across versions.  There are a few instances of interop calls\r
370     // scattered in here, but they are only active when PLATFORM_COMPACTFRAMEWORK is declared.\r
371     #region standard sqlite api calls\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 IntPtr sqlite3_libversion();\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 void sqlite3_interrupt(IntPtr db);\r
386 \r
387 #if !PLATFORM_COMPACTFRAMEWORK\r
388     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
389 #else\r
390     [DllImport(SQLITE_DLL)]\r
391 #endif\r
392     internal static extern int sqlite3_changes(IntPtr db);\r
393 \r
394 #if !PLATFORM_COMPACTFRAMEWORK\r
395     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
396 #else\r
397     [DllImport(SQLITE_DLL)]\r
398 #endif\r
399     internal static extern int sqlite3_busy_timeout(IntPtr db, int ms);\r
400 \r
401 #if !PLATFORM_COMPACTFRAMEWORK\r
402     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
403 #else\r
404     [DllImport(SQLITE_DLL)]\r
405 #endif\r
406     internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);\r
407 \r
408 #if !PLATFORM_COMPACTFRAMEWORK\r
409     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
410     internal static extern int sqlite3_bind_double(IntPtr stmt, int index, double value);\r
411 #else\r
412     [DllImport(SQLITE_DLL)]\r
413     internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);\r
414 #endif\r
415 \r
416 #if !PLATFORM_COMPACTFRAMEWORK\r
417     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
418 #else\r
419     [DllImport(SQLITE_DLL)]\r
420 #endif\r
421     internal static extern int sqlite3_bind_int(IntPtr stmt, int index, int value);\r
422 \r
423 #if !PLATFORM_COMPACTFRAMEWORK\r
424     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
425     internal static extern int sqlite3_bind_int64(IntPtr stmt, int index, long value);\r
426 #else\r
427     [DllImport(SQLITE_DLL)]\r
428     internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long value);\r
429 #endif\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_null(IntPtr stmt, int index);\r
437 \r
438 #if !PLATFORM_COMPACTFRAMEWORK\r
439     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
440 #else\r
441     [DllImport(SQLITE_DLL)]\r
442 #endif\r
443     internal static extern int sqlite3_bind_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);\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_bind_parameter_count(IntPtr stmt);\r
451 \r
452 #if !PLATFORM_COMPACTFRAMEWORK\r
453     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
454 #else\r
455     [DllImport(SQLITE_DLL)]\r
456 #endif\r
457     internal static extern int sqlite3_bind_parameter_index(IntPtr stmt, byte[] strName);\r
458 \r
459 #if !PLATFORM_COMPACTFRAMEWORK\r
460     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
461 #else\r
462     [DllImport(SQLITE_DLL)]\r
463 #endif\r
464     internal static extern int sqlite3_column_count(IntPtr stmt);\r
465 \r
466 #if !PLATFORM_COMPACTFRAMEWORK\r
467     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
468 #else\r
469     [DllImport(SQLITE_DLL)]\r
470 #endif\r
471     internal static extern int sqlite3_step(IntPtr stmt);\r
472 \r
473 #if !PLATFORM_COMPACTFRAMEWORK\r
474     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
475     internal static extern double sqlite3_column_double(IntPtr stmt, int index);\r
476 #else\r
477     [DllImport(SQLITE_DLL)]\r
478     internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);\r
479 #endif\r
480 \r
481 #if !PLATFORM_COMPACTFRAMEWORK\r
482     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
483 #else\r
484     [DllImport(SQLITE_DLL)]\r
485 #endif\r
486     internal static extern int sqlite3_column_int(IntPtr stmt, int index);\r
487 \r
488 #if !PLATFORM_COMPACTFRAMEWORK\r
489     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
490     internal static extern long sqlite3_column_int64(IntPtr stmt, int index);\r
491 #else\r
492     [DllImport(SQLITE_DLL)]\r
493     internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long value);\r
494 #endif\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 IntPtr sqlite3_column_blob(IntPtr stmt, int index);\r
502 \r
503 #if !PLATFORM_COMPACTFRAMEWORK\r
504     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
505 #else\r
506     [DllImport(SQLITE_DLL)]\r
507 #endif\r
508     internal static extern int sqlite3_column_bytes(IntPtr stmt, int index);\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 TypeAffinity sqlite3_column_type(IntPtr stmt, int index);\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_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);\r
523 \r
524 #if !PLATFORM_COMPACTFRAMEWORK\r
525     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
526 #else\r
527     [DllImport(SQLITE_DLL)]\r
528 #endif\r
529     internal static extern int sqlite3_aggregate_count(IntPtr context);\r
530 \r
531 #if !PLATFORM_COMPACTFRAMEWORK\r
532     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
533 #else\r
534     [DllImport(SQLITE_DLL)]\r
535 #endif\r
536     internal static extern IntPtr sqlite3_value_blob(IntPtr p);\r
537 \r
538 #if !PLATFORM_COMPACTFRAMEWORK\r
539     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
540 #else\r
541     [DllImport(SQLITE_DLL)]\r
542 #endif\r
543     internal static extern int sqlite3_value_bytes(IntPtr p);\r
544 \r
545 #if !PLATFORM_COMPACTFRAMEWORK\r
546     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
547     internal static extern double sqlite3_value_double(IntPtr p);\r
548 #else\r
549     [DllImport(SQLITE_DLL)]\r
550     internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);\r
551 #endif\r
552 \r
553 #if !PLATFORM_COMPACTFRAMEWORK\r
554     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
555 #else\r
556     [DllImport(SQLITE_DLL)]\r
557 #endif\r
558     internal static extern int sqlite3_value_int(IntPtr p);\r
559 \r
560 #if !PLATFORM_COMPACTFRAMEWORK\r
561     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
562     internal static extern long sqlite3_value_int64(IntPtr p);\r
563 #else\r
564     [DllImport(SQLITE_DLL)]\r
565     internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 value);\r
566 #endif\r
567 \r
568 #if !PLATFORM_COMPACTFRAMEWORK\r
569     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
570 #else\r
571     [DllImport(SQLITE_DLL)]\r
572 #endif\r
573     internal static extern TypeAffinity sqlite3_value_type(IntPtr p);\r
574 \r
575 #if !PLATFORM_COMPACTFRAMEWORK\r
576     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
577 #else\r
578     [DllImport(SQLITE_DLL)]\r
579 #endif\r
580     internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);\r
581 \r
582 #if !PLATFORM_COMPACTFRAMEWORK\r
583     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
584     internal static extern void sqlite3_result_double(IntPtr context, double value);\r
585 #else\r
586     [DllImport(SQLITE_DLL)]\r
587     internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);\r
588 #endif\r
589 \r
590 #if !PLATFORM_COMPACTFRAMEWORK\r
591     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
592 #else\r
593     [DllImport(SQLITE_DLL)]\r
594 #endif\r
595     internal static extern void sqlite3_result_error(IntPtr context, byte[] strErr, int nLen);\r
596 \r
597 #if !PLATFORM_COMPACTFRAMEWORK\r
598     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
599 #else\r
600     [DllImport(SQLITE_DLL)]\r
601 #endif\r
602     internal static extern void sqlite3_result_int(IntPtr context, int value);\r
603 \r
604 #if !PLATFORM_COMPACTFRAMEWORK\r
605     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
606     internal static extern void sqlite3_result_int64(IntPtr context, long value);\r
607 #else\r
608     [DllImport(SQLITE_DLL)]\r
609     internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);\r
610 #endif\r
611 \r
612 #if !PLATFORM_COMPACTFRAMEWORK\r
613     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
614 #else\r
615     [DllImport(SQLITE_DLL)]\r
616 #endif\r
617     internal static extern void sqlite3_result_null(IntPtr context);\r
618 \r
619 #if !PLATFORM_COMPACTFRAMEWORK\r
620     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
621 #else\r
622     [DllImport(SQLITE_DLL)]\r
623 #endif\r
624     internal static extern void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);\r
625 \r
626 #if !PLATFORM_COMPACTFRAMEWORK\r
627     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
628 #else\r
629     [DllImport(SQLITE_DLL)]\r
630 #endif\r
631     internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);\r
632 \r
633 #if !PLATFORM_COMPACTFRAMEWORK\r
634     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
635 #else\r
636     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
637 #endif\r
638     internal static extern int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);\r
639 \r
640 #if !PLATFORM_COMPACTFRAMEWORK\r
641     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
642 #else\r
643     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
644 #endif\r
645     internal static extern void sqlite3_result_error16(IntPtr context, string strName, int nLen);\r
646 \r
647 #if !PLATFORM_COMPACTFRAMEWORK\r
648     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
649 #else\r
650     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
651 #endif\r
652     internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);\r
653 \r
654 #if !MONOTOUCH\r
655 #if !PLATFORM_COMPACTFRAMEWORK\r
656     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
657 #else\r
658     [DllImport(SQLITE_DLL)]\r
659 #endif\r
660     internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);\r
661 \r
662 #if !PLATFORM_COMPACTFRAMEWORK\r
663     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
664 #else\r
665     [DllImport(SQLITE_DLL)]\r
666 #endif\r
667     internal static extern int sqlite3_rekey(IntPtr db, byte[] key, int keylen);\r
668 #endif\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_update_hook(IntPtr db, SQLiteUpdateCallback 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_commit_hook(IntPtr db, SQLiteCommitCallback func, IntPtr pvUser);\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_rollback_hook(IntPtr db, SQLiteRollbackCallback func, IntPtr pvUser);\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 IntPtr sqlite3_db_handle(IntPtr stmt);\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 IntPtr sqlite3_next_stmt(IntPtr db, IntPtr stmt);\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 int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);\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_config (SQLiteConfig config);\r
718 \r
719 #if !PLATFORM_COMPACTFRAMEWORK\r
720                 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
721 #else\r
722                 [DllImport(SQLITE_DLL)]\r
723 #endif\r
724                 internal static extern IntPtr sqlite3_user_data (IntPtr context);\r
725 \r
726 #if !PLATFORM_COMPACTFRAMEWORK\r
727     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
728 #else\r
729     [DllImport(SQLITE_DLL)]\r
730 #endif\r
731     internal static extern int sqlite3_free (IntPtr ptr);\r
732 \r
733     #endregion\r
734   }\r
735 \r
736 #if PLATFORM_COMPACTFRAMEWORK\r
737   internal abstract class CriticalHandle : IDisposable\r
738   {\r
739     private bool _isClosed;\r
740     protected IntPtr handle;\r
741     \r
742     protected CriticalHandle(IntPtr invalidHandleValue)\r
743     {\r
744       handle = invalidHandleValue;\r
745       _isClosed = false;\r
746     }\r
747 \r
748     ~CriticalHandle()\r
749     {\r
750       Dispose(false);\r
751     }\r
752 \r
753     private void Cleanup()\r
754     {\r
755       if (!IsClosed)\r
756       {\r
757         this._isClosed = true;\r
758         if (!IsInvalid)\r
759         {\r
760           ReleaseHandle();\r
761           GC.SuppressFinalize(this);\r
762         }\r
763       }\r
764     }\r
765 \r
766     public void Close()\r
767     {\r
768       Dispose(true);\r
769     }\r
770 \r
771     public void Dispose()\r
772     {\r
773       Dispose(true);\r
774     }\r
775 \r
776     protected virtual void Dispose(bool disposing)\r
777     {\r
778       Cleanup();\r
779     }\r
780 \r
781     protected abstract bool ReleaseHandle();\r
782 \r
783     protected void SetHandle(IntPtr value)\r
784     {\r
785       handle = value;\r
786     }\r
787 \r
788     public void SetHandleAsInvalid()\r
789     {\r
790       _isClosed = true;\r
791       GC.SuppressFinalize(this);\r
792     }\r
793 \r
794     public bool IsClosed\r
795     {\r
796       get { return _isClosed; }\r
797     }\r
798 \r
799     public abstract bool IsInvalid\r
800     {\r
801       get;\r
802     }\r
803 \r
804   }\r
805 \r
806 #endif\r
807 \r
808   // Handles the unmanaged database pointer, and provides finalization support for it.\r
809   internal class SqliteConnectionHandle : CriticalHandle\r
810   {\r
811     public static implicit operator IntPtr(SqliteConnectionHandle db)\r
812     {\r
813       return db.handle;\r
814     }\r
815 \r
816     public static implicit operator SqliteConnectionHandle(IntPtr db)\r
817     {\r
818       return new SqliteConnectionHandle(db);\r
819     }\r
820 \r
821     private SqliteConnectionHandle(IntPtr db)\r
822       : this()\r
823     {\r
824       SetHandle(db);\r
825     }\r
826 \r
827     internal SqliteConnectionHandle()\r
828       : base(IntPtr.Zero)\r
829     {\r
830     }\r
831 \r
832     protected override bool ReleaseHandle()\r
833     {\r
834       try\r
835       {\r
836         SQLiteBase.CloseConnection(this);\r
837       }\r
838       catch (SqliteException)\r
839       {\r
840       }\r
841       return true;\r
842     }\r
843 \r
844     public override bool IsInvalid\r
845     {\r
846       get { return (handle == IntPtr.Zero); }\r
847     }\r
848   }\r
849 \r
850   // Provides finalization support for unmanaged SQLite statements.\r
851   internal class SqliteStatementHandle : CriticalHandle\r
852   {\r
853     public static implicit operator IntPtr(SqliteStatementHandle stmt)\r
854     {\r
855       return stmt.handle;\r
856     }\r
857 \r
858     public static implicit operator SqliteStatementHandle(IntPtr stmt)\r
859     {\r
860       return new SqliteStatementHandle(stmt);\r
861     }\r
862 \r
863     private SqliteStatementHandle(IntPtr stmt)\r
864       : this()\r
865     {\r
866       SetHandle(stmt);\r
867     }\r
868 \r
869     internal SqliteStatementHandle()\r
870       : base(IntPtr.Zero)\r
871     {\r
872     }\r
873 \r
874     protected override bool ReleaseHandle()\r
875     {\r
876       try\r
877       {\r
878         SQLiteBase.FinalizeStatement(this);\r
879       }\r
880       catch (SqliteException)\r
881       {\r
882       }\r
883       return true;\r
884     }\r
885 \r
886     public override bool IsInvalid\r
887     {\r
888       get { return (handle == IntPtr.Zero); }\r
889     }\r
890   }\r
891 }\r