0000: ef bb bf 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 ************. *
0040: 41 44 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 ADO.NET 2.0 Data
0050: 20 50 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 Provider for SQ
0060: 4c 69 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 Lite Version 3.X
0070: 0a 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 . * Written by R
0080: 6f 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 obert Simpson (r
0090: 6f 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c obert@blackcastl
00a0: 65 73 6f 66 74 2e 63 6f 6d 29 0a 20 2a 20 0a 20 esoft.com). * .
00b0: 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68 * Released to th
00c0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c e public domain,
00d0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e use at your own
00e0: 20 72 69 73 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a risk!. ********
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0120: 2f 0a 0a 6e 61 6d 65 73 70 61 63 65 20 53 79 73 /..namespace Sys
0130: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0a tem.Data.SQLite.
0140: 7b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d {. using System
0150: 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 ;.. using Syste
0160: 6d 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 2e 47 65 m.Collections.Ge
0170: 6e 65 72 69 63 3b 0a 20 20 75 73 69 6e 67 20 53 neric;. using S
0180: 79 73 74 65 6d 2e 52 75 6e 74 69 6d 65 2e 49 6e ystem.Runtime.In
0190: 74 65 72 6f 70 53 65 72 76 69 63 65 73 3b 0a 20 teropServices;.
01a0: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 47 6c using System.Gl
01b0: 6f 62 61 6c 69 7a 61 74 69 6f 6e 3b 0a 0a 20 20 obalization;..
01c0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 /// <summary>.
01d0: 2f 2f 2f 20 54 68 69 73 20 61 62 73 74 72 61 63 /// This abstrac
01e0: 74 20 63 6c 61 73 73 20 69 73 20 64 65 73 69 67 t class is desig
01f0: 6e 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 75 73 ned to handle us
0200: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 er-defined funct
0210: 69 6f 6e 73 20 65 61 73 69 6c 79 2e 20 20 41 6e ions easily. An
0220: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 instance of the
0230: 20 64 65 72 69 76 65 64 20 63 6c 61 73 73 20 69 derived class i
0240: 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 0a s made for each.
0250: 20 20 2f 2f 2f 20 63 6f 6e 6e 65 63 74 69 6f 6e /// connection
0260: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 to the database
0270: 2e 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 .. /// </summar
0280: 79 3e 0a 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b y>. /// <remark
0290: 73 3e 0a 20 20 2f 2f 2f 20 41 6c 74 68 6f 75 67 s>. /// Althoug
02a0: 68 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 69 h there is one i
02b0: 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 63 6c 61 nstance of a cla
02c0: 73 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 ss derived from
02d0: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 70 SQLiteFunction p
02e0: 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e er database conn
02f0: 65 63 74 69 6f 6e 2c 20 74 68 65 20 64 65 72 69 ection, the deri
0300: 76 65 64 20 63 6c 61 73 73 20 68 61 73 20 6e 6f ved class has no
0310: 20 61 63 63 65 73 73 0a 20 20 2f 2f 2f 20 74 6f access. /// to
0320: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
0330: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 connection. Thi
0340: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 s is necessary t
0350: 6f 20 64 65 74 65 72 20 69 6d 70 6c 65 6d 65 6e o deter implemen
0360: 74 65 72 73 20 66 72 6f 6d 20 74 68 69 6e 6b 69 ters from thinki
0370: 6e 67 20 69 74 20 77 6f 75 6c 64 20 62 65 20 61 ng it would be a
0380: 20 67 6f 6f 64 20 69 64 65 61 20 74 6f 20 6d 61 good idea to ma
0390: 6b 65 20 64 61 74 61 62 61 73 65 0a 20 20 2f 2f ke database. //
03a0: 2f 20 63 61 6c 6c 73 20 64 75 72 69 6e 67 20 70 / calls during p
03b0: 72 6f 63 65 73 73 69 6e 67 2e 0a 20 20 2f 2f 2f rocessing.. ///
03c0: 20 0a 20 20 2f 2f 2f 20 49 74 20 69 73 20 69 6d . /// It is im
03d0: 70 6f 72 74 61 6e 74 20 74 6f 20 64 69 73 74 69 portant to disti
03e0: 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 61 nguish between a
03f0: 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 per-connection
0400: 69 6e 73 74 61 6e 63 65 2c 20 61 6e 64 20 61 20 instance, and a
0410: 70 65 72 2d 53 51 4c 20 73 74 61 74 65 6d 65 6e per-SQL statemen
0420: 74 20 63 6f 6e 74 65 78 74 2e 20 20 4f 6e 65 20 t context. One
0430: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 instance of this
0440: 20 63 6c 61 73 73 0a 20 20 2f 2f 2f 20 73 65 72 class. /// ser
0450: 76 69 63 65 73 20 61 6c 6c 20 53 51 4c 20 73 74 vices all SQL st
0460: 61 74 65 6d 65 6e 74 73 20 62 65 69 6e 67 20 73 atements being s
0470: 74 65 70 70 65 64 20 74 68 72 6f 75 67 68 20 6f tepped through o
0480: 6e 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f n that connectio
0490: 6e 2c 20 61 6e 64 20 74 68 65 72 65 20 63 61 6e n, and there can
04a0: 20 62 65 20 6d 61 6e 79 2e 20 20 4f 6e 65 20 73 be many. One s
04b0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 73 74 6f 72 hould never stor
04c0: 65 20 70 65 72 2d 73 74 61 74 65 6d 65 6e 74 0a e per-statement.
04d0: 20 20 2f 2f 2f 20 69 6e 66 6f 72 6d 61 74 69 6f /// informatio
04e0: 6e 20 69 6e 20 6d 65 6d 62 65 72 20 76 61 72 69 n in member vari
04f0: 61 62 6c 65 73 20 6f 66 20 75 73 65 72 2d 64 65 ables of user-de
0500: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20 63 fined function c
0510: 6c 61 73 73 65 73 2e 0a 20 20 2f 2f 2f 20 0a 20 lasses.. /// .
0520: 20 2f 2f 2f 20 46 6f 72 20 61 67 67 72 65 67 61 /// For aggrega
0530: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 61 6c te functions, al
0540: 77 61 79 73 20 63 72 65 61 74 65 20 61 6e 64 20 ways create and
0550: 73 74 6f 72 65 20 79 6f 75 72 20 70 65 72 2d 73 store your per-s
0560: 74 61 74 65 6d 65 6e 74 20 64 61 74 61 20 69 6e tatement data in
0570: 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61 74 61 the contextData
0580: 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 31 object on the 1
0590: 73 74 20 73 74 65 70 2e 20 20 54 68 69 73 20 64 st step. This d
05a0: 61 74 61 20 77 69 6c 6c 0a 20 20 2f 2f 2f 20 62 ata will. /// b
05b0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 e automatically
05c0: 66 72 65 65 64 20 66 6f 72 20 79 6f 75 20 28 61 freed for you (a
05d0: 6e 64 20 44 69 73 70 6f 73 65 28 29 20 63 61 6c nd Dispose() cal
05e0: 6c 65 64 20 69 66 20 74 68 65 20 69 74 65 6d 20 led if the item
05f0: 73 75 70 70 6f 72 74 73 20 49 44 69 73 70 6f 73 supports IDispos
0600: 61 62 6c 65 29 20 77 68 65 6e 20 74 68 65 20 73 able) when the s
0610: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 6c 65 74 tatement complet
0620: 65 73 2e 0a 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 es.. /// </rema
0630: 72 6b 73 3e 0a 20 20 70 75 62 6c 69 63 20 61 62 rks>. public ab
0640: 73 74 72 61 63 74 20 63 6c 61 73 73 20 53 51 4c stract class SQL
0650: 69 74 65 46 75 6e 63 74 69 6f 6e 20 3a 20 49 44 iteFunction : ID
0660: 69 73 70 6f 73 61 62 6c 65 0a 20 20 7b 0a 20 20 isposable. {.
0670: 20 20 70 72 69 76 61 74 65 20 63 6c 61 73 73 20 private class
0680: 41 67 67 72 65 67 61 74 65 44 61 74 61 0a 20 20 AggregateData.
0690: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e {. intern
06a0: 61 6c 20 69 6e 74 20 5f 63 6f 75 6e 74 20 3d 20 al int _count =
06b0: 31 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61 1;. interna
06c0: 6c 20 6f 62 6a 65 63 74 20 5f 64 61 74 61 3b 0a l object _data;.
06d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c }.. /// <
06e0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f summary>. ///
06f0: 20 54 68 65 20 62 61 73 65 20 63 6f 6e 6e 65 63 The base connec
0700: 74 69 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 tion this functi
0710: 6f 6e 20 69 73 20 61 74 74 61 63 68 65 64 20 74 on is attached t
0720: 6f 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d o. /// </summ
0730: 61 72 79 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 ary>. interna
0740: 6c 20 53 51 4c 69 74 65 42 61 73 65 20 20 20 20 l SQLiteBase
0750: 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 3b _base;
0760: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 .. /// <summa
0770: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 ry>. /// Inte
0780: 72 6e 61 6c 20 61 72 72 61 79 20 75 73 65 64 20 rnal array used
0790: 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 to keep track of
07a0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 aggregate funct
07b0: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 64 61 74 61 ion context data
07c0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 . /// </summa
07d0: 72 79 3e 0a 20 20 20 20 70 72 69 76 61 74 65 20 ry>. private
07e0: 44 69 63 74 69 6f 6e 61 72 79 3c 6c 6f 6e 67 2c Dictionary<long,
07f0: 20 41 67 67 72 65 67 61 74 65 44 61 74 61 3e 20 AggregateData>
0800: 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 _contextDataList
0810: 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d ;.. /// <summ
0820: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 48 6f 6c ary>. /// Hol
0830: 64 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 ds a reference t
0840: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 o the callback f
0850: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 75 73 65 72 unction for user
0860: 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2f functions. /
0870: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 // </summary>.
0880: 20 20 70 72 69 76 61 74 65 20 53 51 4c 69 74 65 private SQLite
0890: 43 61 6c 6c 62 61 63 6b 20 20 5f 49 6e 76 6f 6b Callback _Invok
08a0: 65 46 75 6e 63 3b 0a 20 20 20 20 2f 2f 2f 20 3c eFunc;. /// <
08b0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f summary>. ///
08c0: 20 48 6f 6c 64 73 20 61 20 72 65 66 65 72 65 6e Holds a referen
08d0: 63 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 ce to the callba
08e0: 6b 63 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 kc function for
08f0: 73 74 65 70 70 69 6e 67 20 69 6e 20 61 6e 20 61 stepping in an a
0900: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f ggregate functio
0910: 6e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d n. /// </summ
0920: 61 72 79 3e 0a 20 20 20 20 70 72 69 76 61 74 65 ary>. private
0930: 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 SQLiteCallback
0940: 20 5f 53 74 65 70 46 75 6e 63 3b 0a 20 20 20 20 _StepFunc;.
0950: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 /// <summary>.
0960: 20 20 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65 /// Holds a re
0970: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 ference to the c
0980: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e allback function
0990: 20 66 6f 72 20 66 69 6e 61 6c 69 7a 69 6e 67 20 for finalizing
09a0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e an aggregate fun
09b0: 63 74 69 6f 6e 0a 20 20 20 20 2f 2f 2f 20 3c 2f ction. /// </
09c0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72 69 summary>. pri
09d0: 76 61 74 65 20 53 51 4c 69 74 65 46 69 6e 61 6c vate SQLiteFinal
09e0: 43 61 6c 6c 62 61 63 6b 20 20 5f 46 69 6e 61 6c Callback _Final
09f0: 46 75 6e 63 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 Func;. /// <s
0a00: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 ummary>. ///
0a10: 48 6f 6c 64 73 20 61 20 72 65 66 65 72 65 6e 63 Holds a referenc
0a20: 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 e to the callbac
0a30: 6b 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 63 k function for c
0a40: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 ollation sequenc
0a50: 65 73 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d es. /// </sum
0a60: 6d 61 72 79 3e 0a 20 20 20 20 70 72 69 76 61 74 mary>. privat
0a70: 65 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f e SQLiteCollatio
0a80: 6e 20 5f 43 6f 6d 70 61 72 65 46 75 6e 63 3b 0a n _CompareFunc;.
0a90: 0a 20 20 20 20 70 72 69 76 61 74 65 20 53 51 4c . private SQL
0aa0: 69 74 65 43 6f 6c 6c 61 74 69 6f 6e 20 5f 43 6f iteCollation _Co
0ab0: 6d 70 61 72 65 46 75 6e 63 31 36 3b 0a 0a 20 20 mpareFunc16;..
0ac0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a /// <summary>.
0ad0: 20 20 20 20 2f 2f 2f 20 43 75 72 72 65 6e 74 20 /// Current
0ae0: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 63 context of the c
0af0: 75 72 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 2e urrent callback.
0b00: 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 64 75 72 Only valid dur
0b10: 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 20 ing a callback.
0b20: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
0b30: 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 >. internal I
0b40: 6e 74 50 74 72 20 5f 63 6f 6e 74 65 78 74 3b 0a ntPtr _context;.
0b50: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 . /// <summar
0b60: 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 y>. /// This
0b70: 73 74 61 74 69 63 20 6c 69 73 74 20 63 6f 6e 74 static list cont
0b80: 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 75 73 65 ains all the use
0b90: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 r-defined functi
0ba0: 6f 6e 73 20 64 65 63 6c 61 72 65 64 20 75 73 69 ons declared usi
0bb0: 6e 67 20 74 68 65 20 70 72 6f 70 65 72 20 61 74 ng the proper at
0bc0: 74 72 69 62 75 74 65 73 2e 0a 20 20 20 20 2f 2f tributes.. //
0bd0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 / </summary>.
0be0: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 private static
0bf0: 4c 69 73 74 3c 53 51 4c 69 74 65 46 75 6e 63 74 List<SQLiteFunct
0c00: 69 6f 6e 41 74 74 72 69 62 75 74 65 3e 20 5f 72 ionAttribute> _r
0c10: 65 67 69 73 74 65 72 65 64 46 75 6e 63 74 69 6f egisteredFunctio
0c20: 6e 73 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 ns;.. /// <su
0c30: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 49 mmary>. /// I
0c40: 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 74 72 75 63 nternal construc
0c50: 74 6f 72 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 tor, initializes
0c60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 27 73 20 the function's
0c70: 69 6e 74 65 72 6e 61 6c 20 76 61 72 69 61 62 6c internal variabl
0c80: 65 73 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 es.. /// </su
0c90: 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72 6f 74 65 mmary>. prote
0ca0: 63 74 65 64 20 53 51 4c 69 74 65 46 75 6e 63 74 cted SQLiteFunct
0cb0: 69 6f 6e 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 ion(). {.
0cc0: 20 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 _contextDataLi
0cd0: 73 74 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e st = new Diction
0ce0: 61 72 79 3c 6c 6f 6e 67 2c 20 41 67 67 72 65 67 ary<long, Aggreg
0cf0: 61 74 65 44 61 74 61 3e 28 29 3b 0a 20 20 20 20 ateData>();.
0d00: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f }.... ///////
0d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0d60: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 ////////....
0d70: 23 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73 61 #region IDisposa
0d80: 62 6c 65 20 4d 65 6d 62 65 72 73 0d 0a 20 20 20 ble Members..
0d90: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a /// <summary>..
0da0: 20 20 20 20 2f 2f 2f 20 44 69 73 70 6f 73 65 73 /// Disposes
0db0: 20 6f 66 20 61 6e 79 20 61 63 74 69 76 65 20 63 of any active c
0dc0: 6f 6e 74 65 78 74 44 61 74 61 20 76 61 72 69 61 ontextData varia
0dd0: 62 6c 65 73 20 74 68 61 74 20 77 65 72 65 20 6e bles that were n
0de0: 6f 74 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 ot automatically
0df0: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 53 6f cleaned up. So
0e00: 6d 65 74 69 6d 65 73 20 74 68 69 73 20 63 61 6e metimes this can
0e10: 20 68 61 70 70 65 6e 20 69 66 0d 0a 20 20 20 20 happen if..
0e20: 2f 2f 2f 20 73 6f 6d 65 6f 6e 65 20 63 6c 6f 73 /// someone clos
0e30: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f es the connectio
0e40: 6e 20 77 68 69 6c 65 20 61 20 44 61 74 61 52 65 n while a DataRe
0e50: 61 64 65 72 20 69 73 20 6f 70 65 6e 2e 0d 0a 20 ader is open...
0e60: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
0e70: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f >.. public vo
0e80: 69 64 20 44 69 73 70 6f 73 65 28 29 0d 0a 20 20 id Dispose()..
0e90: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 69 73 {.. Dis
0ea0: 70 6f 73 65 28 74 72 75 65 29 3b 0d 0a 20 20 20 pose(true);..
0eb0: 20 20 20 20 20 47 43 2e 53 75 70 70 72 65 73 73 GC.Suppress
0ec0: 46 69 6e 61 6c 69 7a 65 28 74 68 69 73 29 3b 0d Finalize(this);.
0ed0: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 . }.. #end
0ee0: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f region.... //
0ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d /////////////...
0f50: 0a 20 20 20 20 23 72 65 67 69 6f 6e 20 49 44 69 . #region IDi
0f60: 73 70 6f 73 61 62 6c 65 20 22 50 61 74 74 65 72 sposable "Patter
0f70: 6e 22 20 4d 65 6d 62 65 72 73 0d 0a 20 20 20 20 n" Members..
0f80: 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73 private bool dis
0f90: 70 6f 73 65 64 3b 0d 0a 20 20 20 20 70 72 69 76 posed;.. priv
0fa0: 61 74 65 20 76 6f 69 64 20 43 68 65 63 6b 44 69 ate void CheckDi
0fb0: 73 70 6f 73 65 64 28 29 20 2f 2a 20 74 68 72 6f sposed() /* thro
0fc0: 77 20 2a 2f 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 w */.. {..#if
0fd0: 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 THROW_ON_DISPOS
0fe0: 45 44 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 ED.. if (
0ff0: 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 disposed)..
1000: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 throw new
1010: 20 4f 62 6a 65 63 74 44 69 73 70 6f 73 65 64 45 ObjectDisposedE
1020: 78 63 65 70 74 69 6f 6e 28 74 79 70 65 6f 66 28 xception(typeof(
1030: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 29 2e SQLiteFunction).
1040: 4e 61 6d 65 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a Name);..#endif..
1050: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f }.... ///
1060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
10a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
10b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a ////////////....
10c0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 /// <summary
10d0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 50 6c 61 63 65 >.. /// Place
10e0: 68 6f 6c 64 65 72 20 66 6f 72 20 61 20 75 73 65 holder for a use
10f0: 72 2d 64 65 66 69 6e 65 64 20 64 69 73 70 6f 73 r-defined dispos
1100: 61 6c 20 72 6f 75 74 69 6e 65 0d 0a 20 20 20 20 al routine..
1110: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a /// </summary>..
1120: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e /// <param n
1130: 61 6d 65 3d 22 64 69 73 70 6f 73 69 6e 67 22 3e ame="disposing">
1140: 54 72 75 65 20 69 66 20 74 68 65 20 6f 62 6a 65 True if the obje
1150: 63 74 20 69 73 20 62 65 69 6e 67 20 64 69 73 70 ct is being disp
1160: 6f 73 65 64 20 65 78 70 6c 69 63 69 74 6c 79 3c osed explicitly<
1170: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 72 6f /param>.. pro
1180: 74 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 76 tected virtual v
1190: 6f 69 64 20 44 69 73 70 6f 73 65 28 62 6f 6f 6c oid Dispose(bool
11a0: 20 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20 20 20 disposing)..
11b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 {.. if (
11c0: 21 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 !disposed)..
11d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 {..
11e0: 20 20 20 69 66 20 28 64 69 73 70 6f 73 69 6e 67 if (disposing
11f0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b ).. {
1200: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
1210: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f //////////////
1220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1230: 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20 //////..
1240: 20 20 20 20 20 20 20 20 2f 2f 20 64 69 73 70 6f // dispo
1250: 73 65 20 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 se managed resou
1260: 72 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 rces here.....
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f //
1280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
12a0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 //....
12b0: 20 20 20 20 20 20 49 44 69 73 70 6f 73 61 62 6c IDisposabl
12c0: 65 20 64 69 73 70 3b 0d 0a 0d 0a 20 20 20 20 20 e disp;....
12d0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 forea
12e0: 63 68 20 28 4b 65 79 56 61 6c 75 65 50 61 69 72 ch (KeyValuePair
12f0: 3c 6c 6f 6e 67 2c 20 41 67 67 72 65 67 61 74 65 <long, Aggregate
1300: 44 61 74 61 3e 20 6b 76 20 69 6e 20 5f 63 6f 6e Data> kv in _con
1310: 74 65 78 74 44 61 74 61 4c 69 73 74 29 0d 0a 20 textDataList)..
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b {
1330: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
1340: 20 20 20 20 20 20 64 69 73 70 20 3d 20 6b 76 2e disp = kv.
1350: 56 61 6c 75 65 2e 5f 64 61 74 61 20 61 73 20 49 Value._data as I
1360: 44 69 73 70 6f 73 61 62 6c 65 3b 0d 0a 20 20 20 Disposable;..
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1380: 20 69 66 20 28 64 69 73 70 20 21 3d 20 6e 75 6c if (disp != nul
1390: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 l)..
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 70 disp
13b0: 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 .Dispose();..
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a }..
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13e0: 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 _contextDataList
13f0: 2e 43 6c 65 61 72 28 29 3b 0d 0a 0d 0a 20 20 20 .Clear();....
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 49 6e _In
1410: 76 6f 6b 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b vokeFunc = null;
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
1430: 20 20 5f 53 74 65 70 46 75 6e 63 20 3d 20 6e 75 _StepFunc = nu
1440: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ll;..
1450: 20 20 20 20 20 5f 46 69 6e 61 6c 46 75 6e 63 20 _FinalFunc
1460: 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 = null;..
1470: 20 20 20 20 20 20 20 20 20 5f 43 6f 6d 70 61 72 _Compar
1480: 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 eFunc = null;..
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f _
14a0: 62 61 73 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 base = null;..
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 _c
14c0: 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 20 3d ontextDataList =
14d0: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 null;..
14e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 }....
14f0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ///////////
1500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 ///////////..
1520: 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65 6c 65 // rele
1530: 61 73 65 20 75 6e 6d 61 6e 61 67 65 64 20 72 65 ase unmanaged re
1540: 73 6f 75 72 63 65 73 20 68 65 72 65 2e 2e 2e 0d sources here....
1550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f . ///
1560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1580: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 ///....
1590: 20 20 20 64 69 73 70 6f 73 65 64 20 3d 20 74 72 disposed = tr
15a0: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a ue;.. }..
15b0: 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 }.. #endr
15c0: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f egion.... ///
15d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
15e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
15f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a ////////////....
1630: 20 20 20 20 23 72 65 67 69 6f 6e 20 44 65 73 74 #region Dest
1640: 72 75 63 74 6f 72 0d 0a 20 20 20 20 7e 53 51 4c ructor.. ~SQL
1650: 69 74 65 46 75 6e 63 74 69 6f 6e 28 29 0d 0a 20 iteFunction()..
1660: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 69 {.. Di
1670: 73 70 6f 73 65 28 66 61 6c 73 65 29 3b 0d 0a 20 spose(false);..
1680: 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 }.. #endre
1690: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f gion.... ////
16a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
16b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
16c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
16d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
16e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
16f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 ///////////....
1700: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e /// <summary>
1710: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 . /// Returns
1720: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 a reference to
1730: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 the underlying c
1740: 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 53 51 4c 69 onnection's SQLi
1750: 74 65 43 6f 6e 76 65 72 74 20 63 6c 61 73 73 2c teConvert class,
1760: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75 73 which can be us
1770: 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 0a 20 20 ed to convert.
1780: 20 20 2f 2f 2f 20 73 74 72 69 6e 67 73 20 61 6e /// strings an
1790: 64 20 44 61 74 65 54 69 6d 65 27 73 20 69 6e 74 d DateTime's int
17a0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f o the current co
17b0: 6e 6e 65 63 74 69 6f 6e 27 73 20 65 6e 63 6f 64 nnection's encod
17c0: 69 6e 67 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 ing schema..
17d0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 /// </summary>.
17e0: 20 20 20 70 75 62 6c 69 63 20 53 51 4c 69 74 65 public SQLite
17f0: 43 6f 6e 76 65 72 74 20 53 51 4c 69 74 65 43 6f Convert SQLiteCo
1800: 6e 76 65 72 74 0a 20 20 20 20 7b 0a 20 20 20 20 nvert. {.
1810: 20 20 67 65 74 0a 20 20 20 20 20 20 7b 0d 0a 20 get. {..
1820: 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 CheckDisp
1830: 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 20 20 osed();.
1840: 72 65 74 75 72 6e 20 5f 62 61 73 65 3b 0a 20 20 return _base;.
1850: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
1860: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 /// <summary>.
1870: 20 20 20 2f 2f 2f 20 53 63 61 6c 61 72 20 66 75 /// Scalar fu
1880: 6e 63 74 69 6f 6e 73 20 6f 76 65 72 72 69 64 65 nctions override
1890: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 this method to
18a0: 64 6f 20 74 68 65 69 72 20 6d 61 67 69 63 2e 0a do their magic..
18b0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 /// </summar
18c0: 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 y>. /// <rema
18d0: 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 50 61 72 rks>. /// Par
18e0: 61 6d 65 74 65 72 73 20 70 61 73 73 65 64 20 74 ameters passed t
18f0: 6f 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 o functions have
1900: 20 6f 6e 6c 79 20 61 6e 20 61 66 66 69 6e 69 74 only an affinit
1910: 79 20 66 6f 72 20 61 20 63 65 72 74 61 69 6e 20 y for a certain
1920: 64 61 74 61 20 74 79 70 65 2c 20 74 68 65 72 65 data type, there
1930: 20 69 73 20 6e 6f 20 75 6e 64 65 72 6c 79 69 6e is no underlyin
1940: 67 20 73 63 68 65 6d 61 20 61 76 61 69 6c 61 62 g schema availab
1950: 6c 65 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 66 6f le. /// to fo
1960: 72 63 65 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 rce them into a
1970: 63 65 72 74 61 69 6e 20 74 79 70 65 2e 20 20 54 certain type. T
1980: 68 65 72 65 66 6f 72 65 20 74 68 65 20 6f 6e 6c herefore the onl
1990: 79 20 74 79 70 65 73 20 79 6f 75 20 77 69 6c 6c y types you will
19a0: 20 65 76 65 72 20 73 65 65 20 61 73 20 70 61 72 ever see as par
19b0: 61 6d 65 74 65 72 73 20 61 72 65 0a 20 20 20 20 ameters are.
19c0: 2f 2f 2f 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 /// DBNull.Value
19d0: 2c 20 49 6e 74 36 34 2c 20 44 6f 75 62 6c 65 2c , Int64, Double,
19e0: 20 53 74 72 69 6e 67 20 6f 72 20 62 79 74 65 5b String or byte[
19f0: 5d 20 61 72 72 61 79 2e 0a 20 20 20 20 2f 2f 2f ] array.. ///
1a00: 20 3c 2f 72 65 6d 61 72 6b 73 3e 0a 20 20 20 20 </remarks>.
1a10: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d /// <param name=
1a20: 22 61 72 67 73 22 3e 54 68 65 20 61 72 67 75 6d "args">The argum
1a30: 65 6e 74 73 20 66 6f 72 20 74 68 65 20 63 6f 6d ents for the com
1a40: 6d 61 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 3c mand to process<
1a50: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 /param>. ///
1a60: 3c 72 65 74 75 72 6e 73 3e 59 6f 75 20 6d 61 79 <returns>You may
1a70: 20 72 65 74 75 72 6e 20 6d 6f 73 74 20 73 69 6d return most sim
1a80: 70 6c 65 20 74 79 70 65 73 20 61 73 20 61 20 72 ple types as a r
1a90: 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 6e 75 6c eturn value, nul
1aa0: 6c 20 6f 72 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 l or DBNull.Valu
1ab0: 65 20 74 6f 20 72 65 74 75 72 6e 20 6e 75 6c 6c e to return null
1ac0: 2c 20 44 61 74 65 54 69 6d 65 2c 20 6f 72 0a 20 , DateTime, or.
1ad0: 20 20 20 2f 2f 2f 20 79 6f 75 20 6d 61 79 20 72 /// you may r
1ae0: 65 74 75 72 6e 20 61 6e 20 45 78 63 65 70 74 69 eturn an Excepti
1af0: 6f 6e 2d 64 65 72 69 76 65 64 20 63 6c 61 73 73 on-derived class
1b00: 20 69 66 20 79 6f 75 20 77 69 73 68 20 74 6f 20 if you wish to
1b10: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 return an error
1b20: 74 6f 20 53 51 4c 69 74 65 2e 20 20 44 6f 20 6e to SQLite. Do n
1b30: 6f 74 20 61 63 74 75 61 6c 6c 79 20 74 68 72 6f ot actually thro
1b40: 77 20 74 68 65 20 65 72 72 6f 72 2c 0a 20 20 20 w the error,.
1b50: 20 2f 2f 2f 20 6a 75 73 74 20 72 65 74 75 72 6e /// just return
1b60: 20 69 74 21 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 it!</returns>.
1b70: 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 public virtua
1b80: 6c 20 6f 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28 l object Invoke(
1b90: 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 29 0d 0a object[] args)..
1ba0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 {.. Che
1bb0: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 20 20 ckDisposed();.
1bc0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b return null;
1bd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 . }.. ///
1be0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f <summary>. //
1bf0: 2f 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 / Aggregate func
1c00: 74 69 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 tions override t
1c10: 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 64 6f his method to do
1c20: 20 74 68 65 69 72 20 6d 61 67 69 63 2e 0a 20 20 their magic..
1c30: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e /// </summary>
1c40: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b . /// <remark
1c50: 73 3e 0a 20 20 20 20 2f 2f 2f 20 54 79 70 69 63 s>. /// Typic
1c60: 61 6c 6c 79 20 79 6f 75 27 6c 6c 20 62 65 20 75 ally you'll be u
1c70: 70 64 61 74 69 6e 67 20 77 68 61 74 65 76 65 72 pdating whatever
1c80: 20 79 6f 75 27 76 65 20 70 6c 61 63 65 64 20 69 you've placed i
1c90: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61 74 n the contextDat
1ca0: 61 20 66 69 65 6c 64 20 61 6e 64 20 72 65 74 75 a field and retu
1cb0: 72 6e 69 6e 67 20 61 73 20 71 75 69 63 6b 6c 79 rning as quickly
1cc0: 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 as possible..
1cd0: 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e /// </remarks>
1ce0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 . /// <param
1cf0: 6e 61 6d 65 3d 22 61 72 67 73 22 3e 54 68 65 20 name="args">The
1d00: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 arguments for th
1d10: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f e command to pro
1d20: 63 65 73 73 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 cess</param>.
1d30: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 /// <param name
1d40: 3d 22 73 74 65 70 4e 75 6d 62 65 72 22 3e 54 68 ="stepNumber">Th
1d50: 65 20 31 2d 62 61 73 65 64 20 73 74 65 70 20 6e e 1-based step n
1d60: 75 6d 62 65 72 2e 20 20 54 68 69 73 20 69 73 20 umber. This is
1d70: 69 6e 63 72 65 6d 65 6d 74 65 64 20 65 61 63 68 incrememted each
1d80: 20 74 69 6d 65 20 74 68 65 20 73 74 65 70 20 6d time the step m
1d90: 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 2e ethod is called.
1da0: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f </param>. ///
1db0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f <param name="co
1dc0: 6e 74 65 78 74 44 61 74 61 22 3e 41 20 70 6c 61 ntextData">A pla
1dd0: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70 ceholder for imp
1de0: 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f lementers to sto
1df0: 72 65 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61 re contextual da
1e00: 74 61 20 70 65 72 74 61 69 6e 69 6e 67 20 74 6f ta pertaining to
1e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e the current con
1e20: 74 65 78 74 2e 3c 2f 70 61 72 61 6d 3e 0a 20 20 text.</param>.
1e30: 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c public virtual
1e40: 20 76 6f 69 64 20 53 74 65 70 28 6f 62 6a 65 63 void Step(objec
1e50: 74 5b 5d 20 61 72 67 73 2c 20 69 6e 74 20 73 74 t[] args, int st
1e60: 65 70 4e 75 6d 62 65 72 2c 20 72 65 66 20 6f 62 epNumber, ref ob
1e70: 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 ject contextData
1e80: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 ).. {..
1e90: 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b CheckDisposed();
1ea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 . }.. ///
1eb0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f <summary>. //
1ec0: 2f 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 / Aggregate func
1ed0: 74 69 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 tions override t
1ee0: 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 66 69 his method to fi
1ef0: 6e 69 73 68 20 74 68 65 69 72 20 61 67 67 72 65 nish their aggre
1f00: 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 2e gate processing.
1f10: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 . /// </summa
1f20: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d ry>. /// <rem
1f30: 61 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 49 66 arks>. /// If
1f40: 20 79 6f 75 20 69 6d 70 6c 65 6d 65 6e 74 65 64 you implemented
1f50: 20 79 6f 75 72 20 61 67 67 72 65 67 61 74 65 20 your aggregate
1f60: 66 75 6e 63 74 69 6f 6e 20 70 72 6f 70 65 72 6c function properl
1f70: 79 2c 0a 20 20 20 20 2f 2f 2f 20 79 6f 75 27 76 y,. /// you'v
1f80: 65 20 62 65 65 6e 20 72 65 63 6f 72 64 69 6e 67 e been recording
1f90: 20 61 6e 64 20 6b 65 65 70 69 6e 67 20 74 72 61 and keeping tra
1fa0: 63 6b 20 6f 66 20 79 6f 75 72 20 64 61 74 61 20 ck of your data
1fb0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61 in the contextDa
1fc0: 74 61 20 6f 62 6a 65 63 74 20 70 72 6f 76 69 64 ta object provid
1fd0: 65 64 2c 20 61 6e 64 20 6e 6f 77 20 61 74 20 74 ed, and now at t
1fe0: 68 69 73 20 73 74 61 67 65 20 79 6f 75 20 73 68 his stage you sh
1ff0: 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 2f 2f ould have. //
2000: 2f 20 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d / all the inform
2010: 61 74 69 6f 6e 20 79 6f 75 20 6e 65 65 64 20 69 ation you need i
2020: 6e 20 74 68 65 72 65 20 74 6f 20 66 69 67 75 72 n there to figur
2030: 65 20 6f 75 74 20 77 68 61 74 20 74 6f 20 72 65 e out what to re
2040: 74 75 72 6e 2e 0a 20 20 20 20 2f 2f 2f 20 4e 4f turn.. /// NO
2050: 54 45 3a 20 20 49 74 20 69 73 20 70 6f 73 73 69 TE: It is possi
2060: 62 6c 65 20 74 6f 20 61 72 72 69 76 65 20 68 65 ble to arrive he
2070: 72 65 20 77 69 74 68 6f 75 74 20 72 65 63 65 69 re without recei
2080: 76 69 6e 67 20 61 20 70 72 65 76 69 6f 75 73 20 ving a previous
2090: 63 61 6c 6c 20 74 6f 20 53 74 65 70 28 29 2c 20 call to Step(),
20a0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 in which case th
20b0: 65 20 63 6f 6e 74 65 78 74 44 61 74 61 20 77 69 e contextData wi
20c0: 6c 6c 0a 20 20 20 20 2f 2f 2f 20 62 65 20 6e 75 ll. /// be nu
20d0: 6c 6c 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 ll. This can ha
20e0: 70 70 65 6e 20 77 68 65 6e 20 6e 6f 20 72 6f 77 ppen when no row
20f0: 73 20 77 65 72 65 20 72 65 74 75 72 6e 65 64 2e s were returned.
2100: 20 20 59 6f 75 20 63 61 6e 20 65 69 74 68 65 72 You can either
2110: 20 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 6f 72 return null, or
2120: 20 30 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0 or some other
2130: 20 63 75 73 74 6f 6d 20 72 65 74 75 72 6e 20 76 custom return v
2140: 61 6c 75 65 0a 20 20 20 20 2f 2f 2f 20 69 66 20 alue. /// if
2150: 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 that is the case
2160: 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 .. /// </rema
2170: 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 rks>. /// <pa
2180: 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 ram name="contex
2190: 74 44 61 74 61 22 3e 59 6f 75 72 20 6f 77 6e 20 tData">Your own
21a0: 61 73 73 69 67 6e 65 64 20 63 6f 6e 74 65 78 74 assigned context
21b0: 44 61 74 61 2c 20 70 72 6f 76 69 64 65 64 20 66 Data, provided f
21c0: 6f 72 20 79 6f 75 20 73 6f 20 79 6f 75 20 63 61 or you so you ca
21d0: 6e 20 72 65 74 75 72 6e 20 79 6f 75 72 20 66 69 n return your fi
21e0: 6e 61 6c 20 72 65 73 75 6c 74 73 2e 3c 2f 70 61 nal results.</pa
21f0: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 ram>. /// <re
2200: 74 75 72 6e 73 3e 59 6f 75 20 6d 61 79 20 72 65 turns>You may re
2210: 74 75 72 6e 20 6d 6f 73 74 20 73 69 6d 70 6c 65 turn most simple
2220: 20 74 79 70 65 73 20 61 73 20 61 20 72 65 74 75 types as a retu
2230: 72 6e 20 76 61 6c 75 65 2c 20 6e 75 6c 6c 20 6f rn value, null o
2240: 72 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 20 74 r DBNull.Value t
2250: 6f 20 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 44 o return null, D
2260: 61 74 65 54 69 6d 65 2c 20 6f 72 0a 20 20 20 20 ateTime, or.
2270: 2f 2f 2f 20 79 6f 75 20 6d 61 79 20 72 65 74 75 /// you may retu
2280: 72 6e 20 61 6e 20 45 78 63 65 70 74 69 6f 6e 2d rn an Exception-
2290: 64 65 72 69 76 65 64 20 63 6c 61 73 73 20 69 66 derived class if
22a0: 20 79 6f 75 20 77 69 73 68 20 74 6f 20 72 65 74 you wish to ret
22b0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 urn an error to
22c0: 53 51 4c 69 74 65 2e 20 20 44 6f 20 6e 6f 74 20 SQLite. Do not
22d0: 61 63 74 75 61 6c 6c 79 20 74 68 72 6f 77 20 74 actually throw t
22e0: 68 65 20 65 72 72 6f 72 2c 0a 20 20 20 20 2f 2f he error,. //
22f0: 2f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 69 74 / just return it
2300: 21 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 !. /// </retu
2310: 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 rns>. public
2320: 76 69 72 74 75 61 6c 20 6f 62 6a 65 63 74 20 46 virtual object F
2330: 69 6e 61 6c 28 6f 62 6a 65 63 74 20 63 6f 6e 74 inal(object cont
2340: 65 78 74 44 61 74 61 29 0a 20 20 20 20 7b 0d 0a extData). {..
2350: 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f CheckDispo
2360: 73 65 64 28 29 3b 0a 20 20 20 20 20 20 72 65 74 sed();. ret
2370: 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a urn null;. }.
2380: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 . /// <summar
2390: 79 3e 0a 20 20 20 20 2f 2f 2f 20 55 73 65 72 2d y>. /// User-
23a0: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f defined collatio
23b0: 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 76 65 72 n sequences over
23c0: 72 69 64 65 20 74 68 69 73 20 6d 65 74 68 6f 64 ride this method
23d0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 63 75 to provide a cu
23e0: 73 74 6f 6d 20 73 74 72 69 6e 67 20 73 6f 72 74 stom string sort
23f0: 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 ing algorithm..
2400: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
2410: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d >. /// <param
2420: 20 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22 3e 54 name="param1">T
2430: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 he first string
2440: 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 to compare</para
2450: 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 m>. /// <para
2460: 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 3e m name="param2">
2470: 54 68 65 20 73 65 63 6f 6e 64 20 73 74 72 6e 69 The second strni
2480: 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 g to compare</pa
2490: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 ram>. /// <re
24a0: 74 75 72 6e 73 3e 31 20 69 66 20 70 61 72 61 6d turns>1 if param
24b0: 31 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 1 is greater tha
24c0: 6e 20 70 61 72 61 6d 32 2c 20 30 20 69 66 20 74 n param2, 0 if t
24d0: 68 65 79 20 61 72 65 20 65 71 75 61 6c 2c 20 6f hey are equal, o
24e0: 72 20 2d 31 20 69 66 20 70 61 72 61 6d 31 20 69 r -1 if param1 i
24f0: 73 20 6c 65 73 73 20 74 68 61 6e 20 70 61 72 61 s less than para
2500: 6d 32 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 m2</returns>.
2510: 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c 20 public virtual
2520: 69 6e 74 20 43 6f 6d 70 61 72 65 28 73 74 72 69 int Compare(stri
2530: 6e 67 20 70 61 72 61 6d 31 2c 20 73 74 72 69 6e ng param1, strin
2540: 67 20 70 61 72 61 6d 32 29 0d 0a 20 20 20 20 7b g param2).. {
2550: 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 .. CheckDis
2560: 70 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 72 posed();. r
2570: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
2580: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 /// <summary
2590: 3e 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e 76 65 72 >. /// Conver
25a0: 74 73 20 61 6e 20 49 6e 74 50 74 72 20 61 72 72 ts an IntPtr arr
25b0: 61 79 20 6f 66 20 63 6f 6e 74 65 78 74 20 61 72 ay of context ar
25c0: 67 75 6d 65 6e 74 73 20 74 6f 20 61 6e 20 6f 62 guments to an ob
25d0: 6a 65 63 74 20 61 72 72 61 79 20 63 6f 6e 74 61 ject array conta
25e0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 6f 6c 76 ining the resolv
25f0: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 ed parameters th
2600: 65 20 70 6f 69 6e 74 65 72 73 20 70 6f 69 6e 74 e pointers point
2610: 20 74 6f 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 to.. /// </s
2620: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 ummary>. ///
2630: 3c 72 65 6d 61 72 6b 73 3e 0a 20 20 20 20 2f 2f <remarks>. //
2640: 2f 20 50 61 72 61 6d 65 74 65 72 73 20 70 61 73 / Parameters pas
2650: 73 65 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e 73 sed to functions
2660: 20 68 61 76 65 20 6f 6e 6c 79 20 61 6e 20 61 66 have only an af
2670: 66 69 6e 69 74 79 20 66 6f 72 20 61 20 63 65 72 finity for a cer
2680: 74 61 69 6e 20 64 61 74 61 20 74 79 70 65 2c 20 tain data type,
2690: 74 68 65 72 65 20 69 73 20 6e 6f 20 75 6e 64 65 there is no unde
26a0: 72 6c 79 69 6e 67 20 73 63 68 65 6d 61 20 61 76 rlying schema av
26b0: 61 69 6c 61 62 6c 65 0a 20 20 20 20 2f 2f 2f 20 ailable. ///
26c0: 74 6f 20 66 6f 72 63 65 20 74 68 65 6d 20 69 6e to force them in
26d0: 74 6f 20 61 20 63 65 72 74 61 69 6e 20 74 79 70 to a certain typ
26e0: 65 2e 20 20 54 68 65 72 65 66 6f 72 65 20 74 68 e. Therefore th
26f0: 65 20 6f 6e 6c 79 20 74 79 70 65 73 20 79 6f 75 e only types you
2700: 20 77 69 6c 6c 20 65 76 65 72 20 73 65 65 20 61 will ever see a
2710: 73 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 s parameters are
2720: 0a 20 20 20 20 2f 2f 2f 20 44 42 4e 75 6c 6c 2e . /// DBNull.
2730: 56 61 6c 75 65 2c 20 49 6e 74 36 34 2c 20 44 6f Value, Int64, Do
2740: 75 62 6c 65 2c 20 53 74 72 69 6e 67 20 6f 72 20 uble, String or
2750: 62 79 74 65 5b 5d 20 61 72 72 61 79 2e 0a 20 20 byte[] array..
2760: 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e /// </remarks>
2770: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 . /// <param
2780: 6e 61 6d 65 3d 22 6e 41 72 67 73 22 3e 54 68 65 name="nArgs">The
2790: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
27a0: 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 ents</param>.
27b0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 /// <param name
27c0: 3d 22 61 72 67 73 70 74 72 22 3e 41 20 70 6f 69 ="argsptr">A poi
27d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 nter to the arra
27e0: 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 3c 2f y of arguments</
27f0: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c param>. /// <
2800: 72 65 74 75 72 6e 73 3e 41 6e 20 6f 62 6a 65 63 returns>An objec
2810: 74 20 61 72 72 61 79 20 6f 66 20 74 68 65 20 61 t array of the a
2820: 72 67 75 6d 65 6e 74 73 20 6f 6e 63 65 20 74 68 rguments once th
2830: 65 79 27 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 ey've been conve
2840: 72 74 65 64 20 74 6f 20 2e 4e 45 54 20 76 61 6c rted to .NET val
2850: 75 65 73 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 ues</returns>.
2860: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 62 6a 65 63 internal objec
2870: 74 5b 5d 20 43 6f 6e 76 65 72 74 50 61 72 61 6d t[] ConvertParam
2880: 73 28 69 6e 74 20 6e 41 72 67 73 2c 20 49 6e 74 s(int nArgs, Int
2890: 50 74 72 20 61 72 67 73 70 74 72 29 0a 20 20 20 Ptr argsptr).
28a0: 20 7b 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 5b {. object[
28b0: 5d 20 70 61 72 6d 73 20 3d 20 6e 65 77 20 6f 62 ] parms = new ob
28c0: 6a 65 63 74 5b 6e 41 72 67 73 5d 3b 0a 23 69 66 ject[nArgs];.#if
28d0: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 !PLATFORM_COMPA
28e0: 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 CTFRAMEWORK.
28f0: 20 20 49 6e 74 50 74 72 5b 5d 20 61 72 67 69 6e IntPtr[] argin
2900: 74 20 3d 20 6e 65 77 20 49 6e 74 50 74 72 5b 6e t = new IntPtr[n
2910: 41 72 67 73 5d 3b 0a 23 65 6c 73 65 0a 20 20 20 Args];.#else.
2920: 20 20 20 69 6e 74 5b 5d 20 61 72 67 69 6e 74 20 int[] argint
2930: 3d 20 6e 65 77 20 69 6e 74 5b 6e 41 72 67 73 5d = new int[nArgs]
2940: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4d ;.#endif. M
2950: 61 72 73 68 61 6c 2e 43 6f 70 79 28 61 72 67 73 arshal.Copy(args
2960: 70 74 72 2c 20 61 72 67 69 6e 74 2c 20 30 2c 20 ptr, argint, 0,
2970: 6e 41 72 67 73 29 3b 0a 0a 20 20 20 20 20 20 66 nArgs);.. f
2980: 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e or (int n = 0; n
2990: 20 3c 20 6e 41 72 67 73 3b 20 6e 2b 2b 29 0a 20 < nArgs; n++).
29a0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 {. s
29b0: 77 69 74 63 68 20 28 5f 62 61 73 65 2e 47 65 74 witch (_base.Get
29c0: 50 61 72 61 6d 56 61 6c 75 65 54 79 70 65 28 28 ParamValueType((
29d0: 49 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d IntPtr)argint[n]
29e0: 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 )). {.
29f0: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 case Type
2a00: 41 66 66 69 6e 69 74 79 2e 4e 75 6c 6c 3a 0a 20 Affinity.Null:.
2a10: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73 parms
2a20: 5b 6e 5d 20 3d 20 44 42 4e 75 6c 6c 2e 56 61 6c [n] = DBNull.Val
2a30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ue;.
2a40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 break;.
2a50: 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 case TypeAffini
2a60: 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20 20 20 20 ty.Int64:.
2a70: 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d parms[n] =
2a80: 20 5f 62 61 73 65 2e 47 65 74 50 61 72 61 6d 56 _base.GetParamV
2a90: 61 6c 75 65 49 6e 74 36 34 28 28 49 6e 74 50 74 alueInt64((IntPt
2aa0: 72 29 61 72 67 69 6e 74 5b 6e 5d 29 3b 0a 20 20 r)argint[n]);.
2ab0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
2ac0: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 . case
2ad0: 54 79 70 65 41 66 66 69 6e 69 74 79 2e 44 6f 75 TypeAffinity.Dou
2ae0: 62 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 ble:.
2af0: 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 parms[n] = _bas
2b00: 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 44 e.GetParamValueD
2b10: 6f 75 62 6c 65 28 28 49 6e 74 50 74 72 29 61 72 ouble((IntPtr)ar
2b20: 67 69 6e 74 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 gint[n]);.
2b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
2b40: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 case Type
2b50: 41 66 66 69 6e 69 74 79 2e 54 65 78 74 3a 0a 20 Affinity.Text:.
2b60: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73 parms
2b70: 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47 65 74 50 [n] = _base.GetP
2b80: 61 72 61 6d 56 61 6c 75 65 54 65 78 74 28 28 49 aramValueText((I
2b90: 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 ntPtr)argint[n])
2ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 ;. br
2bb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 eak;. c
2bc0: 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 ase TypeAffinity
2bd0: 2e 42 6c 6f 62 3a 0a 20 20 20 20 20 20 20 20 20 .Blob:.
2be0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 {.
2bf0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 int x;.
2c00: 20 20 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 byte[] b
2c10: 6c 6f 62 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 lob;..
2c20: 20 20 20 20 78 20 3d 20 28 69 6e 74 29 5f 62 61 x = (int)_ba
2c30: 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 se.GetParamValue
2c40: 42 79 74 65 73 28 28 49 6e 74 50 74 72 29 61 72 Bytes((IntPtr)ar
2c50: 67 69 6e 74 5b 6e 5d 2c 20 30 2c 20 6e 75 6c 6c gint[n], 0, null
2c60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 , 0, 0);.
2c70: 20 20 20 20 20 20 20 62 6c 6f 62 20 3d 20 6e 65 blob = ne
2c80: 77 20 62 79 74 65 5b 78 5d 3b 0a 20 20 20 20 20 w byte[x];.
2c90: 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 47 _base.G
2ca0: 65 74 50 61 72 61 6d 56 61 6c 75 65 42 79 74 65 etParamValueByte
2cb0: 73 28 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74 s((IntPtr)argint
2cc0: 5b 6e 5d 2c 20 30 2c 20 62 6c 6f 62 2c 20 30 2c [n], 0, blob, 0,
2cd0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 x);.
2ce0: 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 62 6c parms[n] = bl
2cf0: 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ob;.
2d00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 }. br
2d10: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 eak;. c
2d20: 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 ase TypeAffinity
2d30: 2e 44 61 74 65 54 69 6d 65 3a 20 2f 2f 20 4e 65 .DateTime: // Ne
2d40: 76 65 72 20 68 61 70 70 65 6e 73 20 68 65 72 65 ver happens here
2d50: 20 62 75 74 20 77 68 61 74 20 74 68 65 20 68 65 but what the he
2d60: 63 6b 2c 20 6d 61 79 62 65 20 69 74 20 77 69 6c ck, maybe it wil
2d70: 6c 20 6f 6e 65 20 64 61 79 2e 0a 20 20 20 20 20 l one day..
2d80: 20 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20 parms[n]
2d90: 3d 20 5f 62 61 73 65 2e 54 6f 44 61 74 65 54 69 = _base.ToDateTi
2da0: 6d 65 28 5f 62 61 73 65 2e 47 65 74 50 61 72 61 me(_base.GetPara
2db0: 6d 56 61 6c 75 65 54 65 78 74 28 28 49 6e 74 50 mValueText((IntP
2dc0: 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 29 3b 0a tr)argint[n]));.
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
2de0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 k;. }.
2df0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 }. retur
2e00: 6e 20 70 61 72 6d 73 3b 0a 20 20 20 20 7d 0a 0a n parms;. }..
2e10: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 /// <summary
2e20: 3e 0a 20 20 20 20 2f 2f 2f 20 54 61 6b 65 73 20 >. /// Takes
2e30: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
2e40: 20 66 72 6f 6d 20 49 6e 76 6f 6b 65 28 29 20 61 from Invoke() a
2e50: 6e 64 20 46 69 6e 61 6c 28 29 20 61 6e 64 20 66 nd Final() and f
2e60: 69 67 75 72 65 73 20 6f 75 74 20 68 6f 77 20 74 igures out how t
2e70: 6f 20 72 65 74 75 72 6e 20 69 74 20 74 6f 20 53 o return it to S
2e80: 51 4c 69 74 65 27 73 20 63 6f 6e 74 65 78 74 2e QLite's context.
2e90: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 . /// </summa
2ea0: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 ry>. /// <par
2eb0: 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 am name="context
2ec0: 22 3e 54 68 65 20 63 6f 6e 74 65 78 74 20 74 68 ">The context th
2ed0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 e return value a
2ee0: 70 70 6c 69 65 73 20 74 6f 3c 2f 70 61 72 61 6d pplies to</param
2ef0: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d >. /// <param
2f00: 20 6e 61 6d 65 3d 22 72 65 74 75 72 6e 56 61 6c name="returnVal
2f10: 75 65 22 3e 54 68 65 20 70 61 72 61 6d 65 74 65 ue">The paramete
2f20: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 53 r to return to S
2f30: 51 4c 69 74 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 QLite</param>.
2f40: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 53 private void S
2f50: 65 74 52 65 74 75 72 6e 56 61 6c 75 65 28 49 6e etReturnValue(In
2f60: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 6f 62 tPtr context, ob
2f70: 6a 65 63 74 20 72 65 74 75 72 6e 56 61 6c 75 65 ject returnValue
2f80: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 ). {. if
2f90: 20 28 72 65 74 75 72 6e 56 61 6c 75 65 20 3d 3d (returnValue ==
2fa0: 20 6e 75 6c 6c 20 7c 7c 20 72 65 74 75 72 6e 56 null || returnV
2fb0: 61 6c 75 65 20 3d 3d 20 44 42 4e 75 6c 6c 2e 56 alue == DBNull.V
2fc0: 61 6c 75 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 alue). {.
2fd0: 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75 _base.Retu
2fe0: 72 6e 4e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b rnNull(context);
2ff0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b . return;
3000: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 . }..
3010: 54 79 70 65 20 74 20 3d 20 72 65 74 75 72 6e 56 Type t = returnV
3020: 61 6c 75 65 2e 47 65 74 54 79 70 65 28 29 3b 0a alue.GetType();.
3030: 20 20 20 20 20 20 69 66 20 28 74 20 3d 3d 20 74 if (t == t
3040: 79 70 65 6f 66 28 44 61 74 65 54 69 6d 65 29 29 ypeof(DateTime))
3050: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 . {.
3060: 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 54 65 78 _base.ReturnTex
3070: 74 28 63 6f 6e 74 65 78 74 2c 20 5f 62 61 73 65 t(context, _base
3080: 2e 54 6f 53 74 72 69 6e 67 28 28 44 61 74 65 54 .ToString((DateT
3090: 69 6d 65 29 72 65 74 75 72 6e 56 61 6c 75 65 29 ime)returnValue)
30a0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 );. retur
30b0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 n;. }.
30c0: 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 else. {.
30d0: 20 20 20 20 20 20 45 78 63 65 70 74 69 6f 6e 20 Exception
30e0: 72 20 3d 20 72 65 74 75 72 6e 56 61 6c 75 65 20 r = returnValue
30f0: 61 73 20 45 78 63 65 70 74 69 6f 6e 3b 0a 0a 20 as Exception;..
3100: 20 20 20 20 20 20 20 69 66 20 28 72 20 21 3d 20 if (r !=
3110: 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 7b 0a null). {.
3120: 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e _base.
3130: 52 65 74 75 72 6e 45 72 72 6f 72 28 63 6f 6e 74 ReturnError(cont
3140: 65 78 74 2c 20 72 2e 4d 65 73 73 61 67 65 29 3b ext, r.Message);
3150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
3160: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 n;. }.
3170: 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 77 69 74 }.. swit
3180: 63 68 20 28 53 51 4c 69 74 65 43 6f 6e 76 65 72 ch (SQLiteConver
3190: 74 2e 54 79 70 65 54 6f 41 66 66 69 6e 69 74 79 t.TypeToAffinity
31a0: 28 74 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 (t)). {.
31b0: 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 case TypeAf
31c0: 66 69 6e 69 74 79 2e 4e 75 6c 6c 3a 0a 20 20 20 finity.Null:.
31d0: 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 _base.Ret
31e0: 75 72 6e 4e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 urnNull(context)
31f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 ;. retu
3200: 72 6e 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 rn;. case
3210: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 49 6e TypeAffinity.In
3220: 74 36 34 3a 0a 20 20 20 20 20 20 20 20 20 20 5f t64:. _
3230: 62 61 73 65 2e 52 65 74 75 72 6e 49 6e 74 36 34 base.ReturnInt64
3240: 28 63 6f 6e 74 65 78 74 2c 20 43 6f 6e 76 65 72 (context, Conver
3250: 74 2e 54 6f 49 6e 74 36 34 28 72 65 74 75 72 6e t.ToInt64(return
3260: 56 61 6c 75 65 2c 20 43 75 6c 74 75 72 65 49 6e Value, CultureIn
3270: 66 6f 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 fo.CurrentCultur
3280: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 e));. r
3290: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 63 eturn;. c
32a0: 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 ase TypeAffinity
32b0: 2e 44 6f 75 62 6c 65 3a 0a 20 20 20 20 20 20 20 .Double:.
32c0: 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 44 _base.ReturnD
32d0: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 43 ouble(context, C
32e0: 6f 6e 76 65 72 74 2e 54 6f 44 6f 75 62 6c 65 28 onvert.ToDouble(
32f0: 72 65 74 75 72 6e 56 61 6c 75 65 2c 20 43 75 6c returnValue, Cul
3300: 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 tureInfo.Current
3310: 43 75 6c 74 75 72 65 29 29 3b 0a 20 20 20 20 20 Culture));.
3320: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 return;.
3330: 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 case TypeAf
3340: 66 69 6e 69 74 79 2e 54 65 78 74 3a 0a 20 20 20 finity.Text:.
3350: 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 _base.Ret
3360: 75 72 6e 54 65 78 74 28 63 6f 6e 74 65 78 74 2c urnText(context,
3370: 20 72 65 74 75 72 6e 56 61 6c 75 65 2e 54 6f 53 returnValue.ToS
3380: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20 tring());.
3390: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;.
33a0: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 case TypeAff
33b0: 69 6e 69 74 79 2e 42 6c 6f 62 3a 0a 20 20 20 20 inity.Blob:.
33c0: 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75 _base.Retu
33d0: 72 6e 42 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 rnBlob(context,
33e0: 28 62 79 74 65 5b 5d 29 72 65 74 75 72 6e 56 61 (byte[])returnVa
33f0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 lue);.
3400: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a return;. }.
3410: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c }.. /// <
3420: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f summary>. ///
3430: 20 49 6e 74 65 72 6e 61 6c 20 73 63 61 6c 61 72 Internal scalar
3440: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 callback functi
3450: 6f 6e 2c 20 77 68 69 63 68 20 77 72 61 70 73 20 on, which wraps
3460: 74 68 65 20 72 61 77 20 63 6f 6e 74 65 78 74 20 the raw context
3470: 70 6f 69 6e 74 65 72 20 61 6e 64 20 63 61 6c 6c pointer and call
3480: 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 49 6e s the virtual In
3490: 76 6f 6b 65 28 29 20 6d 65 74 68 6f 64 2e 0a 20 voke() method..
34a0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
34b0: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d >. /// <param
34c0: 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e name="context">
34d0: 41 20 72 61 77 20 63 6f 6e 74 65 78 74 20 70 6f A raw context po
34e0: 69 6e 74 65 72 3c 2f 70 61 72 61 6d 3e 0a 20 20 inter</param>.
34f0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d /// <param nam
3500: 65 3d 22 6e 41 72 67 73 22 3e 4e 75 6d 62 65 72 e="nArgs">Number
3510: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 of arguments pa
3520: 73 73 65 64 20 69 6e 3c 2f 70 61 72 61 6d 3e 0a ssed in</param>.
3530: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e /// <param n
3540: 61 6d 65 3d 22 61 72 67 73 70 74 72 22 3e 41 20 ame="argsptr">A
3550: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 pointer to the a
3560: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 rray of argument
3570: 73 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 69 6e s</param>. in
3580: 74 65 72 6e 61 6c 20 76 6f 69 64 20 53 63 61 6c ternal void Scal
3590: 61 72 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 arCallback(IntPt
35a0: 72 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e r context, int n
35b0: 41 72 67 73 2c 20 49 6e 74 50 74 72 20 61 72 67 Args, IntPtr arg
35c0: 73 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 sptr). {.
35d0: 20 20 5f 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e _context = con
35e0: 74 65 78 74 3b 0a 20 20 20 20 20 20 53 65 74 52 text;. SetR
35f0: 65 74 75 72 6e 56 61 6c 75 65 28 63 6f 6e 74 65 eturnValue(conte
3600: 78 74 2c 20 49 6e 76 6f 6b 65 28 43 6f 6e 76 65 xt, Invoke(Conve
3610: 72 74 50 61 72 61 6d 73 28 6e 41 72 67 73 2c 20 rtParams(nArgs,
3620: 61 72 67 73 70 74 72 29 29 29 3b 0a 20 20 20 20 argsptr)));.
3630: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d }.. /// <summ
3640: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 ary>. /// Int
3650: 65 72 6e 61 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 ernal collation
3660: 73 65 71 75 65 6e 63 65 20 66 75 6e 63 74 69 6f sequence functio
3670: 6e 2c 20 77 68 69 63 68 20 77 72 61 70 73 20 75 n, which wraps u
3680: 70 20 74 68 65 20 72 61 77 20 73 74 72 69 6e 67 p the raw string
3690: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 65 78 pointers and ex
36a0: 65 63 75 74 65 73 20 74 68 65 20 43 6f 6d 70 61 ecutes the Compa
36b0: 72 65 28 29 20 76 69 72 74 75 61 6c 20 66 75 6e re() virtual fun
36c0: 63 74 69 6f 6e 2e 0a 20 20 20 20 2f 2f 2f 20 3c ction.. /// <
36d0: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f /summary>. //
36e0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 / <param name="p
36f0: 74 72 22 3e 4e 6f 74 20 75 73 65 64 3c 2f 70 61 tr">Not used</pa
3700: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 ram>. /// <pa
3710: 72 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e ram name="len1">
3720: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 Length of the st
3730: 72 69 6e 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e ring pv1</param>
3740: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 . /// <param
3750: 6e 61 6d 65 3d 22 70 74 72 31 22 3e 50 6f 69 6e name="ptr1">Poin
3760: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 ter to the first
3770: 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 string to compa
3780: 72 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f re</param>. /
3790: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 // <param name="
37a0: 6c 65 6e 32 22 3e 4c 65 6e 67 74 68 20 6f 66 20 len2">Length of
37b0: 74 68 65 20 73 74 72 69 6e 67 20 70 76 32 3c 2f the string pv2</
37c0: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c param>. /// <
37d0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 32 param name="ptr2
37e0: 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 ">Pointer to the
37f0: 20 73 65 63 6f 6e 64 20 73 74 72 69 6e 67 20 74 second string t
3800: 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d o compare</param
3810: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 >. /// <retur
3820: 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31 20 69 66 ns>Returns -1 if
3830: 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e the first strin
3840: 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 g is less than t
3850: 68 65 20 73 65 63 6f 6e 64 2e 20 20 30 20 69 66 he second. 0 if
3860: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 2c they are equal,
3870: 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 72 or 1 if the fir
3880: 73 74 20 73 74 72 69 6e 67 20 69 73 20 67 72 65 st string is gre
3890: 61 74 65 72 0a 20 20 20 20 2f 2f 2f 20 74 68 61 ater. /// tha
38a0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 3c 2f 72 n the second.</r
38b0: 65 74 75 72 6e 73 3e 0a 20 20 20 20 69 6e 74 65 eturns>. inte
38c0: 72 6e 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 rnal int Compare
38d0: 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 Callback(IntPtr
38e0: 70 74 72 2c 20 69 6e 74 20 6c 65 6e 31 2c 20 49 ptr, int len1, I
38f0: 6e 74 50 74 72 20 70 74 72 31 2c 20 69 6e 74 20 ntPtr ptr1, int
3900: 6c 65 6e 32 2c 20 49 6e 74 50 74 72 20 70 74 72 len2, IntPtr ptr
3910: 32 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 2). {. r
3920: 65 74 75 72 6e 20 43 6f 6d 70 61 72 65 28 53 51 eturn Compare(SQ
3930: 4c 69 74 65 43 6f 6e 76 65 72 74 2e 55 54 46 38 LiteConvert.UTF8
3940: 54 6f 53 74 72 69 6e 67 28 70 74 72 31 2c 20 6c ToString(ptr1, l
3950: 65 6e 31 29 2c 20 53 51 4c 69 74 65 43 6f 6e 76 en1), SQLiteConv
3960: 65 72 74 2e 55 54 46 38 54 6f 53 74 72 69 6e 67 ert.UTF8ToString
3970: 28 70 74 72 32 2c 20 6c 65 6e 32 29 29 3b 0a 20 (ptr2, len2));.
3980: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e }.. intern
3990: 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 43 61 al int CompareCa
39a0: 6c 6c 62 61 63 6b 31 36 28 49 6e 74 50 74 72 20 llback16(IntPtr
39b0: 70 74 72 2c 20 69 6e 74 20 6c 65 6e 31 2c 20 49 ptr, int len1, I
39c0: 6e 74 50 74 72 20 70 74 72 31 2c 20 69 6e 74 20 ntPtr ptr1, int
39d0: 6c 65 6e 32 2c 20 49 6e 74 50 74 72 20 70 74 72 len2, IntPtr ptr
39e0: 32 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 2). {. r
39f0: 65 74 75 72 6e 20 43 6f 6d 70 61 72 65 28 53 51 eturn Compare(SQ
3a00: 4c 69 74 65 33 5f 55 54 46 31 36 2e 55 54 46 31 Lite3_UTF16.UTF1
3a10: 36 54 6f 53 74 72 69 6e 67 28 70 74 72 31 2c 20 6ToString(ptr1,
3a20: 6c 65 6e 31 29 2c 20 53 51 4c 69 74 65 33 5f 55 len1), SQLite3_U
3a30: 54 46 31 36 2e 55 54 46 31 36 54 6f 53 74 72 69 TF16.UTF16ToStri
3a40: 6e 67 28 70 74 72 32 2c 20 6c 65 6e 32 29 29 3b ng(ptr2, len2));
3a50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 . }.. ///
3a60: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f <summary>. //
3a70: 2f 20 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 / The internal a
3a80: 67 67 72 65 67 61 74 65 20 53 74 65 70 20 66 75 ggregate Step fu
3a90: 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2c nction callback,
3aa0: 20 77 68 69 63 68 20 77 72 61 70 73 20 74 68 65 which wraps the
3ab0: 20 72 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 raw context poi
3ac0: 6e 74 65 72 20 61 6e 64 20 63 61 6c 6c 73 20 74 nter and calls t
3ad0: 68 65 20 76 69 72 74 75 61 6c 20 53 74 65 70 28 he virtual Step(
3ae0: 29 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2f 2f ) method.. //
3af0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 / </summary>.
3b00: 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a 20 /// <remarks>.
3b10: 20 20 20 2f 2f 2f 20 54 68 69 73 20 66 75 6e 63 /// This func
3b20: 74 69 6f 6e 20 74 61 6b 65 73 20 63 61 72 65 20 tion takes care
3b30: 6f 66 20 64 6f 69 6e 67 20 74 68 65 20 6c 6f 6f of doing the loo
3b40: 6b 75 70 73 20 61 6e 64 20 67 65 74 74 69 6e 67 kups and getting
3b50: 20 74 68 65 20 69 6d 70 6f 72 74 61 6e 74 20 69 the important i
3b60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 75 74 20 74 nformation put t
3b70: 6f 67 65 74 68 65 72 20 74 6f 20 63 61 6c 6c 20 ogether to call
3b80: 74 68 65 20 53 74 65 70 28 29 20 66 75 6e 63 74 the Step() funct
3b90: 69 6f 6e 2e 0a 20 20 20 20 2f 2f 2f 20 54 68 61 ion.. /// Tha
3ba0: 74 20 69 6e 63 6c 75 64 65 73 20 70 75 6c 6c 69 t includes pulli
3bb0: 6e 67 20 6f 75 74 20 74 68 65 20 75 73 65 72 27 ng out the user'
3bc0: 73 20 63 6f 6e 74 65 78 74 44 61 74 61 20 61 6e s contextData an
3bd0: 64 20 75 70 64 61 74 69 6e 67 20 69 74 20 61 66 d updating it af
3be0: 74 65 72 20 74 68 65 20 63 61 6c 6c 20 69 73 20 ter the call is
3bf0: 6d 61 64 65 2e 20 20 57 65 20 75 73 65 20 61 20 made. We use a
3c00: 73 6f 72 74 65 64 20 6c 69 73 74 20 66 6f 72 20 sorted list for
3c10: 74 68 69 73 20 73 6f 0a 20 20 20 20 2f 2f 2f 20 this so. ///
3c20: 62 69 6e 61 72 79 20 73 65 61 72 63 68 65 73 20 binary searches
3c30: 63 61 6e 20 62 65 20 64 6f 6e 65 20 74 6f 20 66 can be done to f
3c40: 69 6e 64 20 74 68 65 20 64 61 74 61 2e 0a 20 20 ind the data..
3c50: 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e /// </remarks>
3c60: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 . /// <param
3c70: 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e 41 name="context">A
3c80: 20 72 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 raw context poi
3c90: 6e 74 65 72 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 nter</param>.
3ca0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 /// <param name
3cb0: 3d 22 6e 41 72 67 73 22 3e 4e 75 6d 62 65 72 20 ="nArgs">Number
3cc0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 of arguments pas
3cd0: 73 65 64 20 69 6e 3c 2f 70 61 72 61 6d 3e 0a 20 sed in</param>.
3ce0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 /// <param na
3cf0: 6d 65 3d 22 61 72 67 73 70 74 72 22 3e 41 20 70 me="argsptr">A p
3d00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 ointer to the ar
3d10: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ray of arguments
3d20: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 69 6e 74 </param>. int
3d30: 65 72 6e 61 6c 20 76 6f 69 64 20 53 74 65 70 43 ernal void StepC
3d40: 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63 allback(IntPtr c
3d50: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e 41 72 67 ontext, int nArg
3d60: 73 2c 20 49 6e 74 50 74 72 20 61 72 67 73 70 74 s, IntPtr argspt
3d70: 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6c r). {. l
3d80: 6f 6e 67 20 6e 41 75 78 3b 0a 20 20 20 20 20 20 ong nAux;.
3d90: 41 67 67 72 65 67 61 74 65 44 61 74 61 20 64 61 AggregateData da
3da0: 74 61 3b 0a 0a 20 20 20 20 20 20 6e 41 75 78 20 ta;.. nAux
3db0: 3d 20 28 6c 6f 6e 67 29 5f 62 61 73 65 2e 41 67 = (long)_base.Ag
3dc0: 67 72 65 67 61 74 65 43 6f 6e 74 65 78 74 28 63 gregateContext(c
3dd0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 ontext);. i
3de0: 66 20 28 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c f (_contextDataL
3df0: 69 73 74 2e 54 72 79 47 65 74 56 61 6c 75 65 28 ist.TryGetValue(
3e00: 6e 41 75 78 2c 20 6f 75 74 20 64 61 74 61 29 20 nAux, out data)
3e10: 3d 3d 20 66 61 6c 73 65 29 0a 20 20 20 20 20 20 == false).
3e20: 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 20 3d {. data =
3e30: 20 6e 65 77 20 41 67 67 72 65 67 61 74 65 44 61 new AggregateDa
3e40: 74 61 28 29 3b 0a 20 20 20 20 20 20 20 20 5f 63 ta();. _c
3e50: 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 5b 6e ontextDataList[n
3e60: 41 75 78 5d 20 3d 20 64 61 74 61 3b 0a 20 20 20 Aux] = data;.
3e70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 72 79 0a }.. try.
3e80: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 {.
3e90: 5f 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 _context = conte
3ea0: 78 74 3b 0a 20 20 20 20 20 20 20 20 53 74 65 70 xt;. Step
3eb0: 28 43 6f 6e 76 65 72 74 50 61 72 61 6d 73 28 6e (ConvertParams(n
3ec0: 41 72 67 73 2c 20 61 72 67 73 70 74 72 29 2c 20 Args, argsptr),
3ed0: 64 61 74 61 2e 5f 63 6f 75 6e 74 2c 20 72 65 66 data._count, ref
3ee0: 20 64 61 74 61 2e 5f 64 61 74 61 29 3b 0a 20 20 data._data);.
3ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 69 6e 61 }. fina
3f00: 6c 6c 79 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 lly. {.
3f10: 20 20 20 20 64 61 74 61 2e 5f 63 6f 75 6e 74 2b data._count+
3f20: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d +;. }. }
3f30: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 .. /// <summa
3f40: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 41 6e 20 69 ry>. /// An i
3f50: 6e 74 65 72 6e 61 6c 20 61 67 67 72 65 67 61 74 nternal aggregat
3f60: 65 20 46 69 6e 61 6c 20 66 75 6e 63 74 69 6f 6e e Final function
3f70: 20 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69 63 68 callback, which
3f80: 20 77 72 61 70 73 20 74 68 65 20 63 6f 6e 74 65 wraps the conte
3f90: 78 74 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 63 xt pointer and c
3fa0: 61 6c 6c 73 20 74 68 65 20 76 69 72 74 75 61 6c alls the virtual
3fb0: 20 46 69 6e 61 6c 28 29 20 6d 65 74 68 6f 64 2e Final() method.
3fc0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 . /// </summa
3fd0: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 ry>. /// <par
3fe0: 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 am name="context
3ff0: 22 3e 41 20 72 61 77 20 63 6f 6e 74 65 78 74 20 ">A raw context
4000: 70 6f 69 6e 74 65 72 3c 2f 70 61 72 61 6d 3e 0a pointer</param>.
4010: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 internal voi
4020: 64 20 46 69 6e 61 6c 43 61 6c 6c 62 61 63 6b 28 d FinalCallback(
4030: 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 29 0a IntPtr context).
4040: 20 20 20 20 7b 0a 20 20 20 20 20 20 6c 6f 6e 67 {. long
4050: 20 6e 20 3d 20 28 6c 6f 6e 67 29 5f 62 61 73 65 n = (long)_base
4060: 2e 41 67 67 72 65 67 61 74 65 43 6f 6e 74 65 78 .AggregateContex
4070: 74 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 t(context);.
4080: 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20 3d 20 6e object obj = n
4090: 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 ull;.. if (
40a0: 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 _contextDataList
40b0: 2e 43 6f 6e 74 61 69 6e 73 4b 65 79 28 6e 29 29 .ContainsKey(n))
40c0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 . {.
40d0: 20 6f 62 6a 20 3d 20 5f 63 6f 6e 74 65 78 74 44 obj = _contextD
40e0: 61 74 61 4c 69 73 74 5b 6e 5d 2e 5f 64 61 74 61 ataList[n]._data
40f0: 3b 0a 20 20 20 20 20 20 20 20 5f 63 6f 6e 74 65 ;. _conte
4100: 78 74 44 61 74 61 4c 69 73 74 2e 52 65 6d 6f 76 xtDataList.Remov
4110: 65 28 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 e(n);. }..
4120: 20 20 20 20 20 5f 63 6f 6e 74 65 78 74 20 3d 20 _context =
4130: 63 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 53 context;. S
4140: 65 74 52 65 74 75 72 6e 56 61 6c 75 65 28 63 6f etReturnValue(co
4150: 6e 74 65 78 74 2c 20 46 69 6e 61 6c 28 6f 62 6a ntext, Final(obj
4160: 29 29 3b 0a 0a 20 20 20 20 20 20 49 44 69 73 70 ));.. IDisp
4170: 6f 73 61 62 6c 65 20 64 69 73 70 20 3d 20 6f 62 osable disp = ob
4180: 6a 20 61 73 20 49 44 69 73 70 6f 73 61 62 6c 65 j as IDisposable
4190: 3b 0a 20 20 20 20 20 20 69 66 20 28 64 69 73 70 ;. if (disp
41a0: 20 21 3d 20 6e 75 6c 6c 29 20 64 69 73 70 2e 44 != null) disp.D
41b0: 69 73 70 6f 73 65 28 29 3b 0a 20 20 20 20 7d 0a ispose();. }.
41c0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 . /// <summar
41d0: 79 3e 0a 20 20 20 20 2f 2f 2f 20 55 73 69 6e 67 y>. /// Using
41e0: 20 72 65 66 6c 65 63 74 69 6f 6e 2c 20 65 6e 75 reflection, enu
41f0: 6d 65 72 61 74 65 20 61 6c 6c 20 61 73 73 65 6d merate all assem
4200: 62 6c 69 65 73 20 69 6e 20 74 68 65 20 63 75 72 blies in the cur
4210: 72 65 6e 74 20 61 70 70 64 6f 6d 61 69 6e 20 6c rent appdomain l
4220: 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 6c 61 73 73 ooking for class
4230: 65 73 20 74 68 61 74 0a 20 20 20 20 2f 2f 2f 20 es that. ///
4240: 68 61 76 65 20 61 20 53 51 4c 69 74 65 46 75 6e have a SQLiteFun
4250: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 61 ctionAttribute a
4260: 74 74 72 69 62 75 74 65 2c 20 61 6e 64 20 72 65 ttribute, and re
4270: 67 69 73 74 65 72 69 6e 67 20 74 68 65 6d 20 61 gistering them a
4280: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 20 20 20 20 ccordingly..
4290: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 23 /// </summary>.#
42a0: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d if !PLATFORM_COM
42b0: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 PACTFRAMEWORK.
42c0: 20 20 5b 53 65 63 75 72 69 74 79 2e 50 65 72 6d [Security.Perm
42d0: 69 73 73 69 6f 6e 73 2e 46 69 6c 65 49 4f 50 65 issions.FileIOPe
42e0: 72 6d 69 73 73 69 6f 6e 28 53 65 63 75 72 69 74 rmission(Securit
42f0: 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e 53 65 y.Permissions.Se
4300: 63 75 72 69 74 79 41 63 74 69 6f 6e 2e 41 73 73 curityAction.Ass
4310: 65 72 74 2c 20 41 6c 6c 46 69 6c 65 73 20 3d 20 ert, AllFiles =
4320: 53 65 63 75 72 69 74 79 2e 50 65 72 6d 69 73 73 Security.Permiss
4330: 69 6f 6e 73 2e 46 69 6c 65 49 4f 50 65 72 6d 69 ions.FileIOPermi
4340: 73 73 69 6f 6e 41 63 63 65 73 73 2e 50 61 74 68 ssionAccess.Path
4350: 44 69 73 63 6f 76 65 72 79 29 5d 0a 23 65 6e 64 Discovery)].#end
4360: 69 66 0a 20 20 20 20 73 74 61 74 69 63 20 53 51 if. static SQ
4370: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 29 0a 20 LiteFunction().
4380: 20 20 20 7b 0a 20 20 20 20 20 20 5f 72 65 67 69 {. _regi
4390: 73 74 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 20 steredFunctions
43a0: 3d 20 6e 65 77 20 4c 69 73 74 3c 53 51 4c 69 74 = new List<SQLit
43b0: 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 eFunctionAttribu
43c0: 74 65 3e 28 29 3b 0a 20 20 20 20 20 20 74 72 79 te>();. try
43d0: 0a 20 20 20 20 20 20 7b 0a 23 69 66 20 21 50 4c . {.#if !PL
43e0: 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 ATFORM_COMPACTFR
43f0: 41 4d 45 57 4f 52 4b 0a 20 20 20 20 20 20 20 20 AMEWORK.
4400: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 SQLiteFunctionAt
4410: 74 72 69 62 75 74 65 20 61 74 3b 0a 20 20 20 20 tribute at;.
4420: 20 20 20 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 System.Refle
4430: 63 74 69 6f 6e 2e 41 73 73 65 6d 62 6c 79 5b 5d ction.Assembly[]
4440: 20 61 72 41 73 73 65 6d 62 6c 69 65 73 20 3d 20 arAssemblies =
4450: 53 79 73 74 65 6d 2e 41 70 70 44 6f 6d 61 69 6e System.AppDomain
4460: 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 2e 47 .CurrentDomain.G
4470: 65 74 41 73 73 65 6d 62 6c 69 65 73 28 29 3b 0a etAssemblies();.
4480: 20 20 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 int w =
4490: 61 72 41 73 73 65 6d 62 6c 69 65 73 2e 4c 65 6e arAssemblies.Len
44a0: 67 74 68 3b 0a 20 20 20 20 20 20 20 20 53 79 73 gth;. Sys
44b0: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 41 tem.Reflection.A
44c0: 73 73 65 6d 62 6c 79 4e 61 6d 65 20 73 71 6c 69 ssemblyName sqli
44d0: 74 65 20 3d 20 53 79 73 74 65 6d 2e 52 65 66 6c te = System.Refl
44e0: 65 63 74 69 6f 6e 2e 41 73 73 65 6d 62 6c 79 2e ection.Assembly.
44f0: 47 65 74 43 61 6c 6c 69 6e 67 41 73 73 65 6d 62 GetCallingAssemb
4500: 6c 79 28 29 2e 47 65 74 4e 61 6d 65 28 29 3b 0a ly().GetName();.
4510: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e . for (in
4520: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 77 3b 20 t n = 0; n < w;
4530: 6e 2b 2b 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 n++). {.
4540: 20 20 20 20 20 20 20 20 20 54 79 70 65 5b 5d 20 Type[]
4550: 61 72 54 79 70 65 73 3b 0a 20 20 20 20 20 20 20 arTypes;.
4560: 20 20 20 62 6f 6f 6c 20 66 6f 75 6e 64 20 3d 20 bool found =
4570: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 false;.
4580: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 System.Reflecti
4590: 6f 6e 2e 41 73 73 65 6d 62 6c 79 4e 61 6d 65 5b on.AssemblyName[
45a0: 5d 20 72 65 66 65 72 65 6e 63 65 73 3b 0a 20 20 ] references;.
45b0: 20 20 20 20 20 20 20 20 74 72 79 0a 20 20 20 20 try.
45c0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 {.
45d0: 20 20 20 20 2f 2f 20 49 6e 73 70 65 63 74 20 6f // Inspect o
45e0: 6e 6c 79 20 61 73 73 65 6d 62 6c 69 65 73 20 74 nly assemblies t
45f0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 53 51 hat reference SQ
4600: 4c 69 74 65 0a 20 20 20 20 20 20 20 20 20 20 20 Lite.
4610: 20 72 65 66 65 72 65 6e 63 65 73 20 3d 20 61 72 references = ar
4620: 41 73 73 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65 Assemblies[n].Ge
4630: 74 52 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d tReferencedAssem
4640: 62 6c 69 65 73 28 29 3b 0a 20 20 20 20 20 20 20 blies();.
4650: 20 20 20 20 20 69 6e 74 20 74 20 3d 20 72 65 66 int t = ref
4660: 65 72 65 6e 63 65 73 2e 4c 65 6e 67 74 68 3b 0a erences.Length;.
4670: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 for
4680: 28 69 6e 74 20 7a 20 3d 20 30 3b 20 7a 20 3c 20 (int z = 0; z <
4690: 74 3b 20 7a 2b 2b 29 0a 20 20 20 20 20 20 20 20 t; z++).
46a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 {.
46b0: 20 20 20 20 69 66 20 28 72 65 66 65 72 65 6e 63 if (referenc
46c0: 65 73 5b 7a 5d 2e 4e 61 6d 65 20 3d 3d 20 73 71 es[z].Name == sq
46d0: 6c 69 74 65 2e 4e 61 6d 65 29 0a 20 20 20 20 20 lite.Name).
46e0: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 {.
46f0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 75 6e 64 found
4700: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 = true;.
4710: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }.
4730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 }..
4740: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 if (f
4750: 6f 75 6e 64 20 3d 3d 20 66 61 6c 73 65 29 0a 20 ound == false).
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e con
4770: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 tinue;..
4780: 20 20 20 20 61 72 54 79 70 65 73 20 3d 20 61 72 arTypes = ar
4790: 41 73 73 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65 Assemblies[n].Ge
47a0: 74 54 79 70 65 73 28 29 3b 0a 20 20 20 20 20 20 tTypes();.
47b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
47c0: 63 61 74 63 68 20 28 52 65 66 6c 65 63 74 69 6f catch (Reflectio
47d0: 6e 2e 52 65 66 6c 65 63 74 69 6f 6e 54 79 70 65 n.ReflectionType
47e0: 4c 6f 61 64 45 78 63 65 70 74 69 6f 6e 20 65 29 LoadException e)
47f0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 . {.
4800: 20 20 20 20 20 20 20 20 20 61 72 54 79 70 65 73 arTypes
4810: 20 3d 20 65 2e 54 79 70 65 73 3b 0a 20 20 20 20 = e.Types;.
4820: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 }..
4830: 20 20 20 69 6e 74 20 76 20 3d 20 61 72 54 79 70 int v = arTyp
4840: 65 73 2e 4c 65 6e 67 74 68 3b 0a 20 20 20 20 20 es.Length;.
4850: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 78 20 for (int x
4860: 3d 20 30 3b 20 78 20 3c 20 76 3b 20 78 2b 2b 29 = 0; x < v; x++)
4870: 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 . {.
4880: 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72 54 if (arT
4890: 79 70 65 73 5b 78 5d 20 3d 3d 20 6e 75 6c 6c 29 ypes[x] == null)
48a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 continue;..
48b0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 5b 5d object[]
48c0: 20 61 72 41 74 74 20 3d 20 61 72 54 79 70 65 73 arAtt = arTypes
48d0: 5b 78 5d 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 [x].GetCustomAtt
48e0: 72 69 62 75 74 65 73 28 74 79 70 65 6f 66 28 53 ributes(typeof(S
48f0: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 QLiteFunctionAtt
4900: 72 69 62 75 74 65 29 2c 20 66 61 6c 73 65 29 3b ribute), false);
4910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 . int
4920: 20 75 20 3d 20 61 72 41 74 74 2e 4c 65 6e 67 74 u = arAtt.Lengt
4930: 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 h;. f
4940: 6f 72 20 28 69 6e 74 20 79 20 3d 20 30 3b 20 79 or (int y = 0; y
4950: 20 3c 20 75 3b 20 79 2b 2b 29 0a 20 20 20 20 20 < u; y++).
4960: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 {.
4970: 20 20 20 20 20 20 20 61 74 20 3d 20 61 72 41 74 at = arAt
4980: 74 5b 79 5d 20 61 73 20 53 51 4c 69 74 65 46 75 t[y] as SQLiteFu
4990: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 3b nctionAttribute;
49a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 . i
49b0: 66 20 28 61 74 20 21 3d 20 6e 75 6c 6c 29 0a 20 f (at != null).
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 {.
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
49e0: 74 2e 5f 69 6e 73 74 61 6e 63 65 54 79 70 65 20 t._instanceType
49f0: 3d 20 61 72 54 79 70 65 73 5b 78 5d 3b 0a 20 20 = arTypes[x];.
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 72 _r
4a10: 65 67 69 73 74 65 72 65 64 46 75 6e 63 74 69 6f egisteredFunctio
4a20: 6e 73 2e 41 64 64 28 61 74 29 3b 0a 20 20 20 20 ns.Add(at);.
4a30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
4a40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
4a50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a }. }.
4a60: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 #endif. }.
4a70: 20 20 20 20 20 63 61 74 63 68 20 2f 2f 20 53 51 catch // SQ
4a80: 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 63 61 Lite provider ca
4a90: 6e 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 6f n continue witho
4aa0: 75 74 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f ut being able to
4ab0: 20 66 69 6e 64 20 62 75 69 6c 74 2d 69 6e 20 66 find built-in f
4ac0: 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 7b unctions. {
4ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a . }. }..
4ae0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 /// <summary
4af0: 3e 0a 20 20 20 20 2f 2f 2f 20 4d 61 6e 75 61 6c >. /// Manual
4b00: 20 6d 65 74 68 6f 64 20 6f 66 20 72 65 67 69 73 method of regis
4b10: 74 65 72 69 6e 67 20 61 20 66 75 6e 63 74 69 6f tering a functio
4b20: 6e 2e 20 20 54 68 65 20 74 79 70 65 20 6d 75 73 n. The type mus
4b30: 74 20 73 74 69 6c 6c 20 68 61 76 65 20 74 68 65 t still have the
4b40: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 SQLiteFunctionA
4b50: 74 74 72 69 62 75 74 65 73 20 69 6e 20 6f 72 64 ttributes in ord
4b60: 65 72 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 2f er to work. /
4b70: 2f 2f 20 70 72 6f 70 65 72 6c 79 2c 20 62 75 74 // properly, but
4b80: 20 74 68 69 73 20 69 73 20 61 20 77 6f 72 6b 61 this is a worka
4b90: 72 6f 75 6e 64 20 66 6f 72 20 74 68 65 20 43 6f round for the Co
4ba0: 6d 70 61 63 74 20 46 72 61 6d 65 77 6f 72 6b 20 mpact Framework
4bb0: 77 68 65 72 65 20 65 6e 75 6d 65 72 61 74 69 6e where enumeratin
4bc0: 67 20 61 73 73 65 6d 62 6c 69 65 73 20 69 73 20 g assemblies is
4bd0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 not currently su
4be0: 70 70 6f 72 74 65 64 2e 0a 20 20 20 20 2f 2f 2f pported.. ///
4bf0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 </summary>.
4c00: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d /// <param name=
4c10: 22 74 79 70 22 3e 54 68 65 20 74 79 70 65 20 6f "typ">The type o
4c20: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 f the function t
4c30: 6f 20 72 65 67 69 73 74 65 72 3c 2f 70 61 72 61 o register</para
4c40: 6d 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 m>. public st
4c50: 61 74 69 63 20 76 6f 69 64 20 52 65 67 69 73 74 atic void Regist
4c60: 65 72 46 75 6e 63 74 69 6f 6e 28 54 79 70 65 20 erFunction(Type
4c70: 74 79 70 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 typ). {.
4c80: 20 6f 62 6a 65 63 74 5b 5d 20 61 72 41 74 74 20 object[] arAtt
4c90: 3d 20 74 79 70 2e 47 65 74 43 75 73 74 6f 6d 41 = typ.GetCustomA
4ca0: 74 74 72 69 62 75 74 65 73 28 74 79 70 65 6f 66 ttributes(typeof
4cb0: 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 (SQLiteFunctionA
4cc0: 74 74 72 69 62 75 74 65 29 2c 20 66 61 6c 73 65 ttribute), false
4cd0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 20 3d );. int u =
4ce0: 20 61 72 41 74 74 2e 4c 65 6e 67 74 68 3b 0a 20 arAtt.Length;.
4cf0: 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 SQLiteFunct
4d00: 69 6f 6e 41 74 74 72 69 62 75 74 65 20 61 74 3b ionAttribute at;
4d10: 0a 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 .. for (int
4d20: 20 79 20 3d 20 30 3b 20 79 20 3c 20 75 3b 20 79 y = 0; y < u; y
4d30: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 ++). {.
4d40: 20 20 20 20 61 74 20 3d 20 61 72 41 74 74 5b 79 at = arAtt[y
4d50: 5d 20 61 73 20 53 51 4c 69 74 65 46 75 6e 63 74 ] as SQLiteFunct
4d60: 69 6f 6e 41 74 74 72 69 62 75 74 65 3b 0a 20 20 ionAttribute;.
4d70: 20 20 20 20 20 20 69 66 20 28 61 74 20 21 3d 20 if (at !=
4d80: 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 7b 0a null). {.
4d90: 20 20 20 20 20 20 20 20 20 20 61 74 2e 5f 69 6e at._in
4da0: 73 74 61 6e 63 65 54 79 70 65 20 3d 20 74 79 70 stanceType = typ
4db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 5f 72 65 67 ;. _reg
4dc0: 69 73 74 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 isteredFunctions
4dd0: 2e 41 64 64 28 61 74 29 3b 0a 20 20 20 20 20 20 .Add(at);.
4de0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
4df0: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d }.. /// <summ
4e00: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 43 61 6c ary>. /// Cal
4e10: 6c 65 64 20 62 79 20 53 51 4c 69 74 65 42 61 73 led by SQLiteBas
4e20: 65 20 64 65 72 69 76 65 64 20 63 6c 61 73 73 65 e derived classe
4e30: 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e s, this function
4e40: 20 62 69 6e 64 73 20 61 6c 6c 20 75 73 65 72 2d binds all user-
4e50: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e defined function
4e60: 73 20 74 6f 20 61 20 63 6f 6e 6e 65 63 74 69 6f s to a connectio
4e70: 6e 2e 0a 20 20 20 20 2f 2f 2f 20 49 74 20 69 73 n.. /// It is
4e80: 20 64 6f 6e 65 20 74 68 69 73 20 77 61 79 20 73 done this way s
4e90: 6f 20 74 68 61 74 20 61 6c 6c 20 75 73 65 72 2d o that all user-
4ea0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e defined function
4eb0: 73 20 77 69 6c 6c 20 61 63 63 65 73 73 20 74 68 s will access th
4ec0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 e database using
4ed0: 20 74 68 65 20 73 61 6d 65 20 65 6e 63 6f 64 69 the same encodi
4ee0: 6e 67 20 73 63 68 65 6d 65 0a 20 20 20 20 2f 2f ng scheme. //
4ef0: 2f 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 / as the connect
4f00: 69 6f 6e 20 28 55 54 46 2d 38 20 6f 72 20 55 54 ion (UTF-8 or UT
4f10: 46 2d 31 36 29 2e 0a 20 20 20 20 2f 2f 2f 20 3c F-16).. /// <
4f20: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f /summary>. //
4f30: 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a 20 20 20 20 / <remarks>.
4f40: 2f 2f 2f 20 54 68 65 20 77 72 61 70 70 65 72 20 /// The wrapper
4f50: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69 functions that i
4f60: 6e 74 65 72 6f 70 20 77 69 74 68 20 53 51 4c 69 nterop with SQLi
4f70: 74 65 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 te will create a
4f80: 20 75 6e 69 71 75 65 20 63 6f 6f 6b 69 65 20 76 unique cookie v
4f90: 61 6c 75 65 2c 20 77 68 69 63 68 20 69 6e 74 65 alue, which inte
4fa0: 72 6e 61 6c 6c 79 20 69 73 20 61 20 70 6f 69 6e rnally is a poin
4fb0: 74 65 72 20 74 6f 0a 20 20 20 20 2f 2f 2f 20 61 ter to. /// a
4fc0: 6c 6c 20 74 68 65 20 77 72 61 70 70 65 64 20 63 ll the wrapped c
4fd0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e allback function
4fe0: 73 2e 20 20 54 68 65 20 69 6e 74 65 72 6f 70 20 s. The interop
4ff0: 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 69 74 function uses it
5000: 20 74 6f 20 6d 61 70 20 43 44 65 63 6c 20 63 61 to map CDecl ca
5010: 6c 6c 62 61 63 6b 73 20 74 6f 20 53 74 64 43 61 llbacks to StdCa
5020: 6c 6c 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 ll callbacks..
5030: 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e /// </remarks>
5040: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 . /// <param
5050: 6e 61 6d 65 3d 22 73 71 6c 62 61 73 65 22 3e 54 name="sqlbase">T
5060: 68 65 20 62 61 73 65 20 6f 62 6a 65 63 74 20 6f he base object o
5070: 6e 20 77 68 69 63 68 20 74 68 65 20 66 75 6e 63 n which the func
5080: 74 69 6f 6e 73 20 61 72 65 20 74 6f 20 62 69 6e tions are to bin
5090: 64 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f d</param>. //
50a0: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72 / <returns>Retur
50b0: 6e 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 66 ns an array of f
50c0: 75 6e 63 74 69 6f 6e 73 20 77 68 69 63 68 20 74 unctions which t
50d0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 he connection ob
50e0: 6a 65 63 74 20 73 68 6f 75 6c 64 20 72 65 74 61 ject should reta
50f0: 69 6e 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6e in until the con
5100: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 nection is close
5110: 64 2e 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 d.</returns>.
5120: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63 internal static
5130: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 5b SQLiteFunction[
5140: 5d 20 42 69 6e 64 46 75 6e 63 74 69 6f 6e 73 28 ] BindFunctions(
5150: 53 51 4c 69 74 65 42 61 73 65 20 73 71 6c 62 61 SQLiteBase sqlba
5160: 73 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 se). {.
5170: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 66 SQLiteFunction f
5180: 3b 0a 20 20 20 20 20 20 4c 69 73 74 3c 53 51 4c ;. List<SQL
5190: 69 74 65 46 75 6e 63 74 69 6f 6e 3e 20 6c 46 75 iteFunction> lFu
51a0: 6e 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 4c 69 nctions = new Li
51b0: 73 74 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f st<SQLiteFunctio
51c0: 6e 3e 28 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 n>();.. for
51d0: 65 61 63 68 20 28 53 51 4c 69 74 65 46 75 6e 63 each (SQLiteFunc
51e0: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 70 72 tionAttribute pr
51f0: 20 69 6e 20 5f 72 65 67 69 73 74 65 72 65 64 46 in _registeredF
5200: 75 6e 63 74 69 6f 6e 73 29 0a 20 20 20 20 20 20 unctions).
5210: 7b 0a 20 20 20 20 20 20 20 20 66 20 3d 20 28 53 {. f = (S
5220: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 29 41 63 QLiteFunction)Ac
5230: 74 69 76 61 74 6f 72 2e 43 72 65 61 74 65 49 6e tivator.CreateIn
5240: 73 74 61 6e 63 65 28 70 72 2e 5f 69 6e 73 74 61 stance(pr._insta
5250: 6e 63 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 nceType);.
5260: 20 20 66 2e 5f 62 61 73 65 20 3d 20 73 71 6c 62 f._base = sqlb
5270: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 66 2e 5f ase;. f._
5280: 49 6e 76 6f 6b 65 46 75 6e 63 20 3d 20 28 70 72 InvokeFunc = (pr
5290: 2e 46 75 6e 63 54 79 70 65 20 3d 3d 20 46 75 6e .FuncType == Fun
52a0: 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 ctionType.Scalar
52b0: 29 20 3f 20 6e 65 77 20 53 51 4c 69 74 65 43 61 ) ? new SQLiteCa
52c0: 6c 6c 62 61 63 6b 28 66 2e 53 63 61 6c 61 72 43 llback(f.ScalarC
52d0: 61 6c 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b allback) : null;
52e0: 0a 20 20 20 20 20 20 20 20 66 2e 5f 53 74 65 70 . f._Step
52f0: 46 75 6e 63 20 3d 20 28 70 72 2e 46 75 6e 63 54 Func = (pr.FuncT
5300: 79 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 ype == FunctionT
5310: 79 70 65 2e 41 67 67 72 65 67 61 74 65 29 20 3f ype.Aggregate) ?
5320: 20 6e 65 77 20 53 51 4c 69 74 65 43 61 6c 6c 62 new SQLiteCallb
5330: 61 63 6b 28 66 2e 53 74 65 70 43 61 6c 6c 62 61 ack(f.StepCallba
5340: 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0a 20 20 20 20 ck) : null;.
5350: 20 20 20 20 66 2e 5f 46 69 6e 61 6c 46 75 6e 63 f._FinalFunc
5360: 20 3d 20 28 70 72 2e 46 75 6e 63 54 79 70 65 20 = (pr.FuncType
5370: 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e == FunctionType.
5380: 41 67 67 72 65 67 61 74 65 29 20 3f 20 6e 65 77 Aggregate) ? new
5390: 20 53 51 4c 69 74 65 46 69 6e 61 6c 43 61 6c 6c SQLiteFinalCall
53a0: 62 61 63 6b 28 66 2e 46 69 6e 61 6c 43 61 6c 6c back(f.FinalCall
53b0: 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0a 20 20 back) : null;.
53c0: 20 20 20 20 20 20 66 2e 5f 43 6f 6d 70 61 72 65 f._Compare
53d0: 46 75 6e 63 20 3d 20 28 70 72 2e 46 75 6e 63 54 Func = (pr.FuncT
53e0: 79 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 ype == FunctionT
53f0: 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 20 3f ype.Collation) ?
5400: 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6c 6c 61 new SQLiteColla
5410: 74 69 6f 6e 28 66 2e 43 6f 6d 70 61 72 65 43 61 tion(f.CompareCa
5420: 6c 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0a llback) : null;.
5430: 20 20 20 20 20 20 20 20 66 2e 5f 43 6f 6d 70 61 f._Compa
5440: 72 65 46 75 6e 63 31 36 20 3d 20 28 70 72 2e 46 reFunc16 = (pr.F
5450: 75 6e 63 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 uncType == Funct
5460: 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f ionType.Collatio
5470: 6e 29 20 3f 20 6e 65 77 20 53 51 4c 69 74 65 43 n) ? new SQLiteC
5480: 6f 6c 6c 61 74 69 6f 6e 28 66 2e 43 6f 6d 70 61 ollation(f.Compa
5490: 72 65 43 61 6c 6c 62 61 63 6b 31 36 29 20 3a 20 reCallback16) :
54a0: 6e 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 null;.. i
54b0: 66 20 28 70 72 2e 46 75 6e 63 54 79 70 65 20 21 f (pr.FuncType !
54c0: 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 43 = FunctionType.C
54d0: 6f 6c 6c 61 74 69 6f 6e 29 0a 20 20 20 20 20 20 ollation).
54e0: 20 20 20 20 73 71 6c 62 61 73 65 2e 43 72 65 61 sqlbase.Crea
54f0: 74 65 46 75 6e 63 74 69 6f 6e 28 70 72 2e 4e 61 teFunction(pr.Na
5500: 6d 65 2c 20 70 72 2e 41 72 67 75 6d 65 6e 74 73 me, pr.Arguments
5510: 2c 20 28 66 20 69 73 20 53 51 4c 69 74 65 46 75 , (f is SQLiteFu
5520: 6e 63 74 69 6f 6e 45 78 29 2c 20 66 2e 5f 49 6e nctionEx), f._In
5530: 76 6f 6b 65 46 75 6e 63 2c 20 66 2e 5f 53 74 65 vokeFunc, f._Ste
5540: 70 46 75 6e 63 2c 20 66 2e 5f 46 69 6e 61 6c 46 pFunc, f._FinalF
5550: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 65 6c unc);. el
5560: 73 65 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c se. sql
5570: 62 61 73 65 2e 43 72 65 61 74 65 43 6f 6c 6c 61 base.CreateColla
5580: 74 69 6f 6e 28 70 72 2e 4e 61 6d 65 2c 20 66 2e tion(pr.Name, f.
5590: 5f 43 6f 6d 70 61 72 65 46 75 6e 63 2c 20 66 2e _CompareFunc, f.
55a0: 5f 43 6f 6d 70 61 72 65 46 75 6e 63 31 36 29 3b _CompareFunc16);
55b0: 0a 0a 0a 20 20 20 20 20 20 20 20 6c 46 75 6e 63 ... lFunc
55c0: 74 69 6f 6e 73 2e 41 64 64 28 66 29 3b 0a 20 20 tions.Add(f);.
55d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 53 51 4c }.. SQL
55e0: 69 74 65 46 75 6e 63 74 69 6f 6e 5b 5d 20 61 72 iteFunction[] ar
55f0: 46 75 6e 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 Functions = new
5600: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 5b 6c SQLiteFunction[l
5610: 46 75 6e 63 74 69 6f 6e 73 2e 43 6f 75 6e 74 5d Functions.Count]
5620: 3b 0a 20 20 20 20 20 20 6c 46 75 6e 63 74 69 6f ;. lFunctio
5630: 6e 73 2e 43 6f 70 79 54 6f 28 61 72 46 75 6e 63 ns.CopyTo(arFunc
5640: 74 69 6f 6e 73 2c 20 30 29 3b 0a 0a 20 20 20 20 tions, 0);..
5650: 20 20 72 65 74 75 72 6e 20 61 72 46 75 6e 63 74 return arFunct
5660: 69 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a ions;. }. }.
5670: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e . /// <summary>
5680: 0a 20 20 2f 2f 2f 20 45 78 74 65 6e 64 73 20 53 . /// Extends S
5690: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 61 6e QLiteFunction an
56a0: 64 20 61 6c 6c 6f 77 73 20 61 6e 20 69 6e 68 65 d allows an inhe
56b0: 72 69 74 65 64 20 63 6c 61 73 73 20 74 6f 20 6f rited class to o
56c0: 62 74 61 69 6e 20 74 68 65 20 63 6f 6c 6c 61 74 btain the collat
56d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 61 73 73 ing sequence ass
56e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 66 ociated with a f
56f0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 unction call..
5700: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 /// </summary>.
5710: 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a 20 /// <remarks>.
5720: 20 2f 2f 2f 20 55 73 65 72 2d 64 65 66 69 6e 65 /// User-define
5730: 64 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e 20 d functions can
5740: 63 61 6c 6c 20 74 68 65 20 47 65 74 43 6f 6c 6c call the GetColl
5750: 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 28 29 20 ationSequence()
5760: 6d 65 74 68 6f 64 20 69 6e 20 74 68 69 73 20 63 method in this c
5770: 6c 61 73 73 20 61 6e 64 20 75 73 65 20 69 74 20 lass and use it
5780: 74 6f 20 63 6f 6d 70 61 72 65 20 73 74 72 69 6e to compare strin
5790: 67 73 20 61 6e 64 20 63 68 61 72 20 61 72 72 61 gs and char arra
57a0: 79 73 2e 0a 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 ys.. /// </rema
57b0: 72 6b 73 3e 0a 20 20 70 75 62 6c 69 63 20 63 6c rks>. public cl
57c0: 61 73 73 20 53 51 4c 69 74 65 46 75 6e 63 74 69 ass SQLiteFuncti
57d0: 6f 6e 45 78 20 3a 20 53 51 4c 69 74 65 46 75 6e onEx : SQLiteFun
57e0: 63 74 69 6f 6e 0a 20 20 7b 0a 20 20 20 20 2f 2f ction. {. //
57f0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 / <summary>.
5800: 2f 2f 2f 20 4f 62 74 61 69 6e 73 20 74 68 65 20 /// Obtains the
5810: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e collating sequen
5820: 63 65 20 69 6e 20 65 66 66 65 63 74 20 66 6f 72 ce in effect for
5830: 20 74 68 65 20 67 69 76 65 6e 20 66 75 6e 63 74 the given funct
5840: 69 6f 6e 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 ion.. /// </s
5850: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 ummary>. ///
5860: 3c 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 <returns></retur
5870: 6e 73 3e 0a 20 20 20 20 70 72 6f 74 65 63 74 65 ns>. protecte
5880: 64 20 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 d CollationSeque
5890: 6e 63 65 20 47 65 74 43 6f 6c 6c 61 74 69 6f 6e nce GetCollation
58a0: 53 65 71 75 65 6e 63 65 28 29 0a 20 20 20 20 7b Sequence(). {
58b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 62 . return _b
58c0: 61 73 65 2e 47 65 74 43 6f 6c 6c 61 74 69 6f 6e ase.GetCollation
58d0: 53 65 71 75 65 6e 63 65 28 74 68 69 73 2c 20 5f Sequence(this, _
58e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0d context);. }.
58f0: 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f ... /////////
5900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5950: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 //////.... #r
5960: 65 67 69 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c egion IDisposabl
5970: 65 20 22 50 61 74 74 65 72 6e 22 20 4d 65 6d 62 e "Pattern" Memb
5980: 65 72 73 0d 0a 20 20 20 20 70 72 69 76 61 74 65 ers.. private
5990: 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65 64 3b 0d bool disposed;.
59a0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 . private voi
59b0: 64 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 d CheckDisposed(
59c0: 29 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 ) /* throw */..
59d0: 20 20 20 7b 0d 0a 23 69 66 20 54 48 52 4f 57 5f {..#if THROW_
59e0: 4f 4e 5f 44 49 53 50 4f 53 45 44 0d 0a 20 20 20 ON_DISPOSED..
59f0: 20 20 20 20 20 69 66 20 28 64 69 73 70 6f 73 65 if (dispose
5a00: 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 d)..
5a10: 74 68 72 6f 77 20 6e 65 77 20 4f 62 6a 65 63 74 throw new Object
5a20: 44 69 73 70 6f 73 65 64 45 78 63 65 70 74 69 6f DisposedExceptio
5a30: 6e 28 74 79 70 65 6f 66 28 53 51 4c 69 74 65 46 n(typeof(SQLiteF
5a40: 75 6e 63 74 69 6f 6e 45 78 29 2e 4e 61 6d 65 29 unctionEx).Name)
5a50: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d ;..#endif.. }
5a60: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f .... ////////
5a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5ac0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 70 ///////.... p
5ad0: 72 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69 64 rotected overrid
5ae0: 65 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28 62 e void Dispose(b
5af0: 6f 6f 6c 20 64 69 73 70 6f 73 69 6e 67 29 0d 0a ool disposing)..
5b00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 {.. t
5b10: 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 ry.. {..
5b20: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 if (!
5b30: 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 disposed)..
5b40: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 {..
5b50: 20 20 20 20 20 20 20 20 20 20 2f 2f 69 66 20 28 //if (
5b60: 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 disposing)..
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 7b 0d //{.
5b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5b90: 20 2f 2f 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f // /////////
5ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 ///////////..
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 //
5bd0: 20 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d 61 // dispose ma
5be0: 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 naged resources
5bf0: 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 here.....
5c00: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 2f // /
5c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5c30: 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 ///..
5c40: 20 20 20 20 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 //}....
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f ////
5c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5c80: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 //..
5c90: 20 20 20 20 2f 2f 20 72 65 6c 65 61 73 65 20 75 // release u
5ca0: 6e 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 nmanaged resourc
5cb0: 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 es here.....
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f ////
5cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
5cf0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 //....
5d00: 20 20 20 20 20 20 64 69 73 70 6f 73 65 64 20 3d disposed =
5d10: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 true;..
5d20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d }.. }
5d30: 0d 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c .. finall
5d40: 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 y.. {..
5d50: 20 20 20 20 20 20 20 20 20 20 62 61 73 65 2e 44 base.D
5d60: 69 73 70 6f 73 65 28 64 69 73 70 6f 73 69 6e 67 ispose(disposing
5d70: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 );.. }..
5d80: 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 }.. #endre
5d90: 67 69 6f 6e 0a 20 20 7d 0a 0a 20 20 2f 2f 2f 20 gion. }.. ///
5da0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 <summary>. ///
5db0: 54 68 65 20 74 79 70 65 20 6f 66 20 75 73 65 72 The type of user
5dc0: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f -defined functio
5dd0: 6e 20 74 6f 20 64 65 63 6c 61 72 65 0a 20 20 2f n to declare. /
5de0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 // </summary>.
5df0: 70 75 62 6c 69 63 20 65 6e 75 6d 20 46 75 6e 63 public enum Func
5e00: 74 69 6f 6e 54 79 70 65 0a 20 20 7b 0a 20 20 20 tionType. {.
5e10: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 /// <summary>.
5e20: 20 20 20 2f 2f 2f 20 53 63 61 6c 61 72 20 66 75 /// Scalar fu
5e30: 6e 63 74 69 6f 6e 73 20 61 72 65 20 64 65 73 69 nctions are desi
5e40: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 gned to be calle
5e50: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 72 d and return a r
5e60: 65 73 75 6c 74 20 69 6d 6d 65 64 69 61 74 65 6c esult immediatel
5e70: 79 2e 20 20 45 78 61 6d 70 6c 65 73 20 69 6e 63 y. Examples inc
5e80: 6c 75 64 65 20 41 42 53 28 29 2c 20 55 70 70 65 lude ABS(), Uppe
5e90: 72 28 29 2c 20 4c 6f 77 65 72 28 29 2c 20 65 74 r(), Lower(), et
5ea0: 63 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d c.. /// </sum
5eb0: 6d 61 72 79 3e 0a 20 20 20 20 53 63 61 6c 61 72 mary>. Scalar
5ec0: 20 3d 20 30 2c 0a 20 20 20 20 2f 2f 2f 20 3c 73 = 0,. /// <s
5ed0: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 ummary>. ///
5ee0: 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 Aggregate functi
5ef0: 6f 6e 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 ons are designed
5f00: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 to accumulate d
5f10: 61 74 61 20 75 6e 74 69 6c 20 74 68 65 20 65 6e ata until the en
5f20: 64 20 6f 66 20 61 20 63 61 6c 6c 20 61 6e 64 20 d of a call and
5f30: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 72 65 then return a re
5f40: 73 75 6c 74 20 67 6c 65 61 6e 65 64 20 66 72 6f sult gleaned fro
5f50: 6d 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65 m the accumulate
5f60: 64 20 64 61 74 61 2e 0a 20 20 20 20 2f 2f 2f 20 d data.. ///
5f70: 45 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65 Examples include
5f80: 20 53 55 4d 28 29 2c 20 43 4f 55 4e 54 28 29 2c SUM(), COUNT(),
5f90: 20 41 56 47 28 29 2c 20 65 74 63 2e 0a 20 20 20 AVG(), etc..
5fa0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a /// </summary>.
5fb0: 20 20 20 20 41 67 67 72 65 67 61 74 65 20 3d 20 Aggregate =
5fc0: 31 2c 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 1,. /// <summ
5fd0: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 43 6f 6c ary>. /// Col
5fe0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 lation sequences
5ff0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 6f 72 are used to sor
6000: 74 20 74 65 78 74 75 61 6c 20 64 61 74 61 20 69 t textual data i
6010: 6e 20 61 20 63 75 73 74 6f 6d 20 6d 61 6e 6e 65 n a custom manne
6020: 72 2c 20 61 6e 64 20 61 70 70 65 61 72 20 69 6e r, and appear in
6030: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 an ORDER BY cla
6040: 75 73 65 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 use. Typically
6050: 74 65 78 74 20 69 6e 20 61 6e 20 4f 52 44 45 52 text in an ORDER
6060: 20 42 59 20 69 73 0a 20 20 20 20 2f 2f 2f 20 73 BY is. /// s
6070: 6f 72 74 65 64 20 75 73 69 6e 67 20 61 20 73 74 orted using a st
6080: 72 61 69 67 68 74 20 63 61 73 65 2d 69 6e 73 65 raight case-inse
6090: 6e 73 69 74 69 76 65 20 63 6f 6d 70 61 72 69 73 nsitive comparis
60a0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 43 75 on function. Cu
60b0: 73 74 6f 6d 20 63 6f 6c 6c 61 74 69 6e 67 20 73 stom collating s
60c0: 65 71 75 65 6e 63 65 73 20 63 61 6e 20 62 65 20 equences can be
60d0: 75 73 65 64 20 74 6f 20 61 6c 74 65 72 20 74 68 used to alter th
60e0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 65 e behavior of te
60f0: 78 74 20 73 6f 72 74 69 6e 67 0a 20 20 20 20 2f xt sorting. /
6100: 2f 2f 20 69 6e 20 61 20 75 73 65 72 2d 64 65 66 // in a user-def
6110: 69 6e 65 64 20 6d 61 6e 6e 65 72 2e 0a 20 20 20 ined manner..
6120: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a /// </summary>.
6130: 20 20 20 20 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 Collation =
6140: 32 2c 0a 20 20 7d 0a 0a 20 20 2f 2f 2f 20 3c 73 2,. }.. /// <s
6150: 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 41 6e ummary>. /// An
6160: 20 69 6e 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 internal callba
6170: 63 6b 20 64 65 6c 65 67 61 74 65 20 64 65 63 6c ck delegate decl
6180: 61 72 61 74 69 6f 6e 2e 0a 20 20 2f 2f 2f 20 3c aration.. /// <
6190: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 /summary>. ///
61a0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e <param name="con
61b0: 74 65 78 74 22 3e 52 61 77 20 63 6f 6e 74 65 78 text">Raw contex
61c0: 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 t pointer for th
61d0: 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 3c e user function<
61e0: 2f 70 61 72 61 6d 3e 0a 20 20 2f 2f 2f 20 3c 70 /param>. /// <p
61f0: 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73 aram name="nArgs
6200: 22 3e 43 6f 75 6e 74 20 6f 66 20 61 72 67 75 6d ">Count of argum
6210: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 ents to the func
6220: 74 69 6f 6e 3c 2f 70 61 72 61 6d 3e 0a 20 20 2f tion</param>. /
6230: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 // <param name="
6240: 61 72 67 73 70 74 72 22 3e 41 20 70 6f 69 6e 74 argsptr">A point
6250: 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 er to the array
6260: 6f 66 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e of argument poin
6270: 74 65 72 73 3c 2f 70 61 72 61 6d 3e 0a 23 69 66 ters</param>.#if
6280: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 !PLATFORM_COMPA
6290: 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 5b 55 CTFRAMEWORK. [U
62a0: 6e 6d 61 6e 61 67 65 64 46 75 6e 63 74 69 6f 6e nmanagedFunction
62b0: 50 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67 43 Pointer(CallingC
62c0: 6f 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c 29 onvention.Cdecl)
62d0: 5d 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 65 72 ].#endif. inter
62e0: 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 76 6f 69 nal delegate voi
62f0: 64 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b d SQLiteCallback
6300: 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c (IntPtr context,
6310: 20 69 6e 74 20 6e 41 72 67 73 2c 20 49 6e 74 50 int nArgs, IntP
6320: 74 72 20 61 72 67 73 70 74 72 29 3b 0a 20 20 2f tr argsptr);. /
6330: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f // <summary>. /
6340: 2f 2f 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 66 // An internal f
6350: 69 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 20 64 65 inal callback de
6360: 6c 65 67 61 74 65 20 64 65 63 6c 61 72 61 74 69 legate declarati
6370: 6f 6e 2e 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d on.. /// </summ
6380: 61 72 79 3e 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 ary>. /// <para
6390: 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22 m name="context"
63a0: 3e 52 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 >Raw context poi
63b0: 6e 74 65 72 20 66 6f 72 20 74 68 65 20 75 73 65 nter for the use
63c0: 72 20 66 75 6e 63 74 69 6f 6e 3c 2f 70 61 72 61 r function</para
63d0: 6d 3e 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d m>.#if !PLATFORM
63e0: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 _COMPACTFRAMEWOR
63f0: 4b 0a 20 20 5b 55 6e 6d 61 6e 61 67 65 64 46 75 K. [UnmanagedFu
6400: 6e 63 74 69 6f 6e 50 6f 69 6e 74 65 72 28 43 61 nctionPointer(Ca
6410: 6c 6c 69 6e 67 43 6f 6e 76 65 6e 74 69 6f 6e 2e llingConvention.
6420: 43 64 65 63 6c 29 5d 0a 23 65 6e 64 69 66 0a 20 Cdecl)].#endif.
6430: 20 69 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 internal delega
6440: 74 65 20 76 6f 69 64 20 53 51 4c 69 74 65 46 69 te void SQLiteFi
6450: 6e 61 6c 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 nalCallback(IntP
6460: 74 72 20 63 6f 6e 74 65 78 74 29 3b 0a 20 20 2f tr context);. /
6470: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f // <summary>. /
6480: 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 63 61 6c 6c // Internal call
6490: 62 61 63 6b 20 64 65 6c 65 67 61 74 65 20 66 6f back delegate fo
64a0: 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 63 r implementing c
64b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 ollation sequenc
64c0: 65 73 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 es. /// </summa
64d0: 72 79 3e 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d ry>. /// <param
64e0: 20 6e 61 6d 65 3d 22 70 75 73 65 72 22 3e 4e 6f name="puser">No
64f0: 74 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e 0a 20 t used</param>.
6500: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 /// <param name
6510: 3d 22 6c 65 6e 31 22 3e 4c 65 6e 67 74 68 20 6f ="len1">Length o
6520: 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 76 31 f the string pv1
6530: 3c 2f 70 61 72 61 6d 3e 0a 20 20 2f 2f 2f 20 3c </param>. /// <
6540: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 76 31 22 param name="pv1"
6550: 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 >Pointer to the
6560: 66 69 72 73 74 20 73 74 72 69 6e 67 20 74 6f 20 first string to
6570: 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e 0a compare</param>.
6580: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d /// <param nam
6590: 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e 67 74 68 20 e="len2">Length
65a0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 76 of the string pv
65b0: 32 3c 2f 70 61 72 61 6d 3e 0a 20 20 2f 2f 2f 20 2</param>. ///
65c0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 76 32 <param name="pv2
65d0: 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 ">Pointer to the
65e0: 20 73 65 63 6f 6e 64 20 73 74 72 69 6e 67 20 74 second string t
65f0: 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d o compare</param
6600: 3e 0a 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 >. /// <returns
6610: 3e 52 65 74 75 72 6e 73 20 2d 31 20 69 66 20 74 >Returns -1 if t
6620: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 he first string
6630: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 is less than the
6640: 20 73 65 63 6f 6e 64 2e 20 20 30 20 69 66 20 74 second. 0 if t
6650: 68 65 79 20 61 72 65 20 65 71 75 61 6c 2c 20 6f hey are equal, o
6660: 72 20 31 20 69 66 20 74 68 65 20 66 69 72 73 74 r 1 if the first
6670: 20 73 74 72 69 6e 67 20 69 73 20 67 72 65 61 74 string is great
6680: 65 72 0a 20 20 2f 2f 2f 20 74 68 61 6e 20 74 68 er. /// than th
6690: 65 20 73 65 63 6f 6e 64 2e 3c 2f 72 65 74 75 72 e second.</retur
66a0: 6e 73 3e 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 ns>.#if !PLATFOR
66b0: 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f M_COMPACTFRAMEWO
66c0: 52 4b 0a 20 20 5b 55 6e 6d 61 6e 61 67 65 64 46 RK. [UnmanagedF
66d0: 75 6e 63 74 69 6f 6e 50 6f 69 6e 74 65 72 28 43 unctionPointer(C
66e0: 61 6c 6c 69 6e 67 43 6f 6e 76 65 6e 74 69 6f 6e allingConvention
66f0: 2e 43 64 65 63 6c 29 5d 0a 23 65 6e 64 69 66 0a .Cdecl)].#endif.
6700: 20 20 69 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 internal deleg
6710: 61 74 65 20 69 6e 74 20 53 51 4c 69 74 65 43 6f ate int SQLiteCo
6720: 6c 6c 61 74 69 6f 6e 28 49 6e 74 50 74 72 20 70 llation(IntPtr p
6730: 75 73 65 72 2c 20 69 6e 74 20 6c 65 6e 31 2c 20 user, int len1,
6740: 49 6e 74 50 74 72 20 70 76 31 2c 20 69 6e 74 20 IntPtr pv1, int
6750: 6c 65 6e 32 2c 20 49 6e 74 50 74 72 20 70 76 32 len2, IntPtr pv2
6760: 29 3b 0a 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 );.. /// <summa
6770: 72 79 3e 0a 20 20 2f 2f 2f 20 54 68 65 20 74 79 ry>. /// The ty
6780: 70 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 pe of collating
6790: 73 65 71 75 65 6e 63 65 0a 20 20 2f 2f 2f 20 3c sequence. /// <
67a0: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 70 75 62 6c /summary>. publ
67b0: 69 63 20 65 6e 75 6d 20 43 6f 6c 6c 61 74 69 6f ic enum Collatio
67c0: 6e 54 79 70 65 45 6e 75 6d 0a 20 20 7b 0a 20 20 nTypeEnum. {.
67d0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a /// <summary>.
67e0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 62 75 69 6c /// The buil
67f0: 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c t-in BINARY coll
6800: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 20 ating sequence.
6810: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
6820: 3e 0a 20 20 20 20 42 69 6e 61 72 79 20 3d 20 31 >. Binary = 1
6830: 2c 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 ,. /// <summa
6840: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 ry>. /// The
6850: 62 75 69 6c 74 2d 69 6e 20 4e 4f 43 41 53 45 20 built-in NOCASE
6860: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e collating sequen
6870: 63 65 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d ce. /// </sum
6880: 6d 61 72 79 3e 0a 20 20 20 20 4e 6f 43 61 73 65 mary>. NoCase
6890: 20 3d 20 32 2c 0a 20 20 20 20 2f 2f 2f 20 3c 73 = 2,. /// <s
68a0: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 ummary>. ///
68b0: 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 52 45 56 The built-in REV
68c0: 45 52 53 45 20 63 6f 6c 6c 61 74 69 6e 67 20 73 ERSE collating s
68d0: 65 71 75 65 6e 63 65 0a 20 20 20 20 2f 2f 2f 20 equence. ///
68e0: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 52 </summary>. R
68f0: 65 76 65 72 73 65 20 3d 20 33 2c 0a 20 20 20 20 everse = 3,.
6900: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 /// <summary>.
6910: 20 20 2f 2f 2f 20 41 20 63 75 73 74 6f 6d 20 75 /// A custom u
6920: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c ser-defined coll
6930: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 20 ating sequence.
6940: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
6950: 3e 0a 20 20 20 20 43 75 73 74 6f 6d 20 3d 20 30 >. Custom = 0
6960: 2c 0a 20 20 7d 0a 0a 20 20 2f 2f 2f 20 3c 73 75 ,. }.. /// <su
6970: 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 54 68 65 mmary>. /// The
6980: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 20 74 encoding type t
6990: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 he collation seq
69a0: 75 65 6e 63 65 20 75 73 65 73 0a 20 20 2f 2f 2f uence uses. ///
69b0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 70 75 </summary>. pu
69c0: 62 6c 69 63 20 65 6e 75 6d 20 43 6f 6c 6c 61 74 blic enum Collat
69d0: 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 0a ionEncodingEnum.
69e0: 20 20 7b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d {. /// <sum
69f0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 mary>. /// Th
6a00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 e collation sequ
6a10: 65 6e 63 65 20 69 73 20 55 54 46 38 0a 20 20 20 ence is UTF8.
6a20: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a /// </summary>.
6a30: 20 20 20 20 55 54 46 38 20 3d 20 31 2c 0a 20 20 UTF8 = 1,.
6a40: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a /// <summary>.
6a50: 20 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c /// The coll
6a60: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 ation sequence i
6a70: 73 20 55 54 46 31 36 20 6c 69 74 74 6c 65 2d 65 s UTF16 little-e
6a80: 6e 64 69 61 6e 0a 20 20 20 20 2f 2f 2f 20 3c 2f ndian. /// </
6a90: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 55 54 46 summary>. UTF
6aa0: 31 36 4c 45 20 3d 20 32 2c 0a 20 20 20 20 2f 2f 16LE = 2,. //
6ab0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 / <summary>.
6ac0: 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f /// The collatio
6ad0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 55 54 n sequence is UT
6ae0: 46 31 36 20 62 69 67 2d 65 6e 64 69 61 6e 0a 20 F16 big-endian.
6af0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 /// </summary
6b00: 3e 0a 20 20 20 20 55 54 46 31 36 42 45 20 3d 20 >. UTF16BE =
6b10: 33 2c 0a 20 20 7d 0a 0a 20 20 2f 2f 2f 20 3c 73 3,. }.. /// <s
6b20: 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 41 20 ummary>. /// A
6b30: 73 74 72 75 63 74 20 64 65 73 63 72 69 62 69 6e struct describin
6b40: 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 g the collating
6b50: 73 65 71 75 65 6e 63 65 20 61 20 66 75 6e 63 74 sequence a funct
6b60: 69 6f 6e 20 69 73 20 65 78 65 63 75 74 69 6e 67 ion is executing
6b70: 20 69 6e 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d in. /// </summ
6b80: 61 72 79 3e 0a 20 20 70 75 62 6c 69 63 20 73 74 ary>. public st
6b90: 72 75 63 74 20 43 6f 6c 6c 61 74 69 6f 6e 53 65 ruct CollationSe
6ba0: 71 75 65 6e 63 65 0a 20 20 7b 0a 20 20 20 20 2f quence. {. /
6bb0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 // <summary>.
6bc0: 20 2f 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 /// The name of
6bd0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 the collating s
6be0: 65 71 75 65 6e 63 65 0a 20 20 20 20 2f 2f 2f 20 equence. ///
6bf0: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 </summary>. p
6c00: 75 62 6c 69 63 20 73 74 72 69 6e 67 20 4e 61 6d ublic string Nam
6c10: 65 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d e;. /// <summ
6c20: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 65 ary>. /// The
6c30: 20 74 79 70 65 20 6f 66 20 63 6f 6c 6c 61 74 69 type of collati
6c40: 6e 67 20 73 65 71 75 65 6e 63 65 0a 20 20 20 20 ng sequence.
6c50: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 /// </summary>.
6c60: 20 20 20 70 75 62 6c 69 63 20 43 6f 6c 6c 61 74 public Collat
6c70: 69 6f 6e 54 79 70 65 45 6e 75 6d 20 54 79 70 65 ionTypeEnum Type
6c80: 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d ;.. /// <summ
6c90: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 65 ary>. /// The
6ca0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f text encoding o
6cb0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 f the collation
6cc0: 73 65 71 75 65 6e 63 65 0a 20 20 20 20 2f 2f 2f sequence. ///
6cd0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 </summary>.
6ce0: 70 75 62 6c 69 63 20 43 6f 6c 6c 61 74 69 6f 6e public Collation
6cf0: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 20 45 6e 63 EncodingEnum Enc
6d00: 6f 64 69 6e 67 3b 0a 0a 20 20 20 20 2f 2f 2f 20 oding;.. ///
6d10: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f <summary>. //
6d20: 2f 20 43 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 / Context of the
6d30: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 function that r
6d40: 65 71 75 65 73 74 65 64 20 74 68 65 20 63 6f 6c equested the col
6d50: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a lating sequence.
6d60: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 /// </summar
6d70: 79 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 y>. internal
6d80: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 5f SQLiteFunction _
6d90: 66 75 6e 63 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c func;.. /// <
6da0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f summary>. ///
6db0: 20 43 61 6c 6c 73 20 74 68 65 20 62 61 73 65 20 Calls the base
6dc0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e collating sequen
6dd0: 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 ce to compare tw
6de0: 6f 20 73 74 72 69 6e 67 73 0a 20 20 20 20 2f 2f o strings. //
6df0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 / </summary>.
6e00: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 /// <param name
6e10: 3d 22 73 31 22 3e 54 68 65 20 66 69 72 73 74 20 ="s1">The first
6e20: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 string to compar
6e30: 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f e</param>. //
6e40: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 / <param name="s
6e50: 32 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 73 74 2">The second st
6e60: 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c ring to compare<
6e70: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 /param>. ///
6e80: 3c 72 65 74 75 72 6e 73 3e 2d 31 20 69 66 20 73 <returns>-1 if s
6e90: 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 73 1 is less than s
6ea0: 32 2c 20 30 20 69 66 20 73 31 20 69 73 20 65 71 2, 0 if s1 is eq
6eb0: 75 61 6c 20 74 6f 20 73 32 2c 20 61 6e 64 20 31 ual to s2, and 1
6ec0: 20 69 66 20 73 31 20 69 73 20 67 72 65 61 74 65 if s1 is greate
6ed0: 72 20 74 68 61 6e 20 73 32 3c 2f 72 65 74 75 72 r than s2</retur
6ee0: 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 69 ns>. public i
6ef0: 6e 74 20 43 6f 6d 70 61 72 65 28 73 74 72 69 6e nt Compare(strin
6f00: 67 20 73 31 2c 20 73 74 72 69 6e 67 20 73 32 29 g s1, string s2)
6f10: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 . {. ret
6f20: 75 72 6e 20 5f 66 75 6e 63 2e 5f 62 61 73 65 2e urn _func._base.
6f30: 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65 43 6f ContextCollateCo
6f40: 6d 70 61 72 65 28 45 6e 63 6f 64 69 6e 67 2c 20 mpare(Encoding,
6f50: 5f 66 75 6e 63 2e 5f 63 6f 6e 74 65 78 74 2c 20 _func._context,
6f60: 73 31 2c 20 73 32 29 3b 0a 20 20 20 20 7d 0a 0a s1, s2);. }..
6f70: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 /// <summary
6f80: 3e 0a 20 20 20 20 2f 2f 2f 20 43 61 6c 6c 73 20 >. /// Calls
6f90: 74 68 65 20 62 61 73 65 20 63 6f 6c 6c 61 74 69 the base collati
6fa0: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 63 ng sequence to c
6fb0: 6f 6d 70 61 72 65 20 74 77 6f 20 63 68 61 72 61 ompare two chara
6fc0: 63 74 65 72 20 61 72 72 61 79 73 0a 20 20 20 20 cter arrays.
6fd0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 /// </summary>.
6fe0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 /// <param na
6ff0: 6d 65 3d 22 63 31 22 3e 54 68 65 20 66 69 72 73 me="c1">The firs
7000: 74 20 61 72 72 61 79 20 74 6f 20 63 6f 6d 70 61 t array to compa
7010: 72 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f re</param>. /
7020: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 // <param name="
7030: 63 32 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 61 c2">The second a
7040: 72 72 61 79 20 74 6f 20 63 6f 6d 70 61 72 65 3c rray to compare<
7050: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 /param>. ///
7060: 3c 72 65 74 75 72 6e 73 3e 2d 31 20 69 66 20 63 <returns>-1 if c
7070: 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 63 1 is less than c
7080: 32 2c 20 30 20 69 66 20 63 31 20 69 73 20 65 71 2, 0 if c1 is eq
7090: 75 61 6c 20 74 6f 20 63 32 2c 20 61 6e 64 20 31 ual to c2, and 1
70a0: 20 69 66 20 63 31 20 69 73 20 67 72 65 61 74 65 if c1 is greate
70b0: 72 20 74 68 61 6e 20 63 32 3c 2f 72 65 74 75 72 r than c2</retur
70c0: 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 69 ns>. public i
70d0: 6e 74 20 43 6f 6d 70 61 72 65 28 63 68 61 72 5b nt Compare(char[
70e0: 5d 20 63 31 2c 20 63 68 61 72 5b 5d 20 63 32 29 ] c1, char[] c2)
70f0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 . {. ret
7100: 75 72 6e 20 5f 66 75 6e 63 2e 5f 62 61 73 65 2e urn _func._base.
7110: 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65 43 6f ContextCollateCo
7120: 6d 70 61 72 65 28 45 6e 63 6f 64 69 6e 67 2c 20 mpare(Encoding,
7130: 5f 66 75 6e 63 2e 5f 63 6f 6e 74 65 78 74 2c 20 _func._context,
7140: 63 31 2c 20 63 32 29 3b 0a 20 20 20 20 7d 0a 20 c1, c2);. }.
7150: 20 7d 0a 7d 0a }.}.