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 = "/usr/lib/libsqlite3.dylib";
\r
36 private const string SQLITE_DLL = "sqlite3";
\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
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
47 [DllImport(SQLITE_DLL)]
\r
48 internal static extern IntPtr sqlite3_column_database_name_interop(IntPtr stmt, int index, out int len);
\r
50 [DllImport(SQLITE_DLL)]
\r
51 internal static extern IntPtr sqlite3_column_database_name16_interop(IntPtr stmt, int index, out int len);
\r
53 [DllImport(SQLITE_DLL)]
\r
54 internal static extern IntPtr sqlite3_column_decltype_interop(IntPtr stmt, int index, out int len);
\r
56 [DllImport(SQLITE_DLL)]
\r
57 internal static extern IntPtr sqlite3_column_decltype16_interop(IntPtr stmt, int index, out int len);
\r
59 [DllImport(SQLITE_DLL)]
\r
60 internal static extern IntPtr sqlite3_column_name_interop(IntPtr stmt, int index, out int len);
\r
62 [DllImport(SQLITE_DLL)]
\r
63 internal static extern IntPtr sqlite3_column_name16_interop(IntPtr stmt, int index, out int len);
\r
65 [DllImport(SQLITE_DLL)]
\r
66 internal static extern IntPtr sqlite3_column_origin_name_interop(IntPtr stmt, int index, out int len);
\r
68 [DllImport(SQLITE_DLL)]
\r
69 internal static extern IntPtr sqlite3_column_origin_name16_interop(IntPtr stmt, int index, out int len);
\r
71 [DllImport(SQLITE_DLL)]
\r
72 internal static extern IntPtr sqlite3_column_table_name_interop(IntPtr stmt, int index, out int len);
\r
74 [DllImport(SQLITE_DLL)]
\r
75 internal static extern IntPtr sqlite3_column_table_name16_interop(IntPtr stmt, int index, out int len);
\r
77 [DllImport(SQLITE_DLL)]
\r
78 internal static extern IntPtr sqlite3_column_text_interop(IntPtr stmt, int index, out int len);
\r
80 [DllImport(SQLITE_DLL)]
\r
81 internal static extern IntPtr sqlite3_column_text16_interop(IntPtr stmt, int index, out int len);
\r
83 [DllImport(SQLITE_DLL)]
\r
84 internal static extern IntPtr sqlite3_errmsg_interop(IntPtr db, out int len);
\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
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
92 [DllImport(SQLITE_DLL)]
\r
93 internal static extern IntPtr sqlite3_value_text_interop(IntPtr p, out int len);
\r
95 [DllImport(SQLITE_DLL)]
\r
96 internal static extern IntPtr sqlite3_value_text16_interop(IntPtr p, out int len);
\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
105 #if !SQLITE_STANDARD
\r
106 [DllImport(SQLITE_DLL)]
\r
107 internal static extern int sqlite3_close_interop(IntPtr db);
\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
112 [DllImport(SQLITE_DLL)]
\r
113 internal static extern int sqlite3_finalize_interop(IntPtr stmt);
\r
115 [DllImport(SQLITE_DLL)]
\r
116 internal static extern int sqlite3_open_interop(byte[] utf8Filename, int flags, out IntPtr db);
\r
118 [DllImport(SQLITE_DLL)]
\r
119 internal static extern int sqlite3_open16_interop(byte[] utf8Filename, int flags, out IntPtr db);
\r
121 [DllImport(SQLITE_DLL)]
\r
122 internal static extern int sqlite3_reset_interop(IntPtr stmt);
\r
128 // The standard api call equivalents of the above interop calls
\r
129 #region standard versions of interop functions
\r
131 #if SQLITE_STANDARD
\r
132 #if !PLATFORM_COMPACTFRAMEWORK
\r
133 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
135 [DllImport(SQLITE_DLL)]
\r
137 internal static extern int sqlite3_close(IntPtr db);
\r
139 #if !PLATFORM_COMPACTFRAMEWORK
\r
140 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
142 [DllImport(SQLITE_DLL)]
\r
144 internal static extern int sqlite3_close_v2(IntPtr db);
\r
146 #if !PLATFORM_COMPACTFRAMEWORK
\r
147 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
149 [DllImport(SQLITE_DLL)]
\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
153 #if !PLATFORM_COMPACTFRAMEWORK
\r
154 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
156 [DllImport(SQLITE_DLL)]
\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
160 #if !PLATFORM_COMPACTFRAMEWORK
\r
161 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
163 [DllImport(SQLITE_DLL)]
\r
165 internal static extern int sqlite3_finalize(IntPtr stmt);
\r
167 #if !PLATFORM_COMPACTFRAMEWORK
\r
168 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
170 [DllImport(SQLITE_DLL)]
\r
172 internal static extern int sqlite3_open_v2(byte[] utf8Filename, out IntPtr db, int flags, IntPtr vfs);
\r
174 // Compatibility with versions < 3.5.0
\r
175 #if !PLATFORM_COMPACTFRAMEWORK
\r
176 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
178 [DllImport(SQLITE_DLL)]
\r
180 internal static extern int sqlite3_open(byte[] utf8Filename, out IntPtr db);
\r
182 #if !PLATFORM_COMPACTFRAMEWORK
\r
183 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
185 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
187 internal static extern int sqlite3_open16(string fileName, out IntPtr db);
\r
189 #if !PLATFORM_COMPACTFRAMEWORK
\r
190 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
192 [DllImport(SQLITE_DLL)]
\r
194 internal static extern int sqlite3_reset(IntPtr stmt);
\r
196 #if !PLATFORM_COMPACTFRAMEWORK
\r
197 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
199 [DllImport(SQLITE_DLL)]
\r
201 internal static extern IntPtr sqlite3_bind_parameter_name(IntPtr stmt, int index);
\r
203 #if !PLATFORM_COMPACTFRAMEWORK
\r
204 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
206 [DllImport(SQLITE_DLL)]
\r
208 internal static extern IntPtr sqlite3_column_database_name(IntPtr stmt, int index);
\r
210 #if !PLATFORM_COMPACTFRAMEWORK
\r
211 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
213 [DllImport(SQLITE_DLL)]
\r
215 internal static extern IntPtr sqlite3_column_database_name16(IntPtr stmt, int index);
\r
217 #if !PLATFORM_COMPACTFRAMEWORK
\r
218 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
220 [DllImport(SQLITE_DLL)]
\r
222 internal static extern IntPtr sqlite3_column_decltype(IntPtr stmt, int index);
\r
224 #if !PLATFORM_COMPACTFRAMEWORK
\r
225 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
227 [DllImport(SQLITE_DLL)]
\r
229 internal static extern IntPtr sqlite3_column_decltype16(IntPtr stmt, int index);
\r
231 #if !PLATFORM_COMPACTFRAMEWORK
\r
232 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
234 [DllImport(SQLITE_DLL)]
\r
236 internal static extern IntPtr sqlite3_column_name(IntPtr stmt, int index);
\r
238 #if !PLATFORM_COMPACTFRAMEWORK
\r
239 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
241 [DllImport(SQLITE_DLL)]
\r
243 internal static extern IntPtr sqlite3_column_name16(IntPtr stmt, int index);
\r
245 #if !PLATFORM_COMPACTFRAMEWORK
\r
246 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
248 [DllImport(SQLITE_DLL)]
\r
250 internal static extern IntPtr sqlite3_column_origin_name(IntPtr stmt, int index);
\r
252 #if !PLATFORM_COMPACTFRAMEWORK
\r
253 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
255 [DllImport(SQLITE_DLL)]
\r
257 internal static extern IntPtr sqlite3_column_origin_name16(IntPtr stmt, int index);
\r
259 #if !PLATFORM_COMPACTFRAMEWORK
\r
260 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
262 [DllImport(SQLITE_DLL)]
\r
264 internal static extern IntPtr sqlite3_column_table_name(IntPtr stmt, int index);
\r
266 #if !PLATFORM_COMPACTFRAMEWORK
\r
267 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
269 [DllImport(SQLITE_DLL)]
\r
271 internal static extern IntPtr sqlite3_column_table_name16(IntPtr stmt, int index);
\r
273 #if !PLATFORM_COMPACTFRAMEWORK
\r
274 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
276 [DllImport(SQLITE_DLL)]
\r
278 internal static extern IntPtr sqlite3_column_text(IntPtr stmt, int index);
\r
280 #if !PLATFORM_COMPACTFRAMEWORK
\r
281 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
283 [DllImport(SQLITE_DLL)]
\r
285 internal static extern IntPtr sqlite3_column_text16(IntPtr stmt, int index);
\r
287 #if !PLATFORM_COMPACTFRAMEWORK
\r
288 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
290 [DllImport(SQLITE_DLL)]
\r
292 internal static extern IntPtr sqlite3_errmsg(IntPtr db);
\r
294 #if !PLATFORM_COMPACTFRAMEWORK
\r
295 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
297 [DllImport(SQLITE_DLL)]
\r
299 internal static extern int sqlite3_prepare(IntPtr db, IntPtr pSql, int nBytes, out IntPtr stmt, out IntPtr ptrRemain);
\r
301 #if !PLATFORM_COMPACTFRAMEWORK
\r
302 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
304 [DllImport(SQLITE_DLL)]
\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
308 #if !PLATFORM_COMPACTFRAMEWORK
\r
309 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
311 [DllImport(SQLITE_DLL)]
\r
313 internal static extern IntPtr sqlite3_value_text(IntPtr p);
\r
315 #if !PLATFORM_COMPACTFRAMEWORK
\r
316 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
318 [DllImport(SQLITE_DLL)]
\r
320 internal static extern IntPtr sqlite3_value_text16(IntPtr p);
\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
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
333 [DllImport(SQLITE_DLL)]
\r
334 internal static extern int sqlite3_context_collcompare(IntPtr context, byte[] p1, int p1len, byte[] p2, int p2len);
\r
336 [DllImport(SQLITE_DLL)]
\r
337 internal static extern int sqlite3_cursor_rowid(IntPtr stmt, int cursor, out long rowid);
\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
342 [DllImport(SQLITE_DLL)]
\r
343 internal static extern void sqlite3_resetall_interop(IntPtr db);
\r
345 [DllImport(SQLITE_DLL)]
\r
346 internal static extern int sqlite3_table_cursor(IntPtr stmt, int db, int tableRootPage);
\r
351 // These are obsolete and will be removed in the future
\r
352 #region windows ntfs filesystem only
\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
358 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode, SetLastError = true)]
\r
359 internal static extern int sqlite3_decompressfile(string fileName);
\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
368 #if !PLATFORM_COMPACTFRAMEWORK
\r
369 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
371 [DllImport(SQLITE_DLL)]
\r
373 internal static extern IntPtr sqlite3_libversion();
\r
375 #if !PLATFORM_COMPACTFRAMEWORK
\r
376 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
378 [DllImport(SQLITE_DLL)]
\r
380 internal static extern void sqlite3_interrupt(IntPtr db);
\r
382 #if !PLATFORM_COMPACTFRAMEWORK
\r
383 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
385 [DllImport(SQLITE_DLL)]
\r
387 internal static extern int sqlite3_changes(IntPtr db);
\r
389 #if !PLATFORM_COMPACTFRAMEWORK
\r
390 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
392 [DllImport(SQLITE_DLL)]
\r
394 internal static extern int sqlite3_busy_timeout(IntPtr db, int ms);
\r
396 #if !PLATFORM_COMPACTFRAMEWORK
\r
397 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
399 [DllImport(SQLITE_DLL)]
\r
401 internal static extern int sqlite3_bind_blob(IntPtr stmt, int index, Byte[] value, int nSize, IntPtr nTransient);
\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
407 [DllImport(SQLITE_DLL)]
\r
408 internal static extern int sqlite3_bind_double_interop(IntPtr stmt, int index, ref double value);
\r
411 #if !PLATFORM_COMPACTFRAMEWORK
\r
412 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
414 [DllImport(SQLITE_DLL)]
\r
416 internal static extern int sqlite3_bind_int(IntPtr stmt, int index, int value);
\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
422 [DllImport(SQLITE_DLL)]
\r
423 internal static extern int sqlite3_bind_int64_interop(IntPtr stmt, int index, ref long value);
\r
426 #if !PLATFORM_COMPACTFRAMEWORK
\r
427 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
429 [DllImport(SQLITE_DLL)]
\r
431 internal static extern int sqlite3_bind_null(IntPtr stmt, int index);
\r
433 #if !PLATFORM_COMPACTFRAMEWORK
\r
434 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
436 [DllImport(SQLITE_DLL)]
\r
438 internal static extern int sqlite3_bind_text(IntPtr stmt, int index, byte[] value, int nlen, IntPtr pvReserved);
\r
440 #if !PLATFORM_COMPACTFRAMEWORK
\r
441 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
443 [DllImport(SQLITE_DLL)]
\r
445 internal static extern int sqlite3_bind_parameter_count(IntPtr stmt);
\r
447 #if !PLATFORM_COMPACTFRAMEWORK
\r
448 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
450 [DllImport(SQLITE_DLL)]
\r
452 internal static extern int sqlite3_bind_parameter_index(IntPtr stmt, byte[] strName);
\r
454 #if !PLATFORM_COMPACTFRAMEWORK
\r
455 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
457 [DllImport(SQLITE_DLL)]
\r
459 internal static extern int sqlite3_column_count(IntPtr stmt);
\r
461 #if !PLATFORM_COMPACTFRAMEWORK
\r
462 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
464 [DllImport(SQLITE_DLL)]
\r
466 internal static extern int sqlite3_step(IntPtr stmt);
\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
472 [DllImport(SQLITE_DLL)]
\r
473 internal static extern void sqlite3_column_double_interop(IntPtr stmt, int index, out double value);
\r
476 #if !PLATFORM_COMPACTFRAMEWORK
\r
477 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
479 [DllImport(SQLITE_DLL)]
\r
481 internal static extern int sqlite3_column_int(IntPtr stmt, int index);
\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
487 [DllImport(SQLITE_DLL)]
\r
488 internal static extern void sqlite3_column_int64_interop(IntPtr stmt, int index, out long value);
\r
491 #if !PLATFORM_COMPACTFRAMEWORK
\r
492 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
494 [DllImport(SQLITE_DLL)]
\r
496 internal static extern IntPtr sqlite3_column_blob(IntPtr stmt, int index);
\r
498 #if !PLATFORM_COMPACTFRAMEWORK
\r
499 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
501 [DllImport(SQLITE_DLL)]
\r
503 internal static extern int sqlite3_column_bytes(IntPtr stmt, int index);
\r
505 #if !PLATFORM_COMPACTFRAMEWORK
\r
506 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
508 [DllImport(SQLITE_DLL)]
\r
510 internal static extern TypeAffinity sqlite3_column_type(IntPtr stmt, int index);
\r
512 #if !PLATFORM_COMPACTFRAMEWORK
\r
513 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
515 [DllImport(SQLITE_DLL)]
\r
517 internal static extern int sqlite3_create_collation(IntPtr db, byte[] strName, int nType, IntPtr pvUser, SQLiteCollation func);
\r
519 #if !PLATFORM_COMPACTFRAMEWORK
\r
520 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
522 [DllImport(SQLITE_DLL)]
\r
524 internal static extern int sqlite3_aggregate_count(IntPtr context);
\r
526 #if !PLATFORM_COMPACTFRAMEWORK
\r
527 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
529 [DllImport(SQLITE_DLL)]
\r
531 internal static extern IntPtr sqlite3_value_blob(IntPtr p);
\r
533 #if !PLATFORM_COMPACTFRAMEWORK
\r
534 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
536 [DllImport(SQLITE_DLL)]
\r
538 internal static extern int sqlite3_value_bytes(IntPtr p);
\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
544 [DllImport(SQLITE_DLL)]
\r
545 internal static extern void sqlite3_value_double_interop(IntPtr p, out double value);
\r
548 #if !PLATFORM_COMPACTFRAMEWORK
\r
549 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
551 [DllImport(SQLITE_DLL)]
\r
553 internal static extern int sqlite3_value_int(IntPtr p);
\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
559 [DllImport(SQLITE_DLL)]
\r
560 internal static extern void sqlite3_value_int64_interop(IntPtr p, out Int64 value);
\r
563 #if !PLATFORM_COMPACTFRAMEWORK
\r
564 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
566 [DllImport(SQLITE_DLL)]
\r
568 internal static extern TypeAffinity sqlite3_value_type(IntPtr p);
\r
570 #if !PLATFORM_COMPACTFRAMEWORK
\r
571 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
573 [DllImport(SQLITE_DLL)]
\r
575 internal static extern void sqlite3_result_blob(IntPtr context, byte[] value, int nSize, IntPtr pvReserved);
\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
581 [DllImport(SQLITE_DLL)]
\r
582 internal static extern void sqlite3_result_double_interop(IntPtr context, ref double value);
\r
585 #if !PLATFORM_COMPACTFRAMEWORK
\r
586 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
588 [DllImport(SQLITE_DLL)]
\r
590 internal static extern void sqlite3_result_error(IntPtr context, byte[] strErr, int nLen);
\r
592 #if !PLATFORM_COMPACTFRAMEWORK
\r
593 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
595 [DllImport(SQLITE_DLL)]
\r
597 internal static extern void sqlite3_result_int(IntPtr context, int value);
\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
603 [DllImport(SQLITE_DLL)]
\r
604 internal static extern void sqlite3_result_int64_interop(IntPtr context, ref Int64 value);
\r
607 #if !PLATFORM_COMPACTFRAMEWORK
\r
608 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
610 [DllImport(SQLITE_DLL)]
\r
612 internal static extern void sqlite3_result_null(IntPtr context);
\r
614 #if !PLATFORM_COMPACTFRAMEWORK
\r
615 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
617 [DllImport(SQLITE_DLL)]
\r
619 internal static extern void sqlite3_result_text(IntPtr context, byte[] value, int nLen, IntPtr pvReserved);
\r
621 #if !PLATFORM_COMPACTFRAMEWORK
\r
622 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
624 [DllImport(SQLITE_DLL)]
\r
626 internal static extern IntPtr sqlite3_aggregate_context(IntPtr context, int nBytes);
\r
628 #if !PLATFORM_COMPACTFRAMEWORK
\r
629 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
631 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
633 internal static extern int sqlite3_bind_text16(IntPtr stmt, int index, string value, int nlen, IntPtr pvReserved);
\r
635 #if !PLATFORM_COMPACTFRAMEWORK
\r
636 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
638 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
640 internal static extern void sqlite3_result_error16(IntPtr context, string strName, int nLen);
\r
642 #if !PLATFORM_COMPACTFRAMEWORK
\r
643 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
\r
645 [DllImport(SQLITE_DLL, CharSet = CharSet.Unicode)]
\r
647 internal static extern void sqlite3_result_text16(IntPtr context, string strName, int nLen, IntPtr pvReserved);
\r
649 #if !PLATFORM_COMPACTFRAMEWORK
\r
650 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
652 [DllImport(SQLITE_DLL)]
\r
654 internal static extern int sqlite3_key(IntPtr db, byte[] key, int keylen);
\r
656 #if !PLATFORM_COMPACTFRAMEWORK
\r
657 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
659 [DllImport(SQLITE_DLL)]
\r
661 internal static extern int sqlite3_rekey(IntPtr db, byte[] key, int keylen);
\r
663 #if !PLATFORM_COMPACTFRAMEWORK
\r
664 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
666 [DllImport(SQLITE_DLL)]
\r
668 internal static extern IntPtr sqlite3_update_hook(IntPtr db, SQLiteUpdateCallback func, IntPtr pvUser);
\r
670 #if !PLATFORM_COMPACTFRAMEWORK
\r
671 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
673 [DllImport(SQLITE_DLL)]
\r
675 internal static extern IntPtr sqlite3_commit_hook(IntPtr db, SQLiteCommitCallback func, IntPtr pvUser);
\r
677 #if !PLATFORM_COMPACTFRAMEWORK
\r
678 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
680 [DllImport(SQLITE_DLL)]
\r
682 internal static extern IntPtr sqlite3_rollback_hook(IntPtr db, SQLiteRollbackCallback func, IntPtr pvUser);
\r
684 #if !PLATFORM_COMPACTFRAMEWORK
\r
685 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
687 [DllImport(SQLITE_DLL)]
\r
689 internal static extern IntPtr sqlite3_db_handle(IntPtr stmt);
\r
691 #if !PLATFORM_COMPACTFRAMEWORK
\r
692 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
694 [DllImport(SQLITE_DLL)]
\r
696 internal static extern IntPtr sqlite3_next_stmt(IntPtr db, IntPtr stmt);
\r
698 #if !PLATFORM_COMPACTFRAMEWORK
\r
699 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
701 [DllImport(SQLITE_DLL)]
\r
703 internal static extern int sqlite3_exec(IntPtr db, byte[] strSql, IntPtr pvCallback, IntPtr pvParam, out IntPtr errMsg);
\r
705 #if !PLATFORM_COMPACTFRAMEWORK
\r
706 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
708 [DllImport(SQLITE_DLL)]
\r
710 internal static extern int sqlite3_config (SQLiteConfig config);
\r
712 #if !PLATFORM_COMPACTFRAMEWORK
\r
713 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
715 [DllImport(SQLITE_DLL)]
\r
717 internal static extern IntPtr sqlite3_user_data (IntPtr context);
\r
719 #if !PLATFORM_COMPACTFRAMEWORK
\r
720 [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
\r
722 [DllImport(SQLITE_DLL)]
\r
724 internal static extern int sqlite3_free (IntPtr ptr);
\r
729 #if PLATFORM_COMPACTFRAMEWORK
\r
730 internal abstract class CriticalHandle : IDisposable
\r
732 private bool _isClosed;
\r
733 protected IntPtr handle;
\r
735 protected CriticalHandle(IntPtr invalidHandleValue)
\r
737 handle = invalidHandleValue;
\r
746 private void Cleanup()
\r
750 this._isClosed = true;
\r
754 GC.SuppressFinalize(this);
\r
759 public void Close()
\r
764 public void Dispose()
\r
769 protected virtual void Dispose(bool disposing)
\r
774 protected abstract bool ReleaseHandle();
\r
776 protected void SetHandle(IntPtr value)
\r
781 public void SetHandleAsInvalid()
\r
784 GC.SuppressFinalize(this);
\r
787 public bool IsClosed
\r
789 get { return _isClosed; }
\r
792 public abstract bool IsInvalid
\r
801 // Handles the unmanaged database pointer, and provides finalization support for it.
\r
802 internal class SqliteConnectionHandle : CriticalHandle
\r
804 public static implicit operator IntPtr(SqliteConnectionHandle db)
\r
809 public static implicit operator SqliteConnectionHandle(IntPtr db)
\r
811 return new SqliteConnectionHandle(db);
\r
814 private SqliteConnectionHandle(IntPtr db)
\r
820 internal SqliteConnectionHandle()
\r
821 : base(IntPtr.Zero)
\r
825 protected override bool ReleaseHandle()
\r
829 SQLiteBase.CloseConnection(this);
\r
831 catch (SqliteException)
\r
837 public override bool IsInvalid
\r
839 get { return (handle == IntPtr.Zero); }
\r
843 // Provides finalization support for unmanaged SQLite statements.
\r
844 internal class SqliteStatementHandle : CriticalHandle
\r
846 public static implicit operator IntPtr(SqliteStatementHandle stmt)
\r
848 return stmt.handle;
\r
851 public static implicit operator SqliteStatementHandle(IntPtr stmt)
\r
853 return new SqliteStatementHandle(stmt);
\r
856 private SqliteStatementHandle(IntPtr stmt)
\r
862 internal SqliteStatementHandle()
\r
863 : base(IntPtr.Zero)
\r
867 protected override bool ReleaseHandle()
\r
871 SQLiteBase.FinalizeStatement(this);
\r
873 catch (SqliteException)
\r
879 public override bool IsInvalid
\r
881 get { return (handle == IntPtr.Zero); }
\r