System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f0db7e87d86c4a81d1ca7a023ea0b97e1f206dc3:


0000: 2f 2a 2a 2a 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 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 0d 0a 20  soft.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 0d 0a 20 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: 2a 2f 0d 0a 0d 0a 6e 61 6d 65 73 70 61 63 65 20  */....namespace 
0130: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
0140: 74 65 0d 0a 7b 0d 0a 20 20 75 73 69 6e 67 20 53  te..{..  using S
0150: 79 73 74 65 6d 3b 0d 0a 20 20 75 73 69 6e 67 20  ystem;..  using 
0160: 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69 6f  System.Collectio
0170: 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 20 20 75  ns.Generic;..  u
0180: 73 69 6e 67 20 53 79 73 74 65 6d 2e 52 75 6e 74  sing System.Runt
0190: 69 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72 76 69  ime.InteropServi
01a0: 63 65 73 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79  ces;..  using Sy
01b0: 73 74 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69  stem.Globalizati
01c0: 6f 6e 3b 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75  on;....  /// <su
01d0: 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54 68  mmary>..  /// Th
01e0: 69 73 20 61 62 73 74 72 61 63 74 20 63 6c 61 73  is abstract clas
01f0: 73 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  s is designed to
0200: 20 68 61 6e 64 6c 65 20 75 73 65 72 2d 64 65 66   handle user-def
0210: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 65  ined functions e
0220: 61 73 69 6c 79 2e 20 20 41 6e 20 69 6e 73 74 61  asily.  An insta
0230: 6e 63 65 20 6f 66 20 74 68 65 20 64 65 72 69 76  nce of the deriv
0240: 65 64 20 63 6c 61 73 73 20 69 73 20 6d 61 64 65  ed class is made
0250: 20 66 6f 72 20 65 61 63 68 0d 0a 20 20 2f 2f 2f   for each..  ///
0260: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
0270: 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  he database...  
0280: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
0290: 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d    /// <remarks>.
02a0: 0a 20 20 2f 2f 2f 20 41 6c 74 68 6f 75 67 68 20  .  /// Although 
02b0: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  there is one ins
02c0: 74 61 6e 63 65 20 6f 66 20 61 20 63 6c 61 73 73  tance of a class
02d0: 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 53 51   derived from SQ
02e0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 70 65 72  LiteFunction per
02f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
0300: 74 69 6f 6e 2c 20 74 68 65 20 64 65 72 69 76 65  tion, the derive
0310: 64 20 63 6c 61 73 73 20 68 61 73 20 6e 6f 20 61  d class has no a
0320: 63 63 65 73 73 0d 0a 20 20 2f 2f 2f 20 74 6f 20  ccess..  /// to 
0330: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
0340: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
0350: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
0360: 20 64 65 74 65 72 20 69 6d 70 6c 65 6d 65 6e 74   deter implement
0370: 65 72 73 20 66 72 6f 6d 20 74 68 69 6e 6b 69 6e  ers from thinkin
0380: 67 20 69 74 20 77 6f 75 6c 64 20 62 65 20 61 20  g it would be a 
0390: 67 6f 6f 64 20 69 64 65 61 20 74 6f 20 6d 61 6b  good idea to mak
03a0: 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 2f 2f  e database..  //
03b0: 2f 20 63 61 6c 6c 73 20 64 75 72 69 6e 67 20 70  / calls during p
03c0: 72 6f 63 65 73 73 69 6e 67 2e 0d 0a 20 20 2f 2f  rocessing...  //
03d0: 2f 0d 0a 20 20 2f 2f 2f 20 49 74 20 69 73 20 69  /..  /// It is i
03e0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 64 69 73 74  mportant to dist
03f0: 69 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20  inguish between 
0400: 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e  a per-connection
0410: 20 69 6e 73 74 61 6e 63 65 2c 20 61 6e 64 20 61   instance, and a
0420: 20 70 65 72 2d 53 51 4c 20 73 74 61 74 65 6d 65   per-SQL stateme
0430: 6e 74 20 63 6f 6e 74 65 78 74 2e 20 20 4f 6e 65  nt context.  One
0440: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
0450: 73 20 63 6c 61 73 73 0d 0a 20 20 2f 2f 2f 20 73  s class..  /// s
0460: 65 72 76 69 63 65 73 20 61 6c 6c 20 53 51 4c 20  ervices all SQL 
0470: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 69 6e 67  statements being
0480: 20 73 74 65 70 70 65 64 20 74 68 72 6f 75 67 68   stepped through
0490: 20 6f 6e 20 74 68 61 74 20 63 6f 6e 6e 65 63 74   on that connect
04a0: 69 6f 6e 2c 20 61 6e 64 20 74 68 65 72 65 20 63  ion, and there c
04b0: 61 6e 20 62 65 20 6d 61 6e 79 2e 20 20 4f 6e 65  an be many.  One
04c0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 73 74   should never st
04d0: 6f 72 65 20 70 65 72 2d 73 74 61 74 65 6d 65 6e  ore per-statemen
04e0: 74 0d 0a 20 20 2f 2f 2f 20 69 6e 66 6f 72 6d 61  t..  /// informa
04f0: 74 69 6f 6e 20 69 6e 20 6d 65 6d 62 65 72 20 76  tion in member v
0500: 61 72 69 61 62 6c 65 73 20 6f 66 20 75 73 65 72  ariables of user
0510: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
0520: 6e 20 63 6c 61 73 73 65 73 2e 0d 0a 20 20 2f 2f  n classes...  //
0530: 2f 0d 0a 20 20 2f 2f 2f 20 46 6f 72 20 61 67 67  /..  /// For agg
0540: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
0550: 2c 20 61 6c 77 61 79 73 20 63 72 65 61 74 65 20  , always create 
0560: 61 6e 64 20 73 74 6f 72 65 20 79 6f 75 72 20 70  and store your p
0570: 65 72 2d 73 74 61 74 65 6d 65 6e 74 20 64 61 74  er-statement dat
0580: 61 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  a in the context
0590: 44 61 74 61 20 6f 62 6a 65 63 74 20 6f 6e 20 74  Data object on t
05a0: 68 65 20 31 73 74 20 73 74 65 70 2e 20 20 54 68  he 1st step.  Th
05b0: 69 73 20 64 61 74 61 20 77 69 6c 6c 0d 0a 20 20  is data will..  
05c0: 2f 2f 2f 20 62 65 20 61 75 74 6f 6d 61 74 69 63  /// be automatic
05d0: 61 6c 6c 79 20 66 72 65 65 64 20 66 6f 72 20 79  ally freed for y
05e0: 6f 75 20 28 61 6e 64 20 44 69 73 70 6f 73 65 28  ou (and Dispose(
05f0: 29 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20  ) called if the 
0600: 69 74 65 6d 20 73 75 70 70 6f 72 74 73 20 49 44  item supports ID
0610: 69 73 70 6f 73 61 62 6c 65 29 20 77 68 65 6e 20  isposable) when 
0620: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  the statement co
0630: 6d 70 6c 65 74 65 73 2e 0d 0a 20 20 2f 2f 2f 20  mpletes...  /// 
0640: 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 70 75  </remarks>..  pu
0650: 62 6c 69 63 20 61 62 73 74 72 61 63 74 20 63 6c  blic abstract cl
0660: 61 73 73 20 53 51 4c 69 74 65 46 75 6e 63 74 69  ass SQLiteFuncti
0670: 6f 6e 20 3a 20 49 44 69 73 70 6f 73 61 62 6c 65  on : IDisposable
0680: 0d 0a 20 20 7b 0d 0a 20 20 20 20 70 72 69 76 61  ..  {..    priva
0690: 74 65 20 63 6c 61 73 73 20 41 67 67 72 65 67 61  te class Aggrega
06a0: 74 65 44 61 74 61 0d 0a 20 20 20 20 7b 0d 0a 20  teData..    {.. 
06b0: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e       internal in
06c0: 74 20 5f 63 6f 75 6e 74 20 3d 20 31 3b 0d 0a 20  t _count = 1;.. 
06d0: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 62       internal ob
06e0: 6a 65 63 74 20 5f 64 61 74 61 3b 0d 0a 20 20 20  ject _data;..   
06f0: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f   }....    //////
0700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0740: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69  ///....    #regi
0750: 6f 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73 74  on Private Const
0760: 61 6e 74 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  ants..    /// <s
0770: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
0780: 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   The error code 
0790: 75 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67  used for logging
07a0: 20 65 78 63 65 70 74 69 6f 6e 73 20 63 61 75 67   exceptions caug
07b0: 68 74 20 69 6e 20 75 73 65 72 2d 70 72 6f 76 69  ht in user-provi
07c0: 64 65 64 0d 0a 20 20 20 20 2f 2f 2f 20 63 6f 64  ded..    /// cod
07d0: 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  e...    /// </su
07e0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 72 69 76  mmary>..    priv
07f0: 61 74 65 20 63 6f 6e 73 74 20 69 6e 74 20 43 4f  ate const int CO
0800: 52 5f 45 5f 45 58 43 45 50 54 49 4f 4e 20 3d 20  R_E_EXCEPTION = 
0810: 75 6e 63 68 65 63 6b 65 64 28 28 69 6e 74 29 30  unchecked((int)0
0820: 78 38 30 31 33 31 35 30 30 29 3b 0d 0a 20 20 20  x80131500);..   
0830: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
0840: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
0850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
0890: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
08a0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62  >..    /// The b
08b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
08c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
08d0: 61 74 74 61 63 68 65 64 20 74 6f 0d 0a 20 20 20  attached to..   
08e0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
08f0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 51  .    internal SQ
0900: 4c 69 74 65 42 61 73 65 20 20 20 20 20 20 20 20  LiteBase        
0910: 20 20 20 20 20 20 5f 62 61 73 65 3b 0d 0a 0d 0a        _base;....
0920: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
0930: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72  >..    /// Inter
0940: 6e 61 6c 20 61 72 72 61 79 20 75 73 65 64 20 74  nal array used t
0950: 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  o keep track of 
0960: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
0970: 6f 6e 20 63 6f 6e 74 65 78 74 20 64 61 74 61 0d  on context data.
0980: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
0990: 72 79 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ry>..    private
09a0: 20 44 69 63 74 69 6f 6e 61 72 79 3c 49 6e 74 50   Dictionary<IntP
09b0: 74 72 2c 20 41 67 67 72 65 67 61 74 65 44 61 74  tr, AggregateDat
09c0: 61 3e 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c  a> _contextDataL
09d0: 69 73 74 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20  ist;....    /// 
09e0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
09f0: 2f 2f 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  // The connectio
0a00: 6e 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  n flags associat
0a10: 65 64 20 77 69 74 68 20 74 68 69 73 20 6f 62 6a  ed with this obj
0a20: 65 63 74 20 28 74 68 69 73 20 73 68 6f 75 6c 64  ect (this should
0a30: 20 62 65 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f   be the..    ///
0a40: 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74   same value as t
0a50: 68 65 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  he flags associa
0a60: 74 65 64 20 77 69 74 68 20 74 68 65 20 70 61 72  ted with the par
0a70: 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  ent connection o
0a80: 62 6a 65 63 74 29 2e 0d 0a 20 20 20 20 2f 2f 2f  bject)...    ///
0a90: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
0aa0: 20 70 72 69 76 61 74 65 20 53 51 4c 69 74 65 43   private SQLiteC
0ab0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 5f  onnectionFlags _
0ac0: 66 6c 61 67 73 3b 0d 0a 0d 0a 20 20 20 20 2f 2f  flags;....    //
0ad0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
0ae0: 20 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65 66   /// Holds a ref
0af0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 61  erence to the ca
0b00: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
0b10: 66 6f 72 20 75 73 65 72 20 66 75 6e 63 74 69 6f  for user functio
0b20: 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ns..    /// </su
0b30: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 72 69 76  mmary>..    priv
0b40: 61 74 65 20 53 51 4c 69 74 65 43 61 6c 6c 62 61  ate SQLiteCallba
0b50: 63 6b 20 20 5f 49 6e 76 6f 6b 65 46 75 6e 63 3b  ck  _InvokeFunc;
0b60: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
0b70: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 6f 6c  ry>..    /// Hol
0b80: 64 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ds a reference t
0b90: 6f 20 74 68 65 20 63 61 6c 6c 62 61 6b 63 20 66  o the callbakc f
0ba0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 74 65 70  unction for step
0bb0: 70 69 6e 67 20 69 6e 20 61 6e 20 61 67 67 72 65  ping in an aggre
0bc0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0d 0a 20  gate function.. 
0bd0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
0be0: 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 53  >..    private S
0bf0: 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 20 5f  QLiteCallback  _
0c00: 53 74 65 70 46 75 6e 63 3b 0d 0a 20 20 20 20 2f  StepFunc;..    /
0c10: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
0c20: 20 20 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65    /// Holds a re
0c30: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
0c40: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
0c50: 20 66 6f 72 20 66 69 6e 61 6c 69 7a 69 6e 67 20   for finalizing 
0c60: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
0c70: 63 74 69 6f 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ction..    /// <
0c80: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70  /summary>..    p
0c90: 72 69 76 61 74 65 20 53 51 4c 69 74 65 46 69 6e  rivate SQLiteFin
0ca0: 61 6c 43 61 6c 6c 62 61 63 6b 20 20 5f 46 69 6e  alCallback  _Fin
0cb0: 61 6c 46 75 6e 63 3b 0d 0a 20 20 20 20 2f 2f 2f  alFunc;..    ///
0cc0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0cd0: 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65 66 65  /// Holds a refe
0ce0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 61 6c  rence to the cal
0cf0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66  lback function f
0d00: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
0d10: 75 65 6e 63 65 73 0d 0a 20 20 20 20 2f 2f 2f 20  uences..    /// 
0d20: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
0d30: 70 72 69 76 61 74 65 20 53 51 4c 69 74 65 43 6f  private SQLiteCo
0d40: 6c 6c 61 74 69 6f 6e 20 5f 43 6f 6d 70 61 72 65  llation _Compare
0d50: 46 75 6e 63 3b 0d 0a 0d 0a 20 20 20 20 70 72 69  Func;....    pri
0d60: 76 61 74 65 20 53 51 4c 69 74 65 43 6f 6c 6c 61  vate SQLiteColla
0d70: 74 69 6f 6e 20 5f 43 6f 6d 70 61 72 65 46 75 6e  tion _CompareFun
0d80: 63 31 36 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20  c16;....    /// 
0d90: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
0da0: 2f 2f 20 43 75 72 72 65 6e 74 20 63 6f 6e 74 65  // Current conte
0db0: 78 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  xt of the curren
0dc0: 74 20 63 61 6c 6c 62 61 63 6b 2e 20 20 4f 6e 6c  t callback.  Onl
0dd0: 79 20 76 61 6c 69 64 20 64 75 72 69 6e 67 20 61  y valid during a
0de0: 20 63 61 6c 6c 62 61 63 6b 0d 0a 20 20 20 20 2f   callback..    /
0df0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
0e00: 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e 74 50     internal IntP
0e10: 74 72 20 5f 63 6f 6e 74 65 78 74 3b 0d 0a 0d 0a  tr _context;....
0e20: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
0e30: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20  >..    /// This 
0e40: 73 74 61 74 69 63 20 6c 69 73 74 20 63 6f 6e 74  static list cont
0e50: 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 75 73 65  ains all the use
0e60: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
0e70: 6f 6e 73 20 64 65 63 6c 61 72 65 64 20 75 73 69  ons declared usi
0e80: 6e 67 20 74 68 65 20 70 72 6f 70 65 72 20 61 74  ng the proper at
0e90: 74 72 69 62 75 74 65 73 2e 0d 0a 20 20 20 20 2f  tributes...    /
0ea0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
0eb0: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
0ec0: 63 20 4c 69 73 74 3c 53 51 4c 69 74 65 46 75 6e  c List<SQLiteFun
0ed0: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 3e 20  ctionAttribute> 
0ee0: 5f 72 65 67 69 73 74 65 72 65 64 46 75 6e 63 74  _registeredFunct
0ef0: 69 6f 6e 73 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f  ions;....    ///
0f00: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0f10: 2f 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 63 6f 6e  /// Internal con
0f20: 73 74 72 75 63 74 6f 72 2c 20 69 6e 69 74 69 61  structor, initia
0f30: 6c 69 7a 65 73 20 74 68 65 20 66 75 6e 63 74 69  lizes the functi
0f40: 6f 6e 27 73 20 69 6e 74 65 72 6e 61 6c 20 76 61  on's internal va
0f50: 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 2f 2f  riables...    //
0f60: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
0f70: 20 20 70 72 6f 74 65 63 74 65 64 20 53 51 4c 69    protected SQLi
0f80: 74 65 46 75 6e 63 74 69 6f 6e 28 29 0d 0a 20 20  teFunction()..  
0f90: 20 20 7b 0d 0a 20 20 20 20 20 20 5f 63 6f 6e 74    {..      _cont
0fa0: 65 78 74 44 61 74 61 4c 69 73 74 20 3d 20 6e 65  extDataList = ne
0fb0: 77 20 44 69 63 74 69 6f 6e 61 72 79 3c 49 6e 74  w Dictionary<Int
0fc0: 50 74 72 2c 20 41 67 67 72 65 67 61 74 65 44 61  Ptr, AggregateDa
0fd0: 74 61 3e 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  ta>();..    }...
0fe0: 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .    ///////////
0ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1040: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67  ////....    #reg
1050: 69 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20  ion IDisposable 
1060: 4d 65 6d 62 65 72 73 0d 0a 20 20 20 20 2f 2f 2f  Members..    ///
1070: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
1080: 2f 2f 2f 20 44 69 73 70 6f 73 65 73 20 6f 66 20  /// Disposes of 
1090: 61 6e 79 20 61 63 74 69 76 65 20 63 6f 6e 74 65  any active conte
10a0: 78 74 44 61 74 61 20 76 61 72 69 61 62 6c 65 73  xtData variables
10b0: 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 61   that were not a
10c0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 65  utomatically cle
10d0: 61 6e 65 64 20 75 70 2e 20 20 53 6f 6d 65 74 69  aned up.  Someti
10e0: 6d 65 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  mes this can hap
10f0: 70 65 6e 20 69 66 0d 0a 20 20 20 20 2f 2f 2f 20  pen if..    /// 
1100: 73 6f 6d 65 6f 6e 65 20 63 6c 6f 73 65 73 20 74  someone closes t
1110: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68  he connection wh
1120: 69 6c 65 20 61 20 44 61 74 61 52 65 61 64 65 72  ile a DataReader
1130: 20 69 73 20 6f 70 65 6e 2e 0d 0a 20 20 20 20 2f   is open...    /
1140: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
1150: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 44     public void D
1160: 69 73 70 6f 73 65 28 29 0d 0a 20 20 20 20 7b 0d  ispose()..    {.
1170: 0a 20 20 20 20 20 20 20 20 44 69 73 70 6f 73 65  .        Dispose
1180: 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20  (true);..       
1190: 20 47 43 2e 53 75 70 70 72 65 73 73 46 69 6e 61   GC.SuppressFina
11a0: 6c 69 7a 65 28 74 68 69 73 29 3b 0d 0a 20 20 20  lize(this);..   
11b0: 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 67 69   }..    #endregi
11c0: 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f  on....    //////
11d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1230: 20 23 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73   #region IDispos
1240: 61 62 6c 65 20 22 50 61 74 74 65 72 6e 22 20 4d  able "Pattern" M
1250: 65 6d 62 65 72 73 0d 0a 20 20 20 20 70 72 69 76  embers..    priv
1260: 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65  ate bool dispose
1270: 64 3b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  d;..    private 
1280: 76 6f 69 64 20 43 68 65 63 6b 44 69 73 70 6f 73  void CheckDispos
1290: 65 64 28 29 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  ed() /* throw */
12a0: 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 54 48 52  ..    {..#if THR
12b0: 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 0d 0a  OW_ON_DISPOSED..
12c0: 20 20 20 20 20 20 20 20 69 66 20 28 64 69 73 70          if (disp
12d0: 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  osed)..         
12e0: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4f 62 6a     throw new Obj
12f0: 65 63 74 44 69 73 70 6f 73 65 64 45 78 63 65 70  ectDisposedExcep
1300: 74 69 6f 6e 28 74 79 70 65 6f 66 28 53 51 4c 69  tion(typeof(SQLi
1310: 74 65 46 75 6e 63 74 69 6f 6e 29 2e 4e 61 6d 65  teFunction).Name
1320: 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20  );..#endif..    
1330: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  }....    ///////
1340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1370: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1390: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
13a0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
13b0: 20 20 20 2f 2f 2f 20 50 6c 61 63 65 68 6f 6c 64     /// Placehold
13c0: 65 72 20 66 6f 72 20 61 20 75 73 65 72 2d 64 65  er for a user-de
13d0: 66 69 6e 65 64 20 64 69 73 70 6f 73 61 6c 20 72  fined disposal r
13e0: 6f 75 74 69 6e 65 0d 0a 20 20 20 20 2f 2f 2f 20  outine..    /// 
13f0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
1400: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1410: 22 64 69 73 70 6f 73 69 6e 67 22 3e 54 72 75 65  "disposing">True
1420: 20 69 66 20 74 68 65 20 6f 62 6a 65 63 74 20 69   if the object i
1430: 73 20 62 65 69 6e 67 20 64 69 73 70 6f 73 65 64  s being disposed
1440: 20 65 78 70 6c 69 63 69 74 6c 79 3c 2f 70 61 72   explicitly</par
1450: 61 6d 3e 0d 0a 20 20 20 20 70 72 6f 74 65 63 74  am>..    protect
1460: 65 64 20 76 69 72 74 75 61 6c 20 76 6f 69 64 20  ed virtual void 
1470: 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20 64 69 73  Dispose(bool dis
1480: 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a  posing)..    {..
1490: 20 20 20 20 20 20 20 20 69 66 20 28 21 64 69 73          if (!dis
14a0: 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20  posed)..        
14b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
14c0: 66 20 28 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20  f (disposing).. 
14d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
14f0: 2f 2f 2f 2f 2f 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 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1520: 20 20 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d      // dispose m
1530: 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65 73  anaged resources
1540: 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20   here.....      
1550: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 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 0d 0a  //////////////..
1580: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1590: 20 20 49 44 69 73 70 6f 73 61 62 6c 65 20 64 69    IDisposable di
15a0: 73 70 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  sp;....         
15b0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
15c0: 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 49 6e 74  KeyValuePair<Int
15d0: 50 74 72 2c 20 41 67 67 72 65 67 61 74 65 44 61  Ptr, AggregateDa
15e0: 74 61 3e 20 6b 76 20 69 6e 20 5f 63 6f 6e 74 65  ta> kv in _conte
15f0: 78 74 44 61 74 61 4c 69 73 74 29 0d 0a 20 20 20  xtDataList)..   
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 64 69 73 70 20 3d 20 6b 76 2e 56 61      disp = kv.Va
1630: 6c 75 65 2e 5f 64 61 74 61 20 61 73 20 49 44 69  lue._data as IDi
1640: 73 70 6f 73 61 62 6c 65 3b 0d 0a 20 20 20 20 20  sposable;..     
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1660: 66 20 28 64 69 73 70 20 21 3d 20 6e 75 6c 6c 29  f (disp != null)
1670: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1680: 20 20 20 20 20 20 20 20 20 20 64 69 73 70 2e 44            disp.D
1690: 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20  ispose();..     
16a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63                _c
16c0: 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 2e 43  ontextDataList.C
16d0: 6c 65 61 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  lear();..       
16e0: 20 20 20 20 20 20 20 20 20 5f 63 6f 6e 74 65 78           _contex
16f0: 74 44 61 74 61 4c 69 73 74 20 3d 20 6e 75 6c 6c  tDataList = null
1700: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1710: 20 20 20 20 20 5f 66 6c 61 67 73 20 3d 20 53 51       _flags = SQ
1720: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
1730: 61 67 73 2e 4e 6f 6e 65 3b 0d 0a 0d 0a 20 20 20  ags.None;....   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 49 6e               _In
1750: 76 6f 6b 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b  vokeFunc = null;
1760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1770: 20 20 5f 53 74 65 70 46 75 6e 63 20 3d 20 6e 75    _StepFunc = nu
1780: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
1790: 20 20 20 20 20 5f 46 69 6e 61 6c 46 75 6e 63 20       _FinalFunc 
17a0: 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20  = null;..       
17b0: 20 20 20 20 20 20 20 20 20 5f 43 6f 6d 70 61 72           _Compar
17c0: 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b 0d 0a 20  eFunc = null;.. 
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
17e0: 62 61 73 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  base = null;..  
17f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1800: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
1810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1830: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
1840: 2f 20 72 65 6c 65 61 73 65 20 75 6e 6d 61 6e 61  / release unmana
1850: 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68 65  ged resources he
1860: 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20  re.....         
1870: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
18a0: 20 20 20 20 20 20 20 20 20 64 69 73 70 6f 73 65           dispose
18b0: 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  d = true;..     
18c0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20     }..    }..   
18d0: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
18e0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
18f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1940: 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f  //....    #regio
1950: 6e 20 44 65 73 74 72 75 63 74 6f 72 0d 0a 20 20  n Destructor..  
1960: 20 20 7e 53 51 4c 69 74 65 46 75 6e 63 74 69 6f    ~SQLiteFunctio
1970: 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  n()..    {..    
1980: 20 20 20 20 44 69 73 70 6f 73 65 28 66 61 6c 73      Dispose(fals
1990: 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  e);..    }..    
19a0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
19b0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
19c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a10: 2f 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  /....    /// <su
1a20: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1a30: 52 65 74 75 72 6e 73 20 61 20 72 65 66 65 72 65  Returns a refere
1a40: 6e 63 65 20 74 6f 20 74 68 65 20 75 6e 64 65 72  nce to the under
1a50: 6c 79 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  lying connection
1a60: 27 73 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  's SQLiteConvert
1a70: 20 63 6c 61 73 73 2c 20 77 68 69 63 68 20 63 61   class, which ca
1a80: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6e  n be used to con
1a90: 76 65 72 74 0d 0a 20 20 20 20 2f 2f 2f 20 73 74  vert..    /// st
1aa0: 72 69 6e 67 73 20 61 6e 64 20 44 61 74 65 54 69  rings and DateTi
1ab0: 6d 65 27 73 20 69 6e 74 6f 20 74 68 65 20 63 75  me's into the cu
1ac0: 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
1ad0: 27 73 20 65 6e 63 6f 64 69 6e 67 20 73 63 68 65  's encoding sche
1ae0: 6d 61 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ma...    /// </s
1af0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 75 62  ummary>..    pub
1b00: 6c 69 63 20 53 51 4c 69 74 65 43 6f 6e 76 65 72  lic SQLiteConver
1b10: 74 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 0d  t SQLiteConvert.
1b20: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 67 65  .    {..      ge
1b30: 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  t..      {..    
1b40: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
1b50: 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65  d();..        re
1b60: 74 75 72 6e 20 5f 62 61 73 65 3b 0d 0a 20 20 20  turn _base;..   
1b70: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
1b80: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1b90: 0d 0a 20 20 20 20 2f 2f 2f 20 53 63 61 6c 61 72  ..    /// Scalar
1ba0: 20 66 75 6e 63 74 69 6f 6e 73 20 6f 76 65 72 72   functions overr
1bb0: 69 64 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  ide this method 
1bc0: 74 6f 20 64 6f 20 74 68 65 69 72 20 6d 61 67 69  to do their magi
1bd0: 63 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  c...    /// </su
1be0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1bf0: 3c 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f  <remarks>..    /
1c00: 2f 2f 20 50 61 72 61 6d 65 74 65 72 73 20 70 61  // Parameters pa
1c10: 73 73 65 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ssed to function
1c20: 73 20 68 61 76 65 20 6f 6e 6c 79 20 61 6e 20 61  s have only an a
1c30: 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20 63 65  ffinity for a ce
1c40: 72 74 61 69 6e 20 64 61 74 61 20 74 79 70 65 2c  rtain data type,
1c50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 75 6e 64   there is no und
1c60: 65 72 6c 79 69 6e 67 20 73 63 68 65 6d 61 20 61  erlying schema a
1c70: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 2f 2f  vailable..    //
1c80: 2f 20 74 6f 20 66 6f 72 63 65 20 74 68 65 6d 20  / to force them 
1c90: 69 6e 74 6f 20 61 20 63 65 72 74 61 69 6e 20 74  into a certain t
1ca0: 79 70 65 2e 20 20 54 68 65 72 65 66 6f 72 65 20  ype.  Therefore 
1cb0: 74 68 65 20 6f 6e 6c 79 20 74 79 70 65 73 20 79  the only types y
1cc0: 6f 75 20 77 69 6c 6c 20 65 76 65 72 20 73 65 65  ou will ever see
1cd0: 20 61 73 20 70 61 72 61 6d 65 74 65 72 73 20 61   as parameters a
1ce0: 72 65 0d 0a 20 20 20 20 2f 2f 2f 20 44 42 4e 75  re..    /// DBNu
1cf0: 6c 6c 2e 56 61 6c 75 65 2c 20 49 6e 74 36 34 2c  ll.Value, Int64,
1d00: 20 44 6f 75 62 6c 65 2c 20 53 74 72 69 6e 67 20   Double, String 
1d10: 6f 72 20 62 79 74 65 5b 5d 20 61 72 72 61 79 2e  or byte[] array.
1d20: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61  ..    /// </rema
1d30: 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  rks>..    /// <p
1d40: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22  aram name="args"
1d50: 3e 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66  >The arguments f
1d60: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74  or the command t
1d70: 6f 20 70 72 6f 63 65 73 73 3c 2f 70 61 72 61 6d  o process</param
1d80: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
1d90: 72 6e 73 3e 59 6f 75 20 6d 61 79 20 72 65 74 75  rns>You may retu
1da0: 72 6e 20 6d 6f 73 74 20 73 69 6d 70 6c 65 20 74  rn most simple t
1db0: 79 70 65 73 20 61 73 20 61 20 72 65 74 75 72 6e  ypes as a return
1dc0: 20 76 61 6c 75 65 2c 20 6e 75 6c 6c 20 6f 72 20   value, null or 
1dd0: 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 20 74 6f 20  DBNull.Value to 
1de0: 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 44 61 74  return null, Dat
1df0: 65 54 69 6d 65 2c 20 6f 72 0d 0a 20 20 20 20 2f  eTime, or..    /
1e00: 2f 2f 20 79 6f 75 20 6d 61 79 20 72 65 74 75 72  // you may retur
1e10: 6e 20 61 6e 20 45 78 63 65 70 74 69 6f 6e 2d 64  n an Exception-d
1e20: 65 72 69 76 65 64 20 63 6c 61 73 73 20 69 66 20  erived class if 
1e30: 79 6f 75 20 77 69 73 68 20 74 6f 20 72 65 74 75  you wish to retu
1e40: 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
1e50: 51 4c 69 74 65 2e 20 20 44 6f 20 6e 6f 74 20 61  QLite.  Do not a
1e60: 63 74 75 61 6c 6c 79 20 74 68 72 6f 77 20 74 68  ctually throw th
1e70: 65 20 65 72 72 6f 72 2c 0d 0a 20 20 20 20 2f 2f  e error,..    //
1e80: 2f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 69 74  / just return it
1e90: 21 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  !</returns>..   
1ea0: 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c 20   public virtual 
1eb0: 6f 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62  object Invoke(ob
1ec0: 6a 65 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20 20  ject[] args)..  
1ed0: 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b    {..      Check
1ee0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
1ef0: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d     return null;.
1f00: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
1f10: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
1f20: 20 2f 2f 2f 20 41 67 67 72 65 67 61 74 65 20 66   /// Aggregate f
1f30: 75 6e 63 74 69 6f 6e 73 20 6f 76 65 72 72 69 64  unctions overrid
1f40: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  e this method to
1f50: 20 64 6f 20 74 68 65 69 72 20 6d 61 67 69 63 2e   do their magic.
1f60: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
1f70: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ary>..    /// <r
1f80: 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f  emarks>..    ///
1f90: 20 54 79 70 69 63 61 6c 6c 79 20 79 6f 75 27 6c   Typically you'l
1fa0: 6c 20 62 65 20 75 70 64 61 74 69 6e 67 20 77 68  l be updating wh
1fb0: 61 74 65 76 65 72 20 79 6f 75 27 76 65 20 70 6c  atever you've pl
1fc0: 61 63 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  aced in the cont
1fd0: 65 78 74 44 61 74 61 20 66 69 65 6c 64 20 61 6e  extData field an
1fe0: 64 20 72 65 74 75 72 6e 69 6e 67 20 61 73 20 71  d returning as q
1ff0: 75 69 63 6b 6c 79 20 61 73 20 70 6f 73 73 69 62  uickly as possib
2000: 6c 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72  le...    /// </r
2010: 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f  emarks>..    ///
2020: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
2030: 67 73 22 3e 54 68 65 20 61 72 67 75 6d 65 6e 74  gs">The argument
2040: 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  s for the comman
2050: 64 20 74 6f 20 70 72 6f 63 65 73 73 3c 2f 70 61  d to process</pa
2060: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
2070: 61 72 61 6d 20 6e 61 6d 65 3d 22 73 74 65 70 4e  aram name="stepN
2080: 75 6d 62 65 72 22 3e 54 68 65 20 31 2d 62 61 73  umber">The 1-bas
2090: 65 64 20 73 74 65 70 20 6e 75 6d 62 65 72 2e 20  ed step number. 
20a0: 20 54 68 69 73 20 69 73 20 69 6e 63 72 65 6d 65   This is increme
20b0: 6d 74 65 64 20 65 61 63 68 20 74 69 6d 65 20 74  mted each time t
20c0: 68 65 20 73 74 65 70 20 6d 65 74 68 6f 64 20 69  he step method i
20d0: 73 20 63 61 6c 6c 65 64 2e 3c 2f 70 61 72 61 6d  s called.</param
20e0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
20f0: 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44  m name="contextD
2100: 61 74 61 22 3e 41 20 70 6c 61 63 65 68 6f 6c 64  ata">A placehold
2110: 65 72 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  er for implement
2120: 65 72 73 20 74 6f 20 73 74 6f 72 65 20 63 6f 6e  ers to store con
2130: 74 65 78 74 75 61 6c 20 64 61 74 61 20 70 65 72  textual data per
2140: 74 61 69 6e 69 6e 67 20 74 6f 20 74 68 65 20 63  taining to the c
2150: 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 3c  urrent context.<
2160: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 75 62  /param>..    pub
2170: 6c 69 63 20 76 69 72 74 75 61 6c 20 76 6f 69 64  lic virtual void
2180: 20 53 74 65 70 28 6f 62 6a 65 63 74 5b 5d 20 61   Step(object[] a
2190: 72 67 73 2c 20 69 6e 74 20 73 74 65 70 4e 75 6d  rgs, int stepNum
21a0: 62 65 72 2c 20 72 65 66 20 6f 62 6a 65 63 74 20  ber, ref object 
21b0: 63 6f 6e 74 65 78 74 44 61 74 61 29 0d 0a 20 20  contextData)..  
21c0: 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b    {..      Check
21d0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
21e0: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
21f0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
2200: 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
2210: 69 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 68  ions override th
2220: 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 66 69 6e  is method to fin
2230: 69 73 68 20 74 68 65 69 72 20 61 67 67 72 65 67  ish their aggreg
2240: 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0d  ate processing..
2250: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
2260: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ry>..    /// <re
2270: 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20  marks>..    /// 
2280: 49 66 20 79 6f 75 20 69 6d 70 6c 65 6d 65 6e 74  If you implement
2290: 65 64 20 79 6f 75 72 20 61 67 67 72 65 67 61 74  ed your aggregat
22a0: 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 70 65  e function prope
22b0: 72 6c 79 2c 0d 0a 20 20 20 20 2f 2f 2f 20 79 6f  rly,..    /// yo
22c0: 75 27 76 65 20 62 65 65 6e 20 72 65 63 6f 72 64  u've been record
22d0: 69 6e 67 20 61 6e 64 20 6b 65 65 70 69 6e 67 20  ing and keeping 
22e0: 74 72 61 63 6b 20 6f 66 20 79 6f 75 72 20 64 61  track of your da
22f0: 74 61 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ta in the contex
2300: 74 44 61 74 61 20 6f 62 6a 65 63 74 20 70 72 6f  tData object pro
2310: 76 69 64 65 64 2c 20 61 6e 64 20 6e 6f 77 20 61  vided, and now a
2320: 74 20 74 68 69 73 20 73 74 61 67 65 20 79 6f 75  t this stage you
2330: 20 73 68 6f 75 6c 64 20 68 61 76 65 0d 0a 20 20   should have..  
2340: 20 20 2f 2f 2f 20 61 6c 6c 20 74 68 65 20 69 6e    /// all the in
2350: 66 6f 72 6d 61 74 69 6f 6e 20 79 6f 75 20 6e 65  formation you ne
2360: 65 64 20 69 6e 20 74 68 65 72 65 20 74 6f 20 66  ed in there to f
2370: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
2380: 6f 20 72 65 74 75 72 6e 2e 0d 0a 20 20 20 20 2f  o return...    /
2390: 2f 2f 20 4e 4f 54 45 3a 20 20 49 74 20 69 73 20  // NOTE:  It is 
23a0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 72 72 69  possible to arri
23b0: 76 65 20 68 65 72 65 20 77 69 74 68 6f 75 74 20  ve here without 
23c0: 72 65 63 65 69 76 69 6e 67 20 61 20 70 72 65 76  receiving a prev
23d0: 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 53 74 65  ious call to Ste
23e0: 70 28 29 2c 20 69 6e 20 77 68 69 63 68 20 63 61  p(), in which ca
23f0: 73 65 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61  se the contextDa
2400: 74 61 20 77 69 6c 6c 0d 0a 20 20 20 20 2f 2f 2f  ta will..    ///
2410: 20 62 65 20 6e 75 6c 6c 2e 20 20 54 68 69 73 20   be null.  This 
2420: 63 61 6e 20 68 61 70 70 65 6e 20 77 68 65 6e 20  can happen when 
2430: 6e 6f 20 72 6f 77 73 20 77 65 72 65 20 72 65 74  no rows were ret
2440: 75 72 6e 65 64 2e 20 20 59 6f 75 20 63 61 6e 20  urned.  You can 
2450: 65 69 74 68 65 72 20 72 65 74 75 72 6e 20 6e 75  either return nu
2460: 6c 6c 2c 20 6f 72 20 30 20 6f 72 20 73 6f 6d 65  ll, or 0 or some
2470: 20 6f 74 68 65 72 20 63 75 73 74 6f 6d 20 72 65   other custom re
2480: 74 75 72 6e 20 76 61 6c 75 65 0d 0a 20 20 20 20  turn value..    
2490: 2f 2f 2f 20 69 66 20 74 68 61 74 20 69 73 20 74  /// if that is t
24a0: 68 65 20 63 61 73 65 2e 0d 0a 20 20 20 20 2f 2f  he case...    //
24b0: 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20 20  / </remarks>..  
24c0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
24d0: 65 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e  e="contextData">
24e0: 59 6f 75 72 20 6f 77 6e 20 61 73 73 69 67 6e 65  Your own assigne
24f0: 64 20 63 6f 6e 74 65 78 74 44 61 74 61 2c 20 70  d contextData, p
2500: 72 6f 76 69 64 65 64 20 66 6f 72 20 79 6f 75 20  rovided for you 
2510: 73 6f 20 79 6f 75 20 63 61 6e 20 72 65 74 75 72  so you can retur
2520: 6e 20 79 6f 75 72 20 66 69 6e 61 6c 20 72 65 73  n your final res
2530: 75 6c 74 73 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ults.</param>.. 
2540: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
2550: 59 6f 75 20 6d 61 79 20 72 65 74 75 72 6e 20 6d  You may return m
2560: 6f 73 74 20 73 69 6d 70 6c 65 20 74 79 70 65 73  ost simple types
2570: 20 61 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c   as a return val
2580: 75 65 2c 20 6e 75 6c 6c 20 6f 72 20 44 42 4e 75  ue, null or DBNu
2590: 6c 6c 2e 56 61 6c 75 65 20 74 6f 20 72 65 74 75  ll.Value to retu
25a0: 72 6e 20 6e 75 6c 6c 2c 20 44 61 74 65 54 69 6d  rn null, DateTim
25b0: 65 2c 20 6f 72 0d 0a 20 20 20 20 2f 2f 2f 20 79  e, or..    /// y
25c0: 6f 75 20 6d 61 79 20 72 65 74 75 72 6e 20 61 6e  ou may return an
25d0: 20 45 78 63 65 70 74 69 6f 6e 2d 64 65 72 69 76   Exception-deriv
25e0: 65 64 20 63 6c 61 73 73 20 69 66 20 79 6f 75 20  ed class if you 
25f0: 77 69 73 68 20 74 6f 20 72 65 74 75 72 6e 20 61  wish to return a
2600: 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74  n error to SQLit
2610: 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61  e.  Do not actua
2620: 6c 6c 79 20 74 68 72 6f 77 20 74 68 65 20 65 72  lly throw the er
2630: 72 6f 72 2c 0d 0a 20 20 20 20 2f 2f 2f 20 6a 75  ror,..    /// ju
2640: 73 74 20 72 65 74 75 72 6e 20 69 74 21 0d 0a 20  st return it!.. 
2650: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
2660: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 69  >..    public vi
2670: 72 74 75 61 6c 20 6f 62 6a 65 63 74 20 46 69 6e  rtual object Fin
2680: 61 6c 28 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78  al(object contex
2690: 74 44 61 74 61 29 0d 0a 20 20 20 20 7b 0d 0a 20  tData)..    {.. 
26a0: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
26b0: 65 64 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 74  ed();..      ret
26c0: 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 7d  urn null;..    }
26d0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
26e0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 55  mary>..    /// U
26f0: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c  ser-defined coll
2700: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
2710: 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 6d 65  override this me
2720: 74 68 6f 64 20 74 6f 20 70 72 6f 76 69 64 65 20  thod to provide 
2730: 61 20 63 75 73 74 6f 6d 20 73 74 72 69 6e 67 20  a custom string 
2740: 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72 69 74 68  sorting algorith
2750: 6d 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  m...    /// </su
2760: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
2770: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 61 72  <param name="par
2780: 61 6d 31 22 3e 54 68 65 20 66 69 72 73 74 20 73  am1">The first s
2790: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
27a0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
27b0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
27c0: 61 72 61 6d 32 22 3e 54 68 65 20 73 65 63 6f 6e  aram2">The secon
27d0: 64 20 73 74 72 6e 69 67 20 74 6f 20 63 6f 6d 70  d strnig to comp
27e0: 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  are</param>..   
27f0: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 31 20   /// <returns>1 
2800: 69 66 20 70 61 72 61 6d 31 20 69 73 20 67 72 65  if param1 is gre
2810: 61 74 65 72 20 74 68 61 6e 20 70 61 72 61 6d 32  ater than param2
2820: 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20  , 0 if they are 
2830: 65 71 75 61 6c 2c 20 6f 72 20 2d 31 20 69 66 20  equal, or -1 if 
2840: 70 61 72 61 6d 31 20 69 73 20 6c 65 73 73 20 74  param1 is less t
2850: 68 61 6e 20 70 61 72 61 6d 32 3c 2f 72 65 74 75  han param2</retu
2860: 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63  rns>..    public
2870: 20 76 69 72 74 75 61 6c 20 69 6e 74 20 43 6f 6d   virtual int Com
2880: 70 61 72 65 28 73 74 72 69 6e 67 20 70 61 72 61  pare(string para
2890: 6d 31 2c 20 73 74 72 69 6e 67 20 70 61 72 61 6d  m1, string param
28a0: 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  2)..    {..     
28b0: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
28c0: 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
28d0: 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  0;..    }....   
28e0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
28f0: 20 20 20 20 2f 2f 2f 20 43 6f 6e 76 65 72 74 73      /// Converts
2900: 20 61 6e 20 49 6e 74 50 74 72 20 61 72 72 61 79   an IntPtr array
2910: 20 6f 66 20 63 6f 6e 74 65 78 74 20 61 72 67 75   of context argu
2920: 6d 65 6e 74 73 20 74 6f 20 61 6e 20 6f 62 6a 65  ments to an obje
2930: 63 74 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  ct array contain
2940: 69 6e 67 20 74 68 65 20 72 65 73 6f 6c 76 65 64  ing the resolved
2950: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 65 20   parameters the 
2960: 70 6f 69 6e 74 65 72 73 20 70 6f 69 6e 74 20 74  pointers point t
2970: 6f 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  o...    /// </su
2980: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
2990: 3c 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f  <remarks>..    /
29a0: 2f 2f 20 50 61 72 61 6d 65 74 65 72 73 20 70 61  // Parameters pa
29b0: 73 73 65 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ssed to function
29c0: 73 20 68 61 76 65 20 6f 6e 6c 79 20 61 6e 20 61  s have only an a
29d0: 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20 63 65  ffinity for a ce
29e0: 72 74 61 69 6e 20 64 61 74 61 20 74 79 70 65 2c  rtain data type,
29f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 75 6e 64   there is no und
2a00: 65 72 6c 79 69 6e 67 20 73 63 68 65 6d 61 20 61  erlying schema a
2a10: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 2f 2f  vailable..    //
2a20: 2f 20 74 6f 20 66 6f 72 63 65 20 74 68 65 6d 20  / to force them 
2a30: 69 6e 74 6f 20 61 20 63 65 72 74 61 69 6e 20 74  into a certain t
2a40: 79 70 65 2e 20 20 54 68 65 72 65 66 6f 72 65 20  ype.  Therefore 
2a50: 74 68 65 20 6f 6e 6c 79 20 74 79 70 65 73 20 79  the only types y
2a60: 6f 75 20 77 69 6c 6c 20 65 76 65 72 20 73 65 65  ou will ever see
2a70: 20 61 73 20 70 61 72 61 6d 65 74 65 72 73 20 61   as parameters a
2a80: 72 65 0d 0a 20 20 20 20 2f 2f 2f 20 44 42 4e 75  re..    /// DBNu
2a90: 6c 6c 2e 56 61 6c 75 65 2c 20 49 6e 74 36 34 2c  ll.Value, Int64,
2aa0: 20 44 6f 75 62 6c 65 2c 20 53 74 72 69 6e 67 20   Double, String 
2ab0: 6f 72 20 62 79 74 65 5b 5d 20 61 72 72 61 79 2e  or byte[] array.
2ac0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61  ..    /// </rema
2ad0: 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  rks>..    /// <p
2ae0: 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73  aram name="nArgs
2af0: 22 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  ">The number of 
2b00: 61 72 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d  arguments</param
2b10: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
2b20: 6d 20 6e 61 6d 65 3d 22 61 72 67 73 70 74 72 22  m name="argsptr"
2b30: 3e 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  >A pointer to th
2b40: 65 20 61 72 72 61 79 20 6f 66 20 61 72 67 75 6d  e array of argum
2b50: 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  ents</param>..  
2b60: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41    /// <returns>A
2b70: 6e 20 6f 62 6a 65 63 74 20 61 72 72 61 79 20 6f  n object array o
2b80: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
2b90: 6f 6e 63 65 20 74 68 65 79 27 76 65 20 62 65 65  once they've bee
2ba0: 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 2e  n converted to .
2bb0: 4e 45 54 20 76 61 6c 75 65 73 3c 2f 72 65 74 75  NET values</retu
2bc0: 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e  rns>..    intern
2bd0: 61 6c 20 6f 62 6a 65 63 74 5b 5d 20 43 6f 6e 76  al object[] Conv
2be0: 65 72 74 50 61 72 61 6d 73 28 69 6e 74 20 6e 41  ertParams(int nA
2bf0: 72 67 73 2c 20 49 6e 74 50 74 72 20 61 72 67 73  rgs, IntPtr args
2c00: 70 74 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ptr)..    {..   
2c10: 20 20 20 6f 62 6a 65 63 74 5b 5d 20 70 61 72 6d     object[] parm
2c20: 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 6e  s = new object[n
2c30: 41 72 67 73 5d 3b 0d 0a 23 69 66 20 21 50 4c 41  Args];..#if !PLA
2c40: 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
2c50: 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 20 20 49 6e  MEWORK..      In
2c60: 74 50 74 72 5b 5d 20 61 72 67 69 6e 74 20 3d 20  tPtr[] argint = 
2c70: 6e 65 77 20 49 6e 74 50 74 72 5b 6e 41 72 67 73  new IntPtr[nArgs
2c80: 5d 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20  ];..#else..     
2c90: 20 69 6e 74 5b 5d 20 61 72 67 69 6e 74 20 3d 20   int[] argint = 
2ca0: 6e 65 77 20 69 6e 74 5b 6e 41 72 67 73 5d 3b 0d  new int[nArgs];.
2cb0: 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 4d  .#endif..      M
2cc0: 61 72 73 68 61 6c 2e 43 6f 70 79 28 61 72 67 73  arshal.Copy(args
2cd0: 70 74 72 2c 20 61 72 67 69 6e 74 2c 20 30 2c 20  ptr, argint, 0, 
2ce0: 6e 41 72 67 73 29 3b 0d 0a 0d 0a 20 20 20 20 20  nArgs);....     
2cf0: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
2d00: 20 6e 20 3c 20 6e 41 72 67 73 3b 20 6e 2b 2b 29   n < nArgs; n++)
2d10: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
2d20: 20 20 20 73 77 69 74 63 68 20 28 5f 62 61 73 65     switch (_base
2d30: 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 54 79  .GetParamValueTy
2d40: 70 65 28 28 49 6e 74 50 74 72 29 61 72 67 69 6e  pe((IntPtr)argin
2d50: 74 5b 6e 5d 29 29 0d 0a 20 20 20 20 20 20 20 20  t[n]))..        
2d60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  {..          cas
2d70: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 4e  e TypeAffinity.N
2d80: 75 6c 6c 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ull:..          
2d90: 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 44 42 4e    parms[n] = DBN
2da0: 75 6c 6c 2e 56 61 6c 75 65 3b 0d 0a 20 20 20 20  ull.Value;..    
2db0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
2dc0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
2dd0: 79 70 65 41 66 66 69 6e 69 74 79 2e 49 6e 74 36  ypeAffinity.Int6
2de0: 34 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  4:..            
2df0: 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 65  parms[n] = _base
2e00: 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 49 6e  .GetParamValueIn
2e10: 74 36 34 28 28 49 6e 74 50 74 72 29 61 72 67 69  t64((IntPtr)argi
2e20: 6e 74 5b 6e 5d 29 3b 0d 0a 20 20 20 20 20 20 20  nt[n]);..       
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
2e40: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
2e50: 41 66 66 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a  Affinity.Double:
2e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
2e70: 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47  rms[n] = _base.G
2e80: 65 74 50 61 72 61 6d 56 61 6c 75 65 44 6f 75 62  etParamValueDoub
2e90: 6c 65 28 28 49 6e 74 50 74 72 29 61 72 67 69 6e  le((IntPtr)argin
2ea0: 74 5b 6e 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20  t[n]);..        
2eb0: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
2ec0: 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41        case TypeA
2ed0: 66 66 69 6e 69 74 79 2e 54 65 78 74 3a 0d 0a 20  ffinity.Text:.. 
2ee0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73             parms
2ef0: 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47 65 74 50  [n] = _base.GetP
2f00: 61 72 61 6d 56 61 6c 75 65 54 65 78 74 28 28 49  aramValueText((I
2f10: 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29  ntPtr)argint[n])
2f20: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ;..            b
2f30: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20  reak;..         
2f40: 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69   case TypeAffini
2f50: 74 79 2e 42 6c 6f 62 3a 0d 0a 20 20 20 20 20 20  ty.Blob:..      
2f60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2f70: 20 20 20 20 20 20 20 69 6e 74 20 78 3b 0d 0a 20         int x;.. 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74               byt
2f90: 65 5b 5d 20 62 6c 6f 62 3b 0d 0a 0d 0a 20 20 20  e[] blob;....   
2fa0: 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 28             x = (
2fb0: 69 6e 74 29 5f 62 61 73 65 2e 47 65 74 50 61 72  int)_base.GetPar
2fc0: 61 6d 56 61 6c 75 65 42 79 74 65 73 28 28 49 6e  amValueBytes((In
2fd0: 74 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 2c 20  tPtr)argint[n], 
2fe0: 30 2c 20 6e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0d  0, null, 0, 0);.
2ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
3000: 6c 6f 62 20 3d 20 6e 65 77 20 62 79 74 65 5b 78  lob = new byte[x
3010: 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ];..            
3020: 20 20 5f 62 61 73 65 2e 47 65 74 50 61 72 61 6d    _base.GetParam
3030: 56 61 6c 75 65 42 79 74 65 73 28 28 49 6e 74 50  ValueBytes((IntP
3040: 74 72 29 61 72 67 69 6e 74 5b 6e 5d 2c 20 30 2c  tr)argint[n], 0,
3050: 20 62 6c 6f 62 2c 20 30 2c 20 78 29 3b 0d 0a 20   blob, 0, x);.. 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72               par
3070: 6d 73 5b 6e 5d 20 3d 20 62 6c 6f 62 3b 0d 0a 20  ms[n] = blob;.. 
3080: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3090: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
30a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ..          case
30b0: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 44 61   TypeAffinity.Da
30c0: 74 65 54 69 6d 65 3a 20 2f 2f 20 4e 65 76 65 72  teTime: // Never
30d0: 20 68 61 70 70 65 6e 73 20 68 65 72 65 20 62 75   happens here bu
30e0: 74 20 77 68 61 74 20 74 68 65 20 68 65 63 6b 2c  t what the heck,
30f0: 20 6d 61 79 62 65 20 69 74 20 77 69 6c 6c 20 6f   maybe it will o
3100: 6e 65 20 64 61 79 2e 0d 0a 20 20 20 20 20 20 20  ne day...       
3110: 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20       parms[n] = 
3120: 5f 62 61 73 65 2e 54 6f 44 61 74 65 54 69 6d 65  _base.ToDateTime
3130: 28 5f 62 61 73 65 2e 47 65 74 50 61 72 61 6d 56  (_base.GetParamV
3140: 61 6c 75 65 54 65 78 74 28 28 49 6e 74 50 74 72  alueText((IntPtr
3150: 29 61 72 67 69 6e 74 5b 6e 5d 29 29 3b 0d 0a 20  )argint[n]));.. 
3160: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
3170: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74      }..      ret
3190: 75 72 6e 20 70 61 72 6d 73 3b 0d 0a 20 20 20 20  urn parms;..    
31a0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
31b0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
31c0: 54 61 6b 65 73 20 74 68 65 20 72 65 74 75 72 6e  Takes the return
31d0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 49 6e 76 6f   value from Invo
31e0: 6b 65 28 29 20 61 6e 64 20 46 69 6e 61 6c 28 29  ke() and Final()
31f0: 20 61 6e 64 20 66 69 67 75 72 65 73 20 6f 75 74   and figures out
3200: 20 68 6f 77 20 74 6f 20 72 65 74 75 72 6e 20 69   how to return i
3210: 74 20 74 6f 20 53 51 4c 69 74 65 27 73 20 63 6f  t to SQLite's co
3220: 6e 74 65 78 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ntext...    /// 
3230: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
3240: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
3250: 22 63 6f 6e 74 65 78 74 22 3e 54 68 65 20 63 6f  "context">The co
3260: 6e 74 65 78 74 20 74 68 65 20 72 65 74 75 72 6e  ntext the return
3270: 20 76 61 6c 75 65 20 61 70 70 6c 69 65 73 20 74   value applies t
3280: 6f 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  o</param>..    /
3290: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
32a0: 72 65 74 75 72 6e 56 61 6c 75 65 22 3e 54 68 65  returnValue">The
32b0: 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 72 65   parameter to re
32c0: 74 75 72 6e 20 74 6f 20 53 51 4c 69 74 65 3c 2f  turn to SQLite</
32d0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 72 69 76  param>..    priv
32e0: 61 74 65 20 76 6f 69 64 20 53 65 74 52 65 74 75  ate void SetRetu
32f0: 72 6e 56 61 6c 75 65 28 49 6e 74 50 74 72 20 63  rnValue(IntPtr c
3300: 6f 6e 74 65 78 74 2c 20 6f 62 6a 65 63 74 20 72  ontext, object r
3310: 65 74 75 72 6e 56 61 6c 75 65 29 0d 0a 20 20 20  eturnValue)..   
3320: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28 72 65   {..      if (re
3330: 74 75 72 6e 56 61 6c 75 65 20 3d 3d 20 6e 75 6c  turnValue == nul
3340: 6c 20 7c 7c 20 72 65 74 75 72 6e 56 61 6c 75 65  l || returnValue
3350: 20 3d 3d 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65   == DBNull.Value
3360: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
3370: 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72 6e      _base.Return
3380: 4e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0d 0a  Null(context);..
3390: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d          return;.
33a0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
33b0: 20 20 54 79 70 65 20 74 20 3d 20 72 65 74 75 72    Type t = retur
33c0: 6e 56 61 6c 75 65 2e 47 65 74 54 79 70 65 28 29  nValue.GetType()
33d0: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 74 20 3d  ;..      if (t =
33e0: 3d 20 74 79 70 65 6f 66 28 44 61 74 65 54 69 6d  = typeof(DateTim
33f0: 65 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  e))..      {..  
3400: 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75        _base.Retu
3410: 72 6e 54 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  rnText(context, 
3420: 5f 62 61 73 65 2e 54 6f 53 74 72 69 6e 67 28 28  _base.ToString((
3430: 44 61 74 65 54 69 6d 65 29 72 65 74 75 72 6e 56  DateTime)returnV
3440: 61 6c 75 65 29 29 3b 0d 0a 20 20 20 20 20 20 20  alue));..       
3450: 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20   return;..      
3460: 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a 20  }..      else.. 
3470: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3480: 45 78 63 65 70 74 69 6f 6e 20 72 20 3d 20 72 65  Exception r = re
3490: 74 75 72 6e 56 61 6c 75 65 20 61 73 20 45 78 63  turnValue as Exc
34a0: 65 70 74 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 20  eption;....     
34b0: 20 20 20 69 66 20 28 72 20 21 3d 20 6e 75 6c 6c     if (r != null
34c0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
34d0: 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65          _base.Re
34e0: 74 75 72 6e 45 72 72 6f 72 28 63 6f 6e 74 65 78  turnError(contex
34f0: 74 2c 20 72 2e 4d 65 73 73 61 67 65 29 3b 0d 0a  t, r.Message);..
3500: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3510: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
3520: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
3530: 77 69 74 63 68 20 28 53 51 4c 69 74 65 43 6f 6e  witch (SQLiteCon
3540: 76 65 72 74 2e 54 79 70 65 54 6f 41 66 66 69 6e  vert.TypeToAffin
3550: 69 74 79 28 74 29 29 0d 0a 20 20 20 20 20 20 7b  ity(t))..      {
3560: 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ..        case T
3570: 79 70 65 41 66 66 69 6e 69 74 79 2e 4e 75 6c 6c  ypeAffinity.Null
3580: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 5f 62 61  :..          _ba
3590: 73 65 2e 52 65 74 75 72 6e 4e 75 6c 6c 28 63 6f  se.ReturnNull(co
35a0: 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20 20 20  ntext);..       
35b0: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20     return;..    
35c0: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
35d0: 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0d 0a 20 20  inity.Int64:..  
35e0: 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65          _base.Re
35f0: 74 75 72 6e 49 6e 74 36 34 28 63 6f 6e 74 65 78  turnInt64(contex
3600: 74 2c 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74  t, Convert.ToInt
3610: 36 34 28 72 65 74 75 72 6e 56 61 6c 75 65 2c 20  64(returnValue, 
3620: 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72  CultureInfo.Curr
3630: 65 6e 74 43 75 6c 74 75 72 65 29 29 3b 0d 0a 20  entCulture));.. 
3640: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
3650: 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ..        case T
3660: 79 70 65 41 66 66 69 6e 69 74 79 2e 44 6f 75 62  ypeAffinity.Doub
3670: 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 5f  le:..          _
3680: 62 61 73 65 2e 52 65 74 75 72 6e 44 6f 75 62 6c  base.ReturnDoubl
3690: 65 28 63 6f 6e 74 65 78 74 2c 20 43 6f 6e 76 65  e(context, Conve
36a0: 72 74 2e 54 6f 44 6f 75 62 6c 65 28 72 65 74 75  rt.ToDouble(retu
36b0: 72 6e 56 61 6c 75 65 2c 20 43 75 6c 74 75 72 65  rnValue, Culture
36c0: 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43 75 6c 74  Info.CurrentCult
36d0: 75 72 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  ure));..        
36e0: 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20    return;..     
36f0: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
3700: 6e 69 74 79 2e 54 65 78 74 3a 0d 0a 20 20 20 20  nity.Text:..    
3710: 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75        _base.Retu
3720: 72 6e 54 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  rnText(context, 
3730: 72 65 74 75 72 6e 56 61 6c 75 65 2e 54 6f 53 74  returnValue.ToSt
3740: 72 69 6e 67 28 29 29 3b 0d 0a 20 20 20 20 20 20  ring());..      
3750: 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20      return;..   
3760: 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66       case TypeAf
3770: 66 69 6e 69 74 79 2e 42 6c 6f 62 3a 0d 0a 20 20  finity.Blob:..  
3780: 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65          _base.Re
3790: 74 75 72 6e 42 6c 6f 62 28 63 6f 6e 74 65 78 74  turnBlob(context
37a0: 2c 20 28 62 79 74 65 5b 5d 29 72 65 74 75 72 6e  , (byte[])return
37b0: 56 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20  Value);..       
37c0: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20     return;..    
37d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
37e0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
37f0: 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72 6e 61  .    /// Interna
3800: 6c 20 73 63 61 6c 61 72 20 63 61 6c 6c 62 61 63  l scalar callbac
3810: 6b 20 66 75 6e 63 74 69 6f 6e 2c 20 77 68 69 63  k function, whic
3820: 68 20 77 72 61 70 73 20 74 68 65 20 72 61 77 20  h wraps the raw 
3830: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20  context pointer 
3840: 61 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 76 69  and calls the vi
3850: 72 74 75 61 6c 20 49 6e 76 6f 6b 65 28 29 20 6d  rtual Invoke() m
3860: 65 74 68 6f 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ethod...    /// 
3870: 57 41 52 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f  WARNING: Must no
3880: 74 20 74 68 72 6f 77 20 65 78 63 65 70 74 69 6f  t throw exceptio
3890: 6e 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ns...    /// </s
38a0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
38b0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f   <param name="co
38c0: 6e 74 65 78 74 22 3e 41 20 72 61 77 20 63 6f 6e  ntext">A raw con
38d0: 74 65 78 74 20 70 6f 69 6e 74 65 72 3c 2f 70 61  text pointer</pa
38e0: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
38f0: 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73  aram name="nArgs
3900: 22 3e 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  ">Number of argu
3910: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 69 6e 3c  ments passed in<
3920: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
3930: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
3940: 67 73 70 74 72 22 3e 41 20 70 6f 69 6e 74 65 72  gsptr">A pointer
3950: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
3960: 20 61 72 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61   arguments</para
3970: 6d 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  m>..    internal
3980: 20 76 6f 69 64 20 53 63 61 6c 61 72 43 61 6c 6c   void ScalarCall
3990: 62 61 63 6b 28 49 6e 74 50 74 72 20 63 6f 6e 74  back(IntPtr cont
39a0: 65 78 74 2c 20 69 6e 74 20 6e 41 72 67 73 2c 20  ext, int nArgs, 
39b0: 49 6e 74 50 74 72 20 61 72 67 73 70 74 72 29 0d  IntPtr argsptr).
39c0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20  .    {..        
39d0: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  try..        {..
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e              _con
39f0: 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74 3b 0d  text = context;.
3a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  .            Set
3a10: 52 65 74 75 72 6e 56 61 6c 75 65 28 63 6f 6e 74  ReturnValue(cont
3a20: 65 78 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ext,..          
3a30: 20 20 20 20 20 20 49 6e 76 6f 6b 65 28 43 6f 6e        Invoke(Con
3a40: 76 65 72 74 50 61 72 61 6d 73 28 6e 41 72 67 73  vertParams(nArgs
3a50: 2c 20 61 72 67 73 70 74 72 29 29 29 3b 20 2f 2a  , argsptr))); /*
3a60: 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20   throw */..     
3a70: 20 20 20 7d 0d 0a 23 69 66 20 21 50 4c 41 54 46     }..#if !PLATF
3a80: 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45  ORM_COMPACTFRAME
3a90: 57 4f 52 4b 0d 0a 20 20 20 20 20 20 20 20 63 61  WORK..        ca
3aa0: 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65  tch (Exception e
3ab0: 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20  ) /* NOTE: Must 
3ac0: 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20  catch ALL. */.. 
3ad0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3ae0: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
3af0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3b00: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f            if ((_
3b10: 66 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43 6f  flags & SQLiteCo
3b20: 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f  nnectionFlags.Lo
3b30: 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69  gCallbackExcepti
3b40: 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20  on) ==..        
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
3b70: 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63  Flags.LogCallbac
3b80: 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20  kException)..   
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f      SQLiteLog.Lo
3bc0: 67 4d 65 73 73 61 67 65 28 43 4f 52 5f 45 5f 45  gMessage(COR_E_E
3bd0: 58 43 45 50 54 49 4f 4e 2c 20 53 74 72 69 6e 67  XCEPTION, String
3be0: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75    CultureInfo.Cu
3c10: 72 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20  rrentCulture,.. 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 20 20 20 20 20 22 43 61 75 67 68 74 20 65         "Caught e
3c40: 78 63 65 70 74 69 6f 6e 20 69 6e 20 5c 22 49 6e  xception in \"In
3c50: 76 6f 6b 65 5c 22 20 6d 65 74 68 6f 64 3a 20 7b  voke\" method: {
3c60: 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  0}",..          
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 29                e)
3c80: 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a  ); /* throw */..
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
3cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
3cc0: 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20  tch..           
3cd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3ce0: 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e      // do nothin
3cf0: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
3d00: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65  }..        }..#e
3d10: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 63 61 74  lse..        cat
3d20: 63 68 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74  ch /* NOTE: Must
3d30: 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a   catch ALL. */..
3d40: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3d50: 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74         // do not
3d60: 68 69 6e 67 20 28 57 69 6e 64 6f 77 73 20 43 45  hing (Windows CE
3d70: 29 2e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23  )...        }..#
3d80: 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  endif..    }....
3d90: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
3da0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72  >..    /// Inter
3db0: 6e 61 6c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  nal collation se
3dc0: 71 75 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e 2c  quence function,
3dd0: 20 77 68 69 63 68 20 77 72 61 70 73 20 75 70 20   which wraps up 
3de0: 74 68 65 20 72 61 77 20 73 74 72 69 6e 67 20 70  the raw string p
3df0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 65 78 65 63  ointers and exec
3e00: 75 74 65 73 20 74 68 65 20 43 6f 6d 70 61 72 65  utes the Compare
3e10: 28 29 20 76 69 72 74 75 61 6c 20 66 75 6e 63 74  () virtual funct
3e20: 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41  ion...    /// WA
3e30: 52 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20  RNING: Must not 
3e40: 74 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73  throw exceptions
3e50: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
3e60: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
3e70: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 22  param name="ptr"
3e80: 3e 4e 6f 74 20 75 73 65 64 3c 2f 70 61 72 61 6d  >Not used</param
3e90: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
3ea0: 6d 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c 65  m name="len1">Le
3eb0: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69  ngth of the stri
3ec0: 6e 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e 0d 0a  ng pv1</param>..
3ed0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
3ee0: 61 6d 65 3d 22 70 74 72 31 22 3e 50 6f 69 6e 74  ame="ptr1">Point
3ef0: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
3f00: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
3f10: 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  e</param>..    /
3f20: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
3f30: 6c 65 6e 32 22 3e 4c 65 6e 67 74 68 20 6f 66 20  len2">Length of 
3f40: 74 68 65 20 73 74 72 69 6e 67 20 70 76 32 3c 2f  the string pv2</
3f50: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
3f60: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72  <param name="ptr
3f70: 32 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  2">Pointer to th
3f80: 65 20 73 65 63 6f 6e 64 20 73 74 72 69 6e 67 20  e second string 
3f90: 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61  to compare</para
3fa0: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
3fb0: 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31 20  urns>Returns -1 
3fc0: 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74 72  if the first str
3fd0: 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ing is less than
3fe0: 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30 20   the second.  0 
3ff0: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
4000: 6c 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20 66  l, or 1 if the f
4010: 69 72 73 74 20 73 74 72 69 6e 67 20 69 73 20 67  irst string is g
4020: 72 65 61 74 65 72 0d 0a 20 20 20 20 2f 2f 2f 20  reater..    /// 
4030: 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e  than the second.
4040: 20 20 52 65 74 75 72 6e 73 20 30 20 69 66 20 61    Returns 0 if a
4050: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 63  n exception is c
4060: 61 75 67 68 74 2e 3c 2f 72 65 74 75 72 6e 73 3e  aught.</returns>
4070: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69  ..    internal i
4080: 6e 74 20 43 6f 6d 70 61 72 65 43 61 6c 6c 62 61  nt CompareCallba
4090: 63 6b 28 49 6e 74 50 74 72 20 70 74 72 2c 20 69  ck(IntPtr ptr, i
40a0: 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74 72 20  nt len1, IntPtr 
40b0: 70 74 72 31 2c 20 69 6e 74 20 6c 65 6e 32 2c 20  ptr1, int len2, 
40c0: 49 6e 74 50 74 72 20 70 74 72 32 29 0d 0a 20 20  IntPtr ptr2)..  
40d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79    {..        try
40e0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
40f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4100: 43 6f 6d 70 61 72 65 28 53 51 4c 69 74 65 43 6f  Compare(SQLiteCo
4110: 6e 76 65 72 74 2e 55 54 46 38 54 6f 53 74 72 69  nvert.UTF8ToStri
4120: 6e 67 28 70 74 72 31 2c 20 6c 65 6e 31 29 2c 0d  ng(ptr1, len1),.
4130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4140: 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e 55   SQLiteConvert.U
4150: 54 46 38 54 6f 53 74 72 69 6e 67 28 70 74 72 32  TF8ToString(ptr2
4160: 2c 20 6c 65 6e 32 29 29 3b 20 2f 2a 20 74 68 72  , len2)); /* thr
4170: 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7d  ow */..        }
4180: 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f  ..#if !PLATFORM_
4190: 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b  COMPACTFRAMEWORK
41a0: 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
41b0: 28 45 78 63 65 70 74 69 6f 6e 20 65 29 20 2f 2a  (Exception e) /*
41c0: 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63 61 74 63   NOTE: Must catc
41d0: 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20 20 20 20  h ALL. */..     
41e0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
41f0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
4200: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4210: 20 20 20 20 20 20 69 66 20 28 28 5f 66 6c 61 67        if ((_flag
4220: 73 20 26 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  s & SQLiteConnec
4230: 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c  tionFlags.LogCal
4240: 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e 29 20  lbackException) 
4250: 3d 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==..            
4260: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69              SQLi
4270: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
4280: 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63  s.LogCallbackExc
4290: 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  eption)..       
42a0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f 67 4d 65 73  SQLiteLog.LogMes
42d0: 73 61 67 65 28 43 4f 52 5f 45 5f 45 58 43 45 50  sage(COR_E_EXCEP
42e0: 54 49 4f 4e 2c 20 53 74 72 69 6e 67 2e 46 6f 72  TION, String.For
42f0: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 75                Cu
4310: 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e  ltureInfo.Curren
4320: 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20  tCulture,..     
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 22 43 61 75 67 68 74 20 65 78 63 65 70     "Caught excep
4350: 74 69 6f 6e 20 69 6e 20 5c 22 43 6f 6d 70 61 72  tion in \"Compar
4360: 65 5c 22 20 28 55 54 46 38 29 20 6d 65 74 68 6f  e\" (UTF8) metho
4370: 64 3a 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20  d: {0}",..      
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20    e)); /* throw 
43a0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
43b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
43c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
43d0: 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20    catch..       
43e0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
43f0: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
4400: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
4410: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
4420: 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 20  ..#else..       
4430: 20 63 61 74 63 68 20 2f 2a 20 4e 4f 54 45 3a 20   catch /* NOTE: 
4440: 4d 75 73 74 20 63 61 74 63 68 20 41 4c 4c 2e 20  Must catch ALL. 
4450: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  */..        {.. 
4460: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f             // do
4470: 20 6e 6f 74 68 69 6e 67 20 28 57 69 6e 64 6f 77   nothing (Window
4480: 73 20 43 45 29 2e 0d 0a 20 20 20 20 20 20 20 20  s CE)...        
4490: 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20  }..#endif....   
44a0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
44b0: 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73 20 6d   // NOTE: This m
44c0: 75 73 74 20 62 65 20 64 6f 6e 65 20 74 6f 20 70  ust be done to p
44d0: 72 65 76 65 6e 74 20 74 68 65 20 63 6f 72 65 20  revent the core 
44e0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 66  SQLite library f
44f0: 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20  rom..        // 
4500: 20 20 20 20 20 20 75 73 69 6e 67 20 6f 75 72 20        using our 
4510: 28 69 6e 76 61 6c 69 64 29 20 72 65 73 75 6c 74  (invalid) result
4520: 2e 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20  ...        //.. 
4530: 20 20 20 20 20 20 20 69 66 20 28 5f 62 61 73 65         if (_base
4540: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
4550: 20 20 20 20 20 20 20 5f 62 61 73 65 2e 43 61 6e         _base.Can
4560: 63 65 6c 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  cel();....      
4570: 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
4580: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
4590: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
45a0: 20 49 6e 74 65 72 6e 61 6c 20 63 6f 6c 6c 61 74   Internal collat
45b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 75 6e  ion sequence fun
45c0: 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 72 61  ction, which wra
45d0: 70 73 20 75 70 20 74 68 65 20 72 61 77 20 73 74  ps up the raw st
45e0: 72 69 6e 67 20 70 6f 69 6e 74 65 72 73 20 61 6e  ring pointers an
45f0: 64 20 65 78 65 63 75 74 65 73 20 74 68 65 20 43  d executes the C
4600: 6f 6d 70 61 72 65 28 29 20 76 69 72 74 75 61 6c  ompare() virtual
4610: 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20   function...    
4620: 2f 2f 2f 20 57 41 52 4e 49 4e 47 3a 20 4d 75 73  /// WARNING: Mus
4630: 74 20 6e 6f 74 20 74 68 72 6f 77 20 65 78 63 65  t not throw exce
4640: 70 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 2f 2f 2f  ptions...    ///
4650: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
4660: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
4670: 3d 22 70 74 72 22 3e 4e 6f 74 20 75 73 65 64 3c  ="ptr">Not used<
4680: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
4690: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c 65   <param name="le
46a0: 6e 31 22 3e 4c 65 6e 67 74 68 20 6f 66 20 74 68  n1">Length of th
46b0: 65 20 73 74 72 69 6e 67 20 70 76 31 3c 2f 70 61  e string pv1</pa
46c0: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
46d0: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 31 22  aram name="ptr1"
46e0: 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  >Pointer to the 
46f0: 66 69 72 73 74 20 73 74 72 69 6e 67 20 74 6f 20  first string to 
4700: 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e 0d  compare</param>.
4710: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
4720: 6e 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e 67  name="len2">Leng
4730: 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  th of the string
4740: 20 70 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20   pv2</param>..  
4750: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
4760: 65 3d 22 70 74 72 32 22 3e 50 6f 69 6e 74 65 72  e="ptr2">Pointer
4770: 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 73   to the second s
4780: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
4790: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
47a0: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72  / <returns>Retur
47b0: 6e 73 20 2d 31 20 69 66 20 74 68 65 20 66 69 72  ns -1 if the fir
47c0: 73 74 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  st string is les
47d0: 73 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  s than the secon
47e0: 64 2e 20 20 30 20 69 66 20 74 68 65 79 20 61 72  d.  0 if they ar
47f0: 65 20 65 71 75 61 6c 2c 20 6f 72 20 31 20 69 66  e equal, or 1 if
4800: 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e   the first strin
4810: 67 20 69 73 20 67 72 65 61 74 65 72 0d 0a 20 20  g is greater..  
4820: 20 20 2f 2f 2f 20 74 68 61 6e 20 74 68 65 20 73    /// than the s
4830: 65 63 6f 6e 64 2e 20 20 52 65 74 75 72 6e 73 20  econd.  Returns 
4840: 30 20 69 66 20 61 6e 20 65 78 63 65 70 74 69 6f  0 if an exceptio
4850: 6e 20 69 73 20 63 61 75 67 68 74 2e 3c 2f 72 65  n is caught.</re
4860: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65  turns>..    inte
4870: 72 6e 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65  rnal int Compare
4880: 43 61 6c 6c 62 61 63 6b 31 36 28 49 6e 74 50 74  Callback16(IntPt
4890: 72 20 70 74 72 2c 20 69 6e 74 20 6c 65 6e 31 2c  r ptr, int len1,
48a0: 20 49 6e 74 50 74 72 20 70 74 72 31 2c 20 69 6e   IntPtr ptr1, in
48b0: 74 20 6c 65 6e 32 2c 20 49 6e 74 50 74 72 20 70  t len2, IntPtr p
48c0: 74 72 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  tr2)..    {..   
48d0: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
48e0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
48f0: 20 72 65 74 75 72 6e 20 43 6f 6d 70 61 72 65 28   return Compare(
4900: 53 51 4c 69 74 65 33 5f 55 54 46 31 36 2e 55 54  SQLite3_UTF16.UT
4910: 46 31 36 54 6f 53 74 72 69 6e 67 28 70 74 72 31  F16ToString(ptr1
4920: 2c 20 6c 65 6e 31 29 2c 0d 0a 20 20 20 20 20 20  , len1),..      
4930: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
4940: 33 5f 55 54 46 31 36 2e 55 54 46 31 36 54 6f 53  3_UTF16.UTF16ToS
4950: 74 72 69 6e 67 28 70 74 72 32 2c 20 6c 65 6e 32  tring(ptr2, len2
4960: 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d  )); /* throw */.
4970: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 69 66 20  .        }..#if 
4980: 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43  !PLATFORM_COMPAC
4990: 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20  TFRAMEWORK..    
49a0: 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65 70      catch (Excep
49b0: 74 69 6f 6e 20 65 29 20 2f 2a 20 4e 4f 54 45 3a  tion e) /* NOTE:
49c0: 20 4d 75 73 74 20 63 61 74 63 68 20 41 4c 4c 2e   Must catch ALL.
49d0: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a   */..        {..
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
49f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 69 66 20 28 28 5f 66 6c 61 67 73 20 26 20 53 51  if ((_flags & SQ
4a20: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
4a30: 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45  ags.LogCallbackE
4a40: 78 63 65 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20 20  xception) ==..  
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
4a70: 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43  ectionFlags.LogC
4a80: 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e  allbackException
4a90: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
4aa0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4ab0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
4ac0: 4c 6f 67 2e 4c 6f 67 4d 65 73 73 61 67 65 28 43  Log.LogMessage(C
4ad0: 4f 52 5f 45 5f 45 58 43 45 50 54 49 4f 4e 2c 20  OR_E_EXCEPTION, 
4ae0: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 20 20 20 20 43 75 6c 74 75 72 65 49          CultureI
4b10: 6e 66 6f 2e 43 75 72 72 65 6e 74 43 75 6c 74 75  nfo.CurrentCultu
4b20: 72 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  re,..           
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61               "Ca
4b40: 75 67 68 74 20 65 78 63 65 70 74 69 6f 6e 20 69  ught exception i
4b50: 6e 20 5c 22 43 6f 6d 70 61 72 65 5c 22 20 28 55  n \"Compare\" (U
4b60: 54 46 31 36 29 20 6d 65 74 68 6f 64 3a 20 7b 30  TF16) method: {0
4b70: 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 29 29               e))
4b90: 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20  ; /* throw */.. 
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74  .            cat
4bd0: 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch..            
4be0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
4bf0: 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67     // do nothing
4c00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ...            }
4c10: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6c  ..        }..#el
4c20: 73 65 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  se..        catc
4c30: 68 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20  h /* NOTE: Must 
4c40: 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20  catch ALL. */.. 
4c50: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
4c60: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
4c70: 69 6e 67 20 28 57 69 6e 64 6f 77 73 20 43 45 29  ing (Windows CE)
4c80: 2e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65  ...        }..#e
4c90: 6e 64 69 66 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ndif....        
4ca0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e  //..        // N
4cb0: 4f 54 45 3a 20 54 68 69 73 20 6d 75 73 74 20 62  OTE: This must b
4cc0: 65 20 64 6f 6e 65 20 74 6f 20 70 72 65 76 65 6e  e done to preven
4cd0: 74 20 74 68 65 20 63 6f 72 65 20 53 51 4c 69 74  t the core SQLit
4ce0: 65 20 6c 69 62 72 61 72 79 20 66 72 6f 6d 0d 0a  e library from..
4cf0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
4d00: 20 75 73 69 6e 67 20 6f 75 72 20 28 69 6e 76 61   using our (inva
4d10: 6c 69 64 29 20 72 65 73 75 6c 74 2e 0d 0a 20 20  lid) result...  
4d20: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
4d30: 20 20 69 66 20 28 5f 62 61 73 65 20 21 3d 20 6e    if (_base != n
4d40: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
4d50: 20 20 5f 62 61 73 65 2e 43 61 6e 63 65 6c 28 29    _base.Cancel()
4d60: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ;....        ret
4d70: 75 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  urn 0;..    }...
4d80: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
4d90: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  y>..    /// The 
4da0: 69 6e 74 65 72 6e 61 6c 20 61 67 67 72 65 67 61  internal aggrega
4db0: 74 65 20 53 74 65 70 20 66 75 6e 63 74 69 6f 6e  te Step function
4dc0: 20 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69 63 68   callback, which
4dd0: 20 77 72 61 70 73 20 74 68 65 20 72 61 77 20 63   wraps the raw c
4de0: 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61  ontext pointer a
4df0: 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72  nd calls the vir
4e00: 74 75 61 6c 20 53 74 65 70 28 29 20 6d 65 74 68  tual Step() meth
4e10: 6f 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52  od...    /// WAR
4e20: 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74  NING: Must not t
4e30: 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e  hrow exceptions.
4e40: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
4e50: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ary>..    /// <r
4e60: 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f  emarks>..    ///
4e70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
4e80: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 64 6f 69  akes care of doi
4e90: 6e 67 20 74 68 65 20 6c 6f 6f 6b 75 70 73 20 61  ng the lookups a
4ea0: 6e 64 20 67 65 74 74 69 6e 67 20 74 68 65 20 69  nd getting the i
4eb0: 6d 70 6f 72 74 61 6e 74 20 69 6e 66 6f 72 6d 61  mportant informa
4ec0: 74 69 6f 6e 20 70 75 74 20 74 6f 67 65 74 68 65  tion put togethe
4ed0: 72 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 53 74  r to call the St
4ee0: 65 70 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a  ep() function...
4ef0: 20 20 20 20 2f 2f 2f 20 54 68 61 74 20 69 6e 63      /// That inc
4f00: 6c 75 64 65 73 20 70 75 6c 6c 69 6e 67 20 6f 75  ludes pulling ou
4f10: 74 20 74 68 65 20 75 73 65 72 27 73 20 63 6f 6e  t the user's con
4f20: 74 65 78 74 44 61 74 61 20 61 6e 64 20 75 70 64  textData and upd
4f30: 61 74 69 6e 67 20 69 74 20 61 66 74 65 72 20 74  ating it after t
4f40: 68 65 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 2e  he call is made.
4f50: 20 20 57 65 20 75 73 65 20 61 20 73 6f 72 74 65    We use a sorte
4f60: 64 20 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  d list for this 
4f70: 73 6f 0d 0a 20 20 20 20 2f 2f 2f 20 62 69 6e 61  so..    /// bina
4f80: 72 79 20 73 65 61 72 63 68 65 73 20 63 61 6e 20  ry searches can 
4f90: 62 65 20 64 6f 6e 65 20 74 6f 20 66 69 6e 64 20  be done to find 
4fa0: 74 68 65 20 64 61 74 61 2e 0d 0a 20 20 20 20 2f  the data...    /
4fb0: 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20  // </remarks>.. 
4fc0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
4fd0: 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e 41 20 72  me="context">A r
4fe0: 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74  aw context point
4ff0: 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  er</param>..    
5000: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
5010: 22 6e 41 72 67 73 22 3e 4e 75 6d 62 65 72 20 6f  "nArgs">Number o
5020: 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
5030: 65 64 20 69 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ed in</param>.. 
5040: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
5050: 6d 65 3d 22 61 72 67 73 70 74 72 22 3e 41 20 70  me="argsptr">A p
5060: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
5070: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
5080: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 69 6e  </param>..    in
5090: 74 65 72 6e 61 6c 20 76 6f 69 64 20 53 74 65 70  ternal void Step
50a0: 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20  Callback(IntPtr 
50b0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e 41 72  context, int nAr
50c0: 67 73 2c 20 49 6e 74 50 74 72 20 61 72 67 73 70  gs, IntPtr argsp
50d0: 74 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  tr)..    {..    
50e0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
50f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5100: 41 67 67 72 65 67 61 74 65 44 61 74 61 20 64 61  AggregateData da
5110: 74 61 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  ta = null;....  
5120: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f 62            if (_b
5130: 61 73 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ase != null)..  
5140: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74               Int
5160: 50 74 72 20 6e 41 75 78 20 3d 20 5f 62 61 73 65  Ptr nAux = _base
5170: 2e 41 67 67 72 65 67 61 74 65 43 6f 6e 74 65 78  .AggregateContex
5180: 74 28 63 6f 6e 74 65 78 74 29 3b 0d 0a 0d 0a 20  t(context);.... 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
51a0: 66 20 28 28 5f 63 6f 6e 74 65 78 74 44 61 74 61  f ((_contextData
51b0: 4c 69 73 74 20 21 3d 20 6e 75 6c 6c 29 20 26 26  List != null) &&
51c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
51d0: 20 20 20 20 20 20 21 5f 63 6f 6e 74 65 78 74 44        !_contextD
51e0: 61 74 61 4c 69 73 74 2e 54 72 79 47 65 74 56 61  ataList.TryGetVa
51f0: 6c 75 65 28 6e 41 75 78 2c 20 6f 75 74 20 64 61  lue(nAux, out da
5200: 74 61 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ta))..          
5210: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
5230: 61 20 3d 20 6e 65 77 20 41 67 67 72 65 67 61 74  a = new Aggregat
5240: 65 44 61 74 61 28 29 3b 0d 0a 20 20 20 20 20 20  eData();..      
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63                _c
5260: 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 5b 6e  ontextDataList[n
5270: 41 75 78 5d 20 3d 20 64 61 74 61 3b 0d 0a 20 20  Aux] = data;..  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
5290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
52a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
52b0: 20 28 64 61 74 61 20 3d 3d 20 6e 75 6c 6c 29 0d   (data == null).
52c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
52d0: 20 64 61 74 61 20 3d 20 6e 65 77 20 41 67 67 72   data = new Aggr
52e0: 65 67 61 74 65 44 61 74 61 28 29 3b 0d 0a 0d 0a  egateData();....
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
5300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5320: 5f 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65  _context = conte
5330: 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  xt;..           
5340: 20 20 20 20 20 53 74 65 70 28 43 6f 6e 76 65 72       Step(Conver
5350: 74 50 61 72 61 6d 73 28 6e 41 72 67 73 2c 20 61  tParams(nArgs, a
5360: 72 67 73 70 74 72 29 2c 0d 0a 20 20 20 20 20 20  rgsptr),..      
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
5380: 74 61 2e 5f 63 6f 75 6e 74 2c 20 72 65 66 20 64  ta._count, ref d
5390: 61 74 61 2e 5f 64 61 74 61 29 3b 20 2f 2a 20 74  ata._data); /* t
53a0: 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20  hrow */..       
53b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
53c0: 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20      finally..   
53d0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
53f0: 2e 5f 63 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 20 20  ._count++;..    
5400: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5410: 20 20 20 7d 0d 0a 23 69 66 20 21 50 4c 41 54 46     }..#if !PLATF
5420: 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45  ORM_COMPACTFRAME
5430: 57 4f 52 4b 0d 0a 20 20 20 20 20 20 20 20 63 61  WORK..        ca
5440: 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65  tch (Exception e
5450: 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20  ) /* NOTE: Must 
5460: 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20  catch ALL. */.. 
5470: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5480: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
5490: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
54a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f            if ((_
54b0: 66 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43 6f  flags & SQLiteCo
54c0: 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f  nnectionFlags.Lo
54d0: 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69  gCallbackExcepti
54e0: 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20  on) ==..        
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
5510: 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63  Flags.LogCallbac
5520: 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20  kException)..   
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f      SQLiteLog.Lo
5560: 67 4d 65 73 73 61 67 65 28 43 4f 52 5f 45 5f 45  gMessage(COR_E_E
5570: 58 43 45 50 54 49 4f 4e 2c 20 53 74 72 69 6e 67  XCEPTION, String
5580: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75    CultureInfo.Cu
55b0: 72 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20  rrentCulture,.. 
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 20 20 20 20 22 43 61 75 67 68 74 20 65         "Caught e
55e0: 78 63 65 70 74 69 6f 6e 20 69 6e 20 5c 22 53 74  xception in \"St
55f0: 65 70 5c 22 20 6d 65 74 68 6f 64 3a 20 7b 31 7d  ep\" method: {1}
5600: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
5610: 20 20 20 20 20 20 20 20 20 20 20 20 65 29 29 3b              e));
5620: 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20   /* throw */..  
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
5640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
5650: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
5660: 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  h..            {
5670: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5680: 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e    // do nothing.
5690: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
56a0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6c 73  .        }..#els
56b0: 65 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  e..        catch
56c0: 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63   /* NOTE: Must c
56d0: 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20  atch ALL. */..  
56e0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
56f0: 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69       // do nothi
5700: 6e 67 20 28 57 69 6e 64 6f 77 73 20 43 45 29 2e  ng (Windows CE).
5710: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6e  ..        }..#en
5720: 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  dif..    }....  
5730: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
5740: 0a 20 20 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65  .    /// An inte
5750: 72 6e 61 6c 20 61 67 67 72 65 67 61 74 65 20 46  rnal aggregate F
5760: 69 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 63 61  inal function ca
5770: 6c 6c 62 61 63 6b 2c 20 77 68 69 63 68 20 77 72  llback, which wr
5780: 61 70 73 20 74 68 65 20 63 6f 6e 74 65 78 74 20  aps the context 
5790: 70 6f 69 6e 74 65 72 20 61 6e 64 20 63 61 6c 6c  pointer and call
57a0: 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 46 69  s the virtual Fi
57b0: 6e 61 6c 28 29 20 6d 65 74 68 6f 64 2e 0d 0a 20  nal() method... 
57c0: 20 20 20 2f 2f 2f 20 57 41 52 4e 49 4e 47 3a 20     /// WARNING: 
57d0: 4d 75 73 74 20 6e 6f 74 20 74 68 72 6f 77 20 65  Must not throw e
57e0: 78 63 65 70 74 69 6f 6e 73 2e 0d 0a 20 20 20 20  xceptions...    
57f0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
5800: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
5810: 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e 41 20  ame="context">A 
5820: 72 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e  raw context poin
5830: 74 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  ter</param>..   
5840: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 46   internal void F
5850: 69 6e 61 6c 43 61 6c 6c 62 61 63 6b 28 49 6e 74  inalCallback(Int
5860: 50 74 72 20 63 6f 6e 74 65 78 74 29 0d 0a 20 20  Ptr context)..  
5870: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79    {..        try
5880: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
5890: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
58a0: 6f 62 6a 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  obj = null;.... 
58b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f             if (_
58c0: 62 61 73 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  base != null).. 
58d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
58f0: 74 50 74 72 20 6e 20 3d 20 5f 62 61 73 65 2e 41  tPtr n = _base.A
5900: 67 67 72 65 67 61 74 65 43 6f 6e 74 65 78 74 28  ggregateContext(
5910: 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20  context);..     
5920: 20 20 20 20 20 20 20 20 20 20 20 41 67 67 72 65             Aggre
5930: 67 61 74 65 44 61 74 61 20 61 67 67 44 61 74 61  gateData aggData
5940: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
5950: 20 20 20 20 20 69 66 20 28 28 5f 63 6f 6e 74 65       if ((_conte
5960: 78 74 44 61 74 61 4c 69 73 74 20 21 3d 20 6e 75  xtDataList != nu
5970: 6c 6c 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20  ll) &&..        
5980: 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e              _con
5990: 74 65 78 74 44 61 74 61 4c 69 73 74 2e 54 72 79  textDataList.Try
59a0: 47 65 74 56 61 6c 75 65 28 6e 2c 20 6f 75 74 20  GetValue(n, out 
59b0: 61 67 67 44 61 74 61 29 29 0d 0a 20 20 20 20 20  aggData))..     
59c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 6f 62 6a 20 3d 20 61 67 67 44 61 74 61 2e    obj = aggData.
59f0: 5f 64 61 74 61 3b 0d 0a 20 20 20 20 20 20 20 20  _data;..        
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e              _con
5a10: 74 65 78 74 44 61 74 61 4c 69 73 74 2e 52 65 6d  textDataList.Rem
5a20: 6f 76 65 28 6e 29 3b 0d 0a 20 20 20 20 20 20 20  ove(n);..       
5a30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5a40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5a50: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
5a60: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f               _co
5a80: 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74 3b  ntext = context;
5a90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5aa0: 20 20 53 65 74 52 65 74 75 72 6e 56 61 6c 75 65    SetReturnValue
5ab0: 28 63 6f 6e 74 65 78 74 2c 20 46 69 6e 61 6c 28  (context, Final(
5ac0: 6f 62 6a 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20  obj)); /* throw 
5ad0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
5ae0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  }..            f
5af0: 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  inally..        
5b00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5b10: 20 20 20 20 20 20 20 49 44 69 73 70 6f 73 61 62         IDisposab
5b20: 6c 65 20 64 69 73 70 20 3d 20 6f 62 6a 20 61 73  le disp = obj as
5b30: 20 49 44 69 73 70 6f 73 61 62 6c 65 3b 0d 0a 20   IDisposable;.. 
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5b50: 66 20 28 64 69 73 70 20 21 3d 20 6e 75 6c 6c 29  f (disp != null)
5b60: 20 64 69 73 70 2e 44 69 73 70 6f 73 65 28 29 3b   disp.Dispose();
5b70: 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20   /* throw */..  
5b80: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5b90: 20 20 20 20 20 7d 0d 0a 23 69 66 20 21 50 4c 41       }..#if !PLA
5ba0: 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
5bb0: 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 20 20 20 20  MEWORK..        
5bc0: 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e  catch (Exception
5bd0: 20 65 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73   e) /* NOTE: Mus
5be0: 74 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d  t catch ALL. */.
5bf0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
5c00: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
5c10: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5c30: 28 5f 66 6c 61 67 73 20 26 20 53 51 4c 69 74 65  (_flags & SQLite
5c40: 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e  ConnectionFlags.
5c50: 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70  LogCallbackExcep
5c60: 74 69 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20  tion) ==..      
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
5c90: 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62  onFlags.LogCallb
5ca0: 61 63 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20  ackException).. 
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5cd0: 20 20 20 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e        SQLiteLog.
5ce0: 4c 6f 67 4d 65 73 73 61 67 65 28 43 4f 52 5f 45  LogMessage(COR_E
5cf0: 5f 45 58 43 45 50 54 49 4f 4e 2c 20 53 74 72 69  _EXCEPTION, Stri
5d00: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 20 20 20 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e      CultureInfo.
5d30: 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d  CurrentCulture,.
5d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d50: 20 20 20 20 20 20 20 20 20 22 43 61 75 67 68 74           "Caught
5d60: 20 65 78 63 65 70 74 69 6f 6e 20 69 6e 20 5c 22   exception in \"
5d70: 46 69 6e 61 6c 5c 22 20 6d 65 74 68 6f 64 3a 20  Final\" method: 
5d80: 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
5da0: 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d  )); /* throw */.
5db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5dc0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
5dd0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  }..            c
5de0: 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20  atch..          
5df0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
5e00: 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69       // do nothi
5e10: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
5e20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23   }..        }..#
5e30: 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 63 61  else..        ca
5e40: 74 63 68 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73  tch /* NOTE: Mus
5e50: 74 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d  t catch ALL. */.
5e60: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
5e70: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
5e80: 74 68 69 6e 67 20 28 57 69 6e 64 6f 77 73 20 43  thing (Windows C
5e90: 45 29 2e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  E)...        }..
5ea0: 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d  #endif..    }...
5eb0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
5ec0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 55 73 69 6e  y>..    /// Usin
5ed0: 67 20 72 65 66 6c 65 63 74 69 6f 6e 2c 20 65 6e  g reflection, en
5ee0: 75 6d 65 72 61 74 65 20 61 6c 6c 20 61 73 73 65  umerate all asse
5ef0: 6d 62 6c 69 65 73 20 69 6e 20 74 68 65 20 63 75  mblies in the cu
5f00: 72 72 65 6e 74 20 61 70 70 64 6f 6d 61 69 6e 20  rrent appdomain 
5f10: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 6c 61 73  looking for clas
5f20: 73 65 73 20 74 68 61 74 0d 0a 20 20 20 20 2f 2f  ses that..    //
5f30: 2f 20 68 61 76 65 20 61 20 53 51 4c 69 74 65 46  / have a SQLiteF
5f40: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
5f50: 20 61 74 74 72 69 62 75 74 65 2c 20 61 6e 64 20   attribute, and 
5f60: 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 6d  registering them
5f70: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0d 0a 20   accordingly... 
5f80: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
5f90: 3e 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d  >..#if !PLATFORM
5fa0: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
5fb0: 4b 0d 0a 20 20 20 20 5b 53 65 63 75 72 69 74 79  K..    [Security
5fc0: 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e 46 69 6c  .Permissions.Fil
5fd0: 65 49 4f 50 65 72 6d 69 73 73 69 6f 6e 28 53 65  eIOPermission(Se
5fe0: 63 75 72 69 74 79 2e 50 65 72 6d 69 73 73 69 6f  curity.Permissio
5ff0: 6e 73 2e 53 65 63 75 72 69 74 79 41 63 74 69 6f  ns.SecurityActio
6000: 6e 2e 41 73 73 65 72 74 2c 20 41 6c 6c 46 69 6c  n.Assert, AllFil
6010: 65 73 20 3d 20 53 65 63 75 72 69 74 79 2e 50 65  es = Security.Pe
6020: 72 6d 69 73 73 69 6f 6e 73 2e 46 69 6c 65 49 4f  rmissions.FileIO
6030: 50 65 72 6d 69 73 73 69 6f 6e 41 63 63 65 73 73  PermissionAccess
6040: 2e 50 61 74 68 44 69 73 63 6f 76 65 72 79 29 5d  .PathDiscovery)]
6050: 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 73 74  ..#endif..    st
6060: 61 74 69 63 20 53 51 4c 69 74 65 46 75 6e 63 74  atic SQLiteFunct
6070: 69 6f 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ion()..    {..  
6080: 20 20 20 20 5f 72 65 67 69 73 74 65 72 65 64 46      _registeredF
6090: 75 6e 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 4c  unctions = new L
60a0: 69 73 74 3c 53 51 4c 69 74 65 46 75 6e 63 74 69  ist<SQLiteFuncti
60b0: 6f 6e 41 74 74 72 69 62 75 74 65 3e 28 29 3b 0d  onAttribute>();.
60c0: 0a 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20  .      try..    
60d0: 20 20 7b 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f    {..#if !PLATFO
60e0: 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
60f0: 4f 52 4b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d  ORK..        //.
6100: 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45  .        // NOTE
6110: 3a 20 49 66 20 74 68 65 20 22 4e 6f 5f 53 51 4c  : If the "No_SQL
6120: 69 74 65 46 75 6e 63 74 69 6f 6e 73 22 20 65 6e  iteFunctions" en
6130: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
6140: 6c 65 20 69 73 20 73 65 74 2c 0d 0a 20 20 20 20  le is set,..    
6150: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 73 6b 69      //       ski
6160: 70 20 61 6c 6c 20 6f 75 72 20 73 70 65 63 69 61  p all our specia
6170: 6c 20 63 6f 64 65 20 61 6e 64 20 73 69 6d 70 6c  l code and simpl
6180: 79 20 72 65 74 75 72 6e 2e 0d 0a 20 20 20 20 20  y return...     
6190: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 69     //..        i
61a0: 66 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 47  f (Environment.G
61b0: 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  etEnvironmentVar
61c0: 69 61 62 6c 65 28 22 4e 6f 5f 53 51 4c 69 74 65  iable("No_SQLite
61d0: 46 75 6e 63 74 69 6f 6e 73 22 29 20 21 3d 20 6e  Functions") != n
61e0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
61f0: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
6200: 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f     SQLiteFunctio
6210: 6e 41 74 74 72 69 62 75 74 65 20 61 74 3b 0d 0a  nAttribute at;..
6220: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 52          System.R
6230: 65 66 6c 65 63 74 69 6f 6e 2e 41 73 73 65 6d 62  eflection.Assemb
6240: 6c 79 5b 5d 20 61 72 41 73 73 65 6d 62 6c 69 65  ly[] arAssemblie
6250: 73 20 3d 20 53 79 73 74 65 6d 2e 41 70 70 44 6f  s = System.AppDo
6260: 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61  main.CurrentDoma
6270: 69 6e 2e 47 65 74 41 73 73 65 6d 62 6c 69 65 73  in.GetAssemblies
6280: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  ();..        int
6290: 20 77 20 3d 20 61 72 41 73 73 65 6d 62 6c 69 65   w = arAssemblie
62a0: 73 2e 4c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20  s.Length;..     
62b0: 20 20 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63     System.Reflec
62c0: 74 69 6f 6e 2e 41 73 73 65 6d 62 6c 79 4e 61 6d  tion.AssemblyNam
62d0: 65 20 73 71 6c 69 74 65 20 3d 20 53 79 73 74 65  e sqlite = Syste
62e0: 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 41 73 73  m.Reflection.Ass
62f0: 65 6d 62 6c 79 2e 47 65 74 43 61 6c 6c 69 6e 67  embly.GetCalling
6300: 41 73 73 65 6d 62 6c 79 28 29 2e 47 65 74 4e 61  Assembly().GetNa
6310: 6d 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  me();....       
6320: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
6330: 20 6e 20 3c 20 77 3b 20 6e 2b 2b 29 0d 0a 20 20   n < w; n++)..  
6340: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6350: 20 20 20 54 79 70 65 5b 5d 20 61 72 54 79 70 65     Type[] arType
6360: 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 6f  s;..          bo
6370: 6f 6c 20 66 6f 75 6e 64 20 3d 20 66 61 6c 73 65  ol found = false
6380: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  ;..          Sys
6390: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 41  tem.Reflection.A
63a0: 73 73 65 6d 62 6c 79 4e 61 6d 65 5b 5d 20 72 65  ssemblyName[] re
63b0: 66 65 72 65 6e 63 65 73 3b 0d 0a 20 20 20 20 20  ferences;..     
63c0: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
63d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
63e0: 20 20 20 2f 2f 20 49 6e 73 70 65 63 74 20 6f 6e     // Inspect on
63f0: 6c 79 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68  ly assemblies th
6400: 61 74 20 72 65 66 65 72 65 6e 63 65 20 53 51 4c  at reference SQL
6410: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ite..           
6420: 20 72 65 66 65 72 65 6e 63 65 73 20 3d 20 61 72   references = ar
6430: 41 73 73 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65  Assemblies[n].Ge
6440: 74 52 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d  tReferencedAssem
6450: 62 6c 69 65 73 28 29 3b 0d 0a 20 20 20 20 20 20  blies();..      
6460: 20 20 20 20 20 20 69 6e 74 20 74 20 3d 20 72 65        int t = re
6470: 66 65 72 65 6e 63 65 73 2e 4c 65 6e 67 74 68 3b  ferences.Length;
6480: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ..            fo
6490: 72 20 28 69 6e 74 20 7a 20 3d 20 30 3b 20 7a 20  r (int z = 0; z 
64a0: 3c 20 74 3b 20 7a 2b 2b 29 0d 0a 20 20 20 20 20  < t; z++)..     
64b0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
64c0: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 66 65          if (refe
64d0: 72 65 6e 63 65 73 5b 7a 5d 2e 4e 61 6d 65 20 3d  rences[z].Name =
64e0: 3d 20 73 71 6c 69 74 65 2e 4e 61 6d 65 29 0d 0a  = sqlite.Name)..
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
6500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6510: 20 66 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0d 0a   found = true;..
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
6540: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6550: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6560: 20 20 20 20 20 20 69 66 20 28 66 6f 75 6e 64 20        if (found 
6570: 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20 20 20  == false)..     
6580: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6590: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
65a0: 20 20 61 72 54 79 70 65 73 20 3d 20 61 72 41 73    arTypes = arAs
65b0: 73 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65 74 54  semblies[n].GetT
65c0: 79 70 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20  ypes();..       
65d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
65e0: 63 61 74 63 68 20 28 52 65 66 6c 65 63 74 69 6f  catch (Reflectio
65f0: 6e 2e 52 65 66 6c 65 63 74 69 6f 6e 54 79 70 65  n.ReflectionType
6600: 4c 6f 61 64 45 78 63 65 70 74 69 6f 6e 20 65 29  LoadException e)
6610: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
6620: 20 20 20 20 20 20 20 20 20 20 20 61 72 54 79 70             arTyp
6630: 65 73 20 3d 20 65 2e 54 79 70 65 73 3b 0d 0a 20  es = e.Types;.. 
6640: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
6650: 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20          int v = 
6660: 61 72 54 79 70 65 73 2e 4c 65 6e 67 74 68 3b 0d  arTypes.Length;.
6670: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28  .          for (
6680: 69 6e 74 20 78 20 3d 20 30 3b 20 78 20 3c 20 76  int x = 0; x < v
6690: 3b 20 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20  ; x++)..        
66a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
66b0: 20 69 66 20 28 61 72 54 79 70 65 73 5b 78 5d 20   if (arTypes[x] 
66c0: 3d 3d 20 6e 75 6c 6c 29 20 63 6f 6e 74 69 6e 75  == null) continu
66d0: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
66e0: 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72 41 74 74    object[] arAtt
66f0: 20 3d 20 61 72 54 79 70 65 73 5b 78 5d 2e 47 65   = arTypes[x].Ge
6700: 74 43 75 73 74 6f 6d 41 74 74 72 69 62 75 74 65  tCustomAttribute
6710: 73 28 74 79 70 65 6f 66 28 53 51 4c 69 74 65 46  s(typeof(SQLiteF
6720: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
6730: 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  ), false);..    
6740: 20 20 20 20 20 20 20 20 69 6e 74 20 75 20 3d 20          int u = 
6750: 61 72 41 74 74 2e 4c 65 6e 67 74 68 3b 0d 0a 20  arAtt.Length;.. 
6760: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
6770: 69 6e 74 20 79 20 3d 20 30 3b 20 79 20 3c 20 75  int y = 0; y < u
6780: 3b 20 79 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20  ; y++)..        
6790: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
67a0: 20 20 20 20 20 61 74 20 3d 20 61 72 41 74 74 5b       at = arAtt[
67b0: 79 5d 20 61 73 20 53 51 4c 69 74 65 46 75 6e 63  y] as SQLiteFunc
67c0: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 3b 0d 0a  tionAttribute;..
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
67e0: 20 28 61 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20   (at != null).. 
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 61 74 2e 5f 69 6e 73 74 61 6e 63 65 54 79 70 65  at._instanceType
6820: 20 3d 20 61 72 54 79 70 65 73 5b 78 5d 3b 0d 0a   = arTypes[x];..
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 5f 72 65 67 69 73 74 65 72 65 64 46 75 6e 63 74  _registeredFunct
6850: 69 6f 6e 73 2e 41 64 64 28 61 74 29 3b 0d 0a 20  ions.Add(at);.. 
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
6870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
6880: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6890: 20 20 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20      }..#endif.. 
68a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 61       }..      ca
68b0: 74 63 68 20 2f 2f 20 53 51 4c 69 74 65 20 70 72  tch // SQLite pr
68c0: 6f 76 69 64 65 72 20 63 61 6e 20 63 6f 6e 74 69  ovider can conti
68d0: 6e 75 65 20 77 69 74 68 6f 75 74 20 62 65 69 6e  nue without bein
68e0: 67 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 62  g able to find b
68f0: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
6900: 73 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  s..      {..    
6910: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
6920: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
6930: 0a 20 20 20 20 2f 2f 2f 20 4d 61 6e 75 61 6c 20  .    /// Manual 
6940: 6d 65 74 68 6f 64 20 6f 66 20 72 65 67 69 73 74  method of regist
6950: 65 72 69 6e 67 20 61 20 66 75 6e 63 74 69 6f 6e  ering a function
6960: 2e 20 20 54 68 65 20 74 79 70 65 20 6d 75 73 74  .  The type must
6970: 20 73 74 69 6c 6c 20 68 61 76 65 20 74 68 65 20   still have the 
6980: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74  SQLiteFunctionAt
6990: 74 72 69 62 75 74 65 73 20 69 6e 20 6f 72 64 65  tributes in orde
69a0: 72 20 74 6f 20 77 6f 72 6b 0d 0a 20 20 20 20 2f  r to work..    /
69b0: 2f 2f 20 70 72 6f 70 65 72 6c 79 2c 20 62 75 74  // properly, but
69c0: 20 74 68 69 73 20 69 73 20 61 20 77 6f 72 6b 61   this is a worka
69d0: 72 6f 75 6e 64 20 66 6f 72 20 74 68 65 20 43 6f  round for the Co
69e0: 6d 70 61 63 74 20 46 72 61 6d 65 77 6f 72 6b 20  mpact Framework 
69f0: 77 68 65 72 65 20 65 6e 75 6d 65 72 61 74 69 6e  where enumeratin
6a00: 67 20 61 73 73 65 6d 62 6c 69 65 73 20 69 73 20  g assemblies is 
6a10: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
6a20: 70 70 6f 72 74 65 64 2e 0d 0a 20 20 20 20 2f 2f  pported...    //
6a30: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
6a40: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
6a50: 65 3d 22 74 79 70 22 3e 54 68 65 20 74 79 70 65  e="typ">The type
6a60: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
6a70: 20 74 6f 20 72 65 67 69 73 74 65 72 3c 2f 70 61   to register</pa
6a80: 72 61 6d 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63  ram>..    public
6a90: 20 73 74 61 74 69 63 20 76 6f 69 64 20 52 65 67   static void Reg
6aa0: 69 73 74 65 72 46 75 6e 63 74 69 6f 6e 28 54 79  isterFunction(Ty
6ab0: 70 65 20 74 79 70 29 0d 0a 20 20 20 20 7b 0d 0a  pe typ)..    {..
6ac0: 20 20 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 61        object[] a
6ad0: 72 41 74 74 20 3d 20 74 79 70 2e 47 65 74 43 75  rAtt = typ.GetCu
6ae0: 73 74 6f 6d 41 74 74 72 69 62 75 74 65 73 28 74  stomAttributes(t
6af0: 79 70 65 6f 66 28 53 51 4c 69 74 65 46 75 6e 63  ypeof(SQLiteFunc
6b00: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 29 2c 20  tionAttribute), 
6b10: 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 69  false);..      i
6b20: 6e 74 20 75 20 3d 20 61 72 41 74 74 2e 4c 65 6e  nt u = arAtt.Len
6b30: 67 74 68 3b 0d 0a 20 20 20 20 20 20 53 51 4c 69  gth;..      SQLi
6b40: 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  teFunctionAttrib
6b50: 75 74 65 20 61 74 3b 0d 0a 0d 0a 20 20 20 20 20  ute at;....     
6b60: 20 66 6f 72 20 28 69 6e 74 20 79 20 3d 20 30 3b   for (int y = 0;
6b70: 20 79 20 3c 20 75 3b 20 79 2b 2b 29 0d 0a 20 20   y < u; y++)..  
6b80: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 61      {..        a
6b90: 74 20 3d 20 61 72 41 74 74 5b 79 5d 20 61 73 20  t = arAtt[y] as 
6ba0: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74  SQLiteFunctionAt
6bb0: 74 72 69 62 75 74 65 3b 0d 0a 20 20 20 20 20 20  tribute;..      
6bc0: 20 20 69 66 20 28 61 74 20 21 3d 20 6e 75 6c 6c    if (at != null
6bd0: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
6be0: 20 20 20 20 20 20 20 20 61 74 2e 5f 69 6e 73 74          at._inst
6bf0: 61 6e 63 65 54 79 70 65 20 3d 20 74 79 70 3b 0d  anceType = typ;.
6c00: 0a 20 20 20 20 20 20 20 20 20 20 5f 72 65 67 69  .          _regi
6c10: 73 74 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 2e  steredFunctions.
6c20: 41 64 64 28 61 74 29 3b 0d 0a 20 20 20 20 20 20  Add(at);..      
6c30: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
6c40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
6c50: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
6c60: 2f 20 43 61 6c 6c 65 64 20 62 79 20 53 51 4c 69  / Called by SQLi
6c70: 74 65 42 61 73 65 20 64 65 72 69 76 65 64 20 63  teBase derived c
6c80: 6c 61 73 73 65 73 2c 20 74 68 69 73 20 66 75 6e  lasses, this fun
6c90: 63 74 69 6f 6e 20 62 69 6e 64 73 20 61 6c 6c 20  ction binds all 
6ca0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
6cb0: 63 74 69 6f 6e 73 20 74 6f 20 61 20 63 6f 6e 6e  ctions to a conn
6cc0: 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f  ection...    ///
6cd0: 20 49 74 20 69 73 20 64 6f 6e 65 20 74 68 69 73   It is done this
6ce0: 20 77 61 79 20 73 6f 20 74 68 61 74 20 61 6c 6c   way so that all
6cf0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
6d00: 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 61 63 63  nctions will acc
6d10: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
6d20: 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
6d30: 65 6e 63 6f 64 69 6e 67 20 73 63 68 65 6d 65 0d  encoding scheme.
6d40: 0a 20 20 20 20 2f 2f 2f 20 61 73 20 74 68 65 20  .    /// as the 
6d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 55 54 46 2d  connection (UTF-
6d60: 38 20 6f 72 20 55 54 46 2d 31 36 29 2e 0d 0a 20  8 or UTF-16)... 
6d70: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
6d80: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61  >..    /// <rema
6d90: 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  rks>..    /// Th
6da0: 65 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69  e wrapper functi
6db0: 6f 6e 73 20 74 68 61 74 20 69 6e 74 65 72 6f 70  ons that interop
6dc0: 20 77 69 74 68 20 53 51 4c 69 74 65 20 77 69 6c   with SQLite wil
6dd0: 6c 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  l create a uniqu
6de0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2c 20  e cookie value, 
6df0: 77 68 69 63 68 20 69 6e 74 65 72 6e 61 6c 6c 79  which internally
6e00: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
6e10: 0d 0a 20 20 20 20 2f 2f 2f 20 61 6c 6c 20 74 68  ..    /// all th
6e20: 65 20 77 72 61 70 70 65 64 20 63 61 6c 6c 62 61  e wrapped callba
6e30: 63 6b 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  ck functions.  T
6e40: 68 65 20 69 6e 74 65 72 6f 70 20 66 75 6e 63 74  he interop funct
6e50: 69 6f 6e 20 75 73 65 73 20 69 74 20 74 6f 20 6d  ion uses it to m
6e60: 61 70 20 43 44 65 63 6c 20 63 61 6c 6c 62 61 63  ap CDecl callbac
6e70: 6b 73 20 74 6f 20 53 74 64 43 61 6c 6c 20 63 61  ks to StdCall ca
6e80: 6c 6c 62 61 63 6b 73 2e 0d 0a 20 20 20 20 2f 2f  llbacks...    //
6e90: 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20 20  / </remarks>..  
6ea0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
6eb0: 65 3d 22 73 71 6c 62 61 73 65 22 3e 54 68 65 20  e="sqlbase">The 
6ec0: 62 61 73 65 20 6f 62 6a 65 63 74 20 6f 6e 20 77  base object on w
6ed0: 68 69 63 68 20 74 68 65 20 66 75 6e 63 74 69 6f  hich the functio
6ee0: 6e 73 20 61 72 65 20 74 6f 20 62 69 6e 64 3c 2f  ns are to bind</
6ef0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
6f00: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 6c 61  <param name="fla
6f10: 67 73 22 3e 54 68 65 20 66 6c 61 67 73 20 61 73  gs">The flags as
6f20: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
6f30: 65 20 70 61 72 65 6e 74 20 63 6f 6e 6e 65 63 74  e parent connect
6f40: 69 6f 6e 20 6f 62 6a 65 63 74 3c 2f 70 61 72 61  ion object</para
6f50: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
6f60: 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 61 6e 20  urns>Returns an 
6f70: 61 72 72 61 79 20 6f 66 20 66 75 6e 63 74 69 6f  array of functio
6f80: 6e 73 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e  ns which the con
6f90: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 73  nection object s
6fa0: 68 6f 75 6c 64 20 72 65 74 61 69 6e 20 75 6e 74  hould retain unt
6fb0: 69 6c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  il the connectio
6fc0: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 3c 2f 72 65  n is closed.</re
6fd0: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65  turns>..    inte
6fe0: 72 6e 61 6c 20 73 74 61 74 69 63 20 53 51 4c 69  rnal static SQLi
6ff0: 74 65 46 75 6e 63 74 69 6f 6e 5b 5d 20 42 69 6e  teFunction[] Bin
7000: 64 46 75 6e 63 74 69 6f 6e 73 28 53 51 4c 69 74  dFunctions(SQLit
7010: 65 42 61 73 65 20 73 71 6c 62 61 73 65 2c 20 53  eBase sqlbase, S
7020: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
7030: 6c 61 67 73 20 66 6c 61 67 73 29 0d 0a 20 20 20  lags flags)..   
7040: 20 7b 0d 0a 20 20 20 20 20 20 53 51 4c 69 74 65   {..      SQLite
7050: 46 75 6e 63 74 69 6f 6e 20 66 3b 0d 0a 20 20 20  Function f;..   
7060: 20 20 20 4c 69 73 74 3c 53 51 4c 69 74 65 46 75     List<SQLiteFu
7070: 6e 63 74 69 6f 6e 3e 20 6c 46 75 6e 63 74 69 6f  nction> lFunctio
7080: 6e 73 20 3d 20 6e 65 77 20 4c 69 73 74 3c 53 51  ns = new List<SQ
7090: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 3e 28 29 3b  LiteFunction>();
70a0: 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
70b0: 68 20 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  h (SQLiteFunctio
70c0: 6e 41 74 74 72 69 62 75 74 65 20 70 72 20 69 6e  nAttribute pr in
70d0: 20 5f 72 65 67 69 73 74 65 72 65 64 46 75 6e 63   _registeredFunc
70e0: 74 69 6f 6e 73 29 0d 0a 20 20 20 20 20 20 7b 0d  tions)..      {.
70f0: 0a 20 20 20 20 20 20 20 20 66 20 3d 20 28 53 51  .        f = (SQ
7100: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 29 41 63 74  LiteFunction)Act
7110: 69 76 61 74 6f 72 2e 43 72 65 61 74 65 49 6e 73  ivator.CreateIns
7120: 74 61 6e 63 65 28 70 72 2e 5f 69 6e 73 74 61 6e  tance(pr._instan
7130: 63 65 54 79 70 65 29 3b 0d 0a 0d 0a 20 20 20 20  ceType);....    
7140: 20 20 20 20 66 2e 5f 62 61 73 65 20 3d 20 73 71      f._base = sq
7150: 6c 62 61 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  lbase;..        
7160: 66 2e 5f 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  f._flags = flags
7170: 3b 0d 0a 20 20 20 20 20 20 20 20 66 2e 5f 49 6e  ;..        f._In
7180: 76 6f 6b 65 46 75 6e 63 20 3d 20 28 70 72 2e 46  vokeFunc = (pr.F
7190: 75 6e 63 54 79 70 65 20 3d 3d 20 46 75 6e 63 74  uncType == Funct
71a0: 69 6f 6e 54 79 70 65 2e 53 63 61 6c 61 72 29 20  ionType.Scalar) 
71b0: 3f 20 6e 65 77 20 53 51 4c 69 74 65 43 61 6c 6c  ? new SQLiteCall
71c0: 62 61 63 6b 28 66 2e 53 63 61 6c 61 72 43 61 6c  back(f.ScalarCal
71d0: 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0d 0a  lback) : null;..
71e0: 20 20 20 20 20 20 20 20 66 2e 5f 53 74 65 70 46          f._StepF
71f0: 75 6e 63 20 3d 20 28 70 72 2e 46 75 6e 63 54 79  unc = (pr.FuncTy
7200: 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79  pe == FunctionTy
7210: 70 65 2e 41 67 67 72 65 67 61 74 65 29 20 3f 20  pe.Aggregate) ? 
7220: 6e 65 77 20 53 51 4c 69 74 65 43 61 6c 6c 62 61  new SQLiteCallba
7230: 63 6b 28 66 2e 53 74 65 70 43 61 6c 6c 62 61 63  ck(f.StepCallbac
7240: 6b 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  k) : null;..    
7250: 20 20 20 20 66 2e 5f 46 69 6e 61 6c 46 75 6e 63      f._FinalFunc
7260: 20 3d 20 28 70 72 2e 46 75 6e 63 54 79 70 65 20   = (pr.FuncType 
7270: 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e  == FunctionType.
7280: 41 67 67 72 65 67 61 74 65 29 20 3f 20 6e 65 77  Aggregate) ? new
7290: 20 53 51 4c 69 74 65 46 69 6e 61 6c 43 61 6c 6c   SQLiteFinalCall
72a0: 62 61 63 6b 28 66 2e 46 69 6e 61 6c 43 61 6c 6c  back(f.FinalCall
72b0: 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 20  back) : null;.. 
72c0: 20 20 20 20 20 20 20 66 2e 5f 43 6f 6d 70 61 72         f._Compar
72d0: 65 46 75 6e 63 20 3d 20 28 70 72 2e 46 75 6e 63  eFunc = (pr.Func
72e0: 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e  Type == Function
72f0: 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 20  Type.Collation) 
7300: 3f 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6c 6c  ? new SQLiteColl
7310: 61 74 69 6f 6e 28 66 2e 43 6f 6d 70 61 72 65 43  ation(f.CompareC
7320: 61 6c 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b  allback) : null;
7330: 0d 0a 20 20 20 20 20 20 20 20 66 2e 5f 43 6f 6d  ..        f._Com
7340: 70 61 72 65 46 75 6e 63 31 36 20 3d 20 28 70 72  pareFunc16 = (pr
7350: 2e 46 75 6e 63 54 79 70 65 20 3d 3d 20 46 75 6e  .FuncType == Fun
7360: 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74  ctionType.Collat
7370: 69 6f 6e 29 20 3f 20 6e 65 77 20 53 51 4c 69 74  ion) ? new SQLit
7380: 65 43 6f 6c 6c 61 74 69 6f 6e 28 66 2e 43 6f 6d  eCollation(f.Com
7390: 70 61 72 65 43 61 6c 6c 62 61 63 6b 31 36 29 20  pareCallback16) 
73a0: 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  : null;....     
73b0: 20 20 20 69 66 20 28 70 72 2e 46 75 6e 63 54 79     if (pr.FuncTy
73c0: 70 65 20 21 3d 20 46 75 6e 63 74 69 6f 6e 54 79  pe != FunctionTy
73d0: 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 0d 0a 20  pe.Collation).. 
73e0: 20 20 20 20 20 20 20 20 20 73 71 6c 62 61 73 65           sqlbase
73f0: 2e 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28  .CreateFunction(
7400: 70 72 2e 4e 61 6d 65 2c 20 70 72 2e 41 72 67 75  pr.Name, pr.Argu
7410: 6d 65 6e 74 73 2c 20 28 66 20 69 73 20 53 51 4c  ments, (f is SQL
7420: 69 74 65 46 75 6e 63 74 69 6f 6e 45 78 29 2c 20  iteFunctionEx), 
7430: 66 2e 5f 49 6e 76 6f 6b 65 46 75 6e 63 2c 20 66  f._InvokeFunc, f
7440: 2e 5f 53 74 65 70 46 75 6e 63 2c 20 66 2e 5f 46  ._StepFunc, f._F
7450: 69 6e 61 6c 46 75 6e 63 29 3b 0d 0a 20 20 20 20  inalFunc);..    
7460: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
7470: 20 20 20 20 73 71 6c 62 61 73 65 2e 43 72 65 61      sqlbase.Crea
7480: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 70 72 2e 4e  teCollation(pr.N
7490: 61 6d 65 2c 20 66 2e 5f 43 6f 6d 70 61 72 65 46  ame, f._CompareF
74a0: 75 6e 63 2c 20 66 2e 5f 43 6f 6d 70 61 72 65 46  unc, f._CompareF
74b0: 75 6e 63 31 36 29 3b 0d 0a 0d 0a 0d 0a 20 20 20  unc16);......   
74c0: 20 20 20 20 20 6c 46 75 6e 63 74 69 6f 6e 73 2e       lFunctions.
74d0: 41 64 64 28 66 29 3b 0d 0a 20 20 20 20 20 20 7d  Add(f);..      }
74e0: 0d 0a 0d 0a 20 20 20 20 20 20 53 51 4c 69 74 65  ....      SQLite
74f0: 46 75 6e 63 74 69 6f 6e 5b 5d 20 61 72 46 75 6e  Function[] arFun
7500: 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 53 51 4c  ctions = new SQL
7510: 69 74 65 46 75 6e 63 74 69 6f 6e 5b 6c 46 75 6e  iteFunction[lFun
7520: 63 74 69 6f 6e 73 2e 43 6f 75 6e 74 5d 3b 0d 0a  ctions.Count];..
7530: 20 20 20 20 20 20 6c 46 75 6e 63 74 69 6f 6e 73        lFunctions
7540: 2e 43 6f 70 79 54 6f 28 61 72 46 75 6e 63 74 69  .CopyTo(arFuncti
7550: 6f 6e 73 2c 20 30 29 3b 0d 0a 0d 0a 20 20 20 20  ons, 0);....    
7560: 20 20 72 65 74 75 72 6e 20 61 72 46 75 6e 63 74    return arFunct
7570: 69 6f 6e 73 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20  ions;..    }..  
7580: 7d 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d  }....  /// <summ
7590: 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 45 78 74 65  ary>..  /// Exte
75a0: 6e 64 73 20 53 51 4c 69 74 65 46 75 6e 63 74 69  nds SQLiteFuncti
75b0: 6f 6e 20 61 6e 64 20 61 6c 6c 6f 77 73 20 61 6e  on and allows an
75c0: 20 69 6e 68 65 72 69 74 65 64 20 63 6c 61 73 73   inherited class
75d0: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 63   to obtain the c
75e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
75f0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
7600: 68 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  h a function cal
7610: 6c 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  l...  /// </summ
7620: 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65 6d  ary>..  /// <rem
7630: 61 72 6b 73 3e 0d 0a 20 20 2f 2f 2f 20 55 73 65  arks>..  /// Use
7640: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
7650: 6f 6e 73 20 63 61 6e 20 63 61 6c 6c 20 74 68 65  ons can call the
7660: 20 47 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71   GetCollationSeq
7670: 75 65 6e 63 65 28 29 20 6d 65 74 68 6f 64 20 69  uence() method i
7680: 6e 20 74 68 69 73 20 63 6c 61 73 73 20 61 6e 64  n this class and
7690: 20 75 73 65 20 69 74 20 74 6f 20 63 6f 6d 70 61   use it to compa
76a0: 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 63  re strings and c
76b0: 68 61 72 20 61 72 72 61 79 73 2e 0d 0a 20 20 2f  har arrays...  /
76c0: 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20  // </remarks>.. 
76d0: 20 70 75 62 6c 69 63 20 63 6c 61 73 73 20 53 51   public class SQ
76e0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 45 78 20 3a  LiteFunctionEx :
76f0: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 0d   SQLiteFunction.
7700: 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  .  {..    /// <s
7710: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
7720: 20 4f 62 74 61 69 6e 73 20 74 68 65 20 63 6f 6c   Obtains the col
7730: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7740: 69 6e 20 65 66 66 65 63 74 20 66 6f 72 20 74 68  in effect for th
7750: 65 20 67 69 76 65 6e 20 66 75 6e 63 74 69 6f 6e  e given function
7760: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
7770: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
7780: 72 65 74 75 72 6e 73 3e 3c 2f 72 65 74 75 72 6e  returns></return
7790: 73 3e 0d 0a 20 20 20 20 70 72 6f 74 65 63 74 65  s>..    protecte
77a0: 64 20 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65  d CollationSeque
77b0: 6e 63 65 20 47 65 74 43 6f 6c 6c 61 74 69 6f 6e  nce GetCollation
77c0: 53 65 71 75 65 6e 63 65 28 29 0d 0a 20 20 20 20  Sequence()..    
77d0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
77e0: 5f 62 61 73 65 2e 47 65 74 43 6f 6c 6c 61 74 69  _base.GetCollati
77f0: 6f 6e 53 65 71 75 65 6e 63 65 28 74 68 69 73 2c  onSequence(this,
7800: 20 5f 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20   _context);..   
7810: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f   }....    //////
7820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
7880: 20 23 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73   #region IDispos
7890: 61 62 6c 65 20 22 50 61 74 74 65 72 6e 22 20 4d  able "Pattern" M
78a0: 65 6d 62 65 72 73 0d 0a 20 20 20 20 70 72 69 76  embers..    priv
78b0: 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65  ate bool dispose
78c0: 64 3b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  d;..    private 
78d0: 76 6f 69 64 20 43 68 65 63 6b 44 69 73 70 6f 73  void CheckDispos
78e0: 65 64 28 29 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  ed() /* throw */
78f0: 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 54 48 52  ..    {..#if THR
7900: 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 0d 0a  OW_ON_DISPOSED..
7910: 20 20 20 20 20 20 20 20 69 66 20 28 64 69 73 70          if (disp
7920: 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  osed)..         
7930: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4f 62 6a     throw new Obj
7940: 65 63 74 44 69 73 70 6f 73 65 64 45 78 63 65 70  ectDisposedExcep
7950: 74 69 6f 6e 28 74 79 70 65 6f 66 28 53 51 4c 69  tion(typeof(SQLi
7960: 74 65 46 75 6e 63 74 69 6f 6e 45 78 29 2e 4e 61  teFunctionEx).Na
7970: 6d 65 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20  me);..#endif..  
7980: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f    }....    /////
7990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
79f0: 20 20 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72    protected over
7a00: 72 69 64 65 20 76 6f 69 64 20 44 69 73 70 6f 73  ride void Dispos
7a10: 65 28 62 6f 6f 6c 20 64 69 73 70 6f 73 69 6e 67  e(bool disposing
7a20: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
7a30: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
7a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
7a50: 20 28 21 64 69 73 70 6f 73 65 64 29 0d 0a 20 20   (!disposed)..  
7a60: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 69               //i
7a80: 66 20 28 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20  f (disposing).. 
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7aa0: 2f 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  /{..            
7ab0: 20 20 20 20 2f 2f 20 20 20 20 2f 2f 2f 2f 2f 2f      //    //////
7ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 2f 2f 20 20 20 20 2f 2f 20 64 69 73 70 6f 73 65  //    // dispose
7b00: 20 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63   managed resourc
7b10: 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20  es here.....    
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
7b30: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
7b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b50: 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20  //////..        
7b60: 20 20 20 20 20 20 20 20 2f 2f 7d 0d 0a 0d 0a 20          //}.... 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ba0: 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20  /////..         
7bb0: 20 20 20 20 20 20 20 2f 2f 20 72 65 6c 65 61 73         // releas
7bc0: 65 20 75 6e 6d 61 6e 61 67 65 64 20 72 65 73 6f  e unmanaged reso
7bd0: 75 72 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20  urces here..... 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c10: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
7c20: 20 20 20 20 20 20 20 20 20 64 69 73 70 6f 73 65           dispose
7c30: 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  d = true;..     
7c40: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7c50: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6e    }..        fin
7c60: 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ally..        {.
7c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 61 73  .            bas
7c80: 65 2e 44 69 73 70 6f 73 65 28 64 69 73 70 6f 73  e.Dispose(dispos
7c90: 69 6e 67 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  ing);..        }
7ca0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e  ..    }..    #en
7cb0: 64 72 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a  dregion..  }....
7cc0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
7cd0: 0a 20 20 2f 2f 2f 20 54 68 65 20 74 79 70 65 20  .  /// The type 
7ce0: 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
7cf0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 64 65 63 6c  function to decl
7d00: 61 72 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d  are..  /// </sum
7d10: 6d 61 72 79 3e 0d 0a 20 20 70 75 62 6c 69 63 20  mary>..  public 
7d20: 65 6e 75 6d 20 46 75 6e 63 74 69 6f 6e 54 79 70  enum FunctionTyp
7d30: 65 0d 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20  e..  {..    /// 
7d40: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
7d50: 2f 2f 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69  // Scalar functi
7d60: 6f 6e 73 20 61 72 65 20 64 65 73 69 67 6e 65 64  ons are designed
7d70: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 6e   to be called an
7d80: 64 20 72 65 74 75 72 6e 20 61 20 72 65 73 75 6c  d return a resul
7d90: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20  t immediately.  
7da0: 45 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65  Examples include
7db0: 20 41 42 53 28 29 2c 20 55 70 70 65 72 28 29 2c   ABS(), Upper(),
7dc0: 20 4c 6f 77 65 72 28 29 2c 20 65 74 63 2e 0d 0a   Lower(), etc...
7dd0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
7de0: 79 3e 0d 0a 20 20 20 20 53 63 61 6c 61 72 20 3d  y>..    Scalar =
7df0: 20 30 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75   0,..    /// <su
7e00: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
7e10: 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  Aggregate functi
7e20: 6f 6e 73 20 61 72 65 20 64 65 73 69 67 6e 65 64  ons are designed
7e30: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64   to accumulate d
7e40: 61 74 61 20 75 6e 74 69 6c 20 74 68 65 20 65 6e  ata until the en
7e50: 64 20 6f 66 20 61 20 63 61 6c 6c 20 61 6e 64 20  d of a call and 
7e60: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 72 65  then return a re
7e70: 73 75 6c 74 20 67 6c 65 61 6e 65 64 20 66 72 6f  sult gleaned fro
7e80: 6d 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65  m the accumulate
7e90: 64 20 64 61 74 61 2e 0d 0a 20 20 20 20 2f 2f 2f  d data...    ///
7ea0: 20 45 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64   Examples includ
7eb0: 65 20 53 55 4d 28 29 2c 20 43 4f 55 4e 54 28 29  e SUM(), COUNT()
7ec0: 2c 20 41 56 47 28 29 2c 20 65 74 63 2e 0d 0a 20  , AVG(), etc... 
7ed0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
7ee0: 3e 0d 0a 20 20 20 20 41 67 67 72 65 67 61 74 65  >..    Aggregate
7ef0: 20 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c   = 1,..    /// <
7f00: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
7f10: 2f 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  / Collation sequ
7f20: 65 6e 63 65 73 20 61 72 65 20 75 73 65 64 20 74  ences are used t
7f30: 6f 20 73 6f 72 74 20 74 65 78 74 75 61 6c 20 64  o sort textual d
7f40: 61 74 61 20 69 6e 20 61 20 63 75 73 74 6f 6d 20  ata in a custom 
7f50: 6d 61 6e 6e 65 72 2c 20 61 6e 64 20 61 70 70 65  manner, and appe
7f60: 61 72 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  ar in an ORDER B
7f70: 59 20 63 6c 61 75 73 65 2e 20 20 54 79 70 69 63  Y clause.  Typic
7f80: 61 6c 6c 79 20 74 65 78 74 20 69 6e 20 61 6e 20  ally text in an 
7f90: 4f 52 44 45 52 20 42 59 20 69 73 0d 0a 20 20 20  ORDER BY is..   
7fa0: 20 2f 2f 2f 20 73 6f 72 74 65 64 20 75 73 69 6e   /// sorted usin
7fb0: 67 20 61 20 73 74 72 61 69 67 68 74 20 63 61 73  g a straight cas
7fc0: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f  e-insensitive co
7fd0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
7fe0: 6e 2e 20 20 43 75 73 74 6f 6d 20 63 6f 6c 6c 61  n.  Custom colla
7ff0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 63  ting sequences c
8000: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 6c  an be used to al
8010: 74 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72  ter the behavior
8020: 20 6f 66 20 74 65 78 74 20 73 6f 72 74 69 6e 67   of text sorting
8030: 0d 0a 20 20 20 20 2f 2f 2f 20 69 6e 20 61 20 75  ..    /// in a u
8040: 73 65 72 2d 64 65 66 69 6e 65 64 20 6d 61 6e 6e  ser-defined mann
8050: 65 72 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  er...    /// </s
8060: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 43 6f 6c  ummary>..    Col
8070: 6c 61 74 69 6f 6e 20 3d 20 32 2c 0d 0a 20 20 7d  lation = 2,..  }
8080: 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ....  /// <summa
8090: 72 79 3e 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e  ry>..  /// An in
80a0: 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 20  ternal callback 
80b0: 64 65 6c 65 67 61 74 65 20 64 65 63 6c 61 72 61  delegate declara
80c0: 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73  tion...  /// </s
80d0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c  ummary>..  /// <
80e0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74  param name="cont
80f0: 65 78 74 22 3e 52 61 77 20 63 6f 6e 74 65 78 74  ext">Raw context
8100: 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65   pointer for the
8110: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 3c 2f   user function</
8120: 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70  param>..  /// <p
8130: 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73  aram name="nArgs
8140: 22 3e 43 6f 75 6e 74 20 6f 66 20 61 72 67 75 6d  ">Count of argum
8150: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
8160: 74 69 6f 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  tion</param>..  
8170: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
8180: 22 61 72 67 73 70 74 72 22 3e 41 20 70 6f 69 6e  "argsptr">A poin
8190: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
81a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 70 6f 69   of argument poi
81b0: 6e 74 65 72 73 3c 2f 70 61 72 61 6d 3e 0d 0a 23  nters</param>..#
81c0: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
81d0: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20  PACTFRAMEWORK.. 
81e0: 20 5b 55 6e 6d 61 6e 61 67 65 64 46 75 6e 63 74   [UnmanagedFunct
81f0: 69 6f 6e 50 6f 69 6e 74 65 72 28 43 61 6c 6c 69  ionPointer(Calli
8200: 6e 67 43 6f 6e 76 65 6e 74 69 6f 6e 2e 43 64 65  ngConvention.Cde
8210: 63 6c 29 5d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20  cl)]..#endif..  
8220: 69 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74  internal delegat
8230: 65 20 76 6f 69 64 20 53 51 4c 69 74 65 43 61 6c  e void SQLiteCal
8240: 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63 6f 6e  lback(IntPtr con
8250: 74 65 78 74 2c 20 69 6e 74 20 6e 41 72 67 73 2c  text, int nArgs,
8260: 20 49 6e 74 50 74 72 20 61 72 67 73 70 74 72 29   IntPtr argsptr)
8270: 3b 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  ;..  /// <summar
8280: 79 3e 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e 74  y>..  /// An int
8290: 65 72 6e 61 6c 20 66 69 6e 61 6c 20 63 61 6c 6c  ernal final call
82a0: 62 61 63 6b 20 64 65 6c 65 67 61 74 65 20 64 65  back delegate de
82b0: 63 6c 61 72 61 74 69 6f 6e 2e 0d 0a 20 20 2f 2f  claration...  //
82c0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
82d0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
82e0: 22 63 6f 6e 74 65 78 74 22 3e 52 61 77 20 63 6f  "context">Raw co
82f0: 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f  ntext pointer fo
8300: 72 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  r the user funct
8310: 69 6f 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 23 69 66  ion</param>..#if
8320: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41   !PLATFORM_COMPA
8330: 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b  CTFRAMEWORK..  [
8340: 55 6e 6d 61 6e 61 67 65 64 46 75 6e 63 74 69 6f  UnmanagedFunctio
8350: 6e 50 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67  nPointer(Calling
8360: 43 6f 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c  Convention.Cdecl
8370: 29 5d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e  )]..#endif..  in
8380: 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20  ternal delegate 
8390: 76 6f 69 64 20 53 51 4c 69 74 65 46 69 6e 61 6c  void SQLiteFinal
83a0: 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20  Callback(IntPtr 
83b0: 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 2f 2f 2f  context);..  ///
83c0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f   <summary>..  //
83d0: 2f 20 49 6e 74 65 72 6e 61 6c 20 63 61 6c 6c 62  / Internal callb
83e0: 61 63 6b 20 64 65 6c 65 67 61 74 65 20 66 6f 72  ack delegate for
83f0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 63 6f   implementing co
8400: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8410: 73 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  s..  /// </summa
8420: 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61  ry>..  /// <para
8430: 6d 20 6e 61 6d 65 3d 22 70 75 73 65 72 22 3e 4e  m name="puser">N
8440: 6f 74 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e 0d  ot used</param>.
8450: 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61  .  /// <param na
8460: 6d 65 3d 22 6c 65 6e 31 22 3e 4c 65 6e 67 74 68  me="len1">Length
8470: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70   of the string p
8480: 76 31 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f  v1</param>..  //
8490: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
84a0: 76 31 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74  v1">Pointer to t
84b0: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
84c0: 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61  to compare</para
84d0: 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  m>..  /// <param
84e0: 20 6e 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e   name="len2">Len
84f0: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
8500: 67 20 70 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a 20  g pv2</param>.. 
8510: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
8520: 3d 22 70 76 32 22 3e 50 6f 69 6e 74 65 72 20 74  ="pv2">Pointer t
8530: 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 73 74 72  o the second str
8540: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f  ing to compare</
8550: 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 72  param>..  /// <r
8560: 65 74 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d  eturns>Returns -
8570: 31 20 69 66 20 74 68 65 20 66 69 72 73 74 20 73  1 if the first s
8580: 74 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68  tring is less th
8590: 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 20  an the second.  
85a0: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
85b0: 75 61 6c 2c 20 6f 72 20 31 20 69 66 20 74 68 65  ual, or 1 if the
85c0: 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 69 73   first string is
85d0: 20 67 72 65 61 74 65 72 0d 0a 20 20 2f 2f 2f 20   greater..  /// 
85e0: 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e  than the second.
85f0: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 23 69 66 20  </returns>..#if 
8600: 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43  !PLATFORM_COMPAC
8610: 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b 55  TFRAMEWORK..  [U
8620: 6e 6d 61 6e 61 67 65 64 46 75 6e 63 74 69 6f 6e  nmanagedFunction
8630: 50 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67 43  Pointer(CallingC
8640: 6f 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c 29  onvention.Cdecl)
8650: 5d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e 74  ]..#endif..  int
8660: 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 69  ernal delegate i
8670: 6e 74 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69  nt SQLiteCollati
8680: 6f 6e 28 49 6e 74 50 74 72 20 70 75 73 65 72 2c  on(IntPtr puser,
8690: 20 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74   int len1, IntPt
86a0: 72 20 70 76 31 2c 20 69 6e 74 20 6c 65 6e 32 2c  r pv1, int len2,
86b0: 20 49 6e 74 50 74 72 20 70 76 32 29 3b 0d 0a 0d   IntPtr pv2);...
86c0: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
86d0: 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 74 79 70 65  ..  /// The type
86e0: 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65   of collating se
86f0: 71 75 65 6e 63 65 0d 0a 20 20 2f 2f 2f 20 3c 2f  quence..  /// </
8700: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 70 75 62 6c  summary>..  publ
8710: 69 63 20 65 6e 75 6d 20 43 6f 6c 6c 61 74 69 6f  ic enum Collatio
8720: 6e 54 79 70 65 45 6e 75 6d 0d 0a 20 20 7b 0d 0a  nTypeEnum..  {..
8730: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
8740: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62  >..    /// The b
8750: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
8760: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8770: 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  e..    /// </sum
8780: 6d 61 72 79 3e 0d 0a 20 20 20 20 42 69 6e 61 72  mary>..    Binar
8790: 79 20 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20  y = 1,..    /// 
87a0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
87b0: 2f 2f 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20  // The built-in 
87c0: 4e 4f 43 41 53 45 20 63 6f 6c 6c 61 74 69 6e 67  NOCASE collating
87d0: 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 2f   sequence..    /
87e0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
87f0: 20 20 20 4e 6f 43 61 73 65 20 3d 20 32 2c 0d 0a     NoCase = 2,..
8800: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
8810: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62  >..    /// The b
8820: 75 69 6c 74 2d 69 6e 20 52 45 56 45 52 53 45 20  uilt-in REVERSE 
8830: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8840: 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ce..    /// </su
8850: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 52 65 76 65  mmary>..    Reve
8860: 72 73 65 20 3d 20 33 2c 0d 0a 20 20 20 20 2f 2f  rse = 3,..    //
8870: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
8880: 20 2f 2f 2f 20 41 20 63 75 73 74 6f 6d 20 75 73   /// A custom us
8890: 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61  er-defined colla
88a0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a 20  ting sequence.. 
88b0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
88c0: 3e 0d 0a 20 20 20 20 43 75 73 74 6f 6d 20 3d 20  >..    Custom = 
88d0: 30 2c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f  0,..  }....  ///
88e0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f   <summary>..  //
88f0: 2f 20 54 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  / The encoding t
8900: 79 70 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ype the collatio
8910: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 73 0d  n sequence uses.
8920: 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
8930: 3e 0d 0a 20 20 70 75 62 6c 69 63 20 65 6e 75 6d  >..  public enum
8940: 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69   CollationEncodi
8950: 6e 67 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20 20  ngEnum..  {..   
8960: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
8970: 20 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c      /// The coll
8980: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
8990: 73 20 55 54 46 38 0d 0a 20 20 20 20 2f 2f 2f 20  s UTF8..    /// 
89a0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
89b0: 55 54 46 38 20 3d 20 31 2c 0d 0a 20 20 20 20 2f  UTF8 = 1,..    /
89c0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
89d0: 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74    /// The collat
89e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
89f0: 55 54 46 31 36 20 6c 69 74 74 6c 65 2d 65 6e 64  UTF16 little-end
8a00: 69 61 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ian..    /// </s
8a10: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54 46  ummary>..    UTF
8a20: 31 36 4c 45 20 3d 20 32 2c 0d 0a 20 20 20 20 2f  16LE = 2,..    /
8a30: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
8a40: 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74    /// The collat
8a50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
8a60: 55 54 46 31 36 20 62 69 67 2d 65 6e 64 69 61 6e  UTF16 big-endian
8a70: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
8a80: 61 72 79 3e 0d 0a 20 20 20 20 55 54 46 31 36 42  ary>..    UTF16B
8a90: 45 20 3d 20 33 2c 0d 0a 20 20 7d 0d 0a 0d 0a 20  E = 3,..  }.... 
8aa0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
8ab0: 20 20 2f 2f 2f 20 41 20 73 74 72 75 63 74 20 64    /// A struct d
8ac0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 63 6f  escribing the co
8ad0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8ae0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65   a function is e
8af0: 78 65 63 75 74 69 6e 67 20 69 6e 0d 0a 20 20 2f  xecuting in..  /
8b00: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
8b10: 20 70 75 62 6c 69 63 20 73 74 72 75 63 74 20 43   public struct C
8b20: 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65  ollationSequence
8b30: 0d 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ..  {..    /// <
8b40: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
8b50: 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  / The name of th
8b60: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8b70: 65 6e 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ence..    /// </
8b80: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 75  summary>..    pu
8b90: 62 6c 69 63 20 73 74 72 69 6e 67 20 4e 61 6d 65  blic string Name
8ba0: 3b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ;..    /// <summ
8bb0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  ary>..    /// Th
8bc0: 65 20 74 79 70 65 20 6f 66 20 63 6f 6c 6c 61 74  e type of collat
8bd0: 69 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20  ing sequence..  
8be0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
8bf0: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 43 6f 6c  ..    public Col
8c00: 6c 61 74 69 6f 6e 54 79 70 65 45 6e 75 6d 20 54  lationTypeEnum T
8c10: 79 70 65 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20  ype;....    /// 
8c20: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
8c30: 2f 2f 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  // The text enco
8c40: 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c  ding of the coll
8c50: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0d 0a  ation sequence..
8c60: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
8c70: 79 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 43  y>..    public C
8c80: 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67  ollationEncoding
8c90: 45 6e 75 6d 20 45 6e 63 6f 64 69 6e 67 3b 0d 0a  Enum Encoding;..
8ca0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
8cb0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e  ry>..    /// Con
8cc0: 74 65 78 74 20 6f 66 20 74 68 65 20 66 75 6e 63  text of the func
8cd0: 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 65 73  tion that reques
8ce0: 74 65 64 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ted the collatin
8cf0: 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20  g sequence..    
8d00: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
8d10: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 51 4c      internal SQL
8d20: 69 74 65 46 75 6e 63 74 69 6f 6e 20 5f 66 75 6e  iteFunction _fun
8d30: 63 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  c;....    /// <s
8d40: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
8d50: 20 43 61 6c 6c 73 20 74 68 65 20 62 61 73 65 20   Calls the base 
8d60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8d70: 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ce to compare tw
8d80: 6f 20 73 74 72 69 6e 67 73 0d 0a 20 20 20 20 2f  o strings..    /
8d90: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
8da0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
8db0: 6d 65 3d 22 73 31 22 3e 54 68 65 20 66 69 72 73  me="s1">The firs
8dc0: 74 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  t string to comp
8dd0: 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  are</param>..   
8de0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
8df0: 3d 22 73 32 22 3e 54 68 65 20 73 65 63 6f 6e 64  ="s2">The second
8e00: 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61   string to compa
8e10: 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  re</param>..    
8e20: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 2d 31 20  /// <returns>-1 
8e30: 69 66 20 73 31 20 69 73 20 6c 65 73 73 20 74 68  if s1 is less th
8e40: 61 6e 20 73 32 2c 20 30 20 69 66 20 73 31 20 69  an s2, 0 if s1 i
8e50: 73 20 65 71 75 61 6c 20 74 6f 20 73 32 2c 20 61  s equal to s2, a
8e60: 6e 64 20 31 20 69 66 20 73 31 20 69 73 20 67 72  nd 1 if s1 is gr
8e70: 65 61 74 65 72 20 74 68 61 6e 20 73 32 3c 2f 72  eater than s2</r
8e80: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62  eturns>..    pub
8e90: 6c 69 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 28  lic int Compare(
8ea0: 73 74 72 69 6e 67 20 73 31 2c 20 73 74 72 69 6e  string s1, strin
8eb0: 67 20 73 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  g s2)..    {..  
8ec0: 20 20 20 20 72 65 74 75 72 6e 20 5f 66 75 6e 63      return _func
8ed0: 2e 5f 62 61 73 65 2e 43 6f 6e 74 65 78 74 43 6f  ._base.ContextCo
8ee0: 6c 6c 61 74 65 43 6f 6d 70 61 72 65 28 45 6e 63  llateCompare(Enc
8ef0: 6f 64 69 6e 67 2c 20 5f 66 75 6e 63 2e 5f 63 6f  oding, _func._co
8f00: 6e 74 65 78 74 2c 20 73 31 2c 20 73 32 29 3b 0d  ntext, s1, s2);.
8f10: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
8f20: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
8f30: 20 2f 2f 2f 20 43 61 6c 6c 73 20 74 68 65 20 62   /// Calls the b
8f40: 61 73 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ase collating se
8f50: 71 75 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72  quence to compar
8f60: 65 20 74 77 6f 20 63 68 61 72 61 63 74 65 72 20  e two character 
8f70: 61 72 72 61 79 73 0d 0a 20 20 20 20 2f 2f 2f 20  arrays..    /// 
8f80: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
8f90: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
8fa0: 22 63 31 22 3e 54 68 65 20 66 69 72 73 74 20 61  "c1">The first a
8fb0: 72 72 61 79 20 74 6f 20 63 6f 6d 70 61 72 65 3c  rray to compare<
8fc0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
8fd0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 32   <param name="c2
8fe0: 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 61 72 72  ">The second arr
8ff0: 61 79 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70  ay to compare</p
9000: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
9010: 72 65 74 75 72 6e 73 3e 2d 31 20 69 66 20 63 31  returns>-1 if c1
9020: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 63 32   is less than c2
9030: 2c 20 30 20 69 66 20 63 31 20 69 73 20 65 71 75  , 0 if c1 is equ
9040: 61 6c 20 74 6f 20 63 32 2c 20 61 6e 64 20 31 20  al to c2, and 1 
9050: 69 66 20 63 31 20 69 73 20 67 72 65 61 74 65 72  if c1 is greater
9060: 20 74 68 61 6e 20 63 32 3c 2f 72 65 74 75 72 6e   than c2</return
9070: 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69  s>..    public i
9080: 6e 74 20 43 6f 6d 70 61 72 65 28 63 68 61 72 5b  nt Compare(char[
9090: 5d 20 63 31 2c 20 63 68 61 72 5b 5d 20 63 32 29  ] c1, char[] c2)
90a0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72  ..    {..      r
90b0: 65 74 75 72 6e 20 5f 66 75 6e 63 2e 5f 62 61 73  eturn _func._bas
90c0: 65 2e 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65  e.ContextCollate
90d0: 43 6f 6d 70 61 72 65 28 45 6e 63 6f 64 69 6e 67  Compare(Encoding
90e0: 2c 20 5f 66 75 6e 63 2e 5f 63 6f 6e 74 65 78 74  , _func._context
90f0: 2c 20 63 31 2c 20 63 32 29 3b 0d 0a 20 20 20 20  , c1, c2);..    
9100: 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a                 }..  }..}..