1 /********************************************************
\r
2 * ADO.NET 2.0 Data Provider for SQLite Version 3.X
\r
3 * Written by Robert Simpson (robert@blackcastlesoft.com)
\r
5 * Released to the public domain, use at your own risk!
\r
6 ********************************************************/
\r
8 namespace Mono.Data.Sqlite
\r
11 using System.Security;
\r
12 using System.Runtime.InteropServices;
\r
14 #if !PLATFORM_COMPACTFRAMEWORK
\r
15 [SuppressUnmanagedCodeSecurity]
\r
17 internal static class UnsafeNativeMethods
\r
19 #if !SQLITE_STANDARD
\r
21 #if !USE_INTEROP_DLL
\r
23 #if !PLATFORM_COMPACTFRAMEWORK
\r
24 private const string SQLITE_DLL = "Mono.Data.Sqlite.DLL";
\r
26 internal const string SQLITE_DLL = "SQLite.Interop.061.DLL";
\r
27 #endif // PLATFORM_COMPACTFRAMEWORK
\r
30 private const string SQLITE_DLL = "SQLite.Interop.DLL";
\r
31 #endif // USE_INTEROP_DLL
\r
34 private const string SQLITE_DLL = "sqlite3";
\r
37 // This section uses interop calls that also fetch text length to optimize conversion.
\r
38 // When using the standard dll, we can replace these calls with normal sqlite calls and do unoptimized conversions instead afterwards
\r
39 #region interop added textlength calls
\r
41 #if !SQLITE_STANDARD
\r
42 [DllImport(SQLITE_DLL)]
\r
43 internal static extern IntPtr sqlite3_bind_parameter_name_interop(IntPtr stmt, int index, out int len);
\r
45 [DllImport(SQLITE_DLL)]
\r
46 internal static extern IntPtr sqlite3_column_database_name_interop(IntPtr stmt, int index, out int len);
\r
48 [DllImport(SQLITE_DLL)]
\r
49 internal static extern IntPtr sqlite3_column_database_name16_interop(IntPtr stmt, int index, out int len);
\r
51 [DllImport(SQLITE_DLL)]
\r
52 internal static extern IntPtr sqlite3_column_decltype_interop(IntPtr stmt, int index, out int len);
\r
54 [DllImport(SQLITE_DLL)]
\r
55 internal static extern IntPtr sqlite3_column_decltype16_interop(IntPtr stmt, int index, out int len);
\r
57 [DllImport(SQLITE_DLL)]
\r
58 internal static extern IntPtr sqlite3_column_name_interop(IntPtr stmt, int index, out int len);
\r
60 [DllImport(SQLITE_DLL)]
\r
61 internal static extern IntPtr sqlite3_column_name16_interop(IntPtr stmt, int index, out int len);
\r
63 [DllImport(SQLITE_DLL)]
\r
64 internal static extern IntPtr sqlite3_column_origin_name_interop(IntPtr stmt, int index, out int len);
\r
66 [DllImport(SQLITE_DLL)]
\r
67 internal static extern IntPtr sqlite3_column_origin_name16_interop(IntPtr stmt, int index, out int len);
\r
69 [DllImport(SQLITE_DLL)]
\r
70 internal static extern IntPtr sqlite3_column_table_name_interop(IntPtr stmt, int index, out int len);
\r
72 [DllImport(SQLITE_DLL)]
\r
73 internal static extern IntPtr sqlite3_column_table_name16_interop(IntPtr stmt, int index, out int len);
\r
75 [DllImport(SQLITE_DLL)]
\r
76 internal static extern IntPtr sqlite3_column_text_interop(IntPtr stmt, int index, out int len);
\r
78 [DllImport(SQLITE_DLL)]
\r
79 internal static extern IntPtr sqlite3_column_text16_interop(IntPtr stmt, int index, out int len);
\r
81 [DllImport(SQLITE_DLL)]
\r
82 internal static extern IntPtr sqlite3_errmsg_interop(IntPtr db, out int len);
\r
84 [DllImport(SQLITE_DLL)]
\r
85 internal static extern int sqlite3_prepare_interop(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain, out int nRemain);
\r
87 [DllImport(SQLITE_DLL)]
\r
88 internal static extern int sqlite3_table_column_metadata_interop(IntPtr db, byte[] dbName, byte[] tblName, byte[] colName, out IntPtr ptrDataType, out IntPtr ptrCollSeq, out int notNull, out int primaryKey, out int autoInc, out int dtLen, out int csLen);
\r
90 [DllImport(SQLITE_DLL)]
\r
91 internal static extern IntPtr sqlite3_value_text_interop(IntPtr p, out int len);
\r
93 [DllImport(SQLITE_DLL)]
\r
94 internal static extern IntPtr sqlite3_value_text16_interop(IntPtr p, out int len);
\r
99 // These functions add existing functionality on top of SQLite and require a little effort to
\r
100 // get working when using the standard SQLite library.
\r
101 #region interop added functionality
\r
103 #if !SQLITE_STANDARD
\r
104 [DllImport(SQLITE_DLL)]
\r
105 internal static extern int sqlite3_close_interop(IntPtr db);
\r
107 [DllImport(SQLITE_DLL)]
\r
108 internal static extern int sqlite3_create_function_interop(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal, int needCollSeq);
\r
110 [DllImport(SQLITE_DLL)]
\r
111 internal static extern int sqlite3_finalize_interop(IntPtr stmt);
\r
113 [DllImport(SQLITE_DLL)]
\r
114 internal static extern int sqlite3_open_interop(byte[] utf8Filename, int flags, out IntPtr db);
\r
116 [DllImport(SQLITE_DLL)]
\r
117 internal static extern int sqlite3_open16_interop(byte[] utf8Filename, int flags, out IntPtr db);
\r
119 [DllImport(SQLITE_DLL)]
\r
120 internal static extern int sqlite3_reset_interop(IntPtr stmt);
\r
126 // The standard api call equivalents of the above interop calls
\r
127 #region standard versions of interop functions
\r
129 #if SQLITE_STANDARD
\r
130 #if !PLATFORM_COMPACTFRAMEWORK
\r
131 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
133 [DllImport(SQLITE_DLL)]
\r
135 internal static extern int sqlite3_close(IntPtr db);
\r
137 #if !PLATFORM_COMPACTFRAMEWORK
\r
138 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
140 [DllImport(SQLITE_DLL)]
\r
142 internal static extern int sqlite3_create_function(IntPtr db, byte[] strName, int nArgs, int nType, IntPtr pvUser, SQLiteCallback func, SQLiteCallback fstep, SQLiteFinalCallback ffinal);
\r
144 #if !PLATFORM_COMPACTFRAMEWORK
\r
145 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
147 [DllImport(SQLITE_DLL)]
\r
149 internal static extern int sqlite3_finalize(IntPtr stmt);
\r
151 #if !PLATFORM_COMPACTFRAMEWORK
\r
152 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
154 [DllImport(SQLITE_DLL)]
\r
156 internal static extern int sqlite3_open_v2(byte[] utf8Filename, out IntPtr db, int flags, IntPtr vfs);
\r
158 #if !PLATFORM_COMPACTFRAMEWORK
\r
159 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
161 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
163 internal static extern int sqlite3_open16(string fileName, out IntPtr db);
\r
165 #if !PLATFORM_COMPACTFRAMEWORK
\r
166 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
168 [DllImport(SQLITE_DLL)]
\r
170 internal static extern int sqlite3_reset(IntPtr stmt);
\r
172 #if !PLATFORM_COMPACTFRAMEWORK
\r
173 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
175 [DllImport(SQLITE_DLL)]
\r
177 internal static extern IntPtr sqlite3_bind_parameter_name(IntPtr stmt, int index);
\r
179 #if !PLATFORM_COMPACTFRAMEWORK
\r
180 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
182 [DllImport(SQLITE_DLL)]
\r
184 internal static extern IntPtr sqlite3_column_database_name(IntPtr stmt, int index);
\r
186 #if !PLATFORM_COMPACTFRAMEWORK
\r
187 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
189 [DllImport(SQLITE_DLL)]
\r
191 internal static extern IntPtr sqlite3_column_database_name16(IntPtr stmt, int index);
\r
193 #if !PLATFORM_COMPACTFRAMEWORK
\r
194 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
196 [DllImport(SQLITE_DLL)]
\r
198 internal static extern IntPtr sqlite3_column_decltype(IntPtr stmt, int index);
\r
200 #if !PLATFORM_COMPACTFRAMEWORK
\r
201 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
203 [DllImport(SQLITE_DLL)]
\r
205 internal static extern IntPtr sqlite3_column_decltype16(IntPtr stmt, int index);
\r
207 #if !PLATFORM_COMPACTFRAMEWORK
\r
208 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
210 [DllImport(SQLITE_DLL)]
\r
212 internal static extern IntPtr sqlite3_column_name(IntPtr stmt, int index);
\r
214 #if !PLATFORM_COMPACTFRAMEWORK
\r
215 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
217 [DllImport(SQLITE_DLL)]
\r
219 internal static extern IntPtr sqlite3_column_name16(IntPtr stmt, int index);
\r
221 #if !PLATFORM_COMPACTFRAMEWORK
\r
222 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
224 [DllImport(SQLITE_DLL)]
\r
226 internal static extern IntPtr sqlite3_column_origin_name(IntPtr stmt, int index);
\r
228 #if !PLATFORM_COMPACTFRAMEWORK
\r
229 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
231 [DllImport(SQLITE_DLL)]
\r
233 internal static extern IntPtr sqlite3_column_origin_name16(IntPtr stmt, int index);
\r
235 #if !PLATFORM_COMPACTFRAMEWORK
\r
236 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
238 [DllImport(SQLITE_DLL)]
\r
240 internal static extern IntPtr sqlite3_column_table_name(IntPtr stmt, int index);
\r
242 #if !PLATFORM_COMPACTFRAMEWORK
\r
243 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
245 [DllImport(SQLITE_DLL)]
\r
247 internal static extern IntPtr sqlite3_column_table_name16(IntPtr stmt, int index);
\r
249 #if !PLATFORM_COMPACTFRAMEWORK
\r
250 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
252 [DllImport(SQLITE_DLL)]
\r
254 internal static extern IntPtr sqlite3_column_text(IntPtr stmt, int index);
\r
256 #if !PLATFORM_COMPACTFRAMEWORK
\r
257 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
259 [DllImport(SQLITE_DLL)]
\r
261 internal static extern IntPtr sqlite3_column_text16(IntPtr stmt, int index);
\r
263 #if !PLATFORM_COMPACTFRAMEWORK
\r
264 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
266 [DllImport(SQLITE_DLL)]
\r
268 internal static extern IntPtr sqlite3_errmsg(IntPtr db);
\r
270 #if !PLATFORM_COMPACTFRAMEWORK
\r
271 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
273 [DllImport(SQLITE_DLL)]
\r
275 internal static extern int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);
\r
277 #if !PLATFORM_COMPACTFRAMEWORK
\r
278 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
280 [DllImport(SQLITE_DLL)]
\r
282 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
284 #if !PLATFORM_COMPACTFRAMEWORK
\r
285 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
287 [DllImport(SQLITE_DLL)]
\r
289 internal static extern IntPtr sqlite3_value_text(IntPtr p);
\r
291 #if !PLATFORM_COMPACTFRAMEWORK
\r
292 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
294 [DllImport(SQLITE_DLL)]
\r
296 internal static extern IntPtr sqlite3_value_text16(IntPtr p);
\r
301 // These functions are custom and have no equivalent standard library method.
\r
302 // All of them are "nice to haves" and not necessarily "need to haves".
\r
303 #region no equivalent standard method
\r
305 #if !SQLITE_STANDARD
\r
306 [DllImport(SQLITE_DLL)]
\r
307 internal static extern IntPtr sqlite3_context_collseq(IntPtr context, out int type, out int enc, out int len);
\r
309 [DllImport(SQLITE_DLL)]
\r
310 internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);
\r
312 [DllImport(SQLITE_DLL)]
\r
313 internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);
\r
315 [DllImport(SQLITE_DLL)]
\r
316 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
318 [DllImport(SQLITE_DLL)]
\r
319 internal static extern void sqlite3_resetall_interop(IntPtr db);
\r
321 [DllImport(SQLITE_DLL)]
\r
322 internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);
\r
327 // These are obsolete and will be removed in the future
\r
328 #region windows ntfs filesystem only
\r
330 #if !SQLITE_STANDARD
\r
331 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]
\r
332 internal static extern int sqlite3_compressfile(string fileName);
\r
334 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]
\r
335 internal static extern int sqlite3_decompressfile(string fileName);
\r
340 // Standard API calls global across versions. There are a few instances of interop calls
\r
341 // scattered in here, but they are only active when PLATFORM_COMPACTFRAMEWORK is declared.
\r
342 #region standard sqlite api calls
\r
344 #if !PLATFORM_COMPACTFRAMEWORK
\r
345 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
347 [DllImport(SQLITE_DLL)]
\r
349 internal static extern IntPtr sqlite3_libversion();
\r
351 #if !PLATFORM_COMPACTFRAMEWORK
\r
352 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
354 [DllImport(SQLITE_DLL)]
\r
356 internal static extern void sqlite3_interrupt(IntPtr db);
\r
358 #if !PLATFORM_COMPACTFRAMEWORK
\r
359 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
361 [DllImport(SQLITE_DLL)]
\r
363 internal static extern int sqlite3_changes(IntPtr db);
\r
365 #if !PLATFORM_COMPACTFRAMEWORK
\r
366 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
368 [DllImport(SQLITE_DLL)]
\r
370 internal static extern int sqlite3_busy_timeout(IntPtr db, int ms);
\r
372 #if !PLATFORM_COMPACTFRAMEWORK
\r
373 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
375 [DllImport(SQLITE_DLL)]
\r
377 internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);
\r
379 #if !PLATFORM_COMPACTFRAMEWORK
\r
380 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
381 internal static extern int sqlite3_bind_double(IntPtr stmt, int index, double value);
\r
383 [DllImport(SQLITE_DLL)]
\r
384 internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);
\r
387 #if !PLATFORM_COMPACTFRAMEWORK
\r
388 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
390 [DllImport(SQLITE_DLL)]
\r
392 internal static extern int sqlite3_bind_int(IntPtr stmt, int index, int value);
\r
394 #if !PLATFORM_COMPACTFRAMEWORK
\r
395 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
396 internal static extern int sqlite3_bind_int64(IntPtr stmt, int index, long value);
\r
398 [DllImport(SQLITE_DLL)]
\r
399 internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long value);
\r
402 #if !PLATFORM_COMPACTFRAMEWORK
\r
403 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
405 [DllImport(SQLITE_DLL)]
\r
407 internal static extern int sqlite3_bind_null(IntPtr stmt, int index);
\r
409 #if !PLATFORM_COMPACTFRAMEWORK
\r
410 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
412 [DllImport(SQLITE_DLL)]
\r
414 internal static extern int sqlite3_bind_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);
\r
416 #if !PLATFORM_COMPACTFRAMEWORK
\r
417 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
419 [DllImport(SQLITE_DLL)]
\r
421 internal static extern int sqlite3_bind_parameter_count(IntPtr stmt);
\r
423 #if !PLATFORM_COMPACTFRAMEWORK
\r
424 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
426 [DllImport(SQLITE_DLL)]
\r
428 internal static extern int sqlite3_bind_parameter_index(IntPtr stmt, byte[] strName);
\r
430 #if !PLATFORM_COMPACTFRAMEWORK
\r
431 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
433 [DllImport(SQLITE_DLL)]
\r
435 internal static extern int sqlite3_column_count(IntPtr stmt);
\r
437 #if !PLATFORM_COMPACTFRAMEWORK
\r
438 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
440 [DllImport(SQLITE_DLL)]
\r
442 internal static extern int sqlite3_step(IntPtr stmt);
\r
444 #if !PLATFORM_COMPACTFRAMEWORK
\r
445 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
446 internal static extern double sqlite3_column_double(IntPtr stmt, int index);
\r
448 [DllImport(SQLITE_DLL)]
\r
449 internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);
\r
452 #if !PLATFORM_COMPACTFRAMEWORK
\r
453 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
455 [DllImport(SQLITE_DLL)]
\r
457 internal static extern int sqlite3_column_int(IntPtr stmt, int index);
\r
459 #if !PLATFORM_COMPACTFRAMEWORK
\r
460 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
461 internal static extern long sqlite3_column_int64(IntPtr stmt, int index);
\r
463 [DllImport(SQLITE_DLL)]
\r
464 internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long value);
\r
467 #if !PLATFORM_COMPACTFRAMEWORK
\r
468 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
470 [DllImport(SQLITE_DLL)]
\r
472 internal static extern IntPtr sqlite3_column_blob(IntPtr stmt, int index);
\r
474 #if !PLATFORM_COMPACTFRAMEWORK
\r
475 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
477 [DllImport(SQLITE_DLL)]
\r
479 internal static extern int sqlite3_column_bytes(IntPtr stmt, int index);
\r
481 #if !PLATFORM_COMPACTFRAMEWORK
\r
482 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
484 [DllImport(SQLITE_DLL)]
\r
486 internal static extern TypeAffinity sqlite3_column_type(IntPtr stmt, int index);
\r
488 #if !PLATFORM_COMPACTFRAMEWORK
\r
489 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
491 [DllImport(SQLITE_DLL)]
\r
493 internal static extern int sqlite3_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);
\r
495 #if !PLATFORM_COMPACTFRAMEWORK
\r
496 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
498 [DllImport(SQLITE_DLL)]
\r
500 internal static extern int sqlite3_aggregate_count(IntPtr context);
\r
502 #if !PLATFORM_COMPACTFRAMEWORK
\r
503 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
505 [DllImport(SQLITE_DLL)]
\r
507 internal static extern IntPtr sqlite3_value_blob(IntPtr p);
\r
509 #if !PLATFORM_COMPACTFRAMEWORK
\r
510 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
512 [DllImport(SQLITE_DLL)]
\r
514 internal static extern int sqlite3_value_bytes(IntPtr p);
\r
516 #if !PLATFORM_COMPACTFRAMEWORK
\r
517 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
518 internal static extern double sqlite3_value_double(IntPtr p);
\r
520 [DllImport(SQLITE_DLL)]
\r
521 internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);
\r
524 #if !PLATFORM_COMPACTFRAMEWORK
\r
525 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
527 [DllImport(SQLITE_DLL)]
\r
529 internal static extern int sqlite3_value_int(IntPtr p);
\r
531 #if !PLATFORM_COMPACTFRAMEWORK
\r
532 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
533 internal static extern long sqlite3_value_int64(IntPtr p);
\r
535 [DllImport(SQLITE_DLL)]
\r
536 internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 value);
\r
539 #if !PLATFORM_COMPACTFRAMEWORK
\r
540 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
542 [DllImport(SQLITE_DLL)]
\r
544 internal static extern TypeAffinity sqlite3_value_type(IntPtr p);
\r
546 #if !PLATFORM_COMPACTFRAMEWORK
\r
547 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
549 [DllImport(SQLITE_DLL)]
\r
551 internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);
\r
553 #if !PLATFORM_COMPACTFRAMEWORK
\r
554 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
555 internal static extern void sqlite3_result_double(IntPtr context, double value);
\r
557 [DllImport(SQLITE_DLL)]
\r
558 internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);
\r
561 #if !PLATFORM_COMPACTFRAMEWORK
\r
562 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
564 [DllImport(SQLITE_DLL)]
\r
566 internal static extern void sqlite3_result_error(IntPtr context, byte[] strErr, int nLen);
\r
568 #if !PLATFORM_COMPACTFRAMEWORK
\r
569 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
571 [DllImport(SQLITE_DLL)]
\r
573 internal static extern void sqlite3_result_int(IntPtr context, int value);
\r
575 #if !PLATFORM_COMPACTFRAMEWORK
\r
576 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
577 internal static extern void sqlite3_result_int64(IntPtr context, long value);
\r
579 [DllImport(SQLITE_DLL)]
\r
580 internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);
\r
583 #if !PLATFORM_COMPACTFRAMEWORK
\r
584 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
586 [DllImport(SQLITE_DLL)]
\r
588 internal static extern void sqlite3_result_null(IntPtr context);
\r
590 #if !PLATFORM_COMPACTFRAMEWORK
\r
591 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
593 [DllImport(SQLITE_DLL)]
\r
595 internal static extern void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);
\r
597 #if !PLATFORM_COMPACTFRAMEWORK
\r
598 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
600 [DllImport(SQLITE_DLL)]
\r
602 internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);
\r
604 #if !PLATFORM_COMPACTFRAMEWORK
\r
605 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
607 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
609 internal static extern int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);
\r
611 #if !PLATFORM_COMPACTFRAMEWORK
\r
612 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
614 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
616 internal static extern void sqlite3_result_error16(IntPtr context, string strName, int nLen);
\r
618 #if !PLATFORM_COMPACTFRAMEWORK
\r
619 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
621 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
623 internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);
\r
625 #if !PLATFORM_COMPACTFRAMEWORK
\r
626 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
628 [DllImport(SQLITE_DLL)]
\r
630 internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);
\r
632 #if !PLATFORM_COMPACTFRAMEWORK
\r
633 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
635 [DllImport(SQLITE_DLL)]
\r
637 internal static extern int sqlite3_rekey(IntPtr db, byte[] key, int keylen);
\r
639 #if !PLATFORM_COMPACTFRAMEWORK
\r
640 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
642 [DllImport(SQLITE_DLL)]
\r
644 internal static extern IntPtr sqlite3_update_hook(IntPtr db, SQLiteUpdateCallback func, IntPtr pvUser);
\r
646 #if !PLATFORM_COMPACTFRAMEWORK
\r
647 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
649 [DllImport(SQLITE_DLL)]
\r
651 internal static extern IntPtr sqlite3_commit_hook(IntPtr db, SQLiteCommitCallback func, IntPtr pvUser);
\r
653 #if !PLATFORM_COMPACTFRAMEWORK
\r
654 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
656 [DllImport(SQLITE_DLL)]
\r
658 internal static extern IntPtr sqlite3_rollback_hook(IntPtr db, SQLiteRollbackCallback func, IntPtr pvUser);
\r
660 #if !PLATFORM_COMPACTFRAMEWORK
\r
661 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
663 [DllImport(SQLITE_DLL)]
\r
665 internal static extern IntPtr sqlite3_db_handle(IntPtr stmt);
\r
667 #if !PLATFORM_COMPACTFRAMEWORK
\r
668 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
670 [DllImport(SQLITE_DLL)]
\r
672 internal static extern IntPtr sqlite3_next_stmt(IntPtr db, IntPtr stmt);
\r
674 #if !PLATFORM_COMPACTFRAMEWORK
\r
675 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
677 [DllImport(SQLITE_DLL)]
\r
679 internal static extern int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);
\r
684 #if PLATFORM_COMPACTFRAMEWORK
\r
685 internal abstract class CriticalHandle : IDisposable
\r
687 private bool _isClosed;
\r
688 protected IntPtr handle;
\r
690 protected CriticalHandle(IntPtr invalidHandleValue)
\r
692 handle = invalidHandleValue;
\r
701 private void Cleanup()
\r
705 this._isClosed = true;
\r
709 GC.SuppressFinalize(this);
\r
714 public void Close()
\r
719 public void Dispose()
\r
724 protected virtual void Dispose(bool disposing)
\r
729 protected abstract bool ReleaseHandle();
\r
731 protected void SetHandle(IntPtr value)
\r
736 public void SetHandleAsInvalid()
\r
739 GC.SuppressFinalize(this);
\r
742 public bool IsClosed
\r
744 get { return _isClosed; }
\r
747 public abstract bool IsInvalid
\r
756 // Handles the unmanaged database pointer, and provides finalization support for it.
\r
757 internal class SQLiteConnectionHandle : CriticalHandle
\r
759 public static implicit operator IntPtr(SQLiteConnectionHandle db)
\r
764 public static implicit operator SQLiteConnectionHandle(IntPtr db)
\r
766 return new SQLiteConnectionHandle(db);
\r
769 private SQLiteConnectionHandle(IntPtr db)
\r
775 internal SQLiteConnectionHandle()
\r
776 : base(IntPtr.Zero)
\r
780 protected override bool ReleaseHandle()
\r
784 SQLiteBase.CloseConnection(this);
\r
786 catch (SQLiteException)
\r
792 public override bool IsInvalid
\r
794 get { return (handle == IntPtr.Zero); }
\r
798 // Provides finalization support for unmanaged SQLite statements.
\r
799 internal class SQLiteStatementHandle : CriticalHandle
\r
801 public static implicit operator IntPtr(SQLiteStatementHandle stmt)
\r
803 return stmt.handle;
\r
806 public static implicit operator SQLiteStatementHandle(IntPtr stmt)
\r
808 return new SQLiteStatementHandle(stmt);
\r
811 private SQLiteStatementHandle(IntPtr stmt)
\r
817 internal SQLiteStatementHandle()
\r
818 : base(IntPtr.Zero)
\r
822 protected override bool ReleaseHandle()
\r
826 SQLiteBase.FinalizeStatement(this);
\r
828 catch (SQLiteException)
\r
834 public override bool IsInvalid
\r
836 get { return (handle == IntPtr.Zero); }
\r