Changed link from GUID to URL
[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 #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_name(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_database_name16(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_decltype(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_decltype16(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_name(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_name16(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_name(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_origin_name16(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_name(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_table_name16(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_text(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_column_text16(IntPtr stmt, int index);\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 IntPtr sqlite3_errmsg(IntPtr db);\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_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);\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 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
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_text(IntPtr p);\r
314 \r
315 #if !PLATFORM_COMPACTFRAMEWORK\r
316     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
317 #else\r
318     [DllImport(SQLITE_DLL)]\r
319 #endif\r
320     internal static extern IntPtr sqlite3_value_text16(IntPtr p);\r
321 #endif\r
322 \r
323     #endregion\r
324 \r
325     // These functions are custom and have no equivalent standard library method.\r
326     // All of them are "nice to haves" and not necessarily "need to haves".\r
327     #region no equivalent standard method\r
328 \r
329 #if !SQLITE_STANDARD\r
330     [DllImport(SQLITE_DLL)]\r
331     internal static extern IntPtr sqlite3_context_collseq(IntPtr context, out int type, out int enc, out int len);\r
332 \r
333     [DllImport(SQLITE_DLL)]\r
334     internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);\r
335 \r
336     [DllImport(SQLITE_DLL)]\r
337     internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);\r
338 \r
339     [DllImport(SQLITE_DLL)]\r
340     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
341 \r
342     [DllImport(SQLITE_DLL)]\r
343     internal static extern void sqlite3_resetall_interop(IntPtr db);\r
344 \r
345     [DllImport(SQLITE_DLL)]\r
346     internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);\r
347 #endif\r
348 \r
349     #endregion\r
350 \r
351     // These are obsolete and will be removed in the future \r
352     #region windows ntfs filesystem only\r
353 \r
354 #if !SQLITE_STANDARD\r
355     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
356     internal static extern int sqlite3_compressfile(string fileName);\r
357 \r
358     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]\r
359     internal static extern int sqlite3_decompressfile(string fileName);\r
360 #endif\r
361 \r
362     #endregion\r
363 \r
364     // Standard API calls global across versions.  There are a few instances of interop calls\r
365     // scattered in here, but they are only active when PLATFORM_COMPACTFRAMEWORK is declared.\r
366     #region standard sqlite api calls\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 IntPtr sqlite3_libversion();\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 void sqlite3_interrupt(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_changes(IntPtr db);\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_busy_timeout(IntPtr db, int ms);\r
395 \r
396 #if !PLATFORM_COMPACTFRAMEWORK\r
397     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
398 #else\r
399     [DllImport(SQLITE_DLL)]\r
400 #endif\r
401     internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);\r
402 \r
403 #if !PLATFORM_COMPACTFRAMEWORK\r
404     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
405     internal static extern int sqlite3_bind_double(IntPtr stmt, int index, double value);\r
406 #else\r
407     [DllImport(SQLITE_DLL)]\r
408     internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);\r
409 #endif\r
410 \r
411 #if !PLATFORM_COMPACTFRAMEWORK\r
412     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
413 #else\r
414     [DllImport(SQLITE_DLL)]\r
415 #endif\r
416     internal static extern int sqlite3_bind_int(IntPtr stmt, int index, int value);\r
417 \r
418 #if !PLATFORM_COMPACTFRAMEWORK\r
419     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
420     internal static extern int sqlite3_bind_int64(IntPtr stmt, int index, long value);\r
421 #else\r
422     [DllImport(SQLITE_DLL)]\r
423     internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long value);\r
424 #endif\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_null(IntPtr stmt, int index);\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_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);\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_count(IntPtr stmt);\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_bind_parameter_index(IntPtr stmt, byte[] strName);\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_column_count(IntPtr stmt);\r
460 \r
461 #if !PLATFORM_COMPACTFRAMEWORK\r
462     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
463 #else\r
464     [DllImport(SQLITE_DLL)]\r
465 #endif\r
466     internal static extern int sqlite3_step(IntPtr stmt);\r
467 \r
468 #if !PLATFORM_COMPACTFRAMEWORK\r
469     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
470     internal static extern double sqlite3_column_double(IntPtr stmt, int index);\r
471 #else\r
472     [DllImport(SQLITE_DLL)]\r
473     internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);\r
474 #endif\r
475 \r
476 #if !PLATFORM_COMPACTFRAMEWORK\r
477     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
478 #else\r
479     [DllImport(SQLITE_DLL)]\r
480 #endif\r
481     internal static extern int sqlite3_column_int(IntPtr stmt, int index);\r
482 \r
483 #if !PLATFORM_COMPACTFRAMEWORK\r
484     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
485     internal static extern long sqlite3_column_int64(IntPtr stmt, int index);\r
486 #else\r
487     [DllImport(SQLITE_DLL)]\r
488     internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long value);\r
489 #endif\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 IntPtr sqlite3_column_blob(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 int sqlite3_column_bytes(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 TypeAffinity sqlite3_column_type(IntPtr stmt, int index);\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_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);\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 int sqlite3_aggregate_count(IntPtr context);\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 IntPtr sqlite3_value_blob(IntPtr p);\r
532 \r
533 #if !PLATFORM_COMPACTFRAMEWORK\r
534     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
535 #else\r
536     [DllImport(SQLITE_DLL)]\r
537 #endif\r
538     internal static extern int sqlite3_value_bytes(IntPtr p);\r
539 \r
540 #if !PLATFORM_COMPACTFRAMEWORK\r
541     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
542     internal static extern double sqlite3_value_double(IntPtr p);\r
543 #else\r
544     [DllImport(SQLITE_DLL)]\r
545     internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);\r
546 #endif\r
547 \r
548 #if !PLATFORM_COMPACTFRAMEWORK\r
549     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
550 #else\r
551     [DllImport(SQLITE_DLL)]\r
552 #endif\r
553     internal static extern int sqlite3_value_int(IntPtr p);\r
554 \r
555 #if !PLATFORM_COMPACTFRAMEWORK\r
556     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
557     internal static extern long sqlite3_value_int64(IntPtr p);\r
558 #else\r
559     [DllImport(SQLITE_DLL)]\r
560     internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 value);\r
561 #endif\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 TypeAffinity sqlite3_value_type(IntPtr p);\r
569 \r
570 #if !PLATFORM_COMPACTFRAMEWORK\r
571     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
572 #else\r
573     [DllImport(SQLITE_DLL)]\r
574 #endif\r
575     internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);\r
576 \r
577 #if !PLATFORM_COMPACTFRAMEWORK\r
578     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
579     internal static extern void sqlite3_result_double(IntPtr context, double value);\r
580 #else\r
581     [DllImport(SQLITE_DLL)]\r
582     internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);\r
583 #endif\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_error(IntPtr context, byte[] strErr, int nLen);\r
591 \r
592 #if !PLATFORM_COMPACTFRAMEWORK\r
593     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
594 #else\r
595     [DllImport(SQLITE_DLL)]\r
596 #endif\r
597     internal static extern void sqlite3_result_int(IntPtr context, int value);\r
598 \r
599 #if !PLATFORM_COMPACTFRAMEWORK\r
600     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
601     internal static extern void sqlite3_result_int64(IntPtr context, long value);\r
602 #else\r
603     [DllImport(SQLITE_DLL)]\r
604     internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);\r
605 #endif\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_null(IntPtr context);\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 void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);\r
620 \r
621 #if !PLATFORM_COMPACTFRAMEWORK\r
622     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]\r
623 #else\r
624     [DllImport(SQLITE_DLL)]\r
625 #endif\r
626     internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);\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 int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);\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_error16(IntPtr context, string strName, int nLen);\r
641 \r
642 #if !PLATFORM_COMPACTFRAMEWORK\r
643     [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]\r
644 #else\r
645     [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]\r
646 #endif\r
647     internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);\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_key(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 int sqlite3_rekey(IntPtr db, byte[] key, int keylen);\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_update_hook(IntPtr db, SQLiteUpdateCallback 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_commit_hook(IntPtr db, SQLiteCommitCallback 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_rollback_hook(IntPtr db, SQLiteRollbackCallback 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_db_handle(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 IntPtr sqlite3_next_stmt(IntPtr db, 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 int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);\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_config (SQLiteConfig config);\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 IntPtr sqlite3_user_data (IntPtr context);\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 int sqlite3_free (IntPtr ptr);\r
725 \r
726     #endregion\r
727   }\r
728 \r
729 #if PLATFORM_COMPACTFRAMEWORK\r
730   internal abstract class CriticalHandle : IDisposable\r
731   {\r
732     private bool _isClosed;\r
733     protected IntPtr handle;\r
734     \r
735     protected CriticalHandle(IntPtr invalidHandleValue)\r
736     {\r
737       handle = invalidHandleValue;\r
738       _isClosed = false;\r
739     }\r
740 \r
741     ~CriticalHandle()\r
742     {\r
743       Dispose(false);\r
744     }\r
745 \r
746     private void Cleanup()\r
747     {\r
748       if (!IsClosed)\r
749       {\r
750         this._isClosed = true;\r
751         if (!IsInvalid)\r
752         {\r
753           ReleaseHandle();\r
754           GC.SuppressFinalize(this);\r
755         }\r
756       }\r
757     }\r
758 \r
759     public void Close()\r
760     {\r
761       Dispose(true);\r
762     }\r
763 \r
764     public void Dispose()\r
765     {\r
766       Dispose(true);\r
767     }\r
768 \r
769     protected virtual void Dispose(bool disposing)\r
770     {\r
771       Cleanup();\r
772     }\r
773 \r
774     protected abstract bool ReleaseHandle();\r
775 \r
776     protected void SetHandle(IntPtr value)\r
777     {\r
778       handle = value;\r
779     }\r
780 \r
781     public void SetHandleAsInvalid()\r
782     {\r
783       _isClosed = true;\r
784       GC.SuppressFinalize(this);\r
785     }\r
786 \r
787     public bool IsClosed\r
788     {\r
789       get { return _isClosed; }\r
790     }\r
791 \r
792     public abstract bool IsInvalid\r
793     {\r
794       get;\r
795     }\r
796 \r
797   }\r
798 \r
799 #endif\r
800 \r
801   // Handles the unmanaged database pointer, and provides finalization support for it.\r
802   internal class SqliteConnectionHandle : CriticalHandle\r
803   {\r
804     public static implicit operator IntPtr(SqliteConnectionHandle db)\r
805     {\r
806       return db.handle;\r
807     }\r
808 \r
809     public static implicit operator SqliteConnectionHandle(IntPtr db)\r
810     {\r
811       return new SqliteConnectionHandle(db);\r
812     }\r
813 \r
814     private SqliteConnectionHandle(IntPtr db)\r
815       : this()\r
816     {\r
817       SetHandle(db);\r
818     }\r
819 \r
820     internal SqliteConnectionHandle()\r
821       : base(IntPtr.Zero)\r
822     {\r
823     }\r
824 \r
825     protected override bool ReleaseHandle()\r
826     {\r
827       try\r
828       {\r
829         SQLiteBase.CloseConnection(this);\r
830       }\r
831       catch (SqliteException)\r
832       {\r
833       }\r
834       return true;\r
835     }\r
836 \r
837     public override bool IsInvalid\r
838     {\r
839       get { return (handle == IntPtr.Zero); }\r
840     }\r
841   }\r
842 \r
843   // Provides finalization support for unmanaged SQLite statements.\r
844   internal class SqliteStatementHandle : CriticalHandle\r
845   {\r
846     public static implicit operator IntPtr(SqliteStatementHandle stmt)\r
847     {\r
848       return stmt.handle;\r
849     }\r
850 \r
851     public static implicit operator SqliteStatementHandle(IntPtr stmt)\r
852     {\r
853       return new SqliteStatementHandle(stmt);\r
854     }\r
855 \r
856     private SqliteStatementHandle(IntPtr stmt)\r
857       : this()\r
858     {\r
859       SetHandle(stmt);\r
860     }\r
861 \r
862     internal SqliteStatementHandle()\r
863       : base(IntPtr.Zero)\r
864     {\r
865     }\r
866 \r
867     protected override bool ReleaseHandle()\r
868     {\r
869       try\r
870       {\r
871         SQLiteBase.FinalizeStatement(this);\r
872       }\r
873       catch (SqliteException)\r
874       {\r
875       }\r
876       return true;\r
877     }\r
878 \r
879     public override bool IsInvalid\r
880     {\r
881       get { return (handle == IntPtr.Zero); }\r
882     }\r
883   }\r
884 }\r