System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 150003afcec69b543130a3bbeb680bdac065de37:


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 2f 2f 2f 20 3c  ///....    /// <
0750: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
0760: 2f 20 54 68 65 20 62 61 73 65 20 63 6f 6e 6e 65  / The base conne
0770: 63 74 69 6f 6e 20 74 68 69 73 20 66 75 6e 63 74  ction this funct
0780: 69 6f 6e 20 69 73 20 61 74 74 61 63 68 65 64 20  ion is attached 
0790: 74 6f 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  to..    /// </su
07a0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 69 6e 74 65  mmary>..    inte
07b0: 72 6e 61 6c 20 53 51 4c 69 74 65 42 61 73 65 20  rnal SQLiteBase 
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 62 61               _ba
07d0: 73 65 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c  se;....    /// <
07e0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
07f0: 2f 20 49 6e 74 65 72 6e 61 6c 20 61 72 72 61 79  / Internal array
0800: 20 75 73 65 64 20 74 6f 20 6b 65 65 70 20 74 72   used to keep tr
0810: 61 63 6b 20 6f 66 20 61 67 67 72 65 67 61 74 65  ack of aggregate
0820: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78   function contex
0830: 74 20 64 61 74 61 0d 0a 20 20 20 20 2f 2f 2f 20  t data..    /// 
0840: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
0850: 70 72 69 76 61 74 65 20 44 69 63 74 69 6f 6e 61  private Dictiona
0860: 72 79 3c 49 6e 74 50 74 72 2c 20 41 67 67 72 65  ry<IntPtr, Aggre
0870: 67 61 74 65 44 61 74 61 3e 20 5f 63 6f 6e 74 65  gateData> _conte
0880: 78 74 44 61 74 61 4c 69 73 74 3b 0d 0a 0d 0a 20  xtDataList;.... 
0890: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
08a0: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f  ..    /// The co
08b0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
08c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
08d0: 68 69 73 20 6f 62 6a 65 63 74 20 28 74 68 69 73  his object (this
08e0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 0d 0a   should be the..
08f0: 20 20 20 20 2f 2f 2f 20 73 61 6d 65 20 76 61 6c      /// same val
0900: 75 65 20 61 73 20 74 68 65 20 66 6c 61 67 73 20  ue as the flags 
0910: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0920: 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6e 6e 65  the parent conne
0930: 63 74 69 6f 6e 20 6f 62 6a 65 63 74 29 2e 0d 0a  ction object)...
0940: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
0950: 79 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  y>..    private 
0960: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
0970: 46 6c 61 67 73 20 5f 66 6c 61 67 73 3b 0d 0a 0d  Flags _flags;...
0980: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
0990: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 6f 6c 64  y>..    /// Hold
09a0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
09b0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
09c0: 6e 63 74 69 6f 6e 20 66 6f 72 20 75 73 65 72 20  nction for user 
09d0: 66 75 6e 63 74 69 6f 6e 73 0d 0a 20 20 20 20 2f  functions..    /
09e0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
09f0: 20 20 20 70 72 69 76 61 74 65 20 53 51 4c 69 74     private SQLit
0a00: 65 43 61 6c 6c 62 61 63 6b 20 20 5f 49 6e 76 6f  eCallback  _Invo
0a10: 6b 65 46 75 6e 63 3b 0d 0a 20 20 20 20 2f 2f 2f  keFunc;..    ///
0a20: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
0a30: 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65 66 65  /// Holds a refe
0a40: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 61 6c  rence to the cal
0a50: 6c 62 61 6b 63 20 66 75 6e 63 74 69 6f 6e 20 66  lbakc function f
0a60: 6f 72 20 73 74 65 70 70 69 6e 67 20 69 6e 20 61  or stepping in a
0a70: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
0a80: 74 69 6f 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  tion..    /// </
0a90: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 72  summary>..    pr
0aa0: 69 76 61 74 65 20 53 51 4c 69 74 65 43 61 6c 6c  ivate SQLiteCall
0ab0: 62 61 63 6b 20 20 5f 53 74 65 70 46 75 6e 63 3b  back  _StepFunc;
0ac0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
0ad0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 6f 6c  ry>..    /// Hol
0ae0: 64 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ds a reference t
0af0: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
0b00: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 69 6e 61  unction for fina
0b10: 6c 69 7a 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lizing an aggreg
0b20: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0d 0a 20 20  ate function..  
0b30: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
0b40: 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 53 51  ..    private SQ
0b50: 4c 69 74 65 46 69 6e 61 6c 43 61 6c 6c 62 61 63  LiteFinalCallbac
0b60: 6b 20 20 5f 46 69 6e 61 6c 46 75 6e 63 3b 0d 0a  k  _FinalFunc;..
0b70: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
0b80: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 6f 6c 64 73  >..    /// Holds
0b90: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
0ba0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
0bb0: 63 74 69 6f 6e 20 66 6f 72 20 63 6f 6c 6c 61 74  ction for collat
0bc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 0d 0a 20  ing sequences.. 
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 6f 6c 6c 61 74 69 6f 6e 20 5f  QLiteCollation _
0c00: 43 6f 6d 70 61 72 65 46 75 6e 63 3b 0d 0a 0d 0a  CompareFunc;....
0c10: 20 20 20 20 70 72 69 76 61 74 65 20 53 51 4c 69      private SQLi
0c20: 74 65 43 6f 6c 6c 61 74 69 6f 6e 20 5f 43 6f 6d  teCollation _Com
0c30: 70 61 72 65 46 75 6e 63 31 36 3b 0d 0a 0d 0a 20  pareFunc16;.... 
0c40: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
0c50: 0d 0a 20 20 20 20 2f 2f 2f 20 43 75 72 72 65 6e  ..    /// Curren
0c60: 74 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  t context of the
0c70: 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 62 61 63   current callbac
0c80: 6b 2e 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 64  k.  Only valid d
0c90: 75 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  uring a callback
0ca0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
0cb0: 61 72 79 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e  ary>..    intern
0cc0: 61 6c 20 49 6e 74 50 74 72 20 5f 63 6f 6e 74 65  al IntPtr _conte
0cd0: 78 74 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c  xt;....    /// <
0ce0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
0cf0: 2f 20 54 68 69 73 20 73 74 61 74 69 63 20 64 69  / This static di
0d00: 63 74 69 6f 6e 61 72 79 20 63 6f 6e 74 61 69 6e  ctionary contain
0d10: 73 20 61 6c 6c 20 74 68 65 20 72 65 67 69 73 74  s all the regist
0d20: 65 72 65 64 20 28 6b 6e 6f 77 6e 29 20 75 73 65  ered (known) use
0d30: 72 2d 64 65 66 69 6e 65 64 0d 0a 20 20 20 20 2f  r-defined..    /
0d40: 2f 2f 20 66 75 6e 63 74 69 6f 6e 73 20 64 65 63  // functions dec
0d50: 6c 61 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  lared using the 
0d60: 70 72 6f 70 65 72 20 61 74 74 72 69 62 75 74 65  proper attribute
0d70: 73 2e 20 20 54 68 65 20 63 6f 6e 74 61 69 6e 65  s.  The containe
0d80: 64 20 64 69 63 74 69 6f 6e 61 72 79 0d 0a 20 20  d dictionary..  
0d90: 20 20 2f 2f 2f 20 76 61 6c 75 65 73 20 61 72 65    /// values are
0da0: 20 61 6c 77 61 79 73 20 6e 75 6c 6c 20 61 6e 64   always null and
0db0: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0dc0: 6c 79 20 75 73 65 64 2e 0d 0a 20 20 20 20 2f 2f  ly used...    //
0dd0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
0de0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
0df0: 20 49 44 69 63 74 69 6f 6e 61 72 79 3c 53 51 4c   IDictionary<SQL
0e00: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
0e10: 62 75 74 65 2c 20 6f 62 6a 65 63 74 3e 20 5f 72  bute, object> _r
0e20: 65 67 69 73 74 65 72 65 64 46 75 6e 63 74 69 6f  egisteredFunctio
0e30: 6e 73 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ns;....    /// <
0e40: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
0e50: 2f 20 49 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 74  / Internal const
0e60: 72 75 63 74 6f 72 2c 20 69 6e 69 74 69 61 6c 69  ructor, initiali
0e70: 7a 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  zes the function
0e80: 27 73 20 69 6e 74 65 72 6e 61 6c 20 76 61 72 69  's internal vari
0e90: 61 62 6c 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ables...    /// 
0ea0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
0eb0: 70 72 6f 74 65 63 74 65 64 20 53 51 4c 69 74 65  protected SQLite
0ec0: 46 75 6e 63 74 69 6f 6e 28 29 0d 0a 20 20 20 20  Function()..    
0ed0: 7b 0d 0a 20 20 20 20 20 20 5f 63 6f 6e 74 65 78  {..      _contex
0ee0: 74 44 61 74 61 4c 69 73 74 20 3d 20 6e 65 77 20  tDataList = new 
0ef0: 44 69 63 74 69 6f 6e 61 72 79 3c 49 6e 74 50 74  Dictionary<IntPt
0f00: 72 2c 20 41 67 67 72 65 67 61 74 65 44 61 74 61  r, AggregateData
0f10: 3e 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  >();..    }.... 
0f20: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
0f30: 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e 73 74 72  ..    /// Constr
0f40: 75 63 74 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  ucts an instance
0f50: 20 6f 66 20 74 68 69 73 20 63 6c 61 73 73 20 75   of this class u
0f60: 73 69 6e 67 20 74 68 65 20 73 70 65 63 69 66 69  sing the specifi
0f70: 65 64 20 64 61 74 61 2d 74 79 70 65 0d 0a 20 20  ed data-type..  
0f80: 20 20 2f 2f 2f 20 63 6f 6e 76 65 72 73 69 6f 6e    /// conversion
0f90: 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 20 20   parameters...  
0fa0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
0fb0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
0fc0: 20 6e 61 6d 65 3d 22 66 6f 72 6d 61 74 22 3e 0d   name="format">.
0fd0: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 44 61 74  .    /// The Dat
0fe0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 74 6f 20  eTime format to 
0ff0: 62 65 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6e  be used when con
1000: 76 65 72 74 69 6e 67 20 73 74 72 69 6e 67 20 76  verting string v
1010: 61 6c 75 65 73 20 74 6f 20 61 0d 0a 20 20 20 20  alues to a..    
1020: 2f 2f 2f 20 44 61 74 65 54 69 6d 65 20 61 6e 64  /// DateTime and
1030: 20 62 69 6e 64 69 6e 67 20 44 61 74 65 54 69 6d   binding DateTim
1040: 65 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 20  e parameters... 
1050: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
1060: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
1070: 6e 61 6d 65 3d 22 6b 69 6e 64 22 3e 0d 0a 20 20  name="kind">..  
1080: 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20 63    /// The <see c
1090: 72 65 66 3d 22 44 61 74 65 54 69 6d 65 4b 69 6e  ref="DateTimeKin
10a0: 64 22 20 2f 3e 20 74 6f 20 62 65 20 75 73 65 64  d" /> to be used
10b0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 44   when creating D
10c0: 61 74 65 54 69 6d 65 0d 0a 20 20 20 20 2f 2f 2f  ateTime..    ///
10d0: 20 76 61 6c 75 65 73 2e 0d 0a 20 20 20 20 2f 2f   values...    //
10e0: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
10f0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1100: 22 66 6f 72 6d 61 74 53 74 72 69 6e 67 22 3e 0d  "formatString">.
1110: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 6f 72  .    /// The for
1120: 6d 61 74 20 73 74 72 69 6e 67 20 74 6f 20 62 65  mat string to be
1130: 20 75 73 65 64 20 77 68 65 6e 20 70 61 72 73 69   used when parsi
1140: 6e 67 20 61 6e 64 20 66 6f 72 6d 61 74 74 69 6e  ng and formattin
1150: 67 20 44 61 74 65 54 69 6d 65 0d 0a 20 20 20 20  g DateTime..    
1160: 2f 2f 2f 20 76 61 6c 75 65 73 2e 0d 0a 20 20 20  /// values...   
1170: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
1180: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
1190: 6d 65 3d 22 75 74 66 31 36 22 3e 0d 0a 20 20 20  me="utf16">..   
11a0: 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 74 6f   /// Non-zero to
11b0: 20 63 72 65 61 74 65 20 61 20 55 54 46 2d 31 36   create a UTF-16
11c0: 20 64 61 74 61 2d 74 79 70 65 20 63 6f 6e 76 65   data-type conve
11d0: 72 73 69 6f 6e 20 63 6f 6e 74 65 78 74 3b 20 6f  rsion context; o
11e0: 74 68 65 72 77 69 73 65 2c 0d 0a 20 20 20 20 2f  therwise,..    /
11f0: 2f 2f 20 61 20 55 54 46 2d 38 20 64 61 74 61 2d  // a UTF-8 data-
1200: 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20  type conversion 
1210: 63 6f 6e 74 65 78 74 20 77 69 6c 6c 20 62 65 20  context will be 
1220: 63 72 65 61 74 65 64 2e 0d 0a 20 20 20 20 2f 2f  created...    //
1230: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
1240: 70 72 6f 74 65 63 74 65 64 20 53 51 4c 69 74 65  protected SQLite
1250: 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20  Function(..     
1260: 20 20 20 53 51 4c 69 74 65 44 61 74 65 46 6f 72     SQLiteDateFor
1270: 6d 61 74 73 20 66 6f 72 6d 61 74 2c 0d 0a 20 20  mats format,..  
1280: 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 4b 69        DateTimeKi
1290: 6e 64 20 6b 69 6e 64 2c 0d 0a 20 20 20 20 20 20  nd kind,..      
12a0: 20 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 53    string formatS
12b0: 74 72 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20  tring,..        
12c0: 62 6f 6f 6c 20 75 74 66 31 36 0d 0a 20 20 20 20  bool utf16..    
12d0: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 3a      )..        :
12e0: 20 74 68 69 73 28 29 0d 0a 20 20 20 20 7b 0d 0a   this()..    {..
12f0: 20 20 20 20 20 20 20 20 69 66 20 28 75 74 66 31          if (utf1
1300: 36 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  6)..            
1310: 5f 62 61 73 65 20 3d 20 6e 65 77 20 53 51 4c 69  _base = new SQLi
1320: 74 65 33 5f 55 54 46 31 36 28 66 6f 72 6d 61 74  te3_UTF16(format
1330: 2c 20 6b 69 6e 64 2c 20 66 6f 72 6d 61 74 53 74  , kind, formatSt
1340: 72 69 6e 67 2c 20 49 6e 74 50 74 72 2e 5a 65 72  ring, IntPtr.Zer
1350: 6f 2c 20 6e 75 6c 6c 2c 20 66 61 6c 73 65 29 3b  o, null, false);
1360: 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a  ..        else..
1370: 20 20 20 20 20 20 20 20 20 20 20 20 5f 62 61 73              _bas
1380: 65 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 33 28  e = new SQLite3(
1390: 66 6f 72 6d 61 74 2c 20 6b 69 6e 64 2c 20 66 6f  format, kind, fo
13a0: 72 6d 61 74 53 74 72 69 6e 67 2c 20 49 6e 74 50  rmatString, IntP
13b0: 74 72 2e 5a 65 72 6f 2c 20 6e 75 6c 6c 2c 20 66  tr.Zero, null, f
13c0: 61 6c 73 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  alse);..    }...
13d0: 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .    ///////////
13e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1430: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67  ////....    #reg
1440: 69 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20  ion IDisposable 
1450: 4d 65 6d 62 65 72 73 0d 0a 20 20 20 20 2f 2f 2f  Members..    ///
1460: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
1470: 2f 2f 2f 20 44 69 73 70 6f 73 65 73 20 6f 66 20  /// Disposes of 
1480: 61 6e 79 20 61 63 74 69 76 65 20 63 6f 6e 74 65  any active conte
1490: 78 74 44 61 74 61 20 76 61 72 69 61 62 6c 65 73  xtData variables
14a0: 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 61   that were not a
14b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 65  utomatically cle
14c0: 61 6e 65 64 20 75 70 2e 20 20 53 6f 6d 65 74 69  aned up.  Someti
14d0: 6d 65 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  mes this can hap
14e0: 70 65 6e 20 69 66 0d 0a 20 20 20 20 2f 2f 2f 20  pen if..    /// 
14f0: 73 6f 6d 65 6f 6e 65 20 63 6c 6f 73 65 73 20 74  someone closes t
1500: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 68  he connection wh
1510: 69 6c 65 20 61 20 44 61 74 61 52 65 61 64 65 72  ile a DataReader
1520: 20 69 73 20 6f 70 65 6e 2e 0d 0a 20 20 20 20 2f   is open...    /
1530: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
1540: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 44     public void D
1550: 69 73 70 6f 73 65 28 29 0d 0a 20 20 20 20 7b 0d  ispose()..    {.
1560: 0a 20 20 20 20 20 20 20 20 44 69 73 70 6f 73 65  .        Dispose
1570: 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20  (true);..       
1580: 20 47 43 2e 53 75 70 70 72 65 73 73 46 69 6e 61   GC.SuppressFina
1590: 6c 69 7a 65 28 74 68 69 73 29 3b 0d 0a 20 20 20  lize(this);..   
15a0: 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 67 69   }..    #endregi
15b0: 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f  on....    //////
15c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1620: 20 23 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73   #region IDispos
1630: 61 62 6c 65 20 22 50 61 74 74 65 72 6e 22 20 4d  able "Pattern" M
1640: 65 6d 62 65 72 73 0d 0a 20 20 20 20 70 72 69 76  embers..    priv
1650: 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65  ate bool dispose
1660: 64 3b 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20  d;..    private 
1670: 76 6f 69 64 20 43 68 65 63 6b 44 69 73 70 6f 73  void CheckDispos
1680: 65 64 28 29 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  ed() /* throw */
1690: 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 54 48 52  ..    {..#if THR
16a0: 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 0d 0a  OW_ON_DISPOSED..
16b0: 20 20 20 20 20 20 20 20 69 66 20 28 64 69 73 70          if (disp
16c0: 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  osed)..         
16d0: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4f 62 6a     throw new Obj
16e0: 65 63 74 44 69 73 70 6f 73 65 64 45 78 63 65 70  ectDisposedExcep
16f0: 74 69 6f 6e 28 74 79 70 65 6f 66 28 53 51 4c 69  tion(typeof(SQLi
1700: 74 65 46 75 6e 63 74 69 6f 6e 29 2e 4e 61 6d 65  teFunction).Name
1710: 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20  );..#endif..    
1720: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  }....    ///////
1730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1780: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1790: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
17a0: 20 20 20 2f 2f 2f 20 50 6c 61 63 65 68 6f 6c 64     /// Placehold
17b0: 65 72 20 66 6f 72 20 61 20 75 73 65 72 2d 64 65  er for a user-de
17c0: 66 69 6e 65 64 20 64 69 73 70 6f 73 61 6c 20 72  fined disposal r
17d0: 6f 75 74 69 6e 65 0d 0a 20 20 20 20 2f 2f 2f 20  outine..    /// 
17e0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
17f0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1800: 22 64 69 73 70 6f 73 69 6e 67 22 3e 54 72 75 65  "disposing">True
1810: 20 69 66 20 74 68 65 20 6f 62 6a 65 63 74 20 69   if the object i
1820: 73 20 62 65 69 6e 67 20 64 69 73 70 6f 73 65 64  s being disposed
1830: 20 65 78 70 6c 69 63 69 74 6c 79 3c 2f 70 61 72   explicitly</par
1840: 61 6d 3e 0d 0a 20 20 20 20 70 72 6f 74 65 63 74  am>..    protect
1850: 65 64 20 76 69 72 74 75 61 6c 20 76 6f 69 64 20  ed virtual void 
1860: 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20 64 69 73  Dispose(bool dis
1870: 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a  posing)..    {..
1880: 20 20 20 20 20 20 20 20 69 66 20 28 21 64 69 73          if (!dis
1890: 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20  posed)..        
18a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
18b0: 66 20 28 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20  f (disposing).. 
18c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
18e0: 2f 2f 2f 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 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
1910: 20 20 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d      // dispose m
1920: 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65 73  anaged resources
1930: 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20   here.....      
1940: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
1950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
1970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1980: 20 20 49 44 69 73 70 6f 73 61 62 6c 65 20 64 69    IDisposable di
1990: 73 70 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  sp;....         
19a0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
19b0: 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 49 6e 74  KeyValuePair<Int
19c0: 50 74 72 2c 20 41 67 67 72 65 67 61 74 65 44 61  Ptr, AggregateDa
19d0: 74 61 3e 20 6b 76 20 69 6e 20 5f 63 6f 6e 74 65  ta> kv in _conte
19e0: 78 74 44 61 74 61 4c 69 73 74 29 0d 0a 20 20 20  xtDataList)..   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 64 69 73 70 20 3d 20 6b 76 2e 56 61      disp = kv.Va
1a20: 6c 75 65 2e 5f 64 61 74 61 20 61 73 20 49 44 69  lue._data as IDi
1a30: 73 70 6f 73 61 62 6c 65 3b 0d 0a 20 20 20 20 20  sposable;..     
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1a50: 66 20 28 64 69 73 70 20 21 3d 20 6e 75 6c 6c 29  f (disp != null)
1a60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a70: 20 20 20 20 20 20 20 20 20 20 64 69 73 70 2e 44            disp.D
1a80: 69 73 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20  ispose();..     
1a90: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63                _c
1ab0: 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 2e 43  ontextDataList.C
1ac0: 6c 65 61 72 28 29 3b 0d 0a 20 20 20 20 20 20 20  lear();..       
1ad0: 20 20 20 20 20 20 20 20 20 5f 63 6f 6e 74 65 78           _contex
1ae0: 74 44 61 74 61 4c 69 73 74 20 3d 20 6e 75 6c 6c  tDataList = null
1af0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1b00: 20 20 20 20 20 5f 66 6c 61 67 73 20 3d 20 53 51       _flags = SQ
1b10: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
1b20: 61 67 73 2e 4e 6f 6e 65 3b 0d 0a 0d 0a 20 20 20  ags.None;....   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 49 6e               _In
1b40: 76 6f 6b 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b  vokeFunc = null;
1b50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b60: 20 20 5f 53 74 65 70 46 75 6e 63 20 3d 20 6e 75    _StepFunc = nu
1b70: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
1b80: 20 20 20 20 20 5f 46 69 6e 61 6c 46 75 6e 63 20       _FinalFunc 
1b90: 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20  = null;..       
1ba0: 20 20 20 20 20 20 20 20 20 5f 43 6f 6d 70 61 72           _Compar
1bb0: 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b 0d 0a 20  eFunc = null;.. 
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
1bd0: 62 61 73 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  base = null;..  
1be0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
1c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c20: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
1c30: 2f 20 72 65 6c 65 61 73 65 20 75 6e 6d 61 6e 61  / release unmana
1c40: 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68 65  ged resources he
1c50: 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20  re.....         
1c60: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1c90: 20 20 20 20 20 20 20 20 20 64 69 73 70 6f 73 65           dispose
1ca0: 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  d = true;..     
1cb0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20     }..    }..   
1cc0: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
1cd0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d30: 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f  //....    #regio
1d40: 6e 20 44 65 73 74 72 75 63 74 6f 72 0d 0a 20 20  n Destructor..  
1d50: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
1d60: 0a 20 20 20 20 2f 2f 2f 20 43 6c 65 61 6e 73 20  .    /// Cleans 
1d70: 75 70 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  up resources ass
1d80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1d90: 20 63 75 72 72 65 6e 74 20 69 6e 73 74 61 6e 63   current instanc
1da0: 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  e...    /// </su
1db0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 7e 53 51 4c  mmary>..    ~SQL
1dc0: 69 74 65 46 75 6e 63 74 69 6f 6e 28 29 0d 0a 20  iteFunction().. 
1dd0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 69     {..        Di
1de0: 73 70 6f 73 65 28 66 61 6c 73 65 29 3b 0d 0a 20  spose(false);.. 
1df0: 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65     }..    #endre
1e00: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f  gion....    ////
1e10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1e70: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1e80: 0d 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e  ..    /// Return
1e90: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
1ea0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1eb0: 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 53 51 4c  connection's SQL
1ec0: 69 74 65 43 6f 6e 76 65 72 74 20 63 6c 61 73 73  iteConvert class
1ed0: 2c 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  , which can be u
1ee0: 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 0d 0a  sed to convert..
1ef0: 20 20 20 20 2f 2f 2f 20 73 74 72 69 6e 67 73 20      /// strings 
1f00: 61 6e 64 20 44 61 74 65 54 69 6d 65 27 73 20 69  and DateTime's i
1f10: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
1f20: 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 65 6e 63  connection's enc
1f30: 6f 64 69 6e 67 20 73 63 68 65 6d 61 2e 0d 0a 20  oding schema... 
1f40: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
1f50: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 53 51  >..    public SQ
1f60: 4c 69 74 65 43 6f 6e 76 65 72 74 20 53 51 4c 69  LiteConvert SQLi
1f70: 74 65 43 6f 6e 76 65 72 74 0d 0a 20 20 20 20 7b  teConvert..    {
1f80: 0d 0a 20 20 20 20 20 20 67 65 74 0d 0a 20 20 20  ..      get..   
1f90: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 43 68     {..        Ch
1fa0: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
1fb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f          return _
1fc0: 62 61 73 65 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  base;..      }..
1fd0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f      }....    ///
1fe0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
1ff0: 2f 2f 2f 20 53 63 61 6c 61 72 20 66 75 6e 63 74  /// Scalar funct
2000: 69 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 68  ions override th
2010: 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 64 6f 20  is method to do 
2020: 74 68 65 69 72 20 6d 61 67 69 63 2e 0d 0a 20 20  their magic...  
2030: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
2040: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72  ..    /// <remar
2050: 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 50 61 72  ks>..    /// Par
2060: 61 6d 65 74 65 72 73 20 70 61 73 73 65 64 20 74  ameters passed t
2070: 6f 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  o functions have
2080: 20 6f 6e 6c 79 20 61 6e 20 61 66 66 69 6e 69 74   only an affinit
2090: 79 20 66 6f 72 20 61 20 63 65 72 74 61 69 6e 20  y for a certain 
20a0: 64 61 74 61 20 74 79 70 65 2c 20 74 68 65 72 65  data type, there
20b0: 20 69 73 20 6e 6f 20 75 6e 64 65 72 6c 79 69 6e   is no underlyin
20c0: 67 20 73 63 68 65 6d 61 20 61 76 61 69 6c 61 62  g schema availab
20d0: 6c 65 0d 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 66  le..    /// to f
20e0: 6f 72 63 65 20 74 68 65 6d 20 69 6e 74 6f 20 61  orce them into a
20f0: 20 63 65 72 74 61 69 6e 20 74 79 70 65 2e 20 20   certain type.  
2100: 54 68 65 72 65 66 6f 72 65 20 74 68 65 20 6f 6e  Therefore the on
2110: 6c 79 20 74 79 70 65 73 20 79 6f 75 20 77 69 6c  ly types you wil
2120: 6c 20 65 76 65 72 20 73 65 65 20 61 73 20 70 61  l ever see as pa
2130: 72 61 6d 65 74 65 72 73 20 61 72 65 0d 0a 20 20  rameters are..  
2140: 20 20 2f 2f 2f 20 44 42 4e 75 6c 6c 2e 56 61 6c    /// DBNull.Val
2150: 75 65 2c 20 49 6e 74 36 34 2c 20 44 6f 75 62 6c  ue, Int64, Doubl
2160: 65 2c 20 53 74 72 69 6e 67 20 6f 72 20 62 79 74  e, String or byt
2170: 65 5b 5d 20 61 72 72 61 79 2e 0d 0a 20 20 20 20  e[] array...    
2180: 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a  /// </remarks>..
2190: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
21a0: 61 6d 65 3d 22 61 72 67 73 22 3e 54 68 65 20 61  ame="args">The a
21b0: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  rguments for the
21c0: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 63   command to proc
21d0: 65 73 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  ess</param>..   
21e0: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 59 6f   /// <returns>Yo
21f0: 75 20 6d 61 79 20 72 65 74 75 72 6e 20 6d 6f 73  u may return mos
2200: 74 20 73 69 6d 70 6c 65 20 74 79 70 65 73 20 61  t simple types a
2210: 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  s a return value
2220: 2c 20 6e 75 6c 6c 20 6f 72 20 44 42 4e 75 6c 6c  , null or DBNull
2230: 2e 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e  .Value to return
2240: 20 6e 75 6c 6c 2c 20 44 61 74 65 54 69 6d 65 2c   null, DateTime,
2250: 20 6f 72 0d 0a 20 20 20 20 2f 2f 2f 20 79 6f 75   or..    /// you
2260: 20 6d 61 79 20 72 65 74 75 72 6e 20 61 6e 20 45   may return an E
2270: 78 63 65 70 74 69 6f 6e 2d 64 65 72 69 76 65 64  xception-derived
2280: 20 63 6c 61 73 73 20 69 66 20 79 6f 75 20 77 69   class if you wi
2290: 73 68 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  sh to return an 
22a0: 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
22b0: 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c    Do not actuall
22c0: 79 20 74 68 72 6f 77 20 74 68 65 20 65 72 72 6f  y throw the erro
22d0: 72 2c 0d 0a 20 20 20 20 2f 2f 2f 20 6a 75 73 74  r,..    /// just
22e0: 20 72 65 74 75 72 6e 20 69 74 21 3c 2f 72 65 74   return it!</ret
22f0: 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69  urns>..    publi
2300: 63 20 76 69 72 74 75 61 6c 20 6f 62 6a 65 63 74  c virtual object
2310: 20 49 6e 76 6f 6b 65 28 6f 62 6a 65 63 74 5b 5d   Invoke(object[]
2320: 20 61 72 67 73 29 0d 0a 20 20 20 20 7b 0d 0a 20   args)..    {.. 
2330: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
2340: 65 64 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 74  ed();..      ret
2350: 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 7d  urn null;..    }
2360: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
2370: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41  mary>..    /// A
2380: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2390: 6e 73 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  ns override this
23a0: 20 6d 65 74 68 6f 64 20 74 6f 20 64 6f 20 74 68   method to do th
23b0: 65 69 72 20 6d 61 67 69 63 2e 0d 0a 20 20 20 20  eir magic...    
23c0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
23d0: 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73      /// <remarks
23e0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 79 70 69 63  >..    /// Typic
23f0: 61 6c 6c 79 20 79 6f 75 27 6c 6c 20 62 65 20 75  ally you'll be u
2400: 70 64 61 74 69 6e 67 20 77 68 61 74 65 76 65 72  pdating whatever
2410: 20 79 6f 75 27 76 65 20 70 6c 61 63 65 64 20 69   you've placed i
2420: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61 74  n the contextDat
2430: 61 20 66 69 65 6c 64 20 61 6e 64 20 72 65 74 75  a field and retu
2440: 72 6e 69 6e 67 20 61 73 20 71 75 69 63 6b 6c 79  rning as quickly
2450: 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0d 0a 20   as possible... 
2460: 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73     /// </remarks
2470: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
2480: 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e 54 68  m name="args">Th
2490: 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  e arguments for 
24a0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70  the command to p
24b0: 72 6f 63 65 73 73 3c 2f 70 61 72 61 6d 3e 0d 0a  rocess</param>..
24c0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
24d0: 61 6d 65 3d 22 73 74 65 70 4e 75 6d 62 65 72 22  ame="stepNumber"
24e0: 3e 54 68 65 20 31 2d 62 61 73 65 64 20 73 74 65  >The 1-based ste
24f0: 70 20 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20  p number.  This 
2500: 69 73 20 69 6e 63 72 65 6d 65 6d 74 65 64 20 65  is incrememted e
2510: 61 63 68 20 74 69 6d 65 20 74 68 65 20 73 74 65  ach time the ste
2520: 70 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  p method is call
2530: 65 64 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  ed.</param>..   
2540: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
2550: 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 41  ="contextData">A
2560: 20 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72   placeholder for
2570: 20 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74 6f   implementers to
2580: 20 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75 61   store contextua
2590: 6c 20 64 61 74 61 20 70 65 72 74 61 69 6e 69 6e  l data pertainin
25a0: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
25b0: 20 63 6f 6e 74 65 78 74 2e 3c 2f 70 61 72 61 6d   context.</param
25c0: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 69  >..    public vi
25d0: 72 74 75 61 6c 20 76 6f 69 64 20 53 74 65 70 28  rtual void Step(
25e0: 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 2c 20 69  object[] args, i
25f0: 6e 74 20 73 74 65 70 4e 75 6d 62 65 72 2c 20 72  nt stepNumber, r
2600: 65 66 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78  ef object contex
2610: 74 44 61 74 61 29 0d 0a 20 20 20 20 7b 0d 0a 20  tData)..    {.. 
2620: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
2630: 65 64 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ed();..    }....
2640: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
2650: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 67 67 72 65  >..    /// Aggre
2660: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
2670: 76 65 72 72 69 64 65 20 74 68 69 73 20 6d 65 74  verride this met
2680: 68 6f 64 20 74 6f 20 66 69 6e 69 73 68 20 74 68  hod to finish th
2690: 65 69 72 20 61 67 67 72 65 67 61 74 65 20 70 72  eir aggregate pr
26a0: 6f 63 65 73 73 69 6e 67 2e 0d 0a 20 20 20 20 2f  ocessing...    /
26b0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
26c0: 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e     /// <remarks>
26d0: 0d 0a 20 20 20 20 2f 2f 2f 20 49 66 20 79 6f 75  ..    /// If you
26e0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 79 6f 75   implemented you
26f0: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
2700: 74 69 6f 6e 20 70 72 6f 70 65 72 6c 79 2c 0d 0a  tion properly,..
2710: 20 20 20 20 2f 2f 2f 20 79 6f 75 27 76 65 20 62      /// you've b
2720: 65 65 6e 20 72 65 63 6f 72 64 69 6e 67 20 61 6e  een recording an
2730: 64 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  d keeping track 
2740: 6f 66 20 79 6f 75 72 20 64 61 74 61 20 69 6e 20  of your data in 
2750: 74 68 65 20 63 6f 6e 74 65 78 74 44 61 74 61 20  the contextData 
2760: 6f 62 6a 65 63 74 20 70 72 6f 76 69 64 65 64 2c  object provided,
2770: 20 61 6e 64 20 6e 6f 77 20 61 74 20 74 68 69 73   and now at this
2780: 20 73 74 61 67 65 20 79 6f 75 20 73 68 6f 75 6c   stage you shoul
2790: 64 20 68 61 76 65 0d 0a 20 20 20 20 2f 2f 2f 20  d have..    /// 
27a0: 61 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  all the informat
27b0: 69 6f 6e 20 79 6f 75 20 6e 65 65 64 20 69 6e 20  ion you need in 
27c0: 74 68 65 72 65 20 74 6f 20 66 69 67 75 72 65 20  there to figure 
27d0: 6f 75 74 20 77 68 61 74 20 74 6f 20 72 65 74 75  out what to retu
27e0: 72 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 4e 4f 54  rn...    /// NOT
27f0: 45 3a 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  E:  It is possib
2800: 6c 65 20 74 6f 20 61 72 72 69 76 65 20 68 65 72  le to arrive her
2810: 65 20 77 69 74 68 6f 75 74 20 72 65 63 65 69 76  e without receiv
2820: 69 6e 67 20 61 20 70 72 65 76 69 6f 75 73 20 63  ing a previous c
2830: 61 6c 6c 20 74 6f 20 53 74 65 70 28 29 2c 20 69  all to Step(), i
2840: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
2850: 20 63 6f 6e 74 65 78 74 44 61 74 61 20 77 69 6c   contextData wil
2860: 6c 0d 0a 20 20 20 20 2f 2f 2f 20 62 65 20 6e 75  l..    /// be nu
2870: 6c 6c 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ll.  This can ha
2880: 70 70 65 6e 20 77 68 65 6e 20 6e 6f 20 72 6f 77  ppen when no row
2890: 73 20 77 65 72 65 20 72 65 74 75 72 6e 65 64 2e  s were returned.
28a0: 20 20 59 6f 75 20 63 61 6e 20 65 69 74 68 65 72    You can either
28b0: 20 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 6f 72   return null, or
28c0: 20 30 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72   0 or some other
28d0: 20 63 75 73 74 6f 6d 20 72 65 74 75 72 6e 20 76   custom return v
28e0: 61 6c 75 65 0d 0a 20 20 20 20 2f 2f 2f 20 69 66  alue..    /// if
28f0: 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2900: 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65  e...    /// </re
2910: 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20  marks>..    /// 
2920: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e  <param name="con
2930: 74 65 78 74 44 61 74 61 22 3e 59 6f 75 72 20 6f  textData">Your o
2940: 77 6e 20 61 73 73 69 67 6e 65 64 20 63 6f 6e 74  wn assigned cont
2950: 65 78 74 44 61 74 61 2c 20 70 72 6f 76 69 64 65  extData, provide
2960: 64 20 66 6f 72 20 79 6f 75 20 73 6f 20 79 6f 75  d for you so you
2970: 20 63 61 6e 20 72 65 74 75 72 6e 20 79 6f 75 72   can return your
2980: 20 66 69 6e 61 6c 20 72 65 73 75 6c 74 73 2e 3c   final results.<
2990: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
29a0: 20 3c 72 65 74 75 72 6e 73 3e 59 6f 75 20 6d 61   <returns>You ma
29b0: 79 20 72 65 74 75 72 6e 20 6d 6f 73 74 20 73 69  y return most si
29c0: 6d 70 6c 65 20 74 79 70 65 73 20 61 73 20 61 20  mple types as a 
29d0: 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 6e 75  return value, nu
29e0: 6c 6c 20 6f 72 20 44 42 4e 75 6c 6c 2e 56 61 6c  ll or DBNull.Val
29f0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 6e 75 6c  ue to return nul
2a00: 6c 2c 20 44 61 74 65 54 69 6d 65 2c 20 6f 72 0d  l, DateTime, or.
2a10: 0a 20 20 20 20 2f 2f 2f 20 79 6f 75 20 6d 61 79  .    /// you may
2a20: 20 72 65 74 75 72 6e 20 61 6e 20 45 78 63 65 70   return an Excep
2a30: 74 69 6f 6e 2d 64 65 72 69 76 65 64 20 63 6c 61  tion-derived cla
2a40: 73 73 20 69 66 20 79 6f 75 20 77 69 73 68 20 74  ss if you wish t
2a50: 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
2a60: 72 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 44 6f  r to SQLite.  Do
2a70: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 74 68   not actually th
2a80: 72 6f 77 20 74 68 65 20 65 72 72 6f 72 2c 0d 0a  row the error,..
2a90: 20 20 20 20 2f 2f 2f 20 6a 75 73 74 20 72 65 74      /// just ret
2aa0: 75 72 6e 20 69 74 21 0d 0a 20 20 20 20 2f 2f 2f  urn it!..    ///
2ab0: 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20   </returns>..   
2ac0: 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c 20   public virtual 
2ad0: 6f 62 6a 65 63 74 20 46 69 6e 61 6c 28 6f 62 6a  object Final(obj
2ae0: 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 29  ect contextData)
2af0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43  ..    {..      C
2b00: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d  heckDisposed();.
2b10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75  .      return nu
2b20: 6c 6c 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ll;..    }....  
2b30: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
2b40: 0a 20 20 20 20 2f 2f 2f 20 55 73 65 72 2d 64 65  .    /// User-de
2b50: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  fined collating 
2b60: 73 65 71 75 65 6e 63 65 73 20 6f 76 65 72 72 69  sequences overri
2b70: 64 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74  de this method t
2b80: 6f 20 70 72 6f 76 69 64 65 20 61 20 63 75 73 74  o provide a cust
2b90: 6f 6d 20 73 74 72 69 6e 67 20 73 6f 72 74 69 6e  om string sortin
2ba0: 67 20 61 6c 67 6f 72 69 74 68 6d 2e 0d 0a 20 20  g algorithm...  
2bb0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
2bc0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
2bd0: 20 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22 3e 54   name="param1">T
2be0: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
2bf0: 74 6f 20 63 6f 6d 70 61 72 65 2e 3c 2f 70 61 72  to compare.</par
2c00: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
2c10: 72 61 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32  ram name="param2
2c20: 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 73 74 72  ">The second str
2c30: 6e 69 67 20 74 6f 20 63 6f 6d 70 61 72 65 2e 3c  nig to compare.<
2c40: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
2c50: 20 3c 72 65 74 75 72 6e 73 3e 31 20 69 66 20 70   <returns>1 if p
2c60: 61 72 61 6d 31 20 69 73 20 67 72 65 61 74 65 72  aram1 is greater
2c70: 20 74 68 61 6e 20 70 61 72 61 6d 32 2c 20 30 20   than param2, 0 
2c80: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
2c90: 6c 2c 20 6f 72 20 2d 31 20 69 66 20 70 61 72 61  l, or -1 if para
2ca0: 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  m1 is less than 
2cb0: 70 61 72 61 6d 32 2e 3c 2f 72 65 74 75 72 6e 73  param2.</returns
2cc0: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 69  >..    public vi
2cd0: 72 74 75 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72  rtual int Compar
2ce0: 65 28 73 74 72 69 6e 67 20 70 61 72 61 6d 31 2c  e(string param1,
2cf0: 20 73 74 72 69 6e 67 20 70 61 72 61 6d 32 29 0d   string param2).
2d00: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68  .    {..      Ch
2d10: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
2d20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d        return 0;.
2d30: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
2d40: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
2d50: 20 2f 2f 2f 20 43 6f 6e 76 65 72 74 73 20 61 6e   /// Converts an
2d60: 20 49 6e 74 50 74 72 20 61 72 72 61 79 20 6f 66   IntPtr array of
2d70: 20 63 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e   context argumen
2d80: 74 73 20 74 6f 20 61 6e 20 6f 62 6a 65 63 74 20  ts to an object 
2d90: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67  array containing
2da0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 70 61   the resolved pa
2db0: 72 61 6d 65 74 65 72 73 20 74 68 65 20 70 6f 69  rameters the poi
2dc0: 6e 74 65 72 73 20 70 6f 69 6e 74 20 74 6f 2e 0d  nters point to..
2dd0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
2de0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ry>..    /// <re
2df0: 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20  marks>..    /// 
2e00: 50 61 72 61 6d 65 74 65 72 73 20 70 61 73 73 65  Parameters passe
2e10: 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e 73 20 68  d to functions h
2e20: 61 76 65 20 6f 6e 6c 79 20 61 6e 20 61 66 66 69  ave only an affi
2e30: 6e 69 74 79 20 66 6f 72 20 61 20 63 65 72 74 61  nity for a certa
2e40: 69 6e 20 64 61 74 61 20 74 79 70 65 2c 20 74 68  in data type, th
2e50: 65 72 65 20 69 73 20 6e 6f 20 75 6e 64 65 72 6c  ere is no underl
2e60: 79 69 6e 67 20 73 63 68 65 6d 61 20 61 76 61 69  ying schema avai
2e70: 6c 61 62 6c 65 0d 0a 20 20 20 20 2f 2f 2f 20 74  lable..    /// t
2e80: 6f 20 66 6f 72 63 65 20 74 68 65 6d 20 69 6e 74  o force them int
2e90: 6f 20 61 20 63 65 72 74 61 69 6e 20 74 79 70 65  o a certain type
2ea0: 2e 20 20 54 68 65 72 65 66 6f 72 65 20 74 68 65  .  Therefore the
2eb0: 20 6f 6e 6c 79 20 74 79 70 65 73 20 79 6f 75 20   only types you 
2ec0: 77 69 6c 6c 20 65 76 65 72 20 73 65 65 20 61 73  will ever see as
2ed0: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 0d   parameters are.
2ee0: 0a 20 20 20 20 2f 2f 2f 20 44 42 4e 75 6c 6c 2e  .    /// DBNull.
2ef0: 56 61 6c 75 65 2c 20 49 6e 74 36 34 2c 20 44 6f  Value, Int64, Do
2f00: 75 62 6c 65 2c 20 53 74 72 69 6e 67 20 6f 72 20  uble, String or 
2f10: 62 79 74 65 5b 5d 20 61 72 72 61 79 2e 0d 0a 20  byte[] array... 
2f20: 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73     /// </remarks
2f30: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
2f40: 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73 22 3e 54  m name="nArgs">T
2f50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
2f60: 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0d 0a  uments</param>..
2f70: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
2f80: 61 6d 65 3d 22 61 72 67 73 70 74 72 22 3e 41 20  ame="argsptr">A 
2f90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
2fa0: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
2fb0: 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  s</param>..    /
2fc0: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 41 6e 20 6f  // <returns>An o
2fd0: 62 6a 65 63 74 20 61 72 72 61 79 20 6f 66 20 74  bject array of t
2fe0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 63  he arguments onc
2ff0: 65 20 74 68 65 79 27 76 65 20 62 65 65 6e 20 63  e they've been c
3000: 6f 6e 76 65 72 74 65 64 20 74 6f 20 2e 4e 45 54  onverted to .NET
3010: 20 76 61 6c 75 65 73 3c 2f 72 65 74 75 72 6e 73   values</returns
3020: 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  >..    internal 
3030: 6f 62 6a 65 63 74 5b 5d 20 43 6f 6e 76 65 72 74  object[] Convert
3040: 50 61 72 61 6d 73 28 69 6e 74 20 6e 41 72 67 73  Params(int nArgs
3050: 2c 20 49 6e 74 50 74 72 20 61 72 67 73 70 74 72  , IntPtr argsptr
3060: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
3070: 6f 62 6a 65 63 74 5b 5d 20 70 61 72 6d 73 20 3d  object[] parms =
3080: 20 6e 65 77 20 6f 62 6a 65 63 74 5b 6e 41 72 67   new object[nArg
3090: 73 5d 3b 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f  s];..#if !PLATFO
30a0: 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
30b0: 4f 52 4b 0d 0a 20 20 20 20 20 20 49 6e 74 50 74  ORK..      IntPt
30c0: 72 5b 5d 20 61 72 67 69 6e 74 20 3d 20 6e 65 77  r[] argint = new
30d0: 20 49 6e 74 50 74 72 5b 6e 41 72 67 73 5d 3b 0d   IntPtr[nArgs];.
30e0: 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 69 6e  .#else..      in
30f0: 74 5b 5d 20 61 72 67 69 6e 74 20 3d 20 6e 65 77  t[] argint = new
3100: 20 69 6e 74 5b 6e 41 72 67 73 5d 3b 0d 0a 23 65   int[nArgs];..#e
3110: 6e 64 69 66 0d 0a 20 20 20 20 20 20 4d 61 72 73  ndif..      Mars
3120: 68 61 6c 2e 43 6f 70 79 28 61 72 67 73 70 74 72  hal.Copy(argsptr
3130: 2c 20 61 72 67 69 6e 74 2c 20 30 2c 20 6e 41 72  , argint, 0, nAr
3140: 67 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  gs);....      fo
3150: 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20  r (int n = 0; n 
3160: 3c 20 6e 41 72 67 73 3b 20 6e 2b 2b 29 0d 0a 20  < nArgs; n++).. 
3170: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3180: 73 77 69 74 63 68 20 28 5f 62 61 73 65 2e 47 65  switch (_base.Ge
3190: 74 50 61 72 61 6d 56 61 6c 75 65 54 79 70 65 28  tParamValueType(
31a0: 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e  (IntPtr)argint[n
31b0: 5d 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ]))..        {..
31c0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
31d0: 79 70 65 41 66 66 69 6e 69 74 79 2e 4e 75 6c 6c  ypeAffinity.Null
31e0: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  :..            p
31f0: 61 72 6d 73 5b 6e 5d 20 3d 20 44 42 4e 75 6c 6c  arms[n] = DBNull
3200: 2e 56 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  .Value;..       
3210: 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20       break;..   
3220: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
3230: 41 66 66 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0d  Affinity.Int64:.
3240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72  .            par
3250: 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47 65  ms[n] = _base.Ge
3260: 74 50 61 72 61 6d 56 61 6c 75 65 49 6e 74 36 34  tParamValueInt64
3270: 28 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74 5b  ((IntPtr)argint[
3280: 6e 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n]);..          
3290: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
32a0: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
32b0: 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0d 0a 20  inity.Double:.. 
32c0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73             parms
32d0: 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47 65 74 50  [n] = _base.GetP
32e0: 61 72 61 6d 56 61 6c 75 65 44 6f 75 62 6c 65 28  aramValueDouble(
32f0: 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e  (IntPtr)argint[n
3300: 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]);..           
3310: 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20   break;..       
3320: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
3330: 6e 69 74 79 2e 54 65 78 74 3a 0d 0a 20 20 20 20  nity.Text:..    
3340: 20 20 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d          parms[n]
3350: 20 3d 20 5f 62 61 73 65 2e 47 65 74 50 61 72 61   = _base.GetPara
3360: 6d 56 61 6c 75 65 54 65 78 74 28 28 49 6e 74 50  mValueText((IntP
3370: 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 3b 0d 0a  tr)argint[n]);..
3380: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3390: 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  k;..          ca
33a0: 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  se TypeAffinity.
33b0: 42 6c 6f 62 3a 0d 0a 20 20 20 20 20 20 20 20 20  Blob:..         
33c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
33d0: 20 20 20 20 69 6e 74 20 78 3b 0d 0a 20 20 20 20      int x;..    
33e0: 20 20 20 20 20 20 20 20 20 20 62 79 74 65 5b 5d            byte[]
33f0: 20 62 6c 6f 62 3b 0d 0a 0d 0a 20 20 20 20 20 20   blob;....      
3400: 20 20 20 20 20 20 20 20 78 20 3d 20 28 69 6e 74          x = (int
3410: 29 5f 62 61 73 65 2e 47 65 74 50 61 72 61 6d 56  )_base.GetParamV
3420: 61 6c 75 65 42 79 74 65 73 28 28 49 6e 74 50 74  alueBytes((IntPt
3430: 72 29 61 72 67 69 6e 74 5b 6e 5d 2c 20 30 2c 20  r)argint[n], 0, 
3440: 6e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0d 0a 20 20  null, 0, 0);..  
3450: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
3460: 20 3d 20 6e 65 77 20 62 79 74 65 5b 78 5d 3b 0d   = new byte[x];.
3470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f  .              _
3480: 62 61 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c  base.GetParamVal
3490: 75 65 42 79 74 65 73 28 28 49 6e 74 50 74 72 29  ueBytes((IntPtr)
34a0: 61 72 67 69 6e 74 5b 6e 5d 2c 20 30 2c 20 62 6c  argint[n], 0, bl
34b0: 6f 62 2c 20 30 2c 20 78 29 3b 0d 0a 20 20 20 20  ob, 0, x);..    
34c0: 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73 5b            parms[
34d0: 6e 5d 20 3d 20 62 6c 6f 62 3b 0d 0a 20 20 20 20  n] = blob;..    
34e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
34f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
3500: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79           case Ty
3510: 70 65 41 66 66 69 6e 69 74 79 2e 44 61 74 65 54  peAffinity.DateT
3520: 69 6d 65 3a 20 2f 2f 20 4e 65 76 65 72 20 68 61  ime: // Never ha
3530: 70 70 65 6e 73 20 68 65 72 65 20 62 75 74 20 77  ppens here but w
3540: 68 61 74 20 74 68 65 20 68 65 63 6b 2c 20 6d 61  hat the heck, ma
3550: 79 62 65 20 69 74 20 77 69 6c 6c 20 6f 6e 65 20  ybe it will one 
3560: 64 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  day...          
3570: 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61    parms[n] = _ba
3580: 73 65 2e 54 6f 44 61 74 65 54 69 6d 65 28 5f 62  se.ToDateTime(_b
3590: 61 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75  ase.GetParamValu
35a0: 65 54 65 78 74 28 28 49 6e 74 50 74 72 29 61 72  eText((IntPtr)ar
35b0: 67 69 6e 74 5b 6e 5d 29 29 3b 0d 0a 20 20 20 20  gint[n]));..    
35c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
35d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
35e0: 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   }..      return
35f0: 20 70 61 72 6d 73 3b 0d 0a 20 20 20 20 7d 0d 0a   parms;..    }..
3600: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
3610: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 61 6b  ry>..    /// Tak
3620: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  es the return va
3630: 6c 75 65 20 66 72 6f 6d 20 49 6e 76 6f 6b 65 28  lue from Invoke(
3640: 29 20 61 6e 64 20 46 69 6e 61 6c 28 29 20 61 6e  ) and Final() an
3650: 64 20 66 69 67 75 72 65 73 20 6f 75 74 20 68 6f  d figures out ho
3660: 77 20 74 6f 20 72 65 74 75 72 6e 20 69 74 20 74  w to return it t
3670: 6f 20 53 51 4c 69 74 65 27 73 20 63 6f 6e 74 65  o SQLite's conte
3680: 78 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  xt...    /// </s
3690: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
36a0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f   <param name="co
36b0: 6e 74 65 78 74 22 3e 54 68 65 20 63 6f 6e 74 65  ntext">The conte
36c0: 78 74 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  xt the return va
36d0: 6c 75 65 20 61 70 70 6c 69 65 73 20 74 6f 3c 2f  lue applies to</
36e0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
36f0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 72 65 74  <param name="ret
3700: 75 72 6e 56 61 6c 75 65 22 3e 54 68 65 20 70 61  urnValue">The pa
3710: 72 61 6d 65 74 65 72 20 74 6f 20 72 65 74 75 72  rameter to retur
3720: 6e 20 74 6f 20 53 51 4c 69 74 65 3c 2f 70 61 72  n to SQLite</par
3730: 61 6d 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  am>..    private
3740: 20 76 6f 69 64 20 53 65 74 52 65 74 75 72 6e 56   void SetReturnV
3750: 61 6c 75 65 28 49 6e 74 50 74 72 20 63 6f 6e 74  alue(IntPtr cont
3760: 65 78 74 2c 20 6f 62 6a 65 63 74 20 72 65 74 75  ext, object retu
3770: 72 6e 56 61 6c 75 65 29 0d 0a 20 20 20 20 7b 0d  rnValue)..    {.
3780: 0a 20 20 20 20 20 20 69 66 20 28 72 65 74 75 72  .      if (retur
3790: 6e 56 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 20 7c  nValue == null |
37a0: 7c 20 72 65 74 75 72 6e 56 61 6c 75 65 20 3d 3d  | returnValue ==
37b0: 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 29 0d 0a   DBNull.Value)..
37c0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
37d0: 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 4e 75 6c   _base.ReturnNul
37e0: 6c 28 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20  l(context);..   
37f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20       return;..  
3800: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 54      }....      T
3810: 79 70 65 20 74 20 3d 20 72 65 74 75 72 6e 56 61  ype t = returnVa
3820: 6c 75 65 2e 47 65 74 54 79 70 65 28 29 3b 0d 0a  lue.GetType();..
3830: 20 20 20 20 20 20 69 66 20 28 74 20 3d 3d 20 74        if (t == t
3840: 79 70 65 6f 66 28 44 61 74 65 54 69 6d 65 29 29  ypeof(DateTime))
3850: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
3860: 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 54     _base.ReturnT
3870: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 5f 62 61  ext(context, _ba
3880: 73 65 2e 54 6f 53 74 72 69 6e 67 28 28 44 61 74  se.ToString((Dat
3890: 65 54 69 6d 65 29 72 65 74 75 72 6e 56 61 6c 75  eTime)returnValu
38a0: 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65  e));..        re
38b0: 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  turn;..      }..
38c0: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
38d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 45 78 63    {..        Exc
38e0: 65 70 74 69 6f 6e 20 72 20 3d 20 72 65 74 75 72  eption r = retur
38f0: 6e 56 61 6c 75 65 20 61 73 20 45 78 63 65 70 74  nValue as Except
3900: 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ion;....        
3910: 69 66 20 28 72 20 21 3d 20 6e 75 6c 6c 29 0d 0a  if (r != null)..
3920: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3930: 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72       _base.Retur
3940: 6e 45 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  nError(context, 
3950: 72 2e 4d 65 73 73 61 67 65 29 3b 0d 0a 20 20 20  r.Message);..   
3960: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a         return;..
3970: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
3980: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 77 69 74   }....      swit
3990: 63 68 20 28 53 51 4c 69 74 65 43 6f 6e 76 65 72  ch (SQLiteConver
39a0: 74 2e 54 79 70 65 54 6f 41 66 66 69 6e 69 74 79  t.TypeToAffinity
39b0: 28 74 29 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  (t))..      {.. 
39c0: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
39d0: 41 66 66 69 6e 69 74 79 2e 4e 75 6c 6c 3a 0d 0a  Affinity.Null:..
39e0: 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e            _base.
39f0: 52 65 74 75 72 6e 4e 75 6c 6c 28 63 6f 6e 74 65  ReturnNull(conte
3a00: 78 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  xt);..          
3a10: 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20  return;..       
3a20: 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69   case TypeAffini
3a30: 74 79 2e 49 6e 74 36 34 3a 0d 0a 20 20 20 20 20  ty.Int64:..     
3a40: 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72       _base.Retur
3a50: 6e 49 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  nInt64(context, 
3a60: 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 36 34 28  Convert.ToInt64(
3a70: 72 65 74 75 72 6e 56 61 6c 75 65 2c 20 43 75 6c  returnValue, Cul
3a80: 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74  tureInfo.Current
3a90: 43 75 6c 74 75 72 65 29 29 3b 0d 0a 20 20 20 20  Culture));..    
3aa0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20        return;.. 
3ab0: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
3ac0: 41 66 66 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a  Affinity.Double:
3ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5f 62 61 73  ..          _bas
3ae0: 65 2e 52 65 74 75 72 6e 44 6f 75 62 6c 65 28 63  e.ReturnDouble(c
3af0: 6f 6e 74 65 78 74 2c 20 43 6f 6e 76 65 72 74 2e  ontext, Convert.
3b00: 54 6f 44 6f 75 62 6c 65 28 72 65 74 75 72 6e 56  ToDouble(returnV
3b10: 61 6c 75 65 2c 20 43 75 6c 74 75 72 65 49 6e 66  alue, CultureInf
3b20: 6f 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65  o.CurrentCulture
3b30: 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  ));..          r
3b40: 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20  eturn;..        
3b50: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
3b60: 79 2e 54 65 78 74 3a 0d 0a 20 20 20 20 20 20 20  y.Text:..       
3b70: 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 54     _base.ReturnT
3b80: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 72 65 74  ext(context, ret
3b90: 75 72 6e 56 61 6c 75 65 2e 54 6f 53 74 72 69 6e  urnValue.ToStrin
3ba0: 67 28 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  g());..         
3bb0: 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20   return;..      
3bc0: 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e    case TypeAffin
3bd0: 69 74 79 2e 42 6c 6f 62 3a 0d 0a 20 20 20 20 20  ity.Blob:..     
3be0: 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75 72       _base.Retur
3bf0: 6e 42 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 28  nBlob(context, (
3c00: 62 79 74 65 5b 5d 29 72 65 74 75 72 6e 56 61 6c  byte[])returnVal
3c10: 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ue);..          
3c20: 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 7d  return;..      }
3c30: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
3c40: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
3c50: 20 20 2f 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 73    /// Internal s
3c60: 63 61 6c 61 72 20 63 61 6c 6c 62 61 63 6b 20 66  calar callback f
3c70: 75 6e 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 77  unction, which w
3c80: 72 61 70 73 20 74 68 65 20 72 61 77 20 63 6f 6e  raps the raw con
3c90: 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61 6e 64  text pointer and
3ca0: 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72 74 75   calls the virtu
3cb0: 61 6c 20 49 6e 76 6f 6b 65 28 29 20 6d 65 74 68  al Invoke() meth
3cc0: 6f 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52  od...    /// WAR
3cd0: 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74  NING: Must not t
3ce0: 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e  hrow exceptions.
3cf0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
3d00: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
3d10: 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65  aram name="conte
3d20: 78 74 22 3e 41 20 72 61 77 20 63 6f 6e 74 65 78  xt">A raw contex
3d30: 74 20 70 6f 69 6e 74 65 72 3c 2f 70 61 72 61 6d  t pointer</param
3d40: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
3d50: 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73 22 3e 4e  m name="nArgs">N
3d60: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3d70: 74 73 20 70 61 73 73 65 64 20 69 6e 3c 2f 70 61  ts passed in</pa
3d80: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
3d90: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 70  aram name="argsp
3da0: 74 72 22 3e 41 20 70 6f 69 6e 74 65 72 20 74 6f  tr">A pointer to
3db0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72   the array of ar
3dc0: 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0d  guments</param>.
3dd0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
3de0: 69 64 20 53 63 61 6c 61 72 43 61 6c 6c 62 61 63  id ScalarCallbac
3df0: 6b 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  k(IntPtr context
3e00: 2c 20 69 6e 74 20 6e 41 72 67 73 2c 20 49 6e 74  , int nArgs, Int
3e10: 50 74 72 20 61 72 67 73 70 74 72 29 0d 0a 20 20  Ptr argsptr)..  
3e20: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79    {..        try
3e30: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
3e40: 20 20 20 20 20 20 20 20 20 5f 63 6f 6e 74 65 78           _contex
3e50: 74 20 3d 20 63 6f 6e 74 65 78 74 3b 0d 0a 20 20  t = context;..  
3e60: 20 20 20 20 20 20 20 20 20 20 53 65 74 52 65 74            SetRet
3e70: 75 72 6e 56 61 6c 75 65 28 63 6f 6e 74 65 78 74  urnValue(context
3e80: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
3e90: 20 20 20 49 6e 76 6f 6b 65 28 43 6f 6e 76 65 72     Invoke(Conver
3ea0: 74 50 61 72 61 6d 73 28 6e 41 72 67 73 2c 20 61  tParams(nArgs, a
3eb0: 72 67 73 70 74 72 29 29 29 3b 20 2f 2a 20 74 68  rgsptr))); /* th
3ec0: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
3ed0: 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  }..        catch
3ee0: 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 20 2f   (Exception e) /
3ef0: 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63 61 74  * NOTE: Must cat
3f00: 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20 20 20  ch ALL. */..    
3f10: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3f20: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20     try..        
3f30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3f40: 20 20 20 20 20 20 20 69 66 20 28 28 5f 66 6c 61         if ((_fla
3f50: 67 73 20 26 20 53 51 4c 69 74 65 43 6f 6e 6e 65  gs & SQLiteConne
3f60: 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61  ctionFlags.LogCa
3f70: 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e 29  llbackException)
3f80: 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ==..           
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
3fa0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
3fb0: 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78  gs.LogCallbackEx
3fc0: 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ception)..      
3fd0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f 67 4d 65   SQLiteLog.LogMe
4000: 73 73 61 67 65 28 53 51 4c 69 74 65 42 61 73 65  ssage(SQLiteBase
4010: 2e 43 4f 52 5f 45 5f 45 58 43 45 50 54 49 4f 4e  .COR_E_EXCEPTION
4020: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
4030: 20 20 20 20 20 20 20 20 20 20 20 55 6e 73 61 66             Unsaf
4040: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 53  eNativeMethods.S
4050: 74 72 69 6e 67 46 6f 72 6d 61 74 28 43 75 6c 74  tringFormat(Cult
4060: 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43  ureInfo.CurrentC
4070: 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20 20 20  ulture,..       
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 22 43 61 75 67 68 74 20 65 78 63 65 70 74 69   "Caught excepti
40a0: 6f 6e 20 69 6e 20 5c 22 49 6e 76 6f 6b 65 5c 22  on in \"Invoke\"
40b0: 20 6d 65 74 68 6f 64 3a 20 7b 30 7d 22 2c 0d 0a   method: {0}",..
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 20 20 20 20 65 29 29 3b 20 2f 2a 20          e)); /* 
40e0: 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20  throw */..      
40f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
4100: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4110: 20 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20          catch.. 
4120: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
4140: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   do nothing...  
4150: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
4160: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
4170: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
4180: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65  y>..    /// Inte
4190: 72 6e 61 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rnal collating s
41a0: 65 71 75 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e  equence function
41b0: 2c 20 77 68 69 63 68 20 77 72 61 70 73 20 75 70  , which wraps up
41c0: 20 74 68 65 20 72 61 77 20 73 74 72 69 6e 67 20   the raw string 
41d0: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 65 78 65  pointers and exe
41e0: 63 75 74 65 73 20 74 68 65 20 43 6f 6d 70 61 72  cutes the Compar
41f0: 65 28 29 20 76 69 72 74 75 61 6c 20 66 75 6e 63  e() virtual func
4200: 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57  tion...    /// W
4210: 41 52 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74  ARNING: Must not
4220: 20 74 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e   throw exception
4230: 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  s...    /// </su
4240: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
4250: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72  <param name="ptr
4260: 22 3e 4e 6f 74 20 75 73 65 64 3c 2f 70 61 72 61  ">Not used</para
4270: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
4280: 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c  am name="len1">L
4290: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
42a0: 69 6e 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e 0d  ing pv1</param>.
42b0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
42c0: 6e 61 6d 65 3d 22 70 74 72 31 22 3e 50 6f 69 6e  name="ptr1">Poin
42d0: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
42e0: 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61   string to compa
42f0: 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  re</param>..    
4300: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
4310: 22 6c 65 6e 32 22 3e 4c 65 6e 67 74 68 20 6f 66  "len2">Length of
4320: 20 74 68 65 20 73 74 72 69 6e 67 20 70 76 32 3c   the string pv2<
4330: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
4340: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74   <param name="pt
4350: 72 32 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74  r2">Pointer to t
4360: 68 65 20 73 65 63 6f 6e 64 20 73 74 72 69 6e 67  he second string
4370: 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72   to compare</par
4380: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  am>..    /// <re
4390: 74 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31  turns>Returns -1
43a0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74   if the first st
43b0: 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61  ring is less tha
43c0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30  n the second.  0
43d0: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
43e0: 61 6c 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20  al, or 1 if the 
43f0: 66 69 72 73 74 20 73 74 72 69 6e 67 20 69 73 20  first string is 
4400: 67 72 65 61 74 65 72 0d 0a 20 20 20 20 2f 2f 2f  greater..    ///
4410: 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
4420: 2e 20 20 52 65 74 75 72 6e 73 20 30 20 69 66 20  .  Returns 0 if 
4430: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  an exception is 
4440: 63 61 75 67 68 74 2e 3c 2f 72 65 74 75 72 6e 73  caught.</returns
4450: 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  >..    internal 
4460: 69 6e 74 20 43 6f 6d 70 61 72 65 43 61 6c 6c 62  int CompareCallb
4470: 61 63 6b 28 49 6e 74 50 74 72 20 70 74 72 2c 20  ack(IntPtr ptr, 
4480: 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74 72  int len1, IntPtr
4490: 20 70 74 72 31 2c 20 69 6e 74 20 6c 65 6e 32 2c   ptr1, int len2,
44a0: 20 49 6e 74 50 74 72 20 70 74 72 32 29 0d 0a 20   IntPtr ptr2).. 
44b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72     {..        tr
44c0: 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  y..        {..  
44d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
44e0: 20 43 6f 6d 70 61 72 65 28 53 51 4c 69 74 65 43   Compare(SQLiteC
44f0: 6f 6e 76 65 72 74 2e 55 54 46 38 54 6f 53 74 72  onvert.UTF8ToStr
4500: 69 6e 67 28 70 74 72 31 2c 20 6c 65 6e 31 29 2c  ing(ptr1, len1),
4510: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4520: 20 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e    SQLiteConvert.
4530: 55 54 46 38 54 6f 53 74 72 69 6e 67 28 70 74 72  UTF8ToString(ptr
4540: 32 2c 20 6c 65 6e 32 29 29 3b 20 2f 2a 20 74 68  2, len2)); /* th
4550: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
4560: 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  }..        catch
4570: 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 20 2f   (Exception e) /
4580: 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63 61 74  * NOTE: Must cat
4590: 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20 20 20  ch ALL. */..    
45a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
45b0: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20     try..        
45c0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
45d0: 20 20 20 20 20 20 20 69 66 20 28 28 5f 66 6c 61         if ((_fla
45e0: 67 73 20 26 20 53 51 4c 69 74 65 43 6f 6e 6e 65  gs & SQLiteConne
45f0: 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61  ctionFlags.LogCa
4600: 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e 29  llbackException)
4610: 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ==..           
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4630: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
4640: 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78  gs.LogCallbackEx
4650: 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ception)..      
4660: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f 67 4d 65   SQLiteLog.LogMe
4690: 73 73 61 67 65 28 53 51 4c 69 74 65 42 61 73 65  ssage(SQLiteBase
46a0: 2e 43 4f 52 5f 45 5f 45 58 43 45 50 54 49 4f 4e  .COR_E_EXCEPTION
46b0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
46c0: 20 20 20 20 20 20 20 20 20 20 20 55 6e 73 61 66             Unsaf
46d0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 53  eNativeMethods.S
46e0: 74 72 69 6e 67 46 6f 72 6d 61 74 28 43 75 6c 74  tringFormat(Cult
46f0: 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43  ureInfo.CurrentC
4700: 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20 20 20  ulture,..       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 22 43 61 75 67 68 74 20 65 78 63 65 70 74 69   "Caught excepti
4730: 6f 6e 20 69 6e 20 5c 22 43 6f 6d 70 61 72 65 5c  on in \"Compare\
4740: 22 20 28 55 54 46 38 29 20 6d 65 74 68 6f 64 3a  " (UTF8) method:
4750: 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  e)); /* throw */
4780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4790: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
47a0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
47b0: 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  catch..         
47c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
47d0: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
47e0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
47f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
4800: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20  ..        //..  
4810: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54        // NOTE: T
4820: 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
4830: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
4840: 63 6f 72 65 20 53 51 4c 69 74 65 20 6c 69 62 72  core SQLite libr
4850: 61 72 79 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20  ary from..      
4860: 20 20 2f 2f 20 20 20 20 20 20 20 75 73 69 6e 67    //       using
4870: 20 6f 75 72 20 28 69 6e 76 61 6c 69 64 29 20 72   our (invalid) r
4880: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20  esult...        
4890: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  //..        if (
48a0: 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c 6c 29 20  (_base != null) 
48b0: 26 26 20 5f 62 61 73 65 2e 49 73 4f 70 65 6e 28  && _base.IsOpen(
48c0: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
48d0: 5f 62 61 73 65 2e 43 61 6e 63 65 6c 28 29 3b 0d  _base.Cancel();.
48e0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
48f0: 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  n 0;..    }.... 
4900: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
4910: 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72 6e  ..    /// Intern
4920: 61 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  al collating seq
4930: 75 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e 2c 20  uence function, 
4940: 77 68 69 63 68 20 77 72 61 70 73 20 75 70 20 74  which wraps up t
4950: 68 65 20 72 61 77 20 73 74 72 69 6e 67 20 70 6f  he raw string po
4960: 69 6e 74 65 72 73 20 61 6e 64 20 65 78 65 63 75  inters and execu
4970: 74 65 73 20 74 68 65 20 43 6f 6d 70 61 72 65 28  tes the Compare(
4980: 29 20 76 69 72 74 75 61 6c 20 66 75 6e 63 74 69  ) virtual functi
4990: 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52  on...    /// WAR
49a0: 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74  NING: Must not t
49b0: 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e  hrow exceptions.
49c0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
49d0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
49e0: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 22 3e  aram name="ptr">
49f0: 4e 6f 74 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e  Not used</param>
4a00: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
4a10: 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c 65 6e   name="len1">Len
4a20: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
4a30: 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e 0d 0a 20  g pv1</param>.. 
4a40: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
4a50: 6d 65 3d 22 70 74 72 31 22 3e 50 6f 69 6e 74 65  me="ptr1">Pointe
4a60: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  r to the first s
4a70: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
4a80: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
4a90: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c  / <param name="l
4aa0: 65 6e 32 22 3e 4c 65 6e 67 74 68 20 6f 66 20 74  en2">Length of t
4ab0: 68 65 20 73 74 72 69 6e 67 20 70 76 32 3c 2f 70  he string pv2</p
4ac0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
4ad0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 32  param name="ptr2
4ae0: 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  ">Pointer to the
4af0: 20 73 65 63 6f 6e 64 20 73 74 72 69 6e 67 20 74   second string t
4b00: 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d  o compare</param
4b10: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
4b20: 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31 20 69  rns>Returns -1 i
4b30: 66 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69  f the first stri
4b40: 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ng is less than 
4b50: 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30 20 69  the second.  0 i
4b60: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
4b70: 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69  , or 1 if the fi
4b80: 72 73 74 20 73 74 72 69 6e 67 20 69 73 20 67 72  rst string is gr
4b90: 65 61 74 65 72 0d 0a 20 20 20 20 2f 2f 2f 20 74  eater..    /// t
4ba0: 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 20  han the second. 
4bb0: 20 52 65 74 75 72 6e 73 20 30 20 69 66 20 61 6e   Returns 0 if an
4bc0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 63 61   exception is ca
4bd0: 75 67 68 74 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d  ught.</returns>.
4be0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e  .    internal in
4bf0: 74 20 43 6f 6d 70 61 72 65 43 61 6c 6c 62 61 63  t CompareCallbac
4c00: 6b 31 36 28 49 6e 74 50 74 72 20 70 74 72 2c 20  k16(IntPtr ptr, 
4c10: 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74 72  int len1, IntPtr
4c20: 20 70 74 72 31 2c 20 69 6e 74 20 6c 65 6e 32 2c   ptr1, int len2,
4c30: 20 49 6e 74 50 74 72 20 70 74 72 32 29 0d 0a 20   IntPtr ptr2).. 
4c40: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72     {..        tr
4c50: 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  y..        {..  
4c60: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4c70: 20 43 6f 6d 70 61 72 65 28 53 51 4c 69 74 65 33   Compare(SQLite3
4c80: 5f 55 54 46 31 36 2e 55 54 46 31 36 54 6f 53 74  _UTF16.UTF16ToSt
4c90: 72 69 6e 67 28 70 74 72 31 2c 20 6c 65 6e 31 29  ring(ptr1, len1)
4ca0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
4cb0: 20 20 20 53 51 4c 69 74 65 33 5f 55 54 46 31 36     SQLite3_UTF16
4cc0: 2e 55 54 46 31 36 54 6f 53 74 72 69 6e 67 28 70  .UTF16ToString(p
4cd0: 74 72 32 2c 20 6c 65 6e 32 29 29 3b 20 2f 2a 20  tr2, len2)); /* 
4ce0: 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20  throw */..      
4cf0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 74    }..        cat
4d00: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29  ch (Exception e)
4d10: 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63   /* NOTE: Must c
4d20: 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20  atch ALL. */..  
4d30: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4d40: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
4d50: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4d60: 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f 66           if ((_f
4d70: 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43 6f 6e  lags & SQLiteCon
4d80: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67  nectionFlags.Log
4d90: 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f  CallbackExceptio
4da0: 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20 20  n) ==..         
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
4dc0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
4dd0: 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b  lags.LogCallback
4de0: 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20  Exception)..    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f 67     SQLiteLog.Log
4e20: 4d 65 73 73 61 67 65 28 53 51 4c 69 74 65 42 61  Message(SQLiteBa
4e30: 73 65 2e 43 4f 52 5f 45 5f 45 58 43 45 50 54 49  se.COR_E_EXCEPTI
4e40: 4f 4e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ON,..           
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 73               Uns
4e60: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4e70: 2e 53 74 72 69 6e 67 46 6f 72 6d 61 74 28 43 75  .StringFormat(Cu
4e80: 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e  ltureInfo.Curren
4e90: 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20  tCulture,..     
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 22 43 61 75 67 68 74 20 65 78 63 65 70     "Caught excep
4ec0: 74 69 6f 6e 20 69 6e 20 5c 22 43 6f 6d 70 61 72  tion in \"Compar
4ed0: 65 5c 22 20 28 55 54 46 31 36 29 20 6d 65 74 68  e\" (UTF16) meth
4ee0: 6f 64 3a 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20  od: {0}",..     
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77     e)); /* throw
4f10: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
4f20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4f30: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4f40: 20 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20     catch..      
4f50: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4f60: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e           // do n
4f70: 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  othing...       
4f80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4f90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d  }....        //.
4fa0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45  .        // NOTE
4fb0: 3a 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  : This must be d
4fc0: 6f 6e 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74  one to prevent t
4fd0: 68 65 20 63 6f 72 65 20 53 51 4c 69 74 65 20 6c  he core SQLite l
4fe0: 69 62 72 61 72 79 20 66 72 6f 6d 0d 0a 20 20 20  ibrary from..   
4ff0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 75 73       //       us
5000: 69 6e 67 20 6f 75 72 20 28 69 6e 76 61 6c 69 64  ing our (invalid
5010: 29 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  ) result...     
5020: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 69     //..        i
5030: 66 20 28 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c  f ((_base != nul
5040: 6c 29 20 26 26 20 5f 62 61 73 65 2e 49 73 4f 70  l) && _base.IsOp
5050: 65 6e 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  en())..         
5060: 20 20 20 5f 62 61 73 65 2e 43 61 6e 63 65 6c 28     _base.Cancel(
5070: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65  );....        re
5080: 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a  turn 0;..    }..
5090: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
50a0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65  ry>..    /// The
50b0: 20 69 6e 74 65 72 6e 61 6c 20 61 67 67 72 65 67   internal aggreg
50c0: 61 74 65 20 53 74 65 70 20 66 75 6e 63 74 69 6f  ate Step functio
50d0: 6e 20 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69 63  n callback, whic
50e0: 68 20 77 72 61 70 73 20 74 68 65 20 72 61 77 20  h wraps the raw 
50f0: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20  context pointer 
5100: 61 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 76 69  and calls the vi
5110: 72 74 75 61 6c 20 53 74 65 70 28 29 20 6d 65 74  rtual Step() met
5120: 68 6f 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41  hod...    /// WA
5130: 52 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20  RNING: Must not 
5140: 74 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73  throw exceptions
5150: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
5160: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
5170: 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f  remarks>..    //
5180: 2f 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  / This function 
5190: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 64 6f  takes care of do
51a0: 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 75 70 73 20  ing the lookups 
51b0: 61 6e 64 20 67 65 74 74 69 6e 67 20 74 68 65 20  and getting the 
51c0: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 66 6f 72 6d  important inform
51d0: 61 74 69 6f 6e 20 70 75 74 20 74 6f 67 65 74 68  ation put togeth
51e0: 65 72 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 53  er to call the S
51f0: 74 65 70 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d  tep() function..
5200: 0a 20 20 20 20 2f 2f 2f 20 54 68 61 74 20 69 6e  .    /// That in
5210: 63 6c 75 64 65 73 20 70 75 6c 6c 69 6e 67 20 6f  cludes pulling o
5220: 75 74 20 74 68 65 20 75 73 65 72 27 73 20 63 6f  ut the user's co
5230: 6e 74 65 78 74 44 61 74 61 20 61 6e 64 20 75 70  ntextData and up
5240: 64 61 74 69 6e 67 20 69 74 20 61 66 74 65 72 20  dating it after 
5250: 74 68 65 20 63 61 6c 6c 20 69 73 20 6d 61 64 65  the call is made
5260: 2e 20 20 57 65 20 75 73 65 20 61 20 73 6f 72 74  .  We use a sort
5270: 65 64 20 6c 69 73 74 20 66 6f 72 20 74 68 69 73  ed list for this
5280: 20 73 6f 0d 0a 20 20 20 20 2f 2f 2f 20 62 69 6e   so..    /// bin
5290: 61 72 79 20 73 65 61 72 63 68 65 73 20 63 61 6e  ary searches can
52a0: 20 62 65 20 64 6f 6e 65 20 74 6f 20 66 69 6e 64   be done to find
52b0: 20 74 68 65 20 64 61 74 61 2e 0d 0a 20 20 20 20   the data...    
52c0: 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a  /// </remarks>..
52d0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
52e0: 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e 41 20  ame="context">A 
52f0: 72 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e  raw context poin
5300: 74 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  ter</param>..   
5310: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
5320: 3d 22 6e 41 72 67 73 22 3e 4e 75 6d 62 65 72 20  ="nArgs">Number 
5330: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
5340: 73 65 64 20 69 6e 3c 2f 70 61 72 61 6d 3e 0d 0a  sed in</param>..
5350: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
5360: 61 6d 65 3d 22 61 72 67 73 70 74 72 22 3e 41 20  ame="argsptr">A 
5370: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
5380: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
5390: 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 69  s</param>..    i
53a0: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 53 74 65  nternal void Ste
53b0: 70 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72  pCallback(IntPtr
53c0: 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e 41   context, int nA
53d0: 72 67 73 2c 20 49 6e 74 50 74 72 20 61 72 67 73  rgs, IntPtr args
53e0: 70 74 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ptr)..    {..   
53f0: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
5400: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
5410: 20 41 67 67 72 65 67 61 74 65 44 61 74 61 20 64   AggregateData d
5420: 61 74 61 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  ata = null;.... 
5430: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f             if (_
5440: 62 61 73 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  base != null).. 
5450: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
5470: 74 50 74 72 20 6e 41 75 78 20 3d 20 5f 62 61 73  tPtr nAux = _bas
5480: 65 2e 41 67 67 72 65 67 61 74 65 43 6f 6e 74 65  e.AggregateConte
5490: 78 74 28 63 6f 6e 74 65 78 74 29 3b 0d 0a 0d 0a  xt(context);....
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 69 66 20 28 28 5f 63 6f 6e 74 65 78 74 44 61 74  if ((_contextDat
54c0: 61 4c 69 73 74 20 21 3d 20 6e 75 6c 6c 29 20 26  aList != null) &
54d0: 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &..             
54e0: 20 20 20 20 20 20 20 21 5f 63 6f 6e 74 65 78 74         !_context
54f0: 44 61 74 61 4c 69 73 74 2e 54 72 79 47 65 74 56  DataList.TryGetV
5500: 61 6c 75 65 28 6e 41 75 78 2c 20 6f 75 74 20 64  alue(nAux, out d
5510: 61 74 61 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ata))..         
5520: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
5540: 74 61 20 3d 20 6e 65 77 20 41 67 67 72 65 67 61  ta = new Aggrega
5550: 74 65 44 61 74 61 28 29 3b 0d 0a 20 20 20 20 20  teData();..     
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
5570: 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 5b  contextDataList[
5580: 6e 41 75 78 5d 20 3d 20 64 61 74 61 3b 0d 0a 20  nAux] = data;.. 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
55a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
55b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
55c0: 66 20 28 64 61 74 61 20 3d 3d 20 6e 75 6c 6c 29  f (data == null)
55d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
55e0: 20 20 64 61 74 61 20 3d 20 6e 65 77 20 41 67 67    data = new Agg
55f0: 72 65 67 61 74 65 44 61 74 61 28 29 3b 0d 0a 0d  regateData();...
5600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
5610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
5620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5630: 20 5f 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74   _context = cont
5640: 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ext;..          
5650: 20 20 20 20 20 20 53 74 65 70 28 43 6f 6e 76 65        Step(Conve
5660: 72 74 50 61 72 61 6d 73 28 6e 41 72 67 73 2c 20  rtParams(nArgs, 
5670: 61 72 67 73 70 74 72 29 2c 0d 0a 20 20 20 20 20  argsptr),..     
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5690: 61 74 61 2e 5f 63 6f 75 6e 74 2c 20 72 65 66 20  ata._count, ref 
56a0: 64 61 74 61 2e 5f 64 61 74 61 29 3b 20 2f 2a 20  data._data); /* 
56b0: 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20  throw */..      
56c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
56d0: 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20       finally..  
56e0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
5700: 61 2e 5f 63 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 20  a._count++;..   
5710: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5720: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63      }..        c
5730: 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20  atch (Exception 
5740: 65 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74  e) /* NOTE: Must
5750: 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a   catch ALL. */..
5760: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
5770: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
5780: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
5790: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
57a0: 5f 66 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43  _flags & SQLiteC
57b0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c  onnectionFlags.L
57c0: 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74  ogCallbackExcept
57d0: 69 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20  ion) ==..       
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
5800: 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61  nFlags.LogCallba
5810: 63 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20  ckException)..  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5840: 20 20 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c       SQLiteLog.L
5850: 6f 67 4d 65 73 73 61 67 65 28 53 51 4c 69 74 65  ogMessage(SQLite
5860: 42 61 73 65 2e 43 4f 52 5f 45 5f 45 58 43 45 50  Base.COR_E_EXCEP
5870: 54 49 4f 4e 2c 0d 0a 20 20 20 20 20 20 20 20 20  TION,..         
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
5890: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
58a0: 64 73 2e 53 74 72 69 6e 67 46 6f 72 6d 61 74 28  ds.StringFormat(
58b0: 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72  CultureInfo.Curr
58c0: 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20  entCulture,..   
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 20 22 43 61 75 67 68 74 20 65 78 63       "Caught exc
58f0: 65 70 74 69 6f 6e 20 69 6e 20 5c 22 53 74 65 70  eption in \"Step
5900: 5c 22 20 6d 65 74 68 6f 64 3a 20 7b 31 7d 22 2c  \" method: {1}",
5910: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5920: 20 20 20 20 20 20 20 20 20 20 65 29 29 3b 20 2f            e)); /
5930: 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
5940: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5950: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
5960: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 0d            catch.
5970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
59b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d         }..    }.
59c0: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
59d0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 6e  ary>..    /// An
59e0: 20 69 6e 74 65 72 6e 61 6c 20 61 67 67 72 65 67   internal aggreg
59f0: 61 74 65 20 46 69 6e 61 6c 20 66 75 6e 63 74 69  ate Final functi
5a00: 6f 6e 20 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69  on callback, whi
5a10: 63 68 20 77 72 61 70 73 20 74 68 65 20 63 6f 6e  ch wraps the con
5a20: 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61 6e 64  text pointer and
5a30: 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72 74 75   calls the virtu
5a40: 61 6c 20 46 69 6e 61 6c 28 29 20 6d 65 74 68 6f  al Final() metho
5a50: 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52 4e  d...    /// WARN
5a60: 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74 68  ING: Must not th
5a70: 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e 0d  row exceptions..
5a80: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
5a90: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
5aa0: 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78  ram name="contex
5ab0: 74 22 3e 41 20 72 61 77 20 63 6f 6e 74 65 78 74  t">A raw context
5ac0: 20 70 6f 69 6e 74 65 72 3c 2f 70 61 72 61 6d 3e   pointer</param>
5ad0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
5ae0: 6f 69 64 20 46 69 6e 61 6c 43 61 6c 6c 62 61 63  oid FinalCallbac
5af0: 6b 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  k(IntPtr context
5b00: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
5b10: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
5b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
5b30: 6a 65 63 74 20 6f 62 6a 20 3d 20 6e 75 6c 6c 3b  ject obj = null;
5b40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5b50: 69 66 20 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c  if (_base != nul
5b60: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
5b70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5b80: 20 20 20 49 6e 74 50 74 72 20 6e 20 3d 20 5f 62     IntPtr n = _b
5b90: 61 73 65 2e 41 67 67 72 65 67 61 74 65 43 6f 6e  ase.AggregateCon
5ba0: 74 65 78 74 28 63 6f 6e 74 65 78 74 29 3b 0d 0a  text(context);..
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 41 67 67 72 65 67 61 74 65 44 61 74 61 20 61 67  AggregateData ag
5bd0: 67 44 61 74 61 3b 0d 0a 0d 0a 20 20 20 20 20 20  gData;....      
5be0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f            if ((_
5bf0: 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 20  contextDataList 
5c00: 21 3d 20 6e 75 6c 6c 29 20 26 26 0d 0a 20 20 20  != null) &&..   
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73   _contextDataLis
5c30: 74 2e 54 72 79 47 65 74 56 61 6c 75 65 28 6e 2c  t.TryGetValue(n,
5c40: 20 6f 75 74 20 61 67 67 44 61 74 61 29 29 0d 0a   out aggData))..
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5c70: 20 20 20 20 20 20 20 6f 62 6a 20 3d 20 61 67 67         obj = agg
5c80: 44 61 74 61 2e 5f 64 61 74 61 3b 0d 0a 20 20 20  Data._data;..   
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73   _contextDataLis
5cb0: 74 2e 52 65 6d 6f 76 65 28 6e 29 3b 0d 0a 20 20  t.Remove(n);..  
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
5cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
5ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
5cf0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  y..            {
5d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5d10: 20 20 5f 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e    _context = con
5d20: 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  text;..         
5d30: 20 20 20 20 20 20 20 53 65 74 52 65 74 75 72 6e         SetReturn
5d40: 56 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 46  Value(context, F
5d50: 69 6e 61 6c 28 6f 62 6a 29 29 3b 20 2f 2a 20 74  inal(obj)); /* t
5d60: 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20  hrow */..       
5d70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
5d80: 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20      finally..   
5d90: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 49 44 69 73              IDis
5db0: 70 6f 73 61 62 6c 65 20 64 69 73 70 20 3d 20 6f  posable disp = o
5dc0: 62 6a 20 61 73 20 49 44 69 73 70 6f 73 61 62 6c  bj as IDisposabl
5dd0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
5de0: 20 20 20 20 69 66 20 28 64 69 73 70 20 21 3d 20      if (disp != 
5df0: 6e 75 6c 6c 29 20 64 69 73 70 2e 44 69 73 70 6f  null) disp.Dispo
5e00: 73 65 28 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a  se(); /* throw *
5e10: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  /..            }
5e20: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
5e30: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
5e40: 70 74 69 6f 6e 20 65 29 20 2f 2a 20 4e 4f 54 45  ption e) /* NOTE
5e50: 3a 20 4d 75 73 74 20 63 61 74 63 68 20 41 4c 4c  : Must catch ALL
5e60: 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d  . */..        {.
5e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
5e80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
5e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5ea0: 20 69 66 20 28 28 5f 66 6c 61 67 73 20 26 20 53   if ((_flags & S
5eb0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
5ec0: 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b  lags.LogCallback
5ed0: 45 78 63 65 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20  Exception) ==.. 
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e         SQLiteCon
5f00: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67  nectionFlags.Log
5f10: 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f  CallbackExceptio
5f20: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
5f30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5f40: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
5f50: 65 4c 6f 67 2e 4c 6f 67 4d 65 73 73 61 67 65 28  eLog.LogMessage(
5f60: 53 51 4c 69 74 65 42 61 73 65 2e 43 4f 52 5f 45  SQLiteBase.COR_E
5f70: 5f 45 58 43 45 50 54 49 4f 4e 2c 0d 0a 20 20 20  _EXCEPTION,..   
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
5fa0: 65 4d 65 74 68 6f 64 73 2e 53 74 72 69 6e 67 46  eMethods.StringF
5fb0: 6f 72 6d 61 74 28 43 75 6c 74 75 72 65 49 6e 66  ormat(CultureInf
5fc0: 6f 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65  o.CurrentCulture
5fd0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
5fe0: 20 20 20 20 20 20 20 20 20 20 20 22 43 61 75 67             "Caug
5ff0: 68 74 20 65 78 63 65 70 74 69 6f 6e 20 69 6e 20  ht exception in 
6000: 5c 22 46 69 6e 61 6c 5c 22 20 6d 65 74 68 6f 64  \"Final\" method
6010: 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {1}",..       
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a   e)); /* throw *
6040: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
6050: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
6060: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
6070: 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20   catch..        
6080: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6090: 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74         // do not
60a0: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
60b0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
60c0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
60d0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
60e0: 20 2f 2f 2f 20 55 73 69 6e 67 20 72 65 66 6c 65   /// Using refle
60f0: 63 74 69 6f 6e 2c 20 65 6e 75 6d 65 72 61 74 65  ction, enumerate
6100: 20 61 6c 6c 20 61 73 73 65 6d 62 6c 69 65 73 20   all assemblies 
6110: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  in the current a
6120: 70 70 64 6f 6d 61 69 6e 20 6c 6f 6f 6b 69 6e 67  ppdomain looking
6130: 20 66 6f 72 20 63 6c 61 73 73 65 73 20 74 68 61   for classes tha
6140: 74 0d 0a 20 20 20 20 2f 2f 2f 20 68 61 76 65 20  t..    /// have 
6150: 61 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  a SQLiteFunction
6160: 41 74 74 72 69 62 75 74 65 20 61 74 74 72 69 62  Attribute attrib
6170: 75 74 65 2c 20 61 6e 64 20 72 65 67 69 73 74 65  ute, and registe
6180: 72 69 6e 67 20 74 68 65 6d 20 61 63 63 6f 72 64  ring them accord
6190: 69 6e 67 6c 79 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ingly...    /// 
61a0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 23 69 66 20  </summary>..#if 
61b0: 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43  !PLATFORM_COMPAC
61c0: 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20  TFRAMEWORK..    
61d0: 5b 53 65 63 75 72 69 74 79 2e 50 65 72 6d 69 73  [Security.Permis
61e0: 73 69 6f 6e 73 2e 46 69 6c 65 49 4f 50 65 72 6d  sions.FileIOPerm
61f0: 69 73 73 69 6f 6e 28 53 65 63 75 72 69 74 79 2e  ission(Security.
6200: 50 65 72 6d 69 73 73 69 6f 6e 73 2e 53 65 63 75  Permissions.Secu
6210: 72 69 74 79 41 63 74 69 6f 6e 2e 41 73 73 65 72  rityAction.Asser
6220: 74 2c 20 41 6c 6c 46 69 6c 65 73 20 3d 20 53 65  t, AllFiles = Se
6230: 63 75 72 69 74 79 2e 50 65 72 6d 69 73 73 69 6f  curity.Permissio
6240: 6e 73 2e 46 69 6c 65 49 4f 50 65 72 6d 69 73 73  ns.FileIOPermiss
6250: 69 6f 6e 41 63 63 65 73 73 2e 50 61 74 68 44 69  ionAccess.PathDi
6260: 73 63 6f 76 65 72 79 29 5d 0d 0a 23 65 6e 64 69  scovery)]..#endi
6270: 66 0d 0a 20 20 20 20 73 74 61 74 69 63 20 53 51  f..    static SQ
6280: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 29 0d 0a  LiteFunction()..
6290: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 5f 72 65      {..      _re
62a0: 67 69 73 74 65 72 65 64 46 75 6e 63 74 69 6f 6e  gisteredFunction
62b0: 73 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61  s = new Dictiona
62c0: 72 79 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  ry<SQLiteFunctio
62d0: 6e 41 74 74 72 69 62 75 74 65 2c 20 6f 62 6a 65  nAttribute, obje
62e0: 63 74 3e 28 29 3b 0d 0a 20 20 20 20 20 20 74 72  ct>();..      tr
62f0: 79 0d 0a 20 20 20 20 20 20 7b 0d 0a 23 69 66 20  y..      {..#if 
6300: 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43  !PLATFORM_COMPAC
6310: 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20  TFRAMEWORK..    
6320: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
6330: 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20  // NOTE: If the 
6340: 22 4e 6f 5f 53 51 4c 69 74 65 46 75 6e 63 74 69  "No_SQLiteFuncti
6350: 6f 6e 73 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ons" environment
6360: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
6370: 2c 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20  ,..        //   
6380: 20 20 20 20 73 6b 69 70 20 61 6c 6c 20 6f 75 72      skip all our
6390: 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 61 6e   special code an
63a0: 64 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 2e  d simply return.
63b0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20  ..        //..  
63c0: 20 20 20 20 20 20 69 66 20 28 55 6e 73 61 66 65        if (Unsafe
63d0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 47 65  NativeMethods.Ge
63e0: 74 53 65 74 74 69 6e 67 56 61 6c 75 65 28 22 4e  tSettingValue("N
63f0: 6f 5f 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  o_SQLiteFunction
6400: 73 22 2c 20 6e 75 6c 6c 29 20 21 3d 20 6e 75 6c  s", null) != nul
6410: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  l)..          re
6420: 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  turn;....       
6430: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41   SQLiteFunctionA
6440: 74 74 72 69 62 75 74 65 20 61 74 3b 0d 0a 20 20  ttribute at;..  
6450: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 52 65 66        System.Ref
6460: 6c 65 63 74 69 6f 6e 2e 41 73 73 65 6d 62 6c 79  lection.Assembly
6470: 5b 5d 20 61 72 41 73 73 65 6d 62 6c 69 65 73 20  [] arAssemblies 
6480: 3d 20 53 79 73 74 65 6d 2e 41 70 70 44 6f 6d 61  = System.AppDoma
6490: 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e  in.CurrentDomain
64a0: 2e 47 65 74 41 73 73 65 6d 62 6c 69 65 73 28 29  .GetAssemblies()
64b0: 3b 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ;..        int w
64c0: 20 3d 20 61 72 41 73 73 65 6d 62 6c 69 65 73 2e   = arAssemblies.
64d0: 4c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20 20  Length;..       
64e0: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
64f0: 6f 6e 2e 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20  on.AssemblyName 
6500: 73 71 6c 69 74 65 20 3d 20 53 79 73 74 65 6d 2e  sqlite = System.
6510: 52 65 66 6c 65 63 74 69 6f 6e 2e 41 73 73 65 6d  Reflection.Assem
6520: 62 6c 79 2e 47 65 74 45 78 65 63 75 74 69 6e 67  bly.GetExecuting
6530: 41 73 73 65 6d 62 6c 79 28 29 2e 47 65 74 4e 61  Assembly().GetNa
6540: 6d 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  me();....       
6550: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
6560: 20 6e 20 3c 20 77 3b 20 6e 2b 2b 29 0d 0a 20 20   n < w; n++)..  
6570: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6580: 20 20 20 54 79 70 65 5b 5d 20 61 72 54 79 70 65     Type[] arType
6590: 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 6f  s;..          bo
65a0: 6f 6c 20 66 6f 75 6e 64 20 3d 20 66 61 6c 73 65  ol found = false
65b0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  ;..          Sys
65c0: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 41  tem.Reflection.A
65d0: 73 73 65 6d 62 6c 79 4e 61 6d 65 5b 5d 20 72 65  ssemblyName[] re
65e0: 66 65 72 65 6e 63 65 73 3b 0d 0a 20 20 20 20 20  ferences;..     
65f0: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
6600: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6610: 20 20 20 2f 2f 20 49 6e 73 70 65 63 74 20 6f 6e     // Inspect on
6620: 6c 79 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68  ly assemblies th
6630: 61 74 20 72 65 66 65 72 65 6e 63 65 20 53 51 4c  at reference SQL
6640: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ite..           
6650: 20 72 65 66 65 72 65 6e 63 65 73 20 3d 20 61 72   references = ar
6660: 41 73 73 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65  Assemblies[n].Ge
6670: 74 52 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d  tReferencedAssem
6680: 62 6c 69 65 73 28 29 3b 0d 0a 20 20 20 20 20 20  blies();..      
6690: 20 20 20 20 20 20 69 6e 74 20 74 20 3d 20 72 65        int t = re
66a0: 66 65 72 65 6e 63 65 73 2e 4c 65 6e 67 74 68 3b  ferences.Length;
66b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ..            fo
66c0: 72 20 28 69 6e 74 20 7a 20 3d 20 30 3b 20 7a 20  r (int z = 0; z 
66d0: 3c 20 74 3b 20 7a 2b 2b 29 0d 0a 20 20 20 20 20  < t; z++)..     
66e0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
66f0: 20 20 20 20 20 20 20 20 69 66 20 28 72 65 66 65          if (refe
6700: 72 65 6e 63 65 73 5b 7a 5d 2e 4e 61 6d 65 20 3d  rences[z].Name =
6710: 3d 20 73 71 6c 69 74 65 2e 4e 61 6d 65 29 0d 0a  = sqlite.Name)..
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
6730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6740: 20 66 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0d 0a   found = true;..
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6760: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
6770: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6780: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6790: 20 20 20 20 20 20 69 66 20 28 66 6f 75 6e 64 20        if (found 
67a0: 3d 3d 20 66 61 6c 73 65 29 0d 0a 20 20 20 20 20  == false)..     
67b0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
67c0: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
67d0: 20 20 61 72 54 79 70 65 73 20 3d 20 61 72 41 73    arTypes = arAs
67e0: 73 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65 74 54  semblies[n].GetT
67f0: 79 70 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20  ypes();..       
6800: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
6810: 63 61 74 63 68 20 28 52 65 66 6c 65 63 74 69 6f  catch (Reflectio
6820: 6e 2e 52 65 66 6c 65 63 74 69 6f 6e 54 79 70 65  n.ReflectionType
6830: 4c 6f 61 64 45 78 63 65 70 74 69 6f 6e 20 65 29  LoadException e)
6840: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
6850: 20 20 20 20 20 20 20 20 20 20 20 61 72 54 79 70             arTyp
6860: 65 73 20 3d 20 65 2e 54 79 70 65 73 3b 0d 0a 20  es = e.Types;.. 
6870: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
6880: 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20          int v = 
6890: 61 72 54 79 70 65 73 2e 4c 65 6e 67 74 68 3b 0d  arTypes.Length;.
68a0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28  .          for (
68b0: 69 6e 74 20 78 20 3d 20 30 3b 20 78 20 3c 20 76  int x = 0; x < v
68c0: 3b 20 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20  ; x++)..        
68d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
68e0: 20 69 66 20 28 61 72 54 79 70 65 73 5b 78 5d 20   if (arTypes[x] 
68f0: 3d 3d 20 6e 75 6c 6c 29 20 63 6f 6e 74 69 6e 75  == null) continu
6900: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
6910: 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72 41 74 74    object[] arAtt
6920: 20 3d 20 61 72 54 79 70 65 73 5b 78 5d 2e 47 65   = arTypes[x].Ge
6930: 74 43 75 73 74 6f 6d 41 74 74 72 69 62 75 74 65  tCustomAttribute
6940: 73 28 74 79 70 65 6f 66 28 53 51 4c 69 74 65 46  s(typeof(SQLiteF
6950: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
6960: 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  ), false);..    
6970: 20 20 20 20 20 20 20 20 69 6e 74 20 75 20 3d 20          int u = 
6980: 61 72 41 74 74 2e 4c 65 6e 67 74 68 3b 0d 0a 20  arAtt.Length;.. 
6990: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
69a0: 69 6e 74 20 79 20 3d 20 30 3b 20 79 20 3c 20 75  int y = 0; y < u
69b0: 3b 20 79 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20  ; y++)..        
69c0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
69d0: 20 20 20 20 20 61 74 20 3d 20 61 72 41 74 74 5b       at = arAtt[
69e0: 79 5d 20 61 73 20 53 51 4c 69 74 65 46 75 6e 63  y] as SQLiteFunc
69f0: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 3b 0d 0a  tionAttribute;..
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6a10: 20 28 61 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20   (at != null).. 
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 61 74 2e 49 6e 73 74 61 6e 63 65 54 79 70 65 20  at.InstanceType 
6a50: 3d 20 61 72 54 79 70 65 73 5b 78 5d 3b 0d 0a 20  = arTypes[x];.. 
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
6a70: 72 65 67 69 73 74 65 72 65 64 46 75 6e 63 74 69  registeredFuncti
6a80: 6f 6e 73 2e 41 64 64 28 61 74 2c 20 6e 75 6c 6c  ons.Add(at, null
6a90: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
6aa0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
6ab0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
6ac0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64  .        }..#end
6ad0: 69 66 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  if..      }..   
6ae0: 20 20 20 63 61 74 63 68 20 2f 2f 20 53 51 4c 69     catch // SQLi
6af0: 74 65 20 70 72 6f 76 69 64 65 72 20 63 61 6e 20  te provider can 
6b00: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 6f 75 74  continue without
6b10: 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 66   being able to f
6b20: 69 6e 64 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  ind built-in fun
6b30: 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7b 0d  ctions..      {.
6b40: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6b50: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
6b60: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4d 61  ary>..    /// Ma
6b70: 6e 75 61 6c 20 6d 65 74 68 6f 64 20 6f 66 20 72  nual method of r
6b80: 65 67 69 73 74 65 72 69 6e 67 20 61 20 66 75 6e  egistering a fun
6b90: 63 74 69 6f 6e 2e 20 20 54 68 65 20 74 79 70 65  ction.  The type
6ba0: 20 6d 75 73 74 20 73 74 69 6c 6c 20 68 61 76 65   must still have
6bb0: 20 74 68 65 20 53 51 4c 69 74 65 46 75 6e 63 74   the SQLiteFunct
6bc0: 69 6f 6e 41 74 74 72 69 62 75 74 65 73 20 69 6e  ionAttributes in
6bd0: 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 0d 0a   order to work..
6be0: 20 20 20 20 2f 2f 2f 20 70 72 6f 70 65 72 6c 79      /// properly
6bf0: 2c 20 62 75 74 20 74 68 69 73 20 69 73 20 61 20  , but this is a 
6c00: 77 6f 72 6b 61 72 6f 75 6e 64 20 66 6f 72 20 74  workaround for t
6c10: 68 65 20 43 6f 6d 70 61 63 74 20 46 72 61 6d 65  he Compact Frame
6c20: 77 6f 72 6b 20 77 68 65 72 65 20 65 6e 75 6d 65  work where enume
6c30: 72 61 74 69 6e 67 20 61 73 73 65 6d 62 6c 69 65  rating assemblie
6c40: 73 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  s is not current
6c50: 6c 79 20 73 75 70 70 6f 72 74 65 64 2e 0d 0a 20  ly supported... 
6c60: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
6c70: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
6c80: 6d 20 6e 61 6d 65 3d 22 74 79 70 22 3e 54 68 65  m name="typ">The
6c90: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e   type of the fun
6ca0: 63 74 69 6f 6e 20 74 6f 20 72 65 67 69 73 74 65  ction to registe
6cb0: 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70  r</param>..    p
6cc0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69  ublic static voi
6cd0: 64 20 52 65 67 69 73 74 65 72 46 75 6e 63 74 69  d RegisterFuncti
6ce0: 6f 6e 28 54 79 70 65 20 74 79 70 29 0d 0a 20 20  on(Type typ)..  
6cf0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a    {..        obj
6d00: 65 63 74 5b 5d 20 61 72 41 74 74 20 3d 20 74 79  ect[] arAtt = ty
6d10: 70 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 72 69  p.GetCustomAttri
6d20: 62 75 74 65 73 28 0d 0a 20 20 20 20 20 20 20 20  butes(..        
6d30: 20 20 20 20 74 79 70 65 6f 66 28 53 51 4c 69 74      typeof(SQLit
6d40: 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75  eFunctionAttribu
6d50: 74 65 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 0d 0a  te), false);....
6d60: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74          for (int
6d70: 20 79 20 3d 20 30 3b 20 79 20 3c 20 61 72 41 74   y = 0; y < arAt
6d80: 74 2e 4c 65 6e 67 74 68 3b 20 79 2b 2b 29 0d 0a  t.Length; y++)..
6d90: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
6da0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e         SQLiteFun
6db0: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 61  ctionAttribute a
6dc0: 74 20 3d 20 61 72 41 74 74 5b 79 5d 20 61 73 20  t = arAtt[y] as 
6dd0: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74  SQLiteFunctionAt
6de0: 74 72 69 62 75 74 65 3b 0d 0a 0d 0a 20 20 20 20  tribute;....    
6df0: 20 20 20 20 20 20 20 20 69 66 20 28 61 74 20 3d          if (at =
6e00: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
6e10: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6e20: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
6e30: 20 20 52 65 67 69 73 74 65 72 46 75 6e 63 74 69    RegisterFuncti
6e40: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on(..           
6e50: 20 20 20 20 20 61 74 2e 4e 61 6d 65 2c 20 61 74       at.Name, at
6e60: 2e 41 72 67 75 6d 65 6e 74 73 2c 20 61 74 2e 46  .Arguments, at.F
6e70: 75 6e 63 54 79 70 65 2c 20 61 74 2e 49 6e 73 74  uncType, at.Inst
6e80: 61 6e 63 65 54 79 70 65 2c 0d 0a 20 20 20 20 20  anceType,..     
6e90: 20 20 20 20 20 20 20 20 20 20 20 61 74 2e 43 61             at.Ca
6ea0: 6c 6c 62 61 63 6b 31 2c 20 61 74 2e 43 61 6c 6c  llback1, at.Call
6eb0: 62 61 63 6b 32 29 3b 0d 0a 20 20 20 20 20 20 20  back2);..       
6ec0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
6ed0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
6ee0: 20 20 20 20 2f 2f 2f 20 41 6c 74 65 72 6e 61 74      /// Alternat
6ef0: 69 76 65 20 6d 65 74 68 6f 64 20 6f 66 20 72 65  ive method of re
6f00: 67 69 73 74 65 72 69 6e 67 20 61 20 66 75 6e 63  gistering a func
6f10: 74 69 6f 6e 2e 20 20 54 68 69 73 20 6d 65 74 68  tion.  This meth
6f20: 6f 64 0d 0a 20 20 20 20 2f 2f 2f 20 64 6f 65 73  od..    /// does
6f30: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 74 68 65   not require the
6f40: 20 73 70 65 63 69 66 69 65 64 20 74 79 70 65 20   specified type 
6f50: 74 6f 20 62 65 20 61 6e 6e 6f 74 61 74 65 64 20  to be annotated 
6f60: 77 69 74 68 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  with..    /// <s
6f70: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46  ee cref="SQLiteF
6f80: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
6f90: 22 20 2f 3e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  " />...    /// <
6fa0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
6fb0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
6fc0: 6e 61 6d 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20  name">..    /// 
6fd0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6fe0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 67 69  function to regi
6ff0: 73 74 65 72 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ster...    /// <
7000: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
7010: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
7020: 67 75 6d 65 6e 74 43 6f 75 6e 74 22 3e 0d 0a 20  gumentCount">.. 
7030: 20 20 20 2f 2f 2f 20 54 68 65 20 6e 75 6d 62 65     /// The numbe
7040: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  r of arguments a
7050: 63 63 65 70 74 65 64 20 62 79 20 74 68 65 20 66  ccepted by the f
7060: 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f  unction...    //
7070: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
7080: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
7090: 22 66 75 6e 63 74 69 6f 6e 54 79 70 65 22 3e 0d  "functionType">.
70a0: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 74 79 70  .    /// The typ
70b0: 65 20 6f 66 20 53 51 4c 69 74 65 20 66 75 6e 63  e of SQLite func
70c0: 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 73 69 74  tion being resit
70d0: 65 72 65 64 20 28 65 2e 67 2e 20 73 63 61 6c 61  ered (e.g. scala
70e0: 72 2c 0d 0a 20 20 20 20 2f 2f 2f 20 61 67 67 72  r,..    /// aggr
70f0: 65 67 61 74 65 2c 20 6f 72 20 63 6f 6c 6c 61 74  egate, or collat
7100: 69 6e 67 20 73 65 71 75 65 6e 63 65 29 2e 0d 0a  ing sequence)...
7110: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
7120: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
7130: 20 6e 61 6d 65 3d 22 69 6e 73 74 61 6e 63 65 54   name="instanceT
7140: 79 70 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54  ype">..    /// T
7150: 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 54 79  he <see cref="Ty
7160: 70 65 22 20 2f 3e 20 74 68 61 74 20 61 63 74 75  pe" /> that actu
7170: 61 6c 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 73 20  ally implements 
7180: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20  the function... 
7190: 20 20 20 2f 2f 2f 20 54 68 69 73 20 77 69 6c 6c     /// This will
71a0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
71b0: 20 74 68 65 20 3c 70 61 72 61 6d 72 65 66 20 6e   the <paramref n
71c0: 61 6d 65 3d 22 63 61 6c 6c 62 61 63 6b 31 22 20  ame="callback1" 
71d0: 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20 61 6e 64 20  />..    /// and 
71e0: 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22  <paramref name="
71f0: 63 61 6c 6c 62 61 63 6b 32 22 20 2f 3e 20 70 61  callback2" /> pa
7200: 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 75 6c  rameters are nul
7210: 6c 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  l...    /// </pa
7220: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
7230: 61 72 61 6d 20 6e 61 6d 65 3d 22 63 61 6c 6c 62  aram name="callb
7240: 61 63 6b 31 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20  ack1">..    /// 
7250: 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 44  The <see cref="D
7260: 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 6f 20 62  elegate" /> to b
7270: 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 63  e used for all c
7280: 61 6c 6c 73 20 69 6e 74 6f 20 74 68 65 0d 0a 20  alls into the.. 
7290: 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
72a0: 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  ="SQLiteFunction
72b0: 2e 49 6e 76 6f 6b 65 22 20 2f 3e 2c 0d 0a 20 20  .Invoke" />,..  
72c0: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
72d0: 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 2e  "SQLiteFunction.
72e0: 53 74 65 70 22 20 2f 3e 2c 0d 0a 20 20 20 20 2f  Step" />,..    /
72f0: 2f 2f 20 61 6e 64 20 3c 73 65 65 20 63 72 65 66  // and <see cref
7300: 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  ="SQLiteFunction
7310: 2e 43 6f 6d 70 61 72 65 22 20 2f 3e 20 76 69 72  .Compare" /> vir
7320: 74 75 61 6c 20 6d 65 74 68 6f 64 73 2e 0d 0a 20  tual methods... 
7330: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
7340: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
7350: 6e 61 6d 65 3d 22 63 61 6c 6c 62 61 63 6b 32 22  name="callback2"
7360: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c  >..    /// The <
7370: 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67 61  see cref="Delega
7380: 74 65 22 20 2f 3e 20 74 6f 20 62 65 20 75 73 65  te" /> to be use
7390: 64 20 66 6f 72 20 61 6c 6c 20 63 61 6c 6c 73 20  d for all calls 
73a0: 69 6e 74 6f 20 74 68 65 0d 0a 20 20 20 20 2f 2f  into the..    //
73b0: 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c  / <see cref="SQL
73c0: 69 74 65 46 75 6e 63 74 69 6f 6e 2e 46 69 6e 61  iteFunction.Fina
73d0: 6c 22 20 2f 3e 20 76 69 72 74 75 61 6c 20 6d 65  l" /> virtual me
73e0: 74 68 6f 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  thod...    /// <
73f0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 75 62  /param>..    pub
7400: 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20  lic static void 
7410: 52 65 67 69 73 74 65 72 46 75 6e 63 74 69 6f 6e  RegisterFunction
7420: 28 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  (..        strin
7430: 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  g name,..       
7440: 20 69 6e 74 20 61 72 67 75 6d 65 6e 74 43 6f 75   int argumentCou
7450: 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 46 75 6e  nt,..        Fun
7460: 63 74 69 6f 6e 54 79 70 65 20 66 75 6e 63 74 69  ctionType functi
7470: 6f 6e 54 79 70 65 2c 0d 0a 20 20 20 20 20 20 20  onType,..       
7480: 20 54 79 70 65 20 69 6e 73 74 61 6e 63 65 54 79   Type instanceTy
7490: 70 65 2c 0d 0a 20 20 20 20 20 20 20 20 44 65 6c  pe,..        Del
74a0: 65 67 61 74 65 20 63 61 6c 6c 62 61 63 6b 31 2c  egate callback1,
74b0: 0d 0a 20 20 20 20 20 20 20 20 44 65 6c 65 67 61  ..        Delega
74c0: 74 65 20 63 61 6c 6c 62 61 63 6b 32 0d 0a 20 20  te callback2..  
74d0: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 7b 0d 0a        )..    {..
74e0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75          SQLiteFu
74f0: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20  nctionAttribute 
7500: 61 74 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 46  at = new SQLiteF
7510: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
7520: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  (..            n
7530: 61 6d 65 2c 20 61 72 67 75 6d 65 6e 74 43 6f 75  ame, argumentCou
7540: 6e 74 2c 20 66 75 6e 63 74 69 6f 6e 54 79 70 65  nt, functionType
7550: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61 74  );....        at
7560: 2e 49 6e 73 74 61 6e 63 65 54 79 70 65 20 3d 20  .InstanceType = 
7570: 69 6e 73 74 61 6e 63 65 54 79 70 65 3b 0d 0a 20  instanceType;.. 
7580: 20 20 20 20 20 20 20 61 74 2e 43 61 6c 6c 62 61         at.Callba
7590: 63 6b 31 20 3d 20 63 61 6c 6c 62 61 63 6b 31 3b  ck1 = callback1;
75a0: 0d 0a 20 20 20 20 20 20 20 20 61 74 2e 43 61 6c  ..        at.Cal
75b0: 6c 62 61 63 6b 32 20 3d 20 63 61 6c 6c 62 61 63  lback2 = callbac
75c0: 6b 32 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 5f  k2;....        _
75d0: 72 65 67 69 73 74 65 72 65 64 46 75 6e 63 74 69  registeredFuncti
75e0: 6f 6e 73 2e 41 64 64 28 61 74 2c 20 6e 75 6c 6c  ons.Add(at, null
75f0: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
7600: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
7610: 20 20 20 20 2f 2f 2f 20 43 72 65 61 74 65 73 20      /// Creates 
7620: 61 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c  a <see cref="SQL
7630: 69 74 65 46 75 6e 63 74 69 6f 6e 22 20 2f 3e 20  iteFunction" /> 
7640: 69 6e 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f  instance based o
7650: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0d  n the specified.
7660: 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72  .    /// <see cr
7670: 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69  ef="SQLiteFuncti
7680: 6f 6e 41 74 74 72 69 62 75 74 65 22 20 2f 3e 2e  onAttribute" />.
7690: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
76a0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
76b0: 61 72 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63 74  aram name="funct
76c0: 69 6f 6e 41 74 74 72 69 62 75 74 65 22 3e 0d 0a  ionAttribute">..
76d0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65      /// The <see
76e0: 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46 75 6e   cref="SQLiteFun
76f0: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 22 20  ctionAttribute" 
7700: 2f 3e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  /> containing th
7710: 65 20 6d 65 74 61 64 61 74 61 20 61 62 6f 75 74  e metadata about
7720: 0d 0a 20 20 20 20 2f 2f 2f 20 74 68 65 20 66 75  ..    /// the fu
7730: 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  nction to create
7740: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  ...    /// </par
7750: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
7760: 72 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63 74 69  ram name="functi
7770: 6f 6e 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  on">..    /// Th
7780: 65 20 63 72 65 61 74 65 64 20 66 75 6e 63 74 69  e created functi
7790: 6f 6e 20 2d 4f 52 2d 20 6e 75 6c 6c 20 69 66 20  on -OR- null if 
77a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  the function cou
77b0: 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
77c0: 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  d...    /// </pa
77d0: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
77e0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 2f 2f 2f  eturns>..    ///
77f0: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   Non-zero if the
7800: 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72   function was cr
7810: 65 61 74 65 64 3b 20 6f 74 68 65 72 77 69 73 65  eated; otherwise
7820: 2c 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 2f 2f 2f  , zero...    ///
7830: 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20   </returns>..   
7840: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
7850: 62 6f 6f 6c 20 43 72 65 61 74 65 46 75 6e 63 74  bool CreateFunct
7860: 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 53 51  ion(..        SQ
7870: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
7880: 69 62 75 74 65 20 66 75 6e 63 74 69 6f 6e 41 74  ibute functionAt
7890: 74 72 69 62 75 74 65 2c 0d 0a 20 20 20 20 20 20  tribute,..      
78a0: 20 20 6f 75 74 20 53 51 4c 69 74 65 46 75 6e 63    out SQLiteFunc
78b0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 0d 0a 20  tion function.. 
78c0: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 7b 0d         )..    {.
78d0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 75 6e  .        if (fun
78e0: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 3d  ctionAttribute =
78f0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
7900: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7910: 66 75 6e 63 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b  function = null;
7920: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
7930: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
7940: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7950: 65 6c 73 65 20 69 66 20 28 28 66 75 6e 63 74 69  else if ((functi
7960: 6f 6e 41 74 74 72 69 62 75 74 65 2e 43 61 6c 6c  onAttribute.Call
7970: 62 61 63 6b 31 20 21 3d 20 6e 75 6c 6c 29 20 7c  back1 != null) |
7980: 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  |..             
7990: 20 20 20 28 66 75 6e 63 74 69 6f 6e 41 74 74 72     (functionAttr
79a0: 69 62 75 74 65 2e 43 61 6c 6c 62 61 63 6b 32 20  ibute.Callback2 
79b0: 21 3d 20 6e 75 6c 6c 29 29 0d 0a 20 20 20 20 20  != null))..     
79c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
79d0: 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 6e 65 77    function = new
79e0: 20 53 51 4c 69 74 65 44 65 6c 65 67 61 74 65 46   SQLiteDelegateF
79f0: 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20  unction(..      
7a00: 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69            functi
7a10: 6f 6e 41 74 74 72 69 62 75 74 65 2e 43 61 6c 6c  onAttribute.Call
7a20: 62 61 63 6b 31 2c 0d 0a 20 20 20 20 20 20 20 20  back1,..        
7a30: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
7a40: 41 74 74 72 69 62 75 74 65 2e 43 61 6c 6c 62 61  Attribute.Callba
7a50: 63 6b 32 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ck2);....       
7a60: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
7a70: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
7a80: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 66        else if (f
7a90: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
7aa0: 2e 49 6e 73 74 61 6e 63 65 54 79 70 65 20 21 3d  .InstanceType !=
7ab0: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
7ac0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
7ad0: 75 6e 63 74 69 6f 6e 20 3d 20 28 53 51 4c 69 74  unction = (SQLit
7ae0: 65 46 75 6e 63 74 69 6f 6e 29 41 63 74 69 76 61  eFunction)Activa
7af0: 74 6f 72 2e 43 72 65 61 74 65 49 6e 73 74 61 6e  tor.CreateInstan
7b00: 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
7b10: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 41 74 74       functionAtt
7b20: 72 69 62 75 74 65 2e 49 6e 73 74 61 6e 63 65 54  ribute.InstanceT
7b30: 79 70 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ype);....       
7b40: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
7b50: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
7b60: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
7b70: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7b80: 20 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 6e 75     function = nu
7b90: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
7ba0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
7bb0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d          }..    }
7bc0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
7bd0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43  mary>..    /// C
7be0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c  alled by the SQL
7bf0: 69 74 65 42 61 73 65 20 64 65 72 69 76 65 64 20  iteBase derived 
7c00: 63 6c 61 73 73 65 73 2c 20 74 68 69 73 20 6d 65  classes, this me
7c10: 74 68 6f 64 20 62 69 6e 64 73 20 61 6c 6c 20 72  thod binds all r
7c20: 65 67 69 73 74 65 72 65 64 20 28 6b 6e 6f 77 6e  egistered (known
7c30: 29 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  ) user-defined f
7c40: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61 20 63 6f  unctions to a co
7c50: 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f  nnection...    /
7c60: 2f 2f 20 49 74 20 69 73 20 64 6f 6e 65 20 74 68  // It is done th
7c70: 69 73 20 77 61 79 20 73 6f 20 74 68 61 74 20 61  is way so that a
7c80: 6c 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ll user-defined 
7c90: 66 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 61  functions will a
7ca0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
7cb0: 73 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  se using the sam
7cc0: 65 20 65 6e 63 6f 64 69 6e 67 20 73 63 68 65 6d  e encoding schem
7cd0: 65 0d 0a 20 20 20 20 2f 2f 2f 20 61 73 20 74 68  e..    /// as th
7ce0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 55 54  e connection (UT
7cf0: 46 2d 38 20 6f 72 20 55 54 46 2d 31 36 29 2e 0d  F-8 or UTF-16)..
7d00: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
7d10: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ry>..    /// <re
7d20: 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20  marks>..    /// 
7d30: 54 68 65 20 77 72 61 70 70 65 72 20 66 75 6e 63  The wrapper func
7d40: 74 69 6f 6e 73 20 74 68 61 74 20 69 6e 74 65 72  tions that inter
7d50: 6f 70 20 77 69 74 68 20 53 51 4c 69 74 65 20 77  op with SQLite w
7d60: 69 6c 6c 20 63 72 65 61 74 65 20 61 20 75 6e 69  ill create a uni
7d70: 71 75 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  que cookie value
7d80: 2c 20 77 68 69 63 68 20 69 6e 74 65 72 6e 61 6c  , which internal
7d90: 6c 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ly is a pointer 
7da0: 74 6f 0d 0a 20 20 20 20 2f 2f 2f 20 61 6c 6c 20  to..    /// all 
7db0: 74 68 65 20 77 72 61 70 70 65 64 20 63 61 6c 6c  the wrapped call
7dc0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 73 2e 20  back functions. 
7dd0: 20 54 68 65 20 69 6e 74 65 72 6f 70 20 66 75 6e   The interop fun
7de0: 63 74 69 6f 6e 20 75 73 65 73 20 69 74 20 74 6f  ction uses it to
7df0: 20 6d 61 70 20 43 44 65 63 6c 20 63 61 6c 6c 62   map CDecl callb
7e00: 61 63 6b 73 20 74 6f 20 53 74 64 43 61 6c 6c 20  acks to StdCall 
7e10: 63 61 6c 6c 62 61 63 6b 73 2e 0d 0a 20 20 20 20  callbacks...    
7e20: 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a  /// </remarks>..
7e30: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
7e40: 61 6d 65 3d 22 73 71 6c 62 61 73 65 22 3e 54 68  ame="sqlbase">Th
7e50: 65 20 62 61 73 65 20 6f 62 6a 65 63 74 20 6f 6e  e base object on
7e60: 20 77 68 69 63 68 20 74 68 65 20 66 75 6e 63 74   which the funct
7e70: 69 6f 6e 73 20 61 72 65 20 74 6f 20 62 69 6e 64  ions are to bind
7e80: 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  .</param>..    /
7e90: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
7ea0: 66 6c 61 67 73 22 3e 54 68 65 20 66 6c 61 67 73  flags">The flags
7eb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7ec0: 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6e 6e   the parent conn
7ed0: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 3c 2f  ection object.</
7ee0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
7ef0: 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e 73  <returns>Returns
7f00: 20 61 20 6c 6f 67 69 63 61 6c 20 6c 69 73 74 20   a logical list 
7f10: 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 69  of functions whi
7f20: 63 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ch the connectio
7f30: 6e 20 73 68 6f 75 6c 64 20 72 65 74 61 69 6e 20  n should retain 
7f40: 75 6e 74 69 6c 20 69 74 20 69 73 20 63 6c 6f 73  until it is clos
7f50: 65 64 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  ed.</returns>.. 
7f60: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74     internal stat
7f70: 69 63 20 49 44 69 63 74 69 6f 6e 61 72 79 3c 53  ic IDictionary<S
7f80: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74  QLiteFunctionAtt
7f90: 72 69 62 75 74 65 2c 20 53 51 4c 69 74 65 46 75  ribute, SQLiteFu
7fa0: 6e 63 74 69 6f 6e 3e 20 42 69 6e 64 46 75 6e 63  nction> BindFunc
7fb0: 74 69 6f 6e 73 28 0d 0a 20 20 20 20 20 20 20 20  tions(..        
7fc0: 53 51 4c 69 74 65 42 61 73 65 20 73 71 6c 62 61  SQLiteBase sqlba
7fd0: 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  se,..        SQL
7fe0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
7ff0: 67 73 20 66 6c 61 67 73 0d 0a 20 20 20 20 20 20  gs flags..      
8000: 20 20 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20    )..    {..    
8010: 20 20 20 20 49 44 69 63 74 69 6f 6e 61 72 79 3c      IDictionary<
8020: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74  SQLiteFunctionAt
8030: 74 72 69 62 75 74 65 2c 20 53 51 4c 69 74 65 46  tribute, SQLiteF
8040: 75 6e 63 74 69 6f 6e 3e 20 6c 46 75 6e 63 74 69  unction> lFuncti
8050: 6f 6e 73 20 3d 0d 0a 20 20 20 20 20 20 20 20 20  ons =..         
8060: 20 20 20 6e 65 77 20 44 69 63 74 69 6f 6e 61 72     new Dictionar
8070: 79 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  y<SQLiteFunction
8080: 41 74 74 72 69 62 75 74 65 2c 20 53 51 4c 69 74  Attribute, SQLit
8090: 65 46 75 6e 63 74 69 6f 6e 3e 28 29 3b 0d 0a 0d  eFunction>();...
80a0: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
80b0: 20 28 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 53   (KeyValuePair<S
80c0: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74  QLiteFunctionAtt
80d0: 72 69 62 75 74 65 2c 20 6f 62 6a 65 63 74 3e 20  ribute, object> 
80e0: 70 61 69 72 0d 0a 20 20 20 20 20 20 20 20 20 20  pair..          
80f0: 20 20 20 20 20 20 69 6e 20 5f 72 65 67 69 73 74        in _regist
8100: 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 29 0d 0a  eredFunctions)..
8110: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
8120: 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e         SQLiteFun
8130: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 70  ctionAttribute p
8140: 72 20 3d 20 70 61 69 72 2e 4b 65 79 3b 0d 0a 0d  r = pair.Key;...
8150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
8160: 28 70 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  (pr == null)..  
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
8180: 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  ntinue;....     
8190: 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e         SQLiteFun
81a0: 63 74 69 6f 6e 20 66 3b 0d 0a 0d 0a 20 20 20 20  ction f;....    
81b0: 20 20 20 20 20 20 20 20 69 66 20 28 43 72 65 61          if (Crea
81c0: 74 65 46 75 6e 63 74 69 6f 6e 28 70 72 2c 20 6f  teFunction(pr, o
81d0: 75 74 20 66 29 29 0d 0a 20 20 20 20 20 20 20 20  ut f))..        
81e0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
81f0: 20 20 20 20 20 20 20 42 69 6e 64 46 75 6e 63 74         BindFunct
8200: 69 6f 6e 28 73 71 6c 62 61 73 65 2c 20 70 72 2c  ion(sqlbase, pr,
8210: 20 66 2c 20 66 6c 61 67 73 29 3b 0d 0a 20 20 20   f, flags);..   
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 46 75               lFu
8230: 6e 63 74 69 6f 6e 73 5b 70 72 5d 20 3d 20 66 3b  nctions[pr] = f;
8240: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
8260: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e..            {
8270: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8280: 20 20 6c 46 75 6e 63 74 69 6f 6e 73 5b 70 72 5d    lFunctions[pr]
8290: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
82a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
82b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65   }....        re
82c0: 74 75 72 6e 20 6c 46 75 6e 63 74 69 6f 6e 73 3b  turn lFunctions;
82d0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
82e0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
82f0: 20 20 2f 2f 2f 20 43 61 6c 6c 65 64 20 62 79 20    /// Called by 
8300: 74 68 65 20 53 51 4c 69 74 65 42 61 73 65 20 64  the SQLiteBase d
8310: 65 72 69 76 65 64 20 63 6c 61 73 73 65 73 2c 20  erived classes, 
8320: 74 68 69 73 20 6d 65 74 68 6f 64 20 75 6e 62 69  this method unbi
8330: 6e 64 73 20 61 6c 6c 20 72 65 67 69 73 74 65 72  nds all register
8340: 65 64 20 28 6b 6e 6f 77 6e 29 0d 0a 20 20 20 20  ed (known)..    
8350: 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 73 20 2d 4f  /// functions -O
8360: 52 2d 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 6c  R- all previousl
8370: 79 20 62 6f 75 6e 64 20 75 73 65 72 2d 64 65 66  y bound user-def
8380: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 66  ined functions f
8390: 72 6f 6d 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  rom a connection
83a0: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
83b0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
83c0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 62  param name="sqlb
83d0: 61 73 65 22 3e 54 68 65 20 62 61 73 65 20 6f 62  ase">The base ob
83e0: 6a 65 63 74 20 66 72 6f 6d 20 77 68 69 63 68 20  ject from which 
83f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  the functions ar
8400: 65 20 74 6f 20 62 65 20 75 6e 62 6f 75 6e 64 2e  e to be unbound.
8410: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
8420: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66  / <param name="f
8430: 6c 61 67 73 22 3e 54 68 65 20 66 6c 61 67 73 20  lags">The flags 
8440: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8450: 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6e 6e 65  the parent conne
8460: 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 3c 2f 70  ction object.</p
8470: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
8480: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 72 65 67 69  param name="regi
8490: 73 74 65 72 65 64 22 3e 0d 0a 20 20 20 20 2f 2f  stered">..    //
84a0: 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 75 6e  / Non-zero to un
84b0: 62 69 6e 64 20 61 6c 6c 20 72 65 67 69 73 74 65  bind all registe
84c0: 72 65 64 20 28 6b 6e 6f 77 6e 29 20 66 75 6e 63  red (known) func
84d0: 74 69 6f 6e 73 20 2d 4f 52 2d 20 7a 65 72 6f 20  tions -OR- zero 
84e0: 74 6f 20 75 6e 62 69 6e 64 20 61 6c 6c 20 66 75  to unbind all fu
84f0: 6e 63 74 69 6f 6e 73 0d 0a 20 20 20 20 2f 2f 2f  nctions..    ///
8500: 20 63 75 72 72 65 6e 74 6c 79 20 62 6f 75 6e 64   currently bound
8510: 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   to the connecti
8520: 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70  on...    /// </p
8530: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
8540: 72 65 74 75 72 6e 73 3e 4e 6f 6e 2d 7a 65 72 6f  returns>Non-zero
8550: 20 69 66 20 61 6c 6c 20 74 68 65 20 73 70 65 63   if all the spec
8560: 69 66 69 65 64 20 75 73 65 72 2d 64 65 66 69 6e  ified user-defin
8570: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 77 65 72  ed functions wer
8580: 65 20 75 6e 62 6f 75 6e 64 2e 3c 2f 72 65 74 75  e unbound.</retu
8590: 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e  rns>..    intern
85a0: 61 6c 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 55  al static bool U
85b0: 6e 62 69 6e 64 41 6c 6c 46 75 6e 63 74 69 6f 6e  nbindAllFunction
85c0: 73 28 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s(..        SQLi
85d0: 74 65 42 61 73 65 20 73 71 6c 62 61 73 65 2c 0d  teBase sqlbase,.
85e0: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43  .        SQLiteC
85f0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 66  onnectionFlags f
8600: 6c 61 67 73 2c 0d 0a 20 20 20 20 20 20 20 20 62  lags,..        b
8610: 6f 6f 6c 20 72 65 67 69 73 74 65 72 65 64 0d 0a  ool registered..
8620: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 7b          )..    {
8630: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71  ..        if (sq
8640: 6c 62 61 73 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  lbase == null)..
8650: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8660: 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
8670: 20 20 20 20 20 49 44 69 63 74 69 6f 6e 61 72 79       IDictionary
8680: 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41  <SQLiteFunctionA
8690: 74 74 72 69 62 75 74 65 2c 20 53 51 4c 69 74 65  ttribute, SQLite
86a0: 46 75 6e 63 74 69 6f 6e 3e 20 6c 46 75 6e 63 74  Function> lFunct
86b0: 69 6f 6e 73 20 3d 0d 0a 20 20 20 20 20 20 20 20  ions =..        
86c0: 20 20 20 20 73 71 6c 62 61 73 65 2e 46 75 6e 63      sqlbase.Func
86d0: 74 69 6f 6e 73 3b 0d 0a 0d 0a 20 20 20 20 20 20  tions;....      
86e0: 20 20 69 66 20 28 6c 46 75 6e 63 74 69 6f 6e 73    if (lFunctions
86f0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
8700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
8710: 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
8720: 62 6f 6f 6c 20 72 65 73 75 6c 74 20 3d 20 74 72  bool result = tr
8730: 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ue;....        i
8740: 66 20 28 72 65 67 69 73 74 65 72 65 64 29 0d 0a  f (registered)..
8750: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
8760: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
8770: 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 53 51 4c  KeyValuePair<SQL
8780: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
8790: 62 75 74 65 2c 20 6f 62 6a 65 63 74 3e 20 70 61  bute, object> pa
87a0: 69 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ir..            
87b0: 20 20 20 20 20 20 20 20 69 6e 20 5f 72 65 67 69          in _regi
87c0: 73 74 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 29  steredFunctions)
87d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
87e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
87f0: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41   SQLiteFunctionA
8800: 74 74 72 69 62 75 74 65 20 70 72 20 3d 20 70 61  ttribute pr = pa
8810: 69 72 2e 4b 65 79 3b 0d 0a 0d 0a 20 20 20 20 20  ir.Key;....     
8820: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
8830: 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  r == null)..    
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
8870: 69 74 65 46 75 6e 63 74 69 6f 6e 20 66 3b 0d 0a  iteFunction f;..
8880: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8890: 20 20 69 66 20 28 21 6c 46 75 6e 63 74 69 6f 6e    if (!lFunction
88a0: 73 2e 54 72 79 47 65 74 56 61 6c 75 65 28 70 72  s.TryGetValue(pr
88b0: 2c 20 6f 75 74 20 66 29 20 7c 7c 0d 0a 20 20 20  , out f) ||..   
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 28 66 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 0d   (f == null) ||.
88e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
88f0: 20 20 20 20 20 21 55 6e 62 69 6e 64 46 75 6e 63       !UnbindFunc
8900: 74 69 6f 6e 28 73 71 6c 62 61 73 65 2c 20 70 72  tion(sqlbase, pr
8910: 2c 20 66 2c 20 66 6c 61 67 73 29 29 0d 0a 20 20  , f, flags))..  
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
8930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8940: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 66 61       result = fa
8950: 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
8960: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8970: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
8980: 7d 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d  }..        else.
8990: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
89a0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
89b0: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
89c0: 20 4e 65 65 64 20 74 6f 20 75 73 65 20 61 20 63   Need to use a c
89d0: 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74  opy of the funct
89e0: 69 6f 6e 20 64 69 63 74 69 6f 6e 61 72 79 20 69  ion dictionary i
89f0: 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 0d 0a 20  n this method.. 
8a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
8a10: 20 20 20 20 62 65 63 61 75 73 65 20 74 68 65 20      because the 
8a20: 64 69 63 74 69 6f 6e 61 72 79 20 69 73 20 6d 6f  dictionary is mo
8a30: 64 69 66 69 65 64 20 77 69 74 68 69 6e 20 74 68  dified within th
8a40: 65 20 55 6e 62 69 6e 64 46 75 6e 63 74 69 6f 6e  e UnbindFunction
8a50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
8a60: 20 20 20 20 20 20 20 6d 65 74 68 6f 64 2c 20 77         method, w
8a70: 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 20 69  hich is called i
8a80: 6e 73 69 64 65 20 74 68 65 20 6c 6f 6f 70 2e 0d  nside the loop..
8a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
8aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 46 75  .            lFu
8ab0: 6e 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 44 69  nctions = new Di
8ac0: 63 74 69 6f 6e 61 72 79 3c 53 51 4c 69 74 65 46  ctionary<SQLiteF
8ad0: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
8ae0: 2c 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  , SQLiteFunction
8af0: 3e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  >(..            
8b00: 20 20 20 20 6c 46 75 6e 63 74 69 6f 6e 73 29 3b      lFunctions);
8b10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8b20: 66 6f 72 65 61 63 68 20 28 4b 65 79 56 61 6c 75  foreach (KeyValu
8b30: 65 50 61 69 72 3c 53 51 4c 69 74 65 46 75 6e 63  ePair<SQLiteFunc
8b40: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 2c 20 53  tionAttribute, S
8b50: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 3e 20 70  QLiteFunction> p
8b60: 61 69 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  air..           
8b70: 20 20 20 20 20 20 20 20 20 69 6e 20 6c 46 75 6e           in lFun
8b80: 63 74 69 6f 6e 73 29 0d 0a 20 20 20 20 20 20 20  ctions)..       
8b90: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
8ba0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75          SQLiteFu
8bb0: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20  nctionAttribute 
8bc0: 70 72 20 3d 20 70 61 69 72 2e 4b 65 79 3b 0d 0a  pr = pair.Key;..
8bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8be0: 20 20 69 66 20 28 70 72 20 3d 3d 20 6e 75 6c 6c    if (pr == null
8bf0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8c00: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8c10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8c20: 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69      SQLiteFuncti
8c30: 6f 6e 20 66 20 3d 20 70 61 69 72 2e 56 61 6c 75  on f = pair.Valu
8c40: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
8c50: 20 20 20 20 20 20 69 66 20 28 28 66 20 3d 3d 20        if ((f == 
8c60: 6e 75 6c 6c 29 20 7c 7c 0d 0a 20 20 20 20 20 20  null) ||..      
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 55                !U
8c80: 6e 62 69 6e 64 46 75 6e 63 74 69 6f 6e 28 73 71  nbindFunction(sq
8c90: 6c 62 61 73 65 2c 20 70 72 2c 20 66 2c 20 66 6c  lbase, pr, f, fl
8ca0: 61 67 73 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ags))..         
8cb0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8cd0: 73 75 6c 74 20 3d 20 66 61 6c 73 65 3b 0d 0a 20  sult = false;.. 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
8d00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
8d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73        return res
8d20: 75 6c 74 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ult;..    }.... 
8d30: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
8d40: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 66  ..    /// This f
8d50: 75 6e 63 74 69 6f 6e 20 62 69 6e 64 73 20 61 20  unction binds a 
8d60: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8d70: 63 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6e 6e 65  ction to a conne
8d80: 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ction...    /// 
8d90: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
8da0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
8db0: 22 73 71 6c 69 74 65 42 61 73 65 22 3e 0d 0a 20  "sqliteBase">.. 
8dc0: 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20     /// The <see 
8dd0: 63 72 65 66 3d 22 53 51 4c 69 74 65 42 61 73 65  cref="SQLiteBase
8de0: 22 20 2f 3e 20 6f 62 6a 65 63 74 20 69 6e 73 74  " /> object inst
8df0: 61 6e 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  ance associated 
8e00: 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20 2f 2f  with the..    //
8e10: 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c  / <see cref="SQL
8e20: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 22 20 2f  iteConnection" /
8e30: 3e 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  > that the funct
8e40: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 62 6f  ion should be bo
8e50: 75 6e 64 20 74 6f 2e 0d 0a 20 20 20 20 2f 2f 2f  und to...    ///
8e60: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f   </param>..    /
8e70: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
8e80: 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74  functionAttribut
8e90: 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65  e">..    /// The
8ea0: 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69   <see cref="SQLi
8eb0: 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  teFunctionAttrib
8ec0: 75 74 65 22 2f 3e 20 6f 62 6a 65 63 74 20 69 6e  ute"/> object in
8ed0: 73 74 61 6e 63 65 20 63 6f 6e 74 61 69 6e 69 6e  stance containin
8ee0: 67 0d 0a 20 20 20 20 2f 2f 2f 20 74 68 65 20 6d  g..    /// the m
8ef0: 65 74 61 64 61 74 61 20 66 6f 72 20 74 68 65 20  etadata for the 
8f00: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 62  function to be b
8f10: 6f 75 6e 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ound...    /// <
8f20: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
8f30: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 75   <param name="fu
8f40: 6e 63 74 69 6f 6e 22 3e 0d 0a 20 20 20 20 2f 2f  nction">..    //
8f50: 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d  / The <see cref=
8f60: 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 22  "SQLiteFunction"
8f70: 2f 3e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e  /> object instan
8f80: 63 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ce that implemen
8f90: 74 73 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f 20  ts the..    /// 
8fa0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 62  function to be b
8fb0: 6f 75 6e 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ound...    /// <
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 66 6c   <param name="fl
8fe0: 61 67 73 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54  ags">..    /// T
8ff0: 68 65 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  he flags associa
9000: 74 65 64 20 77 69 74 68 20 74 68 65 20 70 61 72  ted with the par
9010: 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  ent connection o
9020: 62 6a 65 63 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20  bject...    /// 
9030: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 69 6e  </param>..    in
9040: 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 76 6f  ternal static vo
9050: 69 64 20 42 69 6e 64 46 75 6e 63 74 69 6f 6e 28  id BindFunction(
9060: 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ..        SQLite
9070: 42 61 73 65 20 73 71 6c 69 74 65 42 61 73 65 2c  Base sqliteBase,
9080: 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ..        SQLite
9090: 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74  FunctionAttribut
90a0: 65 20 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  e functionAttrib
90b0: 75 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 53 51  ute,..        SQ
90c0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 66 75 6e  LiteFunction fun
90d0: 63 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20  ction,..        
90e0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
90f0: 46 6c 61 67 73 20 66 6c 61 67 73 0d 0a 20 20 20  Flags flags..   
9100: 20 20 20 20 20 29 0d 0a 20 20 20 20 7b 0d 0a 20       )..    {.. 
9110: 20 20 20 20 20 20 20 69 66 20 28 73 71 6c 69 74         if (sqlit
9120: 65 42 61 73 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  eBase == null)..
9130: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
9140: 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 4e 75  w new ArgumentNu
9150: 6c 6c 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c  llException("sql
9160: 69 74 65 42 61 73 65 22 29 3b 0d 0a 0d 0a 20 20  iteBase");....  
9170: 20 20 20 20 20 20 69 66 20 28 66 75 6e 63 74 69        if (functi
9180: 6f 6e 41 74 74 72 69 62 75 74 65 20 3d 3d 20 6e  onAttribute == n
9190: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
91a0: 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75    throw new Argu
91b0: 6d 65 6e 74 4e 75 6c 6c 45 78 63 65 70 74 69 6f  mentNullExceptio
91c0: 6e 28 22 66 75 6e 63 74 69 6f 6e 41 74 74 72 69  n("functionAttri
91d0: 62 75 74 65 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  bute");....     
91e0: 20 20 20 69 66 20 28 66 75 6e 63 74 69 6f 6e 20     if (function 
91f0: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
9200: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
9210: 41 72 67 75 6d 65 6e 74 4e 75 6c 6c 45 78 63 65  ArgumentNullExce
9220: 70 74 69 6f 6e 28 22 66 75 6e 63 74 69 6f 6e 22  ption("function"
9230: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 46 75  );....        Fu
9240: 6e 63 74 69 6f 6e 54 79 70 65 20 66 75 6e 63 74  nctionType funct
9250: 69 6f 6e 54 79 70 65 20 3d 20 66 75 6e 63 74 69  ionType = functi
9260: 6f 6e 41 74 74 72 69 62 75 74 65 2e 46 75 6e 63  onAttribute.Func
9270: 54 79 70 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  Type;....       
9280: 20 66 75 6e 63 74 69 6f 6e 2e 5f 62 61 73 65 20   function._base 
9290: 3d 20 73 71 6c 69 74 65 42 61 73 65 3b 0d 0a 20  = sqliteBase;.. 
92a0: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e         function.
92b0: 5f 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0d  _flags = flags;.
92c0: 0a 0d 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74  ...        funct
92d0: 69 6f 6e 2e 5f 49 6e 76 6f 6b 65 46 75 6e 63 20  ion._InvokeFunc 
92e0: 3d 20 28 66 75 6e 63 74 69 6f 6e 54 79 70 65 20  = (functionType 
92f0: 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e  == FunctionType.
9300: 53 63 61 6c 61 72 29 20 3f 0d 0a 20 20 20 20 20  Scalar) ?..     
9310: 20 20 20 20 20 20 20 6e 65 77 20 53 51 4c 69 74         new SQLit
9320: 65 43 61 6c 6c 62 61 63 6b 28 66 75 6e 63 74 69  eCallback(functi
9330: 6f 6e 2e 53 63 61 6c 61 72 43 61 6c 6c 62 61 63  on.ScalarCallbac
9340: 6b 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  k) : null;....  
9350: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f        function._
9360: 53 74 65 70 46 75 6e 63 20 3d 20 28 66 75 6e 63  StepFunc = (func
9370: 74 69 6f 6e 54 79 70 65 20 3d 3d 20 46 75 6e 63  tionType == Func
9380: 74 69 6f 6e 54 79 70 65 2e 41 67 67 72 65 67 61  tionType.Aggrega
9390: 74 65 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20  te) ?..         
93a0: 20 20 20 6e 65 77 20 53 51 4c 69 74 65 43 61 6c     new SQLiteCal
93b0: 6c 62 61 63 6b 28 66 75 6e 63 74 69 6f 6e 2e 53  lback(function.S
93c0: 74 65 70 43 61 6c 6c 62 61 63 6b 29 20 3a 20 6e  tepCallback) : n
93d0: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
93e0: 66 75 6e 63 74 69 6f 6e 2e 5f 46 69 6e 61 6c 46  function._FinalF
93f0: 75 6e 63 20 3d 20 28 66 75 6e 63 74 69 6f 6e 54  unc = (functionT
9400: 79 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54  ype == FunctionT
9410: 79 70 65 2e 41 67 67 72 65 67 61 74 65 29 20 3f  ype.Aggregate) ?
9420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ..            ne
9430: 77 20 53 51 4c 69 74 65 46 69 6e 61 6c 43 61 6c  w SQLiteFinalCal
9440: 6c 62 61 63 6b 28 66 75 6e 63 74 69 6f 6e 2e 46  lback(function.F
9450: 69 6e 61 6c 43 61 6c 6c 62 61 63 6b 29 20 3a 20  inalCallback) : 
9460: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
9470: 20 66 75 6e 63 74 69 6f 6e 2e 5f 43 6f 6d 70 61   function._Compa
9480: 72 65 46 75 6e 63 20 3d 20 28 66 75 6e 63 74 69  reFunc = (functi
9490: 6f 6e 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 69  onType == Functi
94a0: 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e  onType.Collation
94b0: 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) ?..           
94c0: 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6c 6c 61   new SQLiteColla
94d0: 74 69 6f 6e 28 66 75 6e 63 74 69 6f 6e 2e 43 6f  tion(function.Co
94e0: 6d 70 61 72 65 43 61 6c 6c 62 61 63 6b 29 20 3a  mpareCallback) :
94f0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
9500: 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 43 6f 6d 70    function._Comp
9510: 61 72 65 46 75 6e 63 31 36 20 3d 20 28 66 75 6e  areFunc16 = (fun
9520: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 46 75 6e  ctionType == Fun
9530: 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74  ctionType.Collat
9540: 69 6f 6e 29 20 3f 0d 0a 20 20 20 20 20 20 20 20  ion) ?..        
9550: 20 20 20 20 6e 65 77 20 53 51 4c 69 74 65 43 6f      new SQLiteCo
9560: 6c 6c 61 74 69 6f 6e 28 66 75 6e 63 74 69 6f 6e  llation(function
9570: 2e 43 6f 6d 70 61 72 65 43 61 6c 6c 62 61 63 6b  .CompareCallback
9580: 31 36 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  16) : null;.... 
9590: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61         string na
95a0: 6d 65 20 3d 20 66 75 6e 63 74 69 6f 6e 41 74 74  me = functionAtt
95b0: 72 69 62 75 74 65 2e 4e 61 6d 65 3b 0d 0a 0d 0a  ribute.Name;....
95c0: 20 20 20 20 20 20 20 20 69 66 20 28 66 75 6e 63          if (func
95d0: 74 69 6f 6e 54 79 70 65 20 21 3d 20 46 75 6e 63  tionType != Func
95e0: 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69  tionType.Collati
95f0: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  on)..        {..
9600: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
9610: 20 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 28   needCollSeq = (
9620: 66 75 6e 63 74 69 6f 6e 20 69 73 20 53 51 4c 69  function is SQLi
9630: 74 65 46 75 6e 63 74 69 6f 6e 45 78 29 3b 0d 0a  teFunctionEx);..
9640: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
9650: 6c 69 74 65 42 61 73 65 2e 43 72 65 61 74 65 46  liteBase.CreateF
9660: 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20  unction(..      
9670: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 20            name, 
9680: 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74  functionAttribut
9690: 65 2e 41 72 67 75 6d 65 6e 74 73 2c 20 6e 65 65  e.Arguments, nee
96a0: 64 43 6f 6c 6c 53 65 71 2c 0d 0a 20 20 20 20 20  dCollSeq,..     
96b0: 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74             funct
96c0: 69 6f 6e 2e 5f 49 6e 76 6f 6b 65 46 75 6e 63 2c  ion._InvokeFunc,
96d0: 20 66 75 6e 63 74 69 6f 6e 2e 5f 53 74 65 70 46   function._StepF
96e0: 75 6e 63 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  unc,..          
96f0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f        function._
9700: 46 69 6e 61 6c 46 75 6e 63 2c 20 74 72 75 65 29  FinalFunc, true)
9710: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
9720: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
9730: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9740: 20 20 20 73 71 6c 69 74 65 42 61 73 65 2e 43 72     sqliteBase.Cr
9750: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0d 0a  eateCollation(..
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 6e 61 6d 65 2c 20 66 75 6e 63 74 69 6f 6e 2e 5f  name, function._
9780: 43 6f 6d 70 61 72 65 46 75 6e 63 2c 20 66 75 6e  CompareFunc, fun
9790: 63 74 69 6f 6e 2e 5f 43 6f 6d 70 61 72 65 46 75  ction._CompareFu
97a0: 6e 63 31 36 2c 0d 0a 20 20 20 20 20 20 20 20 20  nc16,..         
97b0: 20 20 20 20 20 20 20 74 72 75 65 29 3b 0d 0a 20         true);.. 
97c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d         }..    }.
97d0: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
97e0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  ary>..    /// Th
97f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e 62 69  is function unbi
9800: 6e 64 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e  nds a user-defin
9810: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 66 72 6f  ed functions fro
9820: 6d 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d  m a connection..
9830: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
9840: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
9850: 72 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 69 74 65  ram name="sqlite
9860: 42 61 73 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20  Base">..    /// 
9870: 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53  The <see cref="S
9880: 51 4c 69 74 65 42 61 73 65 22 20 2f 3e 20 6f 62  QLiteBase" /> ob
9890: 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 61 73  ject instance as
98a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
98b0: 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20  e..    /// <see 
98c0: 63 72 65 66 3d 22 53 51 4c 69 74 65 43 6f 6e 6e  cref="SQLiteConn
98d0: 65 63 74 69 6f 6e 22 20 2f 3e 20 74 68 61 74 20  ection" /> that 
98e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  the function sho
98f0: 75 6c 64 20 62 65 20 62 6f 75 6e 64 20 74 6f 2e  uld be bound to.
9900: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61  ..    /// </para
9910: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
9920: 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63 74 69 6f  am name="functio
9930: 6e 41 74 74 72 69 62 75 74 65 22 3e 0d 0a 20 20  nAttribute">..  
9940: 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20 63    /// The <see c
9950: 72 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74  ref="SQLiteFunct
9960: 69 6f 6e 41 74 74 72 69 62 75 74 65 22 2f 3e 20  ionAttribute"/> 
9970: 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20  object instance 
9980: 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20  containing..    
9990: 2f 2f 2f 20 74 68 65 20 6d 65 74 61 64 61 74 61  /// the metadata
99a0: 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f   for the functio
99b0: 6e 20 74 6f 20 62 65 20 62 6f 75 6e 64 2e 0d 0a  n to be bound...
99c0: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
99d0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
99e0: 20 6e 61 6d 65 3d 22 66 75 6e 63 74 69 6f 6e 22   name="function"
99f0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c  >..    /// The <
9a00: 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65  see cref="SQLite
9a10: 46 75 6e 63 74 69 6f 6e 22 2f 3e 20 6f 62 6a 65  Function"/> obje
9a20: 63 74 20 69 6e 73 74 61 6e 63 65 20 74 68 61 74  ct instance that
9a30: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0d   implements the.
9a40: 0a 20 20 20 20 2f 2f 2f 20 66 75 6e 63 74 69 6f  .    /// functio
9a50: 6e 20 74 6f 20 62 65 20 62 6f 75 6e 64 2e 0d 0a  n to be bound...
9a60: 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e      /// </param>
9a70: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
9a80: 20 6e 61 6d 65 3d 22 66 6c 61 67 73 22 3e 0d 0a   name="flags">..
9a90: 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 6c 61 67      /// The flag
9aa0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
9ab0: 68 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6e  h the parent con
9ac0: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 0d  nection object..
9ad0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d  .    /// </param
9ae0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
9af0: 72 6e 73 3e 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns>Non-zero if 
9b00: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  the function was
9b10: 20 75 6e 62 6f 75 6e 64 2e 3c 2f 72 65 74 75 72   unbound.</retur
9b20: 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  ns>..    interna
9b30: 6c 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 55 6e  l static bool Un
9b40: 62 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0d 0a 20  bindFunction(.. 
9b50: 20 20 20 20 20 20 20 53 51 4c 69 74 65 42 61 73         SQLiteBas
9b60: 65 20 73 71 6c 69 74 65 42 61 73 65 2c 0d 0a 20  e sqliteBase,.. 
9b70: 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e         SQLiteFun
9b80: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 66  ctionAttribute f
9b90: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
9ba0: 2c 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  ,..        SQLit
9bb0: 65 46 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  eFunction functi
9bc0: 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  on,..        SQL
9bd0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
9be0: 67 73 20 66 6c 61 67 73 20 2f 2a 20 4e 4f 54 20  gs flags /* NOT 
9bf0: 55 53 45 44 20 2a 2f 0d 0a 20 20 20 20 20 20 20  USED */..       
9c00: 20 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20   )..    {..     
9c10: 20 20 20 69 66 20 28 73 71 6c 69 74 65 42 61 73     if (sqliteBas
9c20: 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
9c30: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
9c40: 77 20 41 72 67 75 6d 65 6e 74 4e 75 6c 6c 45 78  w ArgumentNullEx
9c50: 63 65 70 74 69 6f 6e 28 22 73 71 6c 69 74 65 42  ception("sqliteB
9c60: 61 73 65 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ase");....      
9c70: 20 20 69 66 20 28 66 75 6e 63 74 69 6f 6e 41 74    if (functionAt
9c80: 74 72 69 62 75 74 65 20 3d 3d 20 6e 75 6c 6c 29  tribute == null)
9c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  ..            th
9ca0: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
9cb0: 4e 75 6c 6c 45 78 63 65 70 74 69 6f 6e 28 22 66  NullException("f
9cc0: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
9cd0: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ");....        i
9ce0: 66 20 28 66 75 6e 63 74 69 6f 6e 20 3d 3d 20 6e  f (function == n
9cf0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
9d00: 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75    throw new Argu
9d10: 6d 65 6e 74 4e 75 6c 6c 45 78 63 65 70 74 69 6f  mentNullExceptio
9d20: 6e 28 22 66 75 6e 63 74 69 6f 6e 22 29 3b 0d 0a  n("function");..
9d30: 0d 0a 20 20 20 20 20 20 20 20 46 75 6e 63 74 69  ..        Functi
9d40: 6f 6e 54 79 70 65 20 66 75 6e 63 74 69 6f 6e 54  onType functionT
9d50: 79 70 65 20 3d 20 66 75 6e 63 74 69 6f 6e 41 74  ype = functionAt
9d60: 74 72 69 62 75 74 65 2e 46 75 6e 63 54 79 70 65  tribute.FuncType
9d70: 3b 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ;..        strin
9d80: 67 20 6e 61 6d 65 20 3d 20 66 75 6e 63 74 69 6f  g name = functio
9d90: 6e 41 74 74 72 69 62 75 74 65 2e 4e 61 6d 65 3b  nAttribute.Name;
9da0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  ....        if (
9db0: 66 75 6e 63 74 69 6f 6e 54 79 70 65 20 21 3d 20  functionType != 
9dc0: 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c  FunctionType.Col
9dd0: 6c 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20  lation)..       
9de0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9df0: 62 6f 6f 6c 20 6e 65 65 64 43 6f 6c 6c 53 65 71  bool needCollSeq
9e00: 20 3d 20 28 66 75 6e 63 74 69 6f 6e 20 69 73 20   = (function is 
9e10: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 45 78  SQLiteFunctionEx
9e20: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
9e30: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 42    return sqliteB
9e40: 61 73 65 2e 43 72 65 61 74 65 46 75 6e 63 74 69  ase.CreateFuncti
9e50: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on(..           
9e60: 20 20 20 20 20 6e 61 6d 65 2c 20 66 75 6e 63 74       name, funct
9e70: 69 6f 6e 41 74 74 72 69 62 75 74 65 2e 41 72 67  ionAttribute.Arg
9e80: 75 6d 65 6e 74 73 2c 20 6e 65 65 64 43 6f 6c 6c  uments, needColl
9e90: 53 65 71 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Seq,..          
9ea0: 20 20 20 20 20 20 6e 75 6c 6c 2c 20 6e 75 6c 6c        null, null
9eb0: 2c 20 6e 75 6c 6c 2c 20 66 61 6c 73 65 29 20 3d  , null, false) =
9ec0: 3d 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f 64  = SQLiteErrorCod
9ed0: 65 2e 4f 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d  e.Ok;..        }
9ee0: 0d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a  ..        else..
9ef0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
9f00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
9f10: 6c 69 74 65 42 61 73 65 2e 43 72 65 61 74 65 43  liteBase.CreateC
9f20: 6f 6c 6c 61 74 69 6f 6e 28 0d 0a 20 20 20 20 20  ollation(..     
9f30: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
9f40: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 66 61 6c   null, null, fal
9f50: 73 65 29 20 3d 3d 20 53 51 4c 69 74 65 45 72 72  se) == SQLiteErr
9f60: 6f 72 43 6f 64 65 2e 4f 6b 3b 0d 0a 20 20 20 20  orCode.Ok;..    
9f70: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
9f80: 7d 0d 0a 0d 0a 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  }....  /////////
9f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fd0: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73  ////....  /// <s
9fe0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54  ummary>..  /// T
9ff0: 68 69 73 20 3c 73 65 65 20 63 72 65 66 3d 22 44  his <see cref="D
a000: 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 79 70 65  elegate" /> type
a010: 20 69 73 20 75 73 65 64 20 77 69 74 68 20 74 68   is used with th
a020: 65 0d 0a 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72  e..  /// <see cr
a030: 65 66 3d 22 53 51 4c 69 74 65 44 65 6c 65 67 61  ef="SQLiteDelega
a040: 74 65 46 75 6e 63 74 69 6f 6e 2e 49 6e 76 6f 6b  teFunction.Invok
a050: 65 22 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d 0a 20  e" /> method... 
a060: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
a070: 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61  .  /// <param na
a080: 6d 65 3d 22 70 61 72 61 6d 30 22 3e 0d 0a 20 20  me="param0">..  
a090: 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6c 77 61  /// This is alwa
a0a0: 79 73 20 74 68 65 20 73 74 72 69 6e 67 20 6c 69  ys the string li
a0b0: 74 65 72 61 6c 20 22 49 6e 76 6f 6b 65 22 2e 0d  teral "Invoke"..
a0c0: 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d  .  /// </param>.
a0d0: 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61  .  /// <param na
a0e0: 6d 65 3d 22 61 72 67 73 22 3e 0d 0a 20 20 2f 2f  me="args">..  //
a0f0: 2f 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  / The arguments 
a100: 66 6f 72 20 74 68 65 20 73 63 61 6c 61 72 20 66  for the scalar f
a110: 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20  unction...  /// 
a120: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20  </param>..  /// 
a130: 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 2f 2f 2f  <returns>..  ///
a140: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
a150: 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  he scalar functi
a160: 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 72 65 74  on...  /// </ret
a170: 75 72 6e 73 3e 0d 0a 20 20 70 75 62 6c 69 63 20  urns>..  public 
a180: 64 65 6c 65 67 61 74 65 20 6f 62 6a 65 63 74 20  delegate object 
a190: 53 51 4c 69 74 65 49 6e 76 6f 6b 65 44 65 6c 65  SQLiteInvokeDele
a1a0: 67 61 74 65 28 0d 0a 20 20 20 20 73 74 72 69 6e  gate(..    strin
a1b0: 67 20 70 61 72 61 6d 30 2c 0d 0a 20 20 20 20 6f  g param0,..    o
a1c0: 62 6a 65 63 74 5b 5d 20 61 72 67 73 0d 0a 20 20  bject[] args..  
a1d0: 29 3b 0d 0a 0d 0a 20 20 2f 2f 2f 2f 2f 2f 2f 2f  );....  ////////
a1e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a1f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a220: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c  /////....  /// <
a230: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
a240: 54 68 69 73 20 3c 73 65 65 20 63 72 65 66 3d 22  This <see cref="
a250: 44 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 79 70  Delegate" /> typ
a260: 65 20 69 73 20 75 73 65 64 20 77 69 74 68 20 74  e is used with t
a270: 68 65 0d 0a 20 20 2f 2f 2f 20 3c 73 65 65 20 63  he..  /// <see c
a280: 72 65 66 3d 22 53 51 4c 69 74 65 44 65 6c 65 67  ref="SQLiteDeleg
a290: 61 74 65 46 75 6e 63 74 69 6f 6e 2e 53 74 65 70  ateFunction.Step
a2a0: 22 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d 0a 20 20  " /> method...  
a2b0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
a2c0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
a2d0: 65 3d 22 70 61 72 61 6d 30 22 3e 0d 0a 20 20 2f  e="param0">..  /
a2e0: 2f 2f 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  // This is alway
a2f0: 73 20 74 68 65 20 73 74 72 69 6e 67 20 6c 69 74  s the string lit
a300: 65 72 61 6c 20 22 53 74 65 70 22 2e 0d 0a 20 20  eral "Step"...  
a310: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
a320: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
a330: 22 61 72 67 73 22 3e 0d 0a 20 20 2f 2f 2f 20 54  "args">..  /// T
a340: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  he arguments for
a350: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
a360: 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20  unction...  /// 
a370: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20  </param>..  /// 
a380: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 74 65  <param name="ste
a390: 70 4e 75 6d 62 65 72 22 3e 0d 0a 20 20 2f 2f 2f  pNumber">..  ///
a3a0: 20 54 68 65 20 73 74 65 70 20 6e 75 6d 62 65 72   The step number
a3b0: 20 28 6f 6e 65 20 62 61 73 65 64 29 2e 20 20 54   (one based).  T
a3c0: 68 69 73 20 69 73 20 69 6e 63 72 65 6d 65 6d 74  his is incrememt
a3d0: 65 64 20 65 61 63 68 20 74 69 6d 65 20 74 68 65  ed each time the
a3e0: 0d 0a 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65  ..  /// <see cre
a3f0: 66 3d 22 53 51 4c 69 74 65 44 65 6c 65 67 61 74  f="SQLiteDelegat
a400: 65 46 75 6e 63 74 69 6f 6e 2e 53 74 65 70 22 20  eFunction.Step" 
a410: 2f 3e 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  /> method is cal
a420: 6c 65 64 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61  led...  /// </pa
a430: 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72  ram>..  /// <par
a440: 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74  am name="context
a450: 44 61 74 61 22 3e 0d 0a 20 20 2f 2f 2f 20 41 20  Data">..  /// A 
a460: 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  placeholder for 
a470: 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20  implementers to 
a480: 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75 61 6c  store contextual
a490: 20 64 61 74 61 20 70 65 72 74 61 69 6e 69 6e 67   data pertaining
a4a0: 0d 0a 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 63  ..  /// to the c
a4b0: 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0d  urrent context..
a4c0: 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d  .  /// </param>.
a4d0: 0a 20 20 70 75 62 6c 69 63 20 64 65 6c 65 67 61  .  public delega
a4e0: 74 65 20 76 6f 69 64 20 53 51 4c 69 74 65 53 74  te void SQLiteSt
a4f0: 65 70 44 65 6c 65 67 61 74 65 28 0d 0a 20 20 20  epDelegate(..   
a500: 20 73 74 72 69 6e 67 20 70 61 72 61 6d 30 2c 0d   string param0,.
a510: 0a 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72  .    object[] ar
a520: 67 73 2c 0d 0a 20 20 20 20 69 6e 74 20 73 74 65  gs,..    int ste
a530: 70 4e 75 6d 62 65 72 2c 0d 0a 20 20 20 20 72 65  pNumber,..    re
a540: 66 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74  f object context
a550: 44 61 74 61 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20  Data..  );....  
a560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a5a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
a5b0: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
a5c0: 0d 0a 20 20 2f 2f 2f 20 54 68 69 73 20 3c 73 65  ..  /// This <se
a5d0: 65 20 63 72 65 66 3d 22 44 65 6c 65 67 61 74 65  e cref="Delegate
a5e0: 22 20 2f 3e 20 74 79 70 65 20 69 73 20 75 73 65  " /> type is use
a5f0: 64 20 77 69 74 68 20 74 68 65 0d 0a 20 20 2f 2f  d with the..  //
a600: 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c  / <see cref="SQL
a610: 69 74 65 44 65 6c 65 67 61 74 65 46 75 6e 63 74  iteDelegateFunct
a620: 69 6f 6e 2e 46 69 6e 61 6c 22 20 2f 3e 20 6d 65  ion.Final" /> me
a630: 74 68 6f 64 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73  thod...  /// </s
a640: 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c  ummary>..  /// <
a650: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 61 72 61  param name="para
a660: 6d 30 22 3e 0d 0a 20 20 2f 2f 2f 20 54 68 69 73  m0">..  /// This
a670: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 73   is always the s
a680: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 22 46  tring literal "F
a690: 69 6e 61 6c 22 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f  inal"...  /// </
a6a0: 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70  param>..  /// <p
a6b0: 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65  aram name="conte
a6c0: 78 74 44 61 74 61 22 3e 0d 0a 20 20 2f 2f 2f 20  xtData">..  /// 
a6d0: 41 20 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f  A placeholder fo
a6e0: 72 20 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74  r implementers t
a6f0: 6f 20 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75  o store contextu
a700: 61 6c 20 64 61 74 61 20 70 65 72 74 61 69 6e 69  al data pertaini
a710: 6e 67 0d 0a 20 20 2f 2f 2f 20 74 6f 20 74 68 65  ng..  /// to the
a720: 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74   current context
a730: 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d  ...  /// </param
a740: 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  >..  /// <return
a750: 73 3e 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 72 65  s>..  /// The re
a760: 73 75 6c 74 20 6f 66 20 74 68 65 20 61 67 67 72  sult of the aggr
a770: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0d  egate function..
a780: 0a 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73  .  /// </returns
a790: 3e 0d 0a 20 20 70 75 62 6c 69 63 20 64 65 6c 65  >..  public dele
a7a0: 67 61 74 65 20 6f 62 6a 65 63 74 20 53 51 4c 69  gate object SQLi
a7b0: 74 65 46 69 6e 61 6c 44 65 6c 65 67 61 74 65 28  teFinalDelegate(
a7c0: 0d 0a 20 20 20 20 73 74 72 69 6e 67 20 70 61 72  ..    string par
a7d0: 61 6d 30 2c 0d 0a 20 20 20 20 6f 62 6a 65 63 74  am0,..    object
a7e0: 20 63 6f 6e 74 65 78 74 44 61 74 61 0d 0a 20 20   contextData..  
a7f0: 29 3b 0d 0a 0d 0a 20 20 2f 2f 2f 2f 2f 2f 2f 2f  );....  ////////
a800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a840: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c  /////....  /// <
a850: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
a860: 54 68 69 73 20 3c 73 65 65 20 63 72 65 66 3d 22  This <see cref="
a870: 44 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 79 70  Delegate" /> typ
a880: 65 20 69 73 20 75 73 65 64 20 77 69 74 68 20 74  e is used with t
a890: 68 65 0d 0a 20 20 2f 2f 2f 20 3c 73 65 65 20 63  he..  /// <see c
a8a0: 72 65 66 3d 22 53 51 4c 69 74 65 44 65 6c 65 67  ref="SQLiteDeleg
a8b0: 61 74 65 46 75 6e 63 74 69 6f 6e 2e 43 6f 6d 70  ateFunction.Comp
a8c0: 61 72 65 22 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d  are" /> method..
a8d0: 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
a8e0: 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  >..  /// <param 
a8f0: 6e 61 6d 65 3d 22 70 61 72 61 6d 30 22 3e 0d 0a  name="param0">..
a900: 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20 61 6c    /// This is al
a910: 77 61 79 73 20 74 68 65 20 73 74 72 69 6e 67 20  ways the string 
a920: 6c 69 74 65 72 61 6c 20 22 43 6f 6d 70 61 72 65  literal "Compare
a930: 22 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61  "...  /// </para
a940: 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  m>..  /// <param
a950: 20 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22 3e 0d   name="param1">.
a960: 0a 20 20 2f 2f 2f 20 54 68 65 20 66 69 72 73 74  .  /// The first
a970: 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61   string to compa
a980: 72 65 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72  re...  /// </par
a990: 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61  am>..  /// <para
a9a0: 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 3e  m name="param2">
a9b0: 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 73 65 63 6f  ..  /// The seco
a9c0: 6e 64 20 73 74 72 6e 69 67 20 74 6f 20 63 6f 6d  nd strnig to com
a9d0: 70 61 72 65 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70  pare...  /// </p
a9e0: 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65  aram>..  /// <re
a9f0: 74 75 72 6e 73 3e 0d 0a 20 20 2f 2f 2f 20 41 20  turns>..  /// A 
aa00: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
aa10: 20 69 66 20 74 68 65 20 3c 70 61 72 61 6d 72 65   if the <paramre
aa20: 66 20 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22 20  f name="param1" 
aa30: 2f 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 0d  /> parameter is.
aa40: 0a 20 20 2f 2f 2f 20 67 72 65 61 74 65 72 20 74  .  /// greater t
aa50: 68 61 6e 20 74 68 65 20 3c 70 61 72 61 6d 72 65  han the <paramre
aa60: 66 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 20  f name="param2" 
aa70: 2f 3e 20 70 61 72 61 6d 65 74 65 72 2c 20 61 20  /> parameter, a 
aa80: 6e 65 67 61 74 69 76 65 0d 0a 20 20 2f 2f 2f 20  negative..  /// 
aa90: 69 6e 74 65 67 65 72 20 69 66 20 74 68 65 20 3c  integer if the <
aaa0: 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 70  paramref name="p
aab0: 61 72 61 6d 31 22 20 2f 3e 20 70 61 72 61 6d 65  aram1" /> parame
aac0: 74 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ter is less than
aad0: 0d 0a 20 20 2f 2f 2f 20 74 68 65 20 3c 70 61 72  ..  /// the <par
aae0: 61 6d 72 65 66 20 6e 61 6d 65 3d 22 70 61 72 61  amref name="para
aaf0: 6d 32 22 20 2f 3e 20 70 61 72 61 6d 65 74 65 72  m2" /> parameter
ab00: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 65  , or zero if the
ab10: 79 20 61 72 65 0d 0a 20 20 2f 2f 2f 20 65 71 75  y are..  /// equ
ab20: 61 6c 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 72 65 74  al...  /// </ret
ab30: 75 72 6e 73 3e 0d 0a 20 20 70 75 62 6c 69 63 20  urns>..  public 
ab40: 64 65 6c 65 67 61 74 65 20 69 6e 74 20 53 51 4c  delegate int SQL
ab50: 69 74 65 43 6f 6d 70 61 72 65 44 65 6c 65 67 61  iteCompareDelega
ab60: 74 65 28 0d 0a 20 20 20 20 73 74 72 69 6e 67 20  te(..    string 
ab70: 70 61 72 61 6d 30 2c 0d 0a 20 20 20 20 73 74 72  param0,..    str
ab80: 69 6e 67 20 70 61 72 61 6d 31 2c 0d 0a 20 20 20  ing param1,..   
ab90: 20 73 74 72 69 6e 67 20 70 61 72 61 6d 32 0d 0a   string param2..
aba0: 20 20 29 3b 0d 0a 0d 0a 20 20 2f 2f 2f 2f 2f 2f    );....  //////
abb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abf0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 2f 2f 2f  ///////....  ///
ac00: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f   <summary>..  //
ac10: 2f 20 54 68 69 73 20 63 6c 61 73 73 20 69 6d 70  / This class imp
ac20: 6c 65 6d 65 6e 74 73 20 61 20 53 51 4c 69 74 65  lements a SQLite
ac30: 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20   function using 
ac40: 61 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c  a <see cref="Del
ac50: 65 67 61 74 65 22 20 2f 3e 2e 0d 0a 20 20 2f 2f  egate" />...  //
ac60: 2f 20 41 6c 6c 20 74 68 65 20 76 69 72 74 75 61  / All the virtua
ac70: 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
ac80: 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69   <see cref="SQLi
ac90: 74 65 46 75 6e 63 74 69 6f 6e 22 20 2f 3e 20 63  teFunction" /> c
aca0: 6c 61 73 73 20 61 72 65 0d 0a 20 20 2f 2f 2f 20  lass are..  /// 
acb0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
acc0: 67 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 3c  g calls to the <
acd0: 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67 61  see cref="Delega
ace0: 74 65 2e 44 79 6e 61 6d 69 63 49 6e 76 6f 6b 65  te.DynamicInvoke
acf0: 22 20 2f 3e 0d 0a 20 20 2f 2f 2f 20 6d 65 74 68  " />..  /// meth
ad00: 6f 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  od.  The argumen
ad10: 74 73 20 61 72 65 20 70 72 65 73 65 6e 74 65 64  ts are presented
ad20: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64   in the same ord
ad30: 65 72 20 74 68 65 79 20 61 70 70 65 61 72 20 69  er they appear i
ad40: 6e 0d 0a 20 20 2f 2f 2f 20 74 68 65 20 61 73 73  n..  /// the ass
ad50: 6f 63 69 61 74 65 64 20 3c 73 65 65 20 63 72 65  ociated <see cre
ad60: 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  f="SQLiteFunctio
ad70: 6e 22 20 2f 3e 20 6d 65 74 68 6f 64 73 20 77 69  n" /> methods wi
ad80: 74 68 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  th one exception
ad90: 3a 0d 0a 20 20 2f 2f 2f 20 74 68 65 20 66 69 72  :..  /// the fir
ada0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  st argument is t
adb0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
adc0: 69 72 74 75 61 6c 20 6d 65 74 68 6f 64 20 62 65  irtual method be
add0: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  ing implemented.
ade0: 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72  ..  /// </summar
adf0: 79 3e 0d 0a 20 20 70 75 62 6c 69 63 20 63 6c 61  y>..  public cla
ae00: 73 73 20 53 51 4c 69 74 65 44 65 6c 65 67 61 74  ss SQLiteDelegat
ae10: 65 46 75 6e 63 74 69 6f 6e 20 3a 20 53 51 4c 69  eFunction : SQLi
ae20: 74 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d  teFunction..  {.
ae30: 0a 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50  .      #region P
ae40: 72 69 76 61 74 65 20 43 6f 6e 73 74 61 6e 74 73  rivate Constants
ae50: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ..      /// <sum
ae60: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f  mary>..      ///
ae70: 20 54 68 69 73 20 65 72 72 6f 72 20 6d 65 73 73   This error mess
ae80: 61 67 65 20 69 73 20 75 73 65 64 20 62 79 20 74  age is used by t
ae90: 68 65 20 6f 76 65 72 72 69 64 64 65 6e 20 76 69  he overridden vi
aea0: 72 74 75 61 6c 20 6d 65 74 68 6f 64 73 20 77 68  rtual methods wh
aeb0: 65 6e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 61 20  en..      /// a 
aec0: 72 65 71 75 69 72 65 64 20 3c 73 65 65 20 63 72  required <see cr
aed0: 65 66 3d 22 44 65 6c 65 67 61 74 65 22 20 2f 3e  ef="Delegate" />
aee0: 20 70 72 6f 70 65 72 74 79 20 28 65 2e 67 2e 0d   property (e.g..
aef0: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20  .      /// <see 
af00: 63 72 65 66 3d 22 43 61 6c 6c 62 61 63 6b 31 22  cref="Callback1"
af10: 20 2f 3e 20 6f 72 20 3c 73 65 65 20 63 72 65 66   /> or <see cref
af20: 3d 22 43 61 6c 6c 62 61 63 6b 32 22 20 2f 3e 29  ="Callback2" />)
af30: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0d 0a 20   has not been.. 
af40: 20 20 20 20 20 2f 2f 2f 20 73 65 74 2e 0d 0a 20       /// set... 
af50: 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61       /// </summa
af60: 72 79 3e 0d 0a 20 20 20 20 20 20 70 72 69 76 61  ry>..      priva
af70: 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20  te const string 
af80: 4e 6f 43 61 6c 6c 62 61 63 6b 45 72 72 6f 72 20  NoCallbackError 
af90: 3d 20 22 4e 6f 20 5c 22 7b 30 7d 5c 22 20 63 61  = "No \"{0}\" ca
afa0: 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 2e 22 3b  llback is set.";
afb0: 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ....      //////
afc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b000: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f  ///....      ///
b010: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
b020: 20 20 2f 2f 2f 20 54 68 69 73 20 65 72 72 6f 72    /// This error
b030: 20 6d 65 73 73 61 67 65 20 69 73 20 75 73 65 64   message is used
b040: 20 62 79 20 74 68 65 20 6f 76 65 72 72 69 64 64   by the overridd
b050: 65 6e 20 3c 73 65 65 20 63 72 65 66 3d 22 43 6f  en <see cref="Co
b060: 6d 70 61 72 65 22 20 2f 3e 0d 0a 20 20 20 20 20  mpare" />..     
b070: 20 2f 2f 2f 20 6d 65 74 68 6f 64 20 77 68 65 6e   /// method when
b080: 20 74 68 65 20 72 65 73 75 6c 74 20 64 6f 65 73   the result does
b090: 20 6e 6f 74 20 68 61 76 65 20 61 20 74 79 70 65   not have a type
b0a0: 20 6f 66 20 3c 73 65 65 20 63 72 65 66 3d 22 49   of <see cref="I
b0b0: 6e 74 33 32 22 20 2f 3e 2e 0d 0a 20 20 20 20 20  nt32" />...     
b0c0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
b0d0: 0a 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63  .      private c
b0e0: 6f 6e 73 74 20 73 74 72 69 6e 67 20 52 65 73 75  onst string Resu
b0f0: 6c 74 49 6e 74 33 32 45 72 72 6f 72 20 3d 20 22  ltInt32Error = "
b100: 5c 22 7b 30 7d 5c 22 20 72 65 73 75 6c 74 20 6d  \"{0}\" result m
b110: 75 73 74 20 62 65 20 49 6e 74 33 32 2e 22 3b 0d  ust be Int32.";.
b120: 0a 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f  .      #endregio
b130: 6e 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f  n....      /////
b140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b180: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 23 72  ////....      #r
b190: 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 43 6f 6e  egion Public Con
b1a0: 73 74 72 75 63 74 6f 72 73 0d 0a 20 20 20 20 20  structors..     
b1b0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
b1c0: 20 20 20 20 20 20 2f 2f 2f 20 43 6f 6e 73 74 72        /// Constr
b1d0: 75 63 74 73 20 61 6e 20 65 6d 70 74 79 20 69 6e  ucts an empty in
b1e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 63  stance of this c
b1f0: 6c 61 73 73 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  lass...      ///
b200: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
b210: 20 20 20 70 75 62 6c 69 63 20 53 51 4c 69 74 65     public SQLite
b220: 44 65 6c 65 67 61 74 65 46 75 6e 63 74 69 6f 6e  DelegateFunction
b230: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 3a 20  ()..          : 
b240: 74 68 69 73 28 6e 75 6c 6c 2c 20 6e 75 6c 6c 29  this(null, null)
b250: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
b260: 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69       // do nothi
b270: 6e 67 2e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ng...      }....
b280: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
b290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b2b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b2c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
b2d0: 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75  ...      /// <su
b2e0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f  mmary>..      //
b2f0: 2f 20 43 6f 6e 73 74 72 75 63 74 73 20 61 6e 20  / Constructs an 
b300: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
b310: 20 63 6c 61 73 73 20 75 73 69 6e 67 20 74 68 65   class using the
b320: 20 73 70 65 63 69 66 69 65 64 0d 0a 20 20 20 20   specified..    
b330: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
b340: 22 44 65 6c 65 67 61 74 65 22 20 2f 3e 20 61 73  "Delegate" /> as
b350: 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22   the <see cref="
b360: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 22 20  SQLiteFunction" 
b370: 2f 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 69 6d  />..      /// im
b380: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20  plementation... 
b390: 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61       /// </summa
b3a0: 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  ry>..      /// <
b3b0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 61 6c 6c  param name="call
b3c0: 62 61 63 6b 31 22 3e 0d 0a 20 20 20 20 20 20 2f  back1">..      /
b3d0: 2f 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66  // The <see cref
b3e0: 3d 22 44 65 6c 65 67 61 74 65 22 20 2f 3e 20 74  ="Delegate" /> t
b3f0: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 6c  o be used for al
b400: 6c 20 63 61 6c 6c 73 20 69 6e 74 6f 20 74 68 65  l calls into the
b410: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 65 65  ..      /// <see
b420: 20 63 72 65 66 3d 22 49 6e 76 6f 6b 65 22 20 2f   cref="Invoke" /
b430: 3e 2c 20 3c 73 65 65 20 63 72 65 66 3d 22 53 74  >, <see cref="St
b440: 65 70 22 20 2f 3e 2c 20 61 6e 64 0d 0a 20 20 20  ep" />, and..   
b450: 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
b460: 3d 22 43 6f 6d 70 61 72 65 22 20 2f 3e 20 76 69  ="Compare" /> vi
b470: 72 74 75 61 6c 20 6d 65 74 68 6f 64 73 20 6e 65  rtual methods ne
b480: 65 64 65 64 20 62 79 20 74 68 65 0d 0a 20 20 20  eded by the..   
b490: 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
b4a0: 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  ="SQLiteFunction
b4b0: 22 20 2f 3e 20 62 61 73 65 20 63 6c 61 73 73 2e  " /> base class.
b4c0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  ..      /// </pa
b4d0: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ram>..      /// 
b4e0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 61 6c  <param name="cal
b4f0: 6c 62 61 63 6b 32 22 3e 0d 0a 20 20 20 20 20 20  lback2">..      
b500: 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65  /// The <see cre
b510: 66 3d 22 44 65 6c 65 67 61 74 65 22 20 2f 3e 20  f="Delegate" /> 
b520: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  to be used for a
b530: 6c 6c 20 63 61 6c 6c 73 20 69 6e 74 6f 20 74 68  ll calls into th
b540: 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 65  e..      /// <se
b550: 65 20 63 72 65 66 3d 22 46 69 6e 61 6c 22 20 2f  e cref="Final" /
b560: 3e 20 76 69 72 74 75 61 6c 20 6d 65 74 68 6f 64  > virtual method
b570: 73 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 0d  s needed by the.
b580: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20  .      /// <see 
b590: 63 72 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63  cref="SQLiteFunc
b5a0: 74 69 6f 6e 22 20 2f 3e 20 62 61 73 65 20 63 6c  tion" /> base cl
b5b0: 61 73 73 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ass...      /// 
b5c0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
b5d0: 70 75 62 6c 69 63 20 53 51 4c 69 74 65 44 65 6c  public SQLiteDel
b5e0: 65 67 61 74 65 46 75 6e 63 74 69 6f 6e 28 0d 0a  egateFunction(..
b5f0: 20 20 20 20 20 20 20 20 20 20 44 65 6c 65 67 61            Delega
b600: 74 65 20 63 61 6c 6c 62 61 63 6b 31 2c 0d 0a 20  te callback1,.. 
b610: 20 20 20 20 20 20 20 20 20 44 65 6c 65 67 61 74           Delegat
b620: 65 20 63 61 6c 6c 62 61 63 6b 32 0d 0a 20 20 20  e callback2..   
b630: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
b640: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 68 69  {..          thi
b650: 73 2e 63 61 6c 6c 62 61 63 6b 31 20 3d 20 63 61  s.callback1 = ca
b660: 6c 6c 62 61 63 6b 31 3b 0d 0a 20 20 20 20 20 20  llback1;..      
b670: 20 20 20 20 74 68 69 73 2e 63 61 6c 6c 62 61 63      this.callbac
b680: 6b 32 20 3d 20 63 61 6c 6c 62 61 63 6b 32 3b 0d  k2 = callback2;.
b690: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
b6a0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
b6b0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
b6c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b6d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b6e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b6f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
b700: 0a 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50  .      #region P
b710: 72 6f 74 65 63 74 65 64 20 4d 65 74 68 6f 64 73  rotected Methods
b720: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ..      /// <sum
b730: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f  mary>..      ///
b740: 20 52 65 74 75 72 6e 73 20 74 68 65 20 6c 69 73   Returns the lis
b750: 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66  t of arguments f
b760: 6f 72 20 74 68 65 20 3c 73 65 65 20 63 72 65 66  or the <see cref
b770: 3d 22 49 6e 76 6f 6b 65 22 20 2f 3e 20 6d 65 74  ="Invoke" /> met
b780: 68 6f 64 2c 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  hod,..      /// 
b790: 61 73 20 61 6e 20 3c 73 65 65 20 63 72 65 66 3d  as an <see cref=
b7a0: 22 41 72 72 61 79 22 20 2f 3e 20 6f 66 20 3c 73  "Array" /> of <s
b7b0: 65 65 20 63 72 65 66 3d 22 4f 62 6a 65 63 74 22  ee cref="Object"
b7c0: 20 2f 3e 2e 20 20 54 68 65 20 66 69 72 73 74 0d   />.  The first.
b7d0: 0a 20 20 20 20 20 20 2f 2f 2f 20 61 72 67 75 6d  .      /// argum
b7e0: 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20 74 68  ent is always th
b7f0: 65 20 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67  e literal string
b800: 20 22 49 6e 76 6f 6b 65 22 2e 0d 0a 20 20 20 20   "Invoke"...    
b810: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
b820: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ..      /// <par
b830: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e 0d  am name="args">.
b840: 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6f  .      /// The o
b850: 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74  riginal argument
b860: 73 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68  s received by th
b870: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 49 6e 76  e <see cref="Inv
b880: 6f 6b 65 22 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d  oke" /> method..
b890: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  .      /// </par
b8a0: 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  am>..      /// <
b8b0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 61 72 6c  param name="earl
b8c0: 79 42 6f 75 6e 64 22 3e 0d 0a 20 20 20 20 20 20  yBound">..      
b8d0: 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20  /// Non-zero if 
b8e0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 67  the returned arg
b8f0: 75 6d 65 6e 74 73 20 61 72 65 20 67 6f 69 6e 67  uments are going
b900: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
b910: 20 74 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20   the..      /// 
b920: 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74  <see cref="SQLit
b930: 65 49 6e 76 6f 6b 65 44 65 6c 65 67 61 74 65 22  eInvokeDelegate"
b940: 20 2f 3e 20 74 79 70 65 3b 20 6f 74 68 65 72 77   /> type; otherw
b950: 69 73 65 2c 20 7a 65 72 6f 2e 0d 0a 20 20 20 20  ise, zero...    
b960: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
b970: 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72        /// <retur
b980: 6e 73 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54  ns>..      /// T
b990: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
b9a0: 70 61 73 73 20 74 6f 20 74 68 65 20 63 6f 6e 66  pass to the conf
b9b0: 69 67 75 72 65 64 20 3c 73 65 65 20 63 72 65 66  igured <see cref
b9c0: 3d 22 44 65 6c 65 67 61 74 65 22 20 2f 3e 2e 0d  ="Delegate" />..
b9d0: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74  .      /// </ret
b9e0: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 70 72 6f  urns>..      pro
b9f0: 74 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 6f  tected virtual o
ba00: 62 6a 65 63 74 5b 5d 20 47 65 74 49 6e 76 6f 6b  bject[] GetInvok
ba10: 65 41 72 67 73 28 0d 0a 20 20 20 20 20 20 20 20  eArgs(..        
ba20: 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 2c    object[] args,
ba30: 0d 0a 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c  ..          bool
ba40: 20 65 61 72 6c 79 42 6f 75 6e 64 0d 0a 20 20 20   earlyBound..   
ba50: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
ba60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
ba70: 65 63 74 5b 5d 20 6e 65 77 41 72 67 73 20 3d 20  ect[] newArgs = 
ba80: 6e 65 77 20 6f 62 6a 65 63 74 5b 5d 20 7b 20 22  new object[] { "
ba90: 49 6e 76 6f 6b 65 22 2c 20 61 72 67 73 20 7d 3b  Invoke", args };
baa0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
bab0: 20 28 21 65 61 72 6c 79 42 6f 75 6e 64 29 0d 0a   (!earlyBound)..
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
bad0: 77 41 72 67 73 20 3d 20 6e 65 77 20 6f 62 6a 65  wArgs = new obje
bae0: 63 74 5b 5d 20 7b 20 6e 65 77 41 72 67 73 20 7d  ct[] { newArgs }
baf0: 3b 20 2f 2f 20 57 52 41 50 0d 0a 0d 0a 20 20 20  ; // WRAP....   
bb00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
bb10: 77 41 72 67 73 3b 0d 0a 20 20 20 20 20 20 7d 0d  wArgs;..      }.
bb20: 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  ...      ///////
bb30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb70: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  //....      /// 
bb80: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  <summary>..     
bb90: 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68 65   /// Returns the
bba0: 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
bbb0: 74 73 20 66 6f 72 20 74 68 65 20 3c 73 65 65 20  ts for the <see 
bbc0: 63 72 65 66 3d 22 53 74 65 70 22 20 2f 3e 20 6d  cref="Step" /> m
bbd0: 65 74 68 6f 64 2c 0d 0a 20 20 20 20 20 20 2f 2f  ethod,..      //
bbe0: 2f 20 61 73 20 61 6e 20 3c 73 65 65 20 63 72 65  / as an <see cre
bbf0: 66 3d 22 41 72 72 61 79 22 20 2f 3e 20 6f 66 20  f="Array" /> of 
bc00: 3c 73 65 65 20 63 72 65 66 3d 22 4f 62 6a 65 63  <see cref="Objec
bc10: 74 22 20 2f 3e 2e 20 20 54 68 65 20 66 69 72 73  t" />.  The firs
bc20: 74 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 61 72 67  t..      /// arg
bc30: 75 6d 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20  ument is always 
bc40: 74 68 65 20 6c 69 74 65 72 61 6c 20 73 74 72 69  the literal stri
bc50: 6e 67 20 22 53 74 65 70 22 2e 0d 0a 20 20 20 20  ng "Step"...    
bc60: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
bc70: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ..      /// <par
bc80: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e 0d  am name="args">.
bc90: 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 6f  .      /// The o
bca0: 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74  riginal argument
bcb0: 73 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68  s received by th
bcc0: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53 74 65  e <see cref="Ste
bcd0: 70 22 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d 0a 20  p" /> method... 
bce0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
bcf0: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  >..      /// <pa
bd00: 72 61 6d 20 6e 61 6d 65 3d 22 73 74 65 70 4e 75  ram name="stepNu
bd10: 6d 62 65 72 22 3e 0d 0a 20 20 20 20 20 20 2f 2f  mber">..      //
bd20: 2f 20 54 68 65 20 73 74 65 70 20 6e 75 6d 62 65  / The step numbe
bd30: 72 20 28 6f 6e 65 20 62 61 73 65 64 29 2e 20 20  r (one based).  
bd40: 54 68 69 73 20 69 73 20 69 6e 63 72 65 6d 65 6d  This is incremem
bd50: 74 65 64 20 65 61 63 68 20 74 69 6d 65 20 74 68  ted each time th
bd60: 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 65  e..      /// <se
bd70: 65 20 63 72 65 66 3d 22 53 74 65 70 22 20 2f 3e  e cref="Step" />
bd80: 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65   method is calle
bd90: 64 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  d...      /// </
bda0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f  param>..      //
bdb0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
bdc0: 6f 6e 74 65 78 74 44 61 74 61 22 3e 0d 0a 20 20  ontextData">..  
bdd0: 20 20 20 20 2f 2f 2f 20 41 20 70 6c 61 63 65 68      /// A placeh
bde0: 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70 6c 65 6d  older for implem
bdf0: 65 6e 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20  enters to store 
be00: 63 6f 6e 74 65 78 74 75 61 6c 20 64 61 74 61 20  contextual data 
be10: 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20  pertaining..    
be20: 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 63 75 72    /// to the cur
be30: 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  rent context... 
be40: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
be50: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  >..      /// <pa
be60: 72 61 6d 20 6e 61 6d 65 3d 22 65 61 72 6c 79 42  ram name="earlyB
be70: 6f 75 6e 64 22 3e 0d 0a 20 20 20 20 20 20 2f 2f  ound">..      //
be80: 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  / Non-zero if th
be90: 65 20 72 65 74 75 72 6e 65 64 20 61 72 67 75 6d  e returned argum
bea0: 65 6e 74 73 20 61 72 65 20 67 6f 69 6e 67 20 74  ents are going t
beb0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  o be used with t
bec0: 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73  he..      /// <s
bed0: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 53  ee cref="SQLiteS
bee0: 74 65 70 44 65 6c 65 67 61 74 65 22 20 2f 3e 20  tepDelegate" /> 
bef0: 74 79 70 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  type; otherwise,
bf00: 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 2f 2f   zero...      //
bf10: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
bf20: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
bf30: 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 61  .      /// The a
bf40: 72 67 75 6d 65 6e 74 73 20 74 6f 20 70 61 73 73  rguments to pass
bf50: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
bf60: 65 64 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65  ed <see cref="De
bf70: 6c 65 67 61 74 65 22 20 2f 3e 2e 0d 0a 20 20 20  legate" />...   
bf80: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
bf90: 3e 0d 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74  >..      protect
bfa0: 65 64 20 76 69 72 74 75 61 6c 20 6f 62 6a 65 63  ed virtual objec
bfb0: 74 5b 5d 20 47 65 74 53 74 65 70 41 72 67 73 28  t[] GetStepArgs(
bfc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
bfd0: 63 74 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20 20  ct[] args,..    
bfe0: 20 20 20 20 20 20 69 6e 74 20 73 74 65 70 4e 75        int stepNu
bff0: 6d 62 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 20  mber,..         
c000: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44   object contextD
c010: 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ata,..          
c020: 62 6f 6f 6c 20 65 61 72 6c 79 42 6f 75 6e 64 0d  bool earlyBound.
c030: 0a 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20  .          )..  
c040: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c050: 20 6f 62 6a 65 63 74 5b 5d 20 6e 65 77 41 72 67   object[] newArg
c060: 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d  s = new object[]
c070: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c080: 20 20 22 53 74 65 70 22 2c 20 61 72 67 73 2c 20    "Step", args, 
c090: 73 74 65 70 4e 75 6d 62 65 72 2c 20 63 6f 6e 74  stepNumber, cont
c0a0: 65 78 74 44 61 74 61 0d 0a 20 20 20 20 20 20 20  extData..       
c0b0: 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20     };....       
c0c0: 20 20 20 69 66 20 28 21 65 61 72 6c 79 42 6f 75     if (!earlyBou
c0d0: 6e 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nd)..           
c0e0: 20 20 20 6e 65 77 41 72 67 73 20 3d 20 6e 65 77     newArgs = new
c0f0: 20 6f 62 6a 65 63 74 5b 5d 20 7b 20 6e 65 77 41   object[] { newA
c100: 72 67 73 20 7d 3b 20 2f 2f 20 57 52 41 50 0d 0a  rgs }; // WRAP..
c110: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
c120: 72 6e 20 6e 65 77 41 72 67 73 3b 0d 0a 20 20 20  rn newArgs;..   
c130: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f     }....      //
c140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c180: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
c190: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
c1a0: 20 20 20 20 20 20 2f 2f 2f 20 55 70 64 61 74 65        /// Update
c1b0: 73 20 74 68 65 20 6f 75 74 70 75 74 20 61 72 67  s the output arg
c1c0: 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 3c  uments for the <
c1d0: 73 65 65 20 63 72 65 66 3d 22 53 74 65 70 22 20  see cref="Step" 
c1e0: 2f 3e 20 6d 65 74 68 6f 64 2c 0d 0a 20 20 20 20  /> method,..    
c1f0: 20 20 2f 2f 2f 20 75 73 69 6e 67 20 61 6e 20 3c    /// using an <
c200: 73 65 65 20 63 72 65 66 3d 22 41 72 72 61 79 22  see cref="Array"
c210: 20 2f 3e 20 6f 66 20 3c 73 65 65 20 63 72 65 66   /> of <see cref
c220: 3d 22 4f 62 6a 65 63 74 22 20 2f 3e 2e 20 20 54  ="Object" />.  T
c230: 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20 20 20  he first..      
c240: 2f 2f 2f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  /// argument is 
c250: 61 6c 77 61 79 73 20 74 68 65 20 6c 69 74 65 72  always the liter
c260: 61 6c 20 73 74 72 69 6e 67 20 22 53 74 65 70 22  al string "Step"
c270: 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6f 6e  .  Currently, on
c280: 6c 79 20 74 68 65 0d 0a 20 20 20 20 20 20 2f 2f  ly the..      //
c290: 2f 20 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d 65  / <paramref name
c2a0: 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22 20 2f  ="contextData" /
c2b0: 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  > parameter is u
c2c0: 70 64 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 2f  pdated...      /
c2d0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
c2e0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
c2f0: 6e 61 6d 65 3d 22 61 72 67 73 22 3e 0d 0a 20 20  name="args">..  
c300: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6f 72 69 67      /// The orig
c310: 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 72  inal arguments r
c320: 65 63 65 69 76 65 64 20 62 79 20 74 68 65 20 3c  eceived by the <
c330: 73 65 65 20 63 72 65 66 3d 22 53 74 65 70 22 20  see cref="Step" 
c340: 2f 3e 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20  /> method...    
c350: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
c360: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
c370: 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44 61   name="contextDa
c380: 74 61 22 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ta">..      /// 
c390: 41 20 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f  A placeholder fo
c3a0: 72 20 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74  r implementers t
c3b0: 6f 20 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75  o store contextu
c3c0: 61 6c 20 64 61 74 61 20 70 65 72 74 61 69 6e 69  al data pertaini
c3d0: 6e 67 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 74 6f  ng..      /// to
c3e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
c3f0: 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  text...      ///
c400: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
c410: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
c420: 3d 22 65 61 72 6c 79 42 6f 75 6e 64 22 3e 0d 0a  ="earlyBound">..
c430: 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65        /// Non-ze
c440: 72 6f 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ro if the return
c450: 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ed arguments are
c460: 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 75 73 65   going to be use
c470: 64 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  d with the..    
c480: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
c490: 22 53 51 4c 69 74 65 53 74 65 70 44 65 6c 65 67  "SQLiteStepDeleg
c4a0: 61 74 65 22 20 2f 3e 20 74 79 70 65 3b 20 6f 74  ate" /> type; ot
c4b0: 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0d 0a  herwise, zero...
c4c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
c4d0: 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72  m>..      /// <r
c4e0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f  eturns>..      /
c4f0: 2f 2f 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  // The arguments
c500: 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
c510: 63 6f 6e 66 69 67 75 72 65 64 20 3c 73 65 65 20  configured <see 
c520: 63 72 65 66 3d 22 44 65 6c 65 67 61 74 65 22 20  cref="Delegate" 
c530: 2f 3e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  />...      /// <
c540: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  /returns>..     
c550: 20 70 72 6f 74 65 63 74 65 64 20 76 69 72 74 75   protected virtu
c560: 61 6c 20 76 6f 69 64 20 55 70 64 61 74 65 53 74  al void UpdateSt
c570: 65 70 41 72 67 73 28 0d 0a 20 20 20 20 20 20 20  epArgs(..       
c580: 20 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73     object[] args
c590: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 66  ,..          ref
c5a0: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44   object contextD
c5b0: 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ata,..          
c5c0: 62 6f 6f 6c 20 65 61 72 6c 79 42 6f 75 6e 64 0d  bool earlyBound.
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20  .          )..  
c5e0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c5f0: 20 6f 62 6a 65 63 74 5b 5d 20 6e 65 77 41 72 67   object[] newArg
c600: 73 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  s;....          
c610: 69 66 20 28 65 61 72 6c 79 42 6f 75 6e 64 29 0d  if (earlyBound).
c620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
c630: 65 77 41 72 67 73 20 3d 20 61 72 67 73 3b 0d 0a  ewArgs = args;..
c640: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
c660: 77 41 72 67 73 20 3d 20 61 72 67 73 5b 30 5d 20  wArgs = args[0] 
c670: 61 73 20 6f 62 6a 65 63 74 5b 5d 3b 0d 0a 0d 0a  as object[];....
c680: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 65            if (ne
c690: 77 41 72 67 73 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  wArgs == null)..
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
c6b0: 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  turn;....       
c6c0: 20 20 20 63 6f 6e 74 65 78 74 44 61 74 61 20 3d     contextData =
c6d0: 20 6e 65 77 41 72 67 73 5b 6e 65 77 41 72 67 73   newArgs[newArgs
c6e0: 2e 4c 65 6e 67 74 68 20 2d 20 31 5d 3b 0d 0a 20  .Length - 1];.. 
c6f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
c750: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
c760: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 52 65 74 75  ..      /// Retu
c770: 72 6e 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rns the list of 
c780: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  arguments for th
c790: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 46 69 6e  e <see cref="Fin
c7a0: 61 6c 22 20 2f 3e 20 6d 65 74 68 6f 64 2c 0d 0a  al" /> method,..
c7b0: 20 20 20 20 20 20 2f 2f 2f 20 61 73 20 61 6e 20        /// as an 
c7c0: 3c 73 65 65 20 63 72 65 66 3d 22 41 72 72 61 79  <see cref="Array
c7d0: 22 20 2f 3e 20 6f 66 20 3c 73 65 65 20 63 72 65  " /> of <see cre
c7e0: 66 3d 22 4f 62 6a 65 63 74 22 20 2f 3e 2e 20 20  f="Object" />.  
c7f0: 54 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20 20  The first..     
c800: 20 2f 2f 2f 20 61 72 67 75 6d 65 6e 74 20 69 73   /// argument is
c810: 20 61 6c 77 61 79 73 20 74 68 65 20 6c 69 74 65   always the lite
c820: 72 61 6c 20 73 74 72 69 6e 67 20 22 46 69 6e 61  ral string "Fina
c830: 6c 22 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  l"...      /// <
c840: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
c850: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
c860: 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 0d  ="contextData">.
c870: 0a 20 20 20 20 20 20 2f 2f 2f 20 41 20 70 6c 61  .      /// A pla
c880: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70  ceholder for imp
c890: 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f  lementers to sto
c8a0: 72 65 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61  re contextual da
c8b0: 74 61 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20  ta pertaining.. 
c8c0: 20 20 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20       /// to the 
c8d0: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e  current context.
c8e0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  ..      /// </pa
c8f0: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ram>..      /// 
c900: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 61 72  <param name="ear
c910: 6c 79 42 6f 75 6e 64 22 3e 0d 0a 20 20 20 20 20  lyBound">..     
c920: 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66   /// Non-zero if
c930: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
c940: 67 75 6d 65 6e 74 73 20 61 72 65 20 67 6f 69 6e  guments are goin
c950: 67 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  g to be used wit
c960: 68 20 74 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f  h the..      ///
c970: 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69   <see cref="SQLi
c980: 74 65 46 69 6e 61 6c 44 65 6c 65 67 61 74 65 22  teFinalDelegate"
c990: 20 2f 3e 20 74 79 70 65 3b 20 6f 74 68 65 72 77   /> type; otherw
c9a0: 69 73 65 2c 20 7a 65 72 6f 2e 0d 0a 20 20 20 20  ise, zero...    
c9b0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
c9c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72        /// <retur
c9d0: 6e 73 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54  ns>..      /// T
c9e0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
c9f0: 70 61 73 73 20 74 6f 20 74 68 65 20 63 6f 6e 66  pass to the conf
ca00: 69 67 75 72 65 64 20 3c 73 65 65 20 63 72 65 66  igured <see cref
ca10: 3d 22 44 65 6c 65 67 61 74 65 22 20 2f 3e 2e 0d  ="Delegate" />..
ca20: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74  .      /// </ret
ca30: 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 70 72 6f  urns>..      pro
ca40: 74 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 6f  tected virtual o
ca50: 62 6a 65 63 74 5b 5d 20 47 65 74 46 69 6e 61 6c  bject[] GetFinal
ca60: 41 72 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20  Args(..         
ca70: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44   object contextD
ca80: 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ata,..          
ca90: 62 6f 6f 6c 20 65 61 72 6c 79 42 6f 75 6e 64 0d  bool earlyBound.
caa0: 0a 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20  .          )..  
cab0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
cac0: 20 6f 62 6a 65 63 74 5b 5d 20 6e 65 77 41 72 67   object[] newArg
cad0: 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d  s = new object[]
cae0: 20 7b 20 22 46 69 6e 61 6c 22 2c 20 63 6f 6e 74   { "Final", cont
caf0: 65 78 74 44 61 74 61 20 7d 3b 0d 0a 0d 0a 20 20  extData };....  
cb00: 20 20 20 20 20 20 20 20 69 66 20 28 21 65 61 72          if (!ear
cb10: 6c 79 42 6f 75 6e 64 29 0d 0a 20 20 20 20 20 20  lyBound)..      
cb20: 20 20 20 20 20 20 20 20 6e 65 77 41 72 67 73 20          newArgs 
cb30: 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d 20 7b  = new object[] {
cb40: 20 6e 65 77 41 72 67 73 20 7d 3b 20 2f 2f 20 57   newArgs }; // W
cb50: 52 41 50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  RAP....         
cb60: 20 72 65 74 75 72 6e 20 6e 65 77 41 72 67 73 3b   return newArgs;
cb70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cb80: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
cb90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cbb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cbc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
cbd0: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
cbe0: 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 52  ry>..      /// R
cbf0: 65 74 75 72 6e 73 20 74 68 65 20 6c 69 73 74 20  eturns the list 
cc00: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  of arguments for
cc10: 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22   the <see cref="
cc20: 43 6f 6d 70 61 72 65 22 20 2f 3e 20 6d 65 74 68  Compare" /> meth
cc30: 6f 64 2c 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 61  od,..      /// a
cc40: 73 20 61 6e 20 3c 73 65 65 20 63 72 65 66 3d 22  s an <see cref="
cc50: 41 72 72 61 79 22 20 2f 3e 20 6f 66 20 3c 73 65  Array" /> of <se
cc60: 65 20 63 72 65 66 3d 22 4f 62 6a 65 63 74 22 20  e cref="Object" 
cc70: 2f 3e 2e 20 20 54 68 65 20 66 69 72 73 74 0d 0a  />.  The first..
cc80: 20 20 20 20 20 20 2f 2f 2f 20 61 72 67 75 6d 65        /// argume
cc90: 6e 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  nt is always the
cca0: 20 6c 69 74 65 72 61 6c 20 73 74 72 69 6e 67 20   literal string 
ccb0: 22 43 6f 6d 70 61 72 65 22 2e 0d 0a 20 20 20 20  "Compare"...    
ccc0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
ccd0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ..      /// <par
cce0: 61 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22  am name="param1"
ccf0: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  >..      /// The
cd00: 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 74 6f   first string to
cd10: 20 63 6f 6d 70 61 72 65 2e 0d 0a 20 20 20 20 20   compare...     
cd20: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
cd30: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
cd40: 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 3e 0d 0a  name="param2">..
cd50: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73 65        /// The se
cd60: 63 6f 6e 64 20 73 74 72 6e 69 67 20 74 6f 20 63  cond strnig to c
cd70: 6f 6d 70 61 72 65 2e 0d 0a 20 20 20 20 20 20 2f  ompare...      /
cd80: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
cd90: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
cda0: 6d 65 3d 22 65 61 72 6c 79 42 6f 75 6e 64 22 3e  me="earlyBound">
cdb0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d  ..      /// Non-
cdc0: 7a 65 72 6f 20 69 66 20 74 68 65 20 72 65 74 75  zero if the retu
cdd0: 72 6e 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61  rned arguments a
cde0: 72 65 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 75  re going to be u
cdf0: 73 65 64 20 77 69 74 68 20 74 68 65 0d 0a 20 20  sed with the..  
ce00: 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65      /// <see cre
ce10: 66 3d 22 53 51 4c 69 74 65 43 6f 6d 70 61 72 65  f="SQLiteCompare
ce20: 44 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 79 70  Delegate" /> typ
ce30: 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 7a 65  e; otherwise, ze
ce40: 72 6f 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  ro...      /// <
ce50: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f  /param>..      /
ce60: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20  // <returns>..  
ce70: 20 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 75      /// The argu
ce80: 6d 65 6e 74 73 20 74 6f 20 70 61 73 73 20 74 6f  ments to pass to
ce90: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20   the configured 
cea0: 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67  <see cref="Deleg
ceb0: 61 74 65 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20  ate" />...      
cec0: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
ced0: 20 20 20 20 20 20 70 72 6f 74 65 63 74 65 64 20        protected 
cee0: 76 69 72 74 75 61 6c 20 6f 62 6a 65 63 74 5b 5d  virtual object[]
cef0: 20 47 65 74 43 6f 6d 70 61 72 65 41 72 67 73 28   GetCompareArgs(
cf00: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69  ..          stri
cf10: 6e 67 20 70 61 72 61 6d 31 2c 0d 0a 20 20 20 20  ng param1,..    
cf20: 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 61 72        string par
cf30: 61 6d 32 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  am2,..          
cf40: 62 6f 6f 6c 20 65 61 72 6c 79 42 6f 75 6e 64 0d  bool earlyBound.
cf50: 0a 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20  .          )..  
cf60: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
cf70: 20 6f 62 6a 65 63 74 5b 5d 20 6e 65 77 41 72 67   object[] newArg
cf80: 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d  s = new object[]
cf90: 20 7b 20 22 43 6f 6d 70 61 72 65 22 2c 20 70 61   { "Compare", pa
cfa0: 72 61 6d 31 2c 20 70 61 72 61 6d 32 20 7d 3b 0d  ram1, param2 };.
cfb0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
cfc0: 28 21 65 61 72 6c 79 42 6f 75 6e 64 29 0d 0a 20  (!earlyBound).. 
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
cfe0: 41 72 67 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63  Args = new objec
cff0: 74 5b 5d 20 7b 20 6e 65 77 41 72 67 73 20 7d 3b  t[] { newArgs };
d000: 20 2f 2f 20 57 52 41 50 0d 0a 0d 0a 20 20 20 20   // WRAP....    
d010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77        return new
d020: 41 72 67 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  Args;..      }..
d030: 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
d040: 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ....      //////
d050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d090: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 23 72 65  ///....      #re
d0a0: 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72 6f 70  gion Public Prop
d0b0: 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 70 72  erties..      pr
d0c0: 69 76 61 74 65 20 44 65 6c 65 67 61 74 65 20 63  ivate Delegate c
d0d0: 61 6c 6c 62 61 63 6b 31 3b 0d 0a 20 20 20 20 20  allback1;..     
d0e0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
d0f0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73        /// The <s
d100: 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67 61 74  ee cref="Delegat
d110: 65 22 20 2f 3e 20 74 6f 20 62 65 20 75 73 65 64  e" /> to be used
d120: 20 66 6f 72 20 61 6c 6c 20 63 61 6c 6c 73 20 69   for all calls i
d130: 6e 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 2f  nto the..      /
d140: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 49 6e  // <see cref="In
d150: 76 6f 6b 65 22 20 2f 3e 2c 20 3c 73 65 65 20 63  voke" />, <see c
d160: 72 65 66 3d 22 53 74 65 70 22 20 2f 3e 2c 20 61  ref="Step" />, a
d170: 6e 64 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73  nd..      /// <s
d180: 65 65 20 63 72 65 66 3d 22 43 6f 6d 70 61 72 65  ee cref="Compare
d190: 22 20 2f 3e 20 76 69 72 74 75 61 6c 20 6d 65 74  " /> virtual met
d1a0: 68 6f 64 73 20 6e 65 65 64 65 64 20 62 79 20 74  hods needed by t
d1b0: 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73  he..      /// <s
d1c0: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46  ee cref="SQLiteF
d1d0: 75 6e 63 74 69 6f 6e 22 20 2f 3e 20 62 61 73 65  unction" /> base
d1e0: 20 63 6c 61 73 73 2e 0d 0a 20 20 20 20 20 20 2f   class...      /
d1f0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
d200: 20 20 20 20 20 70 75 62 6c 69 63 20 76 69 72 74       public virt
d210: 75 61 6c 20 44 65 6c 65 67 61 74 65 20 43 61 6c  ual Delegate Cal
d220: 6c 62 61 63 6b 31 0d 0a 20 20 20 20 20 20 7b 0d  lback1..      {.
d230: 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b  .          get {
d240: 20 72 65 74 75 72 6e 20 63 61 6c 6c 62 61 63 6b   return callback
d250: 31 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  1; }..          
d260: 73 65 74 20 7b 20 63 61 6c 6c 62 61 63 6b 31 20  set { callback1 
d270: 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
d280: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f    }....      ///
d290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2d0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
d2e0: 70 72 69 76 61 74 65 20 44 65 6c 65 67 61 74 65  private Delegate
d2f0: 20 63 61 6c 6c 62 61 63 6b 32 3b 0d 0a 20 20 20   callback2;..   
d300: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
d310: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20  ..      /// The 
d320: 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67  <see cref="Deleg
d330: 61 74 65 22 20 2f 3e 20 74 6f 20 62 65 20 75 73  ate" /> to be us
d340: 65 64 20 66 6f 72 20 61 6c 6c 20 63 61 6c 6c 73  ed for all calls
d350: 20 69 6e 74 6f 20 74 68 65 0d 0a 20 20 20 20 20   into the..     
d360: 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
d370: 46 69 6e 61 6c 22 20 2f 3e 20 76 69 72 74 75 61  Final" /> virtua
d380: 6c 20 6d 65 74 68 6f 64 73 20 6e 65 65 64 65 64  l methods needed
d390: 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 2f   by the..      /
d3a0: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51  // <see cref="SQ
d3b0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 22 20 2f 3e  LiteFunction" />
d3c0: 20 62 61 73 65 20 63 6c 61 73 73 2e 0d 0a 20 20   base class...  
d3d0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
d3e0: 79 3e 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63  y>..      public
d3f0: 20 76 69 72 74 75 61 6c 20 44 65 6c 65 67 61 74   virtual Delegat
d400: 65 20 43 61 6c 6c 62 61 63 6b 32 0d 0a 20 20 20  e Callback2..   
d410: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
d420: 67 65 74 20 7b 20 72 65 74 75 72 6e 20 63 61 6c  get { return cal
d430: 6c 62 61 63 6b 32 3b 20 7d 0d 0a 20 20 20 20 20  lback2; }..     
d440: 20 20 20 20 20 73 65 74 20 7b 20 63 61 6c 6c 62       set { callb
d450: 61 63 6b 32 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  ack2 = value; }.
d460: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
d470: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
d480: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
d490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
d4d0: 0a 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 53  .      #region S
d4e0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
d4f0: 65 2e 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  e.SQLiteFunction
d500: 20 4f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20   Overrides..    
d510: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
d520: 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20  .      /// This 
d530: 76 69 72 74 75 61 6c 20 6d 65 74 68 6f 64 20 69  virtual method i
d540: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
d550: 74 69 6f 6e 20 66 6f 72 20 73 63 61 6c 61 72 20  tion for scalar 
d560: 66 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20 20 20 20  functions...    
d570: 20 20 2f 2f 2f 20 53 65 65 20 74 68 65 20 3c 73    /// See the <s
d580: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46  ee cref="SQLiteF
d590: 75 6e 63 74 69 6f 6e 2e 49 6e 76 6f 6b 65 22 20  unction.Invoke" 
d5a0: 2f 3e 20 6d 65 74 68 6f 64 20 66 6f 72 20 6d 6f  /> method for mo
d5b0: 72 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 64 65  re..      /// de
d5c0: 74 61 69 6c 73 2e 0d 0a 20 20 20 20 20 20 2f 2f  tails...      //
d5d0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
d5e0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
d5f0: 61 6d 65 3d 22 61 72 67 73 22 3e 0d 0a 20 20 20  ame="args">..   
d600: 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 75 6d     /// The argum
d610: 65 6e 74 73 20 66 6f 72 20 74 68 65 20 73 63 61  ents for the sca
d620: 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20  lar function... 
d630: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
d640: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  >..      /// <re
d650: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f 2f  turns>..      //
d660: 2f 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  / The result of 
d670: 74 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74  the scalar funct
d680: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ion...      /// 
d690: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
d6a0: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
d6b0: 65 20 6f 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28  e object Invoke(
d6c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
d6d0: 63 74 5b 5d 20 61 72 67 73 20 2f 2a 20 69 6e 20  ct[] args /* in 
d6e0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 29 0d  */..          ).
d6f0: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
d700: 20 20 20 20 69 66 20 28 63 61 6c 6c 62 61 63 6b      if (callback
d710: 31 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  1 == null)..    
d720: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
d730: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
d740: 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f   InvalidOperatio
d750: 6e 45 78 63 65 70 74 69 6f 6e 28 0d 0a 20 20 20  nException(..   
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
d770: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
d780: 64 73 2e 53 74 72 69 6e 67 46 6f 72 6d 61 74 28  ds.StringFormat(
d790: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d7a0: 20 20 20 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e      CultureInfo.
d7b0: 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d  CurrentCulture,.
d7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d7d0: 20 20 20 4e 6f 43 61 6c 6c 62 61 63 6b 45 72 72     NoCallbackErr
d7e0: 6f 72 2c 20 22 49 6e 76 6f 6b 65 22 29 29 3b 0d  or, "Invoke"));.
d7f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
d800: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
d810: 49 6e 76 6f 6b 65 44 65 6c 65 67 61 74 65 20 69  InvokeDelegate i
d820: 6e 76 6f 6b 65 44 65 6c 65 67 61 74 65 20 3d 0d  nvokeDelegate =.
d830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
d840: 61 6c 6c 62 61 63 6b 31 20 61 73 20 53 51 4c 69  allback1 as SQLi
d850: 74 65 49 6e 76 6f 6b 65 44 65 6c 65 67 61 74 65  teInvokeDelegate
d860: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ;....          i
d870: 66 20 28 69 6e 76 6f 6b 65 44 65 6c 65 67 61 74  f (invokeDelegat
d880: 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e != null)..    
d890: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
d8a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e         return in
d8b0: 76 6f 6b 65 44 65 6c 65 67 61 74 65 2e 49 6e 76  vokeDelegate.Inv
d8c0: 6f 6b 65 28 22 49 6e 76 6f 6b 65 22 2c 20 61 72  oke("Invoke", ar
d8d0: 67 73 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  gs); /* throw */
d8e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
d8f0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
d900: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
d910: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d920: 20 63 61 6c 6c 62 61 63 6b 31 2e 44 79 6e 61 6d   callback1.Dynam
d930: 69 63 49 6e 76 6f 6b 65 28 0d 0a 20 20 20 20 20  icInvoke(..     
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
d950: 49 6e 76 6f 6b 65 41 72 67 73 28 61 72 67 73 2c  InvokeArgs(args,
d960: 20 66 61 6c 73 65 29 29 3b 20 2f 2a 20 74 68 72   false)); /* thr
d970: 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  ow */..         
d980: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
d990: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
d9a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
d9e0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ..      /// <sum
d9f0: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f  mary>..      ///
da00: 20 54 68 69 73 20 76 69 72 74 75 61 6c 20 6d 65   This virtual me
da10: 74 68 6f 64 20 69 73 20 70 61 72 74 20 6f 66 20  thod is part of 
da20: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
da30: 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  on for aggregate
da40: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 66 75 6e 63  ..      /// func
da50: 74 69 6f 6e 73 2e 20 20 53 65 65 20 74 68 65 20  tions.  See the 
da60: 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74  <see cref="SQLit
da70: 65 46 75 6e 63 74 69 6f 6e 2e 53 74 65 70 22 20  eFunction.Step" 
da80: 2f 3e 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20  /> method..     
da90: 20 2f 2f 2f 20 66 6f 72 20 6d 6f 72 65 20 64 65   /// for more de
daa0: 74 61 69 6c 73 2e 0d 0a 20 20 20 20 20 20 2f 2f  tails...      //
dab0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
dac0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
dad0: 61 6d 65 3d 22 61 72 67 73 22 3e 0d 0a 20 20 20  ame="args">..   
dae0: 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 75 6d     /// The argum
daf0: 65 6e 74 73 20 66 6f 72 20 74 68 65 20 61 67 67  ents for the agg
db00: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
db10: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  ..      /// </pa
db20: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ram>..      /// 
db30: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 74 65  <param name="ste
db40: 70 4e 75 6d 62 65 72 22 3e 0d 0a 20 20 20 20 20  pNumber">..     
db50: 20 2f 2f 2f 20 54 68 65 20 73 74 65 70 20 6e 75   /// The step nu
db60: 6d 62 65 72 20 28 6f 6e 65 20 62 61 73 65 64 29  mber (one based)
db70: 2e 20 20 54 68 69 73 20 69 73 20 69 6e 63 72 65  .  This is incre
db80: 6d 65 6d 74 65 64 20 65 61 63 68 20 74 69 6d 65  memted each time
db90: 20 74 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20   the..      /// 
dba0: 3c 73 65 65 20 63 72 65 66 3d 22 53 74 65 70 22  <see cref="Step"
dbb0: 20 2f 3e 20 6d 65 74 68 6f 64 20 69 73 20 63 61   /> method is ca
dbc0: 6c 6c 65 64 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  lled...      ///
dbd0: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
dbe0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
dbf0: 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 0d  ="contextData">.
dc00: 0a 20 20 20 20 20 20 2f 2f 2f 20 41 20 70 6c 61  .      /// A pla
dc10: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70  ceholder for imp
dc20: 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f  lementers to sto
dc30: 72 65 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61  re contextual da
dc40: 74 61 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20  ta pertaining.. 
dc50: 20 20 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20       /// to the 
dc60: 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e  current context.
dc70: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  ..      /// </pa
dc80: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 70 75 62 6c  ram>..      publ
dc90: 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ic override void
dca0: 20 53 74 65 70 28 0d 0a 20 20 20 20 20 20 20 20   Step(..        
dcb0: 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 2c    object[] args,
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 20 2a           /* in *
dcd0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  /..          int
dce0: 20 73 74 65 70 4e 75 6d 62 65 72 2c 20 20 20 20   stepNumber,    
dcf0: 20 20 20 20 2f 2a 20 69 6e 20 2a 2f 0d 0a 20 20      /* in */..  
dd00: 20 20 20 20 20 20 20 20 72 65 66 20 6f 62 6a 65          ref obje
dd10: 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 20 2f  ct contextData /
dd20: 2a 20 69 6e 2c 20 6f 75 74 20 2a 2f 0d 0a 20 20  * in, out */..  
dd30: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
dd40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
dd50: 20 28 63 61 6c 6c 62 61 63 6b 31 20 3d 3d 20 6e   (callback1 == n
dd60: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
dd70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
dd80: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
dd90: 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  idOperationExcep
dda0: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
ddb0: 20 20 20 20 20 20 20 20 20 55 6e 73 61 66 65 4e           UnsafeN
ddc0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 53 74 72  ativeMethods.Str
ddd0: 69 6e 67 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ingFormat(..    
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 75                Cu
ddf0: 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e  ltureInfo.Curren
de00: 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20  tCulture,..     
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 43               NoC
de20: 61 6c 6c 62 61 63 6b 45 72 72 6f 72 2c 20 22 53  allbackError, "S
de30: 74 65 70 22 29 29 3b 0d 0a 20 20 20 20 20 20 20  tep"));..       
de40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
de50: 20 20 53 51 4c 69 74 65 53 74 65 70 44 65 6c 65    SQLiteStepDele
de60: 67 61 74 65 20 73 74 65 70 44 65 6c 65 67 61 74  gate stepDelegat
de70: 65 20 3d 20 63 61 6c 6c 62 61 63 6b 31 20 61 73  e = callback1 as
de80: 20 53 51 4c 69 74 65 53 74 65 70 44 65 6c 65 67   SQLiteStepDeleg
de90: 61 74 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ate;....        
dea0: 20 20 69 66 20 28 73 74 65 70 44 65 6c 65 67 61    if (stepDelega
deb0: 74 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  te != null)..   
dec0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
ded0: 20 20 20 20 20 20 20 20 73 74 65 70 44 65 6c 65          stepDele
dee0: 67 61 74 65 2e 49 6e 76 6f 6b 65 28 0d 0a 20 20  gate.Invoke(..  
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 22 53 74 65 70 22 2c 20 61 72 67 73 2c 20 73 74  "Step", args, st
df10: 65 70 4e 75 6d 62 65 72 2c 20 72 65 66 20 63 6f  epNumber, ref co
df20: 6e 74 65 78 74 44 61 74 61 29 3b 20 2f 2a 20 74  ntextData); /* t
df30: 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20  hrow */..       
df40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
df50: 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
df60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
df70: 20 6f 62 6a 65 63 74 5b 5d 20 6e 65 77 41 72 67   object[] newArg
df80: 73 20 3d 20 47 65 74 53 74 65 70 41 72 67 73 28  s = GetStepArgs(
df90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dfa0: 20 20 20 20 61 72 67 73 2c 20 73 74 65 70 4e 75      args, stepNu
dfb0: 6d 62 65 72 2c 20 63 6f 6e 74 65 78 74 44 61 74  mber, contextDat
dfc0: 61 2c 20 66 61 6c 73 65 29 3b 0d 0a 0d 0a 20 20  a, false);....  
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
dfe0: 47 4e 4f 52 45 44 20 2a 2f 0d 0a 20 20 20 20 20  GNORED */..     
dff0: 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
e000: 6b 31 2e 44 79 6e 61 6d 69 63 49 6e 76 6f 6b 65  k1.DynamicInvoke
e010: 28 6e 65 77 41 72 67 73 29 3b 20 2f 2a 20 74 68  (newArgs); /* th
e020: 72 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20  row */....      
e030: 20 20 20 20 20 20 20 20 55 70 64 61 74 65 53 74          UpdateSt
e040: 65 70 41 72 67 73 28 6e 65 77 41 72 67 73 2c 20  epArgs(newArgs, 
e050: 72 65 66 20 63 6f 6e 74 65 78 74 44 61 74 61 2c  ref contextData,
e060: 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20   false);..      
e070: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
e080: 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f  ..      ////////
e090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e0d0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  /....      /// <
e0e0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
e0f0: 2f 2f 2f 20 54 68 69 73 20 76 69 72 74 75 61 6c  /// This virtual
e100: 20 6d 65 74 68 6f 64 20 69 73 20 70 61 72 74 20   method is part 
e110: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
e120: 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67  ation for aggreg
e130: 61 74 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 66  ate..      /// f
e140: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 65 65 20 74  unctions.  See t
e150: 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51  he <see cref="SQ
e160: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 2e 46 69 6e  LiteFunction.Fin
e170: 61 6c 22 20 2f 3e 20 6d 65 74 68 6f 64 0d 0a 20  al" /> method.. 
e180: 20 20 20 20 20 2f 2f 2f 20 66 6f 72 20 6d 6f 72       /// for mor
e190: 65 20 64 65 74 61 69 6c 73 2e 0d 0a 20 20 20 20  e details...    
e1a0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
e1b0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ..      /// <par
e1c0: 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74  am name="context
e1d0: 44 61 74 61 22 3e 0d 0a 20 20 20 20 20 20 2f 2f  Data">..      //
e1e0: 2f 20 41 20 70 6c 61 63 65 68 6f 6c 64 65 72 20  / A placeholder 
e1f0: 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 65 72 73  for implementers
e200: 20 74 6f 20 73 74 6f 72 65 20 63 6f 6e 74 65 78   to store contex
e210: 74 75 61 6c 20 64 61 74 61 20 70 65 72 74 61 69  tual data pertai
e220: 6e 69 6e 67 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ning..      /// 
e230: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  to the current c
e240: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 2f  ontext...      /
e250: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
e260: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
e270: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20  ..      /// The 
e280: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61 67  result of the ag
e290: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
e2a0: 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72  ...      /// </r
e2b0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 70  eturns>..      p
e2c0: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f  ublic override o
e2d0: 62 6a 65 63 74 20 46 69 6e 61 6c 28 0d 0a 20 20  bject Final(..  
e2e0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63          object c
e2f0: 6f 6e 74 65 78 74 44 61 74 61 20 2f 2a 20 69 6e  ontextData /* in
e300: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 29   */..          )
e310: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
e320: 20 20 20 20 20 69 66 20 28 63 61 6c 6c 62 61 63       if (callbac
e330: 6b 32 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  k2 == null)..   
e340: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
e350: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
e360: 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69  w InvalidOperati
e370: 6f 6e 45 78 63 65 70 74 69 6f 6e 28 0d 0a 20 20  onException(..  
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
e3a0: 6f 64 73 2e 53 74 72 69 6e 67 46 6f 72 6d 61 74  ods.StringFormat
e3b0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
e3c0: 20 20 20 20 20 43 75 6c 74 75 72 65 49 6e 66 6f       CultureInfo
e3d0: 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 2c  .CurrentCulture,
e3e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e3f0: 20 20 20 20 4e 6f 43 61 6c 6c 62 61 63 6b 45 72      NoCallbackEr
e400: 72 6f 72 2c 20 22 46 69 6e 61 6c 22 29 29 3b 0d  ror, "Final"));.
e410: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
e420: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
e430: 46 69 6e 61 6c 44 65 6c 65 67 61 74 65 20 66 69  FinalDelegate fi
e440: 6e 61 6c 44 65 6c 65 67 61 74 65 20 3d 20 63 61  nalDelegate = ca
e450: 6c 6c 62 61 63 6b 32 20 61 73 20 53 51 4c 69 74  llback2 as SQLit
e460: 65 46 69 6e 61 6c 44 65 6c 65 67 61 74 65 3b 0d  eFinalDelegate;.
e470: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
e480: 28 66 69 6e 61 6c 44 65 6c 65 67 61 74 65 20 21  (finalDelegate !
e490: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
e4a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
e4b0: 20 20 20 20 72 65 74 75 72 6e 20 66 69 6e 61 6c      return final
e4c0: 44 65 6c 65 67 61 74 65 2e 49 6e 76 6f 6b 65 28  Delegate.Invoke(
e4d0: 22 46 69 6e 61 6c 22 2c 20 63 6f 6e 74 65 78 74  "Final", context
e4e0: 44 61 74 61 29 3b 20 2f 2a 20 74 68 72 6f 77 20  Data); /* throw 
e4f0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  */..          }.
e500: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d  .          else.
e510: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e530: 72 6e 20 63 61 6c 6c 62 61 63 6b 31 2e 44 79 6e  rn callback1.Dyn
e540: 61 6d 69 63 49 6e 76 6f 6b 65 28 47 65 74 46 69  amicInvoke(GetFi
e550: 6e 61 6c 41 72 67 73 28 0d 0a 20 20 20 20 20 20  nalArgs(..      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
e570: 65 78 74 44 61 74 61 2c 20 66 61 6c 73 65 29 29  extData, false))
e580: 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20  ; /* throw */.. 
e590: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
e5a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f    }....      ///
e5b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e5c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e5d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e5e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e5f0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
e600: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
e610: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 76 69       /// This vi
e620: 72 74 75 61 6c 20 6d 65 74 68 6f 64 20 69 73 20  rtual method is 
e630: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d 70 6c  part of the impl
e640: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 63  ementation for c
e650: 6f 6c 6c 61 74 69 6e 67 0d 0a 20 20 20 20 20 20  ollating..      
e660: 2f 2f 2f 20 73 65 71 75 65 6e 63 65 73 2e 20 20  /// sequences.  
e670: 53 65 65 20 74 68 65 20 3c 73 65 65 20 63 72 65  See the <see cre
e680: 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  f="SQLiteFunctio
e690: 6e 2e 43 6f 6d 70 61 72 65 22 20 2f 3e 20 6d 65  n.Compare" /> me
e6a0: 74 68 6f 64 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  thod..      /// 
e6b0: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73  for more details
e6c0: 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73  ...      /// </s
e6d0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f  ummary>..      /
e6e0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
e6f0: 70 61 72 61 6d 31 22 3e 0d 0a 20 20 20 20 20 20  param1">..      
e700: 2f 2f 2f 20 54 68 65 20 66 69 72 73 74 20 73 74  /// The first st
e710: 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 2e  ring to compare.
e720: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  ..      /// </pa
e730: 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ram>..      /// 
e740: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 61 72  <param name="par
e750: 61 6d 32 22 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f  am2">..      ///
e760: 20 54 68 65 20 73 65 63 6f 6e 64 20 73 74 72 6e   The second strn
e770: 69 67 20 74 6f 20 63 6f 6d 70 61 72 65 2e 0d 0a  ig to compare...
e780: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
e790: 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72  m>..      /// <r
e7a0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f  eturns>..      /
e7b0: 2f 2f 20 41 20 70 6f 73 69 74 69 76 65 20 69 6e  // A positive in
e7c0: 74 65 67 65 72 20 69 66 20 74 68 65 20 3c 70 61  teger if the <pa
e7d0: 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 70 61 72  ramref name="par
e7e0: 61 6d 31 22 20 2f 3e 20 70 61 72 61 6d 65 74 65  am1" /> paramete
e7f0: 72 20 69 73 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  r is..      /// 
e800: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
e810: 20 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d   <paramref name=
e820: 22 70 61 72 61 6d 32 22 20 2f 3e 20 70 61 72 61  "param2" /> para
e830: 6d 65 74 65 72 2c 20 61 20 6e 65 67 61 74 69 76  meter, a negativ
e840: 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 69 6e 74  e..      /// int
e850: 65 67 65 72 20 69 66 20 74 68 65 20 3c 70 61 72  eger if the <par
e860: 61 6d 72 65 66 20 6e 61 6d 65 3d 22 70 61 72 61  amref name="para
e870: 6d 31 22 20 2f 3e 20 70 61 72 61 6d 65 74 65 72  m1" /> parameter
e880: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 0d 0a 20   is less than.. 
e890: 20 20 20 20 20 2f 2f 2f 20 74 68 65 20 3c 70 61       /// the <pa
e8a0: 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 70 61 72  ramref name="par
e8b0: 61 6d 32 22 20 2f 3e 20 70 61 72 61 6d 65 74 65  am2" /> paramete
e8c0: 72 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 74 68  r, or zero if th
e8d0: 65 79 20 61 72 65 0d 0a 20 20 20 20 20 20 2f 2f  ey are..      //
e8e0: 2f 20 65 71 75 61 6c 2e 0d 0a 20 20 20 20 20 20  / equal...      
e8f0: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
e900: 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65        public ove
e910: 72 72 69 64 65 20 69 6e 74 20 43 6f 6d 70 61 72  rride int Compar
e920: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74  e(..          st
e930: 72 69 6e 67 20 70 61 72 61 6d 31 2c 20 2f 2a 20  ring param1, /* 
e940: 69 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  in */..         
e950: 20 73 74 72 69 6e 67 20 70 61 72 61 6d 32 20 20   string param2  
e960: 2f 2a 20 69 6e 20 2a 2f 0d 0a 20 20 20 20 20 20  /* in */..      
e970: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 7b 0d 0a      )..      {..
e980: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 61            if (ca
e990: 6c 6c 62 61 63 6b 31 20 3d 3d 20 6e 75 6c 6c 29  llback1 == null)
e9a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
e9c0: 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70  ow new InvalidOp
e9d0: 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e  erationException
e9e0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
e9f0: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
ea00: 65 4d 65 74 68 6f 64 73 2e 53 74 72 69 6e 67 46  eMethods.StringF
ea10: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
ea20: 20 20 20 20 20 20 20 20 20 20 43 75 6c 74 75 72            Cultur
ea30: 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43 75 6c  eInfo.CurrentCul
ea40: 74 75 72 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  ture,..         
ea50: 20 20 20 20 20 20 20 20 20 4e 6f 43 61 6c 6c 62           NoCallb
ea60: 61 63 6b 45 72 72 6f 72 2c 20 22 43 6f 6d 70 61  ackError, "Compa
ea70: 72 65 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  re"));..        
ea80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
ea90: 20 53 51 4c 69 74 65 43 6f 6d 70 61 72 65 44 65   SQLiteCompareDe
eaa0: 6c 65 67 61 74 65 20 63 6f 6d 70 61 72 65 44 65  legate compareDe
eab0: 6c 65 67 61 74 65 20 3d 0d 0a 20 20 20 20 20 20  legate =..      
eac0: 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
ead0: 31 20 61 73 20 53 51 4c 69 74 65 43 6f 6d 70 61  1 as SQLiteCompa
eae0: 72 65 44 65 6c 65 67 61 74 65 3b 0d 0a 0d 0a 20  reDelegate;.... 
eaf0: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6d           if (com
eb00: 70 61 72 65 44 65 6c 65 67 61 74 65 20 21 3d 20  pareDelegate != 
eb10: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
eb20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
eb30: 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 61 72 65    return compare
eb40: 44 65 6c 65 67 61 74 65 2e 49 6e 76 6f 6b 65 28  Delegate.Invoke(
eb50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb60: 20 20 20 20 22 43 6f 6d 70 61 72 65 22 2c 20 70      "Compare", p
eb70: 61 72 61 6d 31 2c 20 70 61 72 61 6d 32 29 3b 20  aram1, param2); 
eb80: 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
eb90: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
eba0: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
ebb0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
ebc0: 20 20 20 20 20 6f 62 6a 65 63 74 20 72 65 73 75       object resu
ebd0: 6c 74 20 3d 20 63 61 6c 6c 62 61 63 6b 31 2e 44  lt = callback1.D
ebe0: 79 6e 61 6d 69 63 49 6e 76 6f 6b 65 28 47 65 74  ynamicInvoke(Get
ebf0: 43 6f 6d 70 61 72 65 41 72 67 73 28 0d 0a 20 20  CompareArgs(..  
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 70 61 72 61 6d 31 2c 20 70 61 72 61 6d 32 2c 20  param1, param2, 
ec20: 66 61 6c 73 65 29 29 3b 20 2f 2a 20 74 68 72 6f  false)); /* thro
ec30: 77 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  w */....        
ec40: 20 20 20 20 20 20 69 66 20 28 72 65 73 75 6c 74        if (result
ec50: 20 69 73 20 69 6e 74 29 0d 0a 20 20 20 20 20 20   is int)..      
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
ec70: 72 6e 20 28 69 6e 74 29 72 65 73 75 6c 74 3b 0d  rn (int)result;.
ec80: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ec90: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
eca0: 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  idOperationExcep
ecb0: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
ecc0: 20 20 20 20 20 20 20 20 20 55 6e 73 61 66 65 4e           UnsafeN
ecd0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 53 74 72  ativeMethods.Str
ece0: 69 6e 67 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ingFormat(..    
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 75                Cu
ed00: 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e  ltureInfo.Curren
ed10: 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20  tCulture,..     
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
ed30: 75 6c 74 49 6e 74 33 32 45 72 72 6f 72 2c 20 22  ultInt32Error, "
ed40: 43 6f 6d 70 61 72 65 22 29 29 3b 0d 0a 20 20 20  Compare"));..   
ed50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ed60: 7d 0d 0a 20 20 20 20 20 20 23 65 6e 64 72 65 67  }..      #endreg
ed70: 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f  ion..  }....  //
ed80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ed90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eda0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
edb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
edc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
edd0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
ede0: 20 20 2f 2f 2f 20 45 78 74 65 6e 64 73 20 53 51    /// Extends SQ
edf0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 61 6e 64  LiteFunction and
ee00: 20 61 6c 6c 6f 77 73 20 61 6e 20 69 6e 68 65 72   allows an inher
ee10: 69 74 65 64 20 63 6c 61 73 73 20 74 6f 20 6f 62  ited class to ob
ee20: 74 61 69 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  tain the collati
ee30: 6e 67 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f  ng sequence asso
ee40: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 66 75  ciated with a fu
ee50: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0d 0a 20 20  nction call...  
ee60: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
ee70: 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d    /// <remarks>.
ee80: 0a 20 20 2f 2f 2f 20 55 73 65 72 2d 64 65 66 69  .  /// User-defi
ee90: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  ned functions ca
eea0: 6e 20 63 61 6c 6c 20 74 68 65 20 47 65 74 43 6f  n call the GetCo
eeb0: 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 28  llationSequence(
eec0: 29 20 6d 65 74 68 6f 64 20 69 6e 20 74 68 69 73  ) method in this
eed0: 20 63 6c 61 73 73 20 61 6e 64 20 75 73 65 20 69   class and use i
eee0: 74 20 74 6f 20 63 6f 6d 70 61 72 65 20 73 74 72  t to compare str
eef0: 69 6e 67 73 20 61 6e 64 20 63 68 61 72 20 61 72  ings and char ar
ef00: 72 61 79 73 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 72  rays...  /// </r
ef10: 65 6d 61 72 6b 73 3e 0d 0a 20 20 70 75 62 6c 69  emarks>..  publi
ef20: 63 20 63 6c 61 73 73 20 53 51 4c 69 74 65 46 75  c class SQLiteFu
ef30: 6e 63 74 69 6f 6e 45 78 20 3a 20 53 51 4c 69 74  nctionEx : SQLit
ef40: 65 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a  eFunction..  {..
ef50: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
ef60: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4f 62 74 61 69  >..    /// Obtai
ef70: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ns the collating
ef80: 20 73 65 71 75 65 6e 63 65 20 69 6e 20 65 66 66   sequence in eff
ef90: 65 63 74 20 66 6f 72 20 74 68 65 20 67 69 76 65  ect for the give
efa0: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20  n function...   
efb0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
efc0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
efd0: 73 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20  s></returns>..  
efe0: 20 20 70 72 6f 74 65 63 74 65 64 20 43 6f 6c 6c    protected Coll
eff0: 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 47 65  ationSequence Ge
f000: 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e  tCollationSequen
f010: 63 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ce()..    {..   
f020: 20 20 20 72 65 74 75 72 6e 20 5f 62 61 73 65 2e     return _base.
f030: 47 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75  GetCollationSequ
f040: 65 6e 63 65 28 74 68 69 73 2c 20 5f 63 6f 6e 74  ence(this, _cont
f050: 65 78 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ext);..    }....
f060: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
f070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f0a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f0b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f0c0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69  ///....    #regi
f0d0: 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22  on IDisposable "
f0e0: 50 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73  Pattern" Members
f0f0: 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f  ..    private bo
f100: 6f 6c 20 64 69 73 70 6f 73 65 64 3b 0d 0a 20 20  ol disposed;..  
f110: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 43    private void C
f120: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20 2f  heckDisposed() /
f130: 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
f140: 7b 0d 0a 23 69 66 20 54 48 52 4f 57 5f 4f 4e 5f  {..#if THROW_ON_
f150: 44 49 53 50 4f 53 45 44 0d 0a 20 20 20 20 20 20  DISPOSED..      
f160: 20 20 69 66 20 28 64 69 73 70 6f 73 65 64 29 0d    if (disposed).
f170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
f180: 6f 77 20 6e 65 77 20 4f 62 6a 65 63 74 44 69 73  ow new ObjectDis
f190: 70 6f 73 65 64 45 78 63 65 70 74 69 6f 6e 28 74  posedException(t
f1a0: 79 70 65 6f 66 28 53 51 4c 69 74 65 46 75 6e 63  ypeof(SQLiteFunc
f1b0: 74 69 6f 6e 45 78 29 2e 4e 61 6d 65 29 3b 0d 0a  tionEx).Name);..
f1c0: 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d  #endif..    }...
f1d0: 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .    ///////////
f1e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f1f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f230: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20  ////....    /// 
f240: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
f250: 2f 2f 20 43 6c 65 61 6e 73 20 75 70 20 72 65 73  // Cleans up res
f260: 6f 75 72 63 65 73 20 28 6e 61 74 69 76 65 20 61  ources (native a
f270: 6e 64 20 6d 61 6e 61 67 65 64 29 20 61 73 73 6f  nd managed) asso
f280: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
f290: 63 75 72 72 65 6e 74 20 69 6e 73 74 61 6e 63 65  current instance
f2a0: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
f2b0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  mary>..    /// <
f2c0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 64 69 73 70  param name="disp
f2d0: 6f 73 69 6e 67 22 3e 0d 0a 20 20 20 20 2f 2f 2f  osing">..    ///
f2e0: 20 5a 65 72 6f 20 77 68 65 6e 20 62 65 69 6e 67   Zero when being
f2f0: 20 64 69 73 70 6f 73 65 64 20 76 69 61 20 67 61   disposed via ga
f300: 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
f310: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6e 6f 6e  ; otherwise, non
f320: 2d 7a 65 72 6f 2e 0d 0a 20 20 20 20 2f 2f 2f 20  -zero...    /// 
f330: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 72  </param>..    pr
f340: 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69 64 65  otected override
f350: 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28 62 6f   void Dispose(bo
f360: 6f 6c 20 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20  ol disposing).. 
f370: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72     {..        tr
f380: 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  y..        {..  
f390: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 64            if (!d
f3a0: 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 20  isposed)..      
f3b0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f3c0: 20 20 20 20 20 20 20 20 20 2f 2f 69 66 20 28 64           //if (d
f3d0: 69 73 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 20  isposing)..     
f3e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 7b 0d 0a             //{..
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 2f 2f 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  //    //////////
f410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20  //////////..    
f430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
f440: 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d 61 6e    // dispose man
f450: 61 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68  aged resources h
f460: 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20  ere.....        
f470: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 2f 2f          //    //
f480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4a0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
f4b0: 20 20 20 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 20      //}....     
f4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
f4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4f0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
f500: 20 20 20 2f 2f 20 72 65 6c 65 61 73 65 20 75 6e     // release un
f510: 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65  managed resource
f520: 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20  s here.....     
f530: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
f540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f560: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  /..            }
f570: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f580: 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20       finally..  
f590: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f5a0: 20 20 20 20 20 62 61 73 65 2e 44 69 73 70 6f 73       base.Dispos
f5b0: 65 28 64 69 73 70 6f 73 69 6e 67 29 3b 0d 0a 0d  e(disposing);...
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
f5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
f5e0: 4e 4f 54 45 3a 20 45 76 65 72 79 74 68 69 6e 67  NOTE: Everything
f5f0: 20 73 68 6f 75 6c 64 20 62 65 20 66 75 6c 6c 79   should be fully
f600: 20 64 69 73 70 6f 73 65 64 20 61 74 20 74 68 69   disposed at thi
f610: 73 20 70 6f 69 6e 74 2e 0d 0a 20 20 20 20 20 20  s point...      
f620: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
f630: 20 20 20 20 20 20 64 69 73 70 6f 73 65 64 20 3d        disposed =
f640: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
f650: 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65  }..    }..    #e
f660: 6e 64 72 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d  ndregion..  }...
f670: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
f680: 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 74 79 70 65  ..  /// The type
f690: 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
f6a0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 64 65 63   function to dec
f6b0: 6c 61 72 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75  lare..  /// </su
f6c0: 6d 6d 61 72 79 3e 0d 0a 20 20 70 75 62 6c 69 63  mmary>..  public
f6d0: 20 65 6e 75 6d 20 46 75 6e 63 74 69 6f 6e 54 79   enum FunctionTy
f6e0: 70 65 0d 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f  pe..  {..    ///
f6f0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
f700: 2f 2f 2f 20 53 63 61 6c 61 72 20 66 75 6e 63 74  /// Scalar funct
f710: 69 6f 6e 73 20 61 72 65 20 64 65 73 69 67 6e 65  ions are designe
f720: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61  d to be called a
f730: 6e 64 20 72 65 74 75 72 6e 20 61 20 72 65 73 75  nd return a resu
f740: 6c 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  lt immediately. 
f750: 20 45 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64   Examples includ
f760: 65 20 41 42 53 28 29 2c 20 55 70 70 65 72 28 29  e ABS(), Upper()
f770: 2c 20 4c 6f 77 65 72 28 29 2c 20 65 74 63 2e 0d  , Lower(), etc..
f780: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
f790: 72 79 3e 0d 0a 20 20 20 20 53 63 61 6c 61 72 20  ry>..    Scalar 
f7a0: 3d 20 30 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  = 0,..    /// <s
f7b0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
f7c0: 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
f7d0: 69 6f 6e 73 20 61 72 65 20 64 65 73 69 67 6e 65  ions are designe
f7e0: 64 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  d to accumulate 
f7f0: 64 61 74 61 20 75 6e 74 69 6c 20 74 68 65 20 65  data until the e
f800: 6e 64 20 6f 66 20 61 20 63 61 6c 6c 20 61 6e 64  nd of a call and
f810: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 72   then return a r
f820: 65 73 75 6c 74 20 67 6c 65 61 6e 65 64 20 66 72  esult gleaned fr
f830: 6f 6d 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  om the accumulat
f840: 65 64 20 64 61 74 61 2e 0d 0a 20 20 20 20 2f 2f  ed data...    //
f850: 2f 20 45 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75  / Examples inclu
f860: 64 65 20 53 55 4d 28 29 2c 20 43 4f 55 4e 54 28  de SUM(), COUNT(
f870: 29 2c 20 41 56 47 28 29 2c 20 65 74 63 2e 0d 0a  ), AVG(), etc...
f880: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
f890: 79 3e 0d 0a 20 20 20 20 41 67 67 72 65 67 61 74  y>..    Aggregat
f8a0: 65 20 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20  e = 1,..    /// 
f8b0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
f8c0: 2f 2f 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  // Collating seq
f8d0: 75 65 6e 63 65 73 20 61 72 65 20 75 73 65 64 20  uences are used 
f8e0: 74 6f 20 73 6f 72 74 20 74 65 78 74 75 61 6c 20  to sort textual 
f8f0: 64 61 74 61 20 69 6e 20 61 20 63 75 73 74 6f 6d  data in a custom
f900: 20 6d 61 6e 6e 65 72 2c 20 61 6e 64 20 61 70 70   manner, and app
f910: 65 61 72 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ear in an ORDER 
f920: 42 59 20 63 6c 61 75 73 65 2e 20 20 54 79 70 69  BY clause.  Typi
f930: 63 61 6c 6c 79 20 74 65 78 74 20 69 6e 20 61 6e  cally text in an
f940: 20 4f 52 44 45 52 20 42 59 20 69 73 0d 0a 20 20   ORDER BY is..  
f950: 20 20 2f 2f 2f 20 73 6f 72 74 65 64 20 75 73 69    /// sorted usi
f960: 6e 67 20 61 20 73 74 72 61 69 67 68 74 20 63 61  ng a straight ca
f970: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63  se-insensitive c
f980: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
f990: 6f 6e 2e 20 20 43 75 73 74 6f 6d 20 63 6f 6c 6c  on.  Custom coll
f9a0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
f9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
f9c0: 6c 74 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  lter the behavio
f9d0: 72 20 6f 66 20 74 65 78 74 20 73 6f 72 74 69 6e  r of text sortin
f9e0: 67 0d 0a 20 20 20 20 2f 2f 2f 20 69 6e 20 61 20  g..    /// in a 
f9f0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 6d 61 6e  user-defined man
fa00: 6e 65 72 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ner...    /// </
fa10: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 43 6f  summary>..    Co
fa20: 6c 6c 61 74 69 6f 6e 20 3d 20 32 2c 0d 0a 20 20  llation = 2,..  
fa30: 7d 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d  }....  /// <summ
fa40: 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69  ary>..  /// An i
fa50: 6e 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b  nternal callback
fa60: 20 64 65 6c 65 67 61 74 65 20 64 65 63 6c 61 72   delegate declar
fa70: 61 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f  ation...  /// </
fa80: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
fa90: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e  <param name="con
faa0: 74 65 78 74 22 3e 52 61 77 20 6e 61 74 69 76 65  text">Raw native
fab0: 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   context pointer
fac0: 20 66 6f 72 20 74 68 65 20 75 73 65 72 20 66 75   for the user fu
fad0: 6e 63 74 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0d  nction.</param>.
fae0: 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61  .  /// <param na
faf0: 6d 65 3d 22 61 72 67 63 22 3e 54 6f 74 61 6c 20  me="argc">Total 
fb00: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
fb10: 6e 74 73 20 74 6f 20 74 68 65 20 75 73 65 72 20  nts to the user 
fb20: 66 75 6e 63 74 69 6f 6e 2e 3c 2f 70 61 72 61 6d  function.</param
fb30: 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  >..  /// <param 
fb40: 6e 61 6d 65 3d 22 61 72 67 76 22 3e 52 61 77 20  name="argv">Raw 
fb50: 6e 61 74 69 76 65 20 70 6f 69 6e 74 65 72 20 74  native pointer t
fb60: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72  o the array of r
fb70: 61 77 20 6e 61 74 69 76 65 20 61 72 67 75 6d 65  aw native argume
fb80: 6e 74 20 70 6f 69 6e 74 65 72 73 2e 3c 2f 70 61  nt pointers.</pa
fb90: 72 61 6d 3e 0d 0a 23 69 66 20 21 50 4c 41 54 46  ram>..#if !PLATF
fba0: 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45  ORM_COMPACTFRAME
fbb0: 57 4f 52 4b 0d 0a 20 20 5b 55 6e 6d 61 6e 61 67  WORK..  [Unmanag
fbc0: 65 64 46 75 6e 63 74 69 6f 6e 50 6f 69 6e 74 65  edFunctionPointe
fbd0: 72 28 43 61 6c 6c 69 6e 67 43 6f 6e 76 65 6e 74  r(CallingConvent
fbe0: 69 6f 6e 2e 43 64 65 63 6c 29 5d 0d 0a 23 65 6e  ion.Cdecl)]..#en
fbf0: 64 69 66 0d 0a 20 20 70 75 62 6c 69 63 20 64 65  dif..  public de
fc00: 6c 65 67 61 74 65 20 76 6f 69 64 20 53 51 4c 69  legate void SQLi
fc10: 74 65 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74  teCallback(IntPt
fc20: 72 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61  r context, int a
fc30: 72 67 63 2c 20 49 6e 74 50 74 72 20 61 72 67 76  rgc, IntPtr argv
fc40: 29 3b 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  );..  /// <summa
fc50: 72 79 3e 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e  ry>..  /// An in
fc60: 74 65 72 6e 61 6c 20 66 69 6e 61 6c 20 63 61 6c  ternal final cal
fc70: 6c 62 61 63 6b 20 64 65 6c 65 67 61 74 65 20 64  lback delegate d
fc80: 65 63 6c 61 72 61 74 69 6f 6e 2e 0d 0a 20 20 2f  eclaration...  /
fc90: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
fca0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
fcb0: 3d 22 63 6f 6e 74 65 78 74 22 3e 52 61 77 20 63  ="context">Raw c
fcc0: 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66  ontext pointer f
fcd0: 6f 72 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  or the user func
fce0: 74 69 6f 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 23 69  tion</param>..#i
fcf0: 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  f !PLATFORM_COMP
fd00: 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20  ACTFRAMEWORK..  
fd10: 5b 55 6e 6d 61 6e 61 67 65 64 46 75 6e 63 74 69  [UnmanagedFuncti
fd20: 6f 6e 50 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e  onPointer(Callin
fd30: 67 43 6f 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63  gConvention.Cdec
fd40: 6c 29 5d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69  l)]..#endif..  i
fd50: 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65  nternal delegate
fd60: 20 76 6f 69 64 20 53 51 4c 69 74 65 46 69 6e 61   void SQLiteFina
fd70: 6c 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72  lCallback(IntPtr
fd80: 20 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 2f 2f   context);..  //
fd90: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f  / <summary>..  /
fda0: 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 63 61 6c 6c  // Internal call
fdb0: 62 61 63 6b 20 64 65 6c 65 67 61 74 65 20 66 6f  back delegate fo
fdc0: 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 63  r implementing c
fdd0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fde0: 65 73 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  es..  /// </summ
fdf0: 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72  ary>..  /// <par
fe00: 61 6d 20 6e 61 6d 65 3d 22 70 75 73 65 72 22 3e  am name="puser">
fe10: 4e 6f 74 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e  Not used</param>
fe20: 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e  ..  /// <param n
fe30: 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c 65 6e 67 74  ame="len1">Lengt
fe40: 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  h of the string 
fe50: 70 76 31 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f  pv1</param>..  /
fe60: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
fe70: 70 76 31 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20  pv1">Pointer to 
fe80: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
fe90: 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72   to compare</par
fea0: 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61  am>..  /// <para
feb0: 6d 20 6e 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65  m name="len2">Le
fec0: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69  ngth of the stri
fed0: 6e 67 20 70 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a  ng pv2</param>..
fee0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
fef0: 65 3d 22 70 76 32 22 3e 50 6f 69 6e 74 65 72 20  e="pv2">Pointer 
ff00: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 73 74  to the second st
ff10: 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c  ring to compare<
ff20: 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c  /param>..  /// <
ff30: 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e 73 20  returns>Returns 
ff40: 2d 31 20 69 66 20 74 68 65 20 66 69 72 73 74 20  -1 if the first 
ff50: 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74  string is less t
ff60: 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 20  han the second. 
ff70: 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65   0 if they are e
ff80: 71 75 61 6c 2c 20 6f 72 20 31 20 69 66 20 74 68  qual, or 1 if th
ff90: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 69  e first string i
ffa0: 73 20 67 72 65 61 74 65 72 0d 0a 20 20 2f 2f 2f  s greater..  ///
ffb0: 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
ffc0: 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 23 69 66  .</returns>..#if
ffd0: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41   !PLATFORM_COMPA
ffe0: 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b  CTFRAMEWORK..  [
fff0: 55 6e 6d 61 6e 61 67 65 64 46 75 6e 63 74 69 6f  UnmanagedFunctio
10000 6e 50 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67  nPointer(Calling
10010 43 6f 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c  Convention.Cdecl
10020 29 5d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e  )]..#endif..  in
10030 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20  ternal delegate 
10040 69 6e 74 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74  int SQLiteCollat
10050 69 6f 6e 28 49 6e 74 50 74 72 20 70 75 73 65 72  ion(IntPtr puser
10060 2c 20 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50  , int len1, IntP
10070 74 72 20 70 76 31 2c 20 69 6e 74 20 6c 65 6e 32  tr pv1, int len2
10080 2c 20 49 6e 74 50 74 72 20 70 76 32 29 3b 0d 0a  , IntPtr pv2);..
10090 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79  ..  /// <summary
100a0 3e 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 74 79 70  >..  /// The typ
100b0 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73  e of collating s
100c0 65 71 75 65 6e 63 65 0d 0a 20 20 2f 2f 2f 20 3c  equence..  /// <
100d0 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 70 75 62  /summary>..  pub
100e0 6c 69 63 20 65 6e 75 6d 20 43 6f 6c 6c 61 74 69  lic enum Collati
100f0 6f 6e 54 79 70 65 45 6e 75 6d 0d 0a 20 20 7b 0d  onTypeEnum..  {.
10100 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
10110 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  y>..    /// The 
10120 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20  built-in BINARY 
10130 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10140 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ce..    /// </su
10150 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 42 69 6e 61  mmary>..    Bina
10160 72 79 20 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f  ry = 1,..    ///
10170 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
10180 2f 2f 2f 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  /// The built-in
10190 20 4e 4f 43 41 53 45 20 63 6f 6c 6c 61 74 69 6e   NOCASE collatin
101a0 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20  g sequence..    
101b0 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
101c0 20 20 20 20 4e 6f 43 61 73 65 20 3d 20 32 2c 0d      NoCase = 2,.
101d0 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
101e0 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  y>..    /// The 
101f0 62 75 69 6c 74 2d 69 6e 20 52 45 56 45 52 53 45  built-in REVERSE
10200 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10210 6e 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  nce..    /// </s
10220 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 52 65 76  ummary>..    Rev
10230 65 72 73 65 20 3d 20 33 2c 0d 0a 20 20 20 20 2f  erse = 3,..    /
10240 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
10250 20 20 2f 2f 2f 20 41 20 63 75 73 74 6f 6d 20 75    /// A custom u
10260 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c  ser-defined coll
10270 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a  ating sequence..
10280 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
10290 79 3e 0d 0a 20 20 20 20 43 75 73 74 6f 6d 20 3d  y>..    Custom =
102a0 20 30 2c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f   0,..  }....  //
102b0 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f  / <summary>..  /
102c0 2f 2f 20 54 68 65 20 65 6e 63 6f 64 69 6e 67 20  // The encoding 
102d0 74 79 70 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  type the collati
102e0 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 73  on sequence uses
102f0 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72  ..  /// </summar
10300 79 3e 0d 0a 20 20 70 75 62 6c 69 63 20 65 6e 75  y>..  public enu
10310 6d 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64  m CollationEncod
10320 69 6e 67 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20  ingEnum..  {..  
10330 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
10340 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c  .    /// The col
10350 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
10360 69 73 20 55 54 46 38 0d 0a 20 20 20 20 2f 2f 2f  is UTF8..    ///
10370 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
10380 20 55 54 46 38 20 3d 20 31 2c 0d 0a 20 20 20 20   UTF8 = 1,..    
10390 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
103a0 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61     /// The colla
103b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
103c0 20 55 54 46 31 36 20 6c 69 74 74 6c 65 2d 65 6e   UTF16 little-en
103d0 64 69 61 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  dian..    /// </
103e0 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54  summary>..    UT
103f0 46 31 36 4c 45 20 3d 20 32 2c 0d 0a 20 20 20 20  F16LE = 2,..    
10400 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
10410 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61     /// The colla
10420 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
10430 20 55 54 46 31 36 20 62 69 67 2d 65 6e 64 69 61   UTF16 big-endia
10440 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  n..    /// </sum
10450 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54 46 31 36  mary>..    UTF16
10460 42 45 20 3d 20 33 2c 0d 0a 20 20 7d 0d 0a 0d 0a  BE = 3,..  }....
10470 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
10480 0a 20 20 2f 2f 2f 20 41 20 73 74 72 75 63 74 20  .  /// A struct 
10490 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 63  describing the c
104a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
104b0 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  e a function is 
104c0 65 78 65 63 75 74 69 6e 67 20 69 6e 0d 0a 20 20  executing in..  
104d0 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
104e0 20 20 70 75 62 6c 69 63 20 73 74 72 75 63 74 20    public struct 
104f0 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63  CollationSequenc
10500 65 0d 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20  e..  {..    /// 
10510 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
10520 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  // The name of t
10530 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
10540 75 65 6e 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c  uence..    /// <
10550 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70  /summary>..    p
10560 75 62 6c 69 63 20 73 74 72 69 6e 67 20 4e 61 6d  ublic string Nam
10570 65 3b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  e;..    /// <sum
10580 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54  mary>..    /// T
10590 68 65 20 74 79 70 65 20 6f 66 20 63 6f 6c 6c 61  he type of colla
105a0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a 20  ting sequence.. 
105b0 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
105c0 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 43 6f  >..    public Co
105d0 6c 6c 61 74 69 6f 6e 54 79 70 65 45 6e 75 6d 20  llationTypeEnum 
105e0 54 79 70 65 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f  Type;....    ///
105f0 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
10600 2f 2f 2f 20 54 68 65 20 74 65 78 74 20 65 6e 63  /// The text enc
10610 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c  oding of the col
10620 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0d  lation sequence.
10630 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
10640 72 79 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  ry>..    public 
10650 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e  CollationEncodin
10660 67 45 6e 75 6d 20 45 6e 63 6f 64 69 6e 67 3b 0d  gEnum Encoding;.
10670 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
10680 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f  ary>..    /// Co
10690 6e 74 65 78 74 20 6f 66 20 74 68 65 20 66 75 6e  ntext of the fun
106a0 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 65  ction that reque
106b0 73 74 65 64 20 74 68 65 20 63 6f 6c 6c 61 74 69  sted the collati
106c0 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20  ng sequence..   
106d0 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
106e0 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 51  .    internal SQ
106f0 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 5f 66 75  LiteFunction _fu
10700 6e 63 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c  nc;....    /// <
10710 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
10720 2f 20 43 61 6c 6c 73 20 74 68 65 20 62 61 73 65  / Calls the base
10730 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10740 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  nce to compare t
10750 77 6f 20 73 74 72 69 6e 67 73 0d 0a 20 20 20 20  wo strings..    
10760 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
10770 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
10780 61 6d 65 3d 22 73 31 22 3e 54 68 65 20 66 69 72  ame="s1">The fir
10790 73 74 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d  st string to com
107a0 70 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  pare</param>..  
107b0 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
107c0 65 3d 22 73 32 22 3e 54 68 65 20 73 65 63 6f 6e  e="s2">The secon
107d0 64 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70  d string to comp
107e0 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  are</param>..   
107f0 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 2d 31   /// <returns>-1
10800 20 69 66 20 73 31 20 69 73 20 6c 65 73 73 20 74   if s1 is less t
10810 68 61 6e 20 73 32 2c 20 30 20 69 66 20 73 31 20  han s2, 0 if s1 
10820 69 73 20 65 71 75 61 6c 20 74 6f 20 73 32 2c 20  is equal to s2, 
10830 61 6e 64 20 31 20 69 66 20 73 31 20 69 73 20 67  and 1 if s1 is g
10840 72 65 61 74 65 72 20 74 68 61 6e 20 73 32 3c 2f  reater than s2</
10850 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75  returns>..    pu
10860 62 6c 69 63 20 69 6e 74 20 43 6f 6d 70 61 72 65  blic int Compare
10870 28 73 74 72 69 6e 67 20 73 31 2c 20 73 74 72 69  (string s1, stri
10880 6e 67 20 73 32 29 0d 0a 20 20 20 20 7b 0d 0a 20  ng s2)..    {.. 
10890 20 20 20 20 20 72 65 74 75 72 6e 20 5f 66 75 6e       return _fun
108a0 63 2e 5f 62 61 73 65 2e 43 6f 6e 74 65 78 74 43  c._base.ContextC
108b0 6f 6c 6c 61 74 65 43 6f 6d 70 61 72 65 28 45 6e  ollateCompare(En
108c0 63 6f 64 69 6e 67 2c 20 5f 66 75 6e 63 2e 5f 63  coding, _func._c
108d0 6f 6e 74 65 78 74 2c 20 73 31 2c 20 73 32 29 3b  ontext, s1, s2);
108e0 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
108f0 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
10900 20 20 2f 2f 2f 20 43 61 6c 6c 73 20 74 68 65 20    /// Calls the 
10910 62 61 73 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  base collating s
10920 65 71 75 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61  equence to compa
10930 72 65 20 74 77 6f 20 63 68 61 72 61 63 74 65 72  re two character
10940 20 61 72 72 61 79 73 0d 0a 20 20 20 20 2f 2f 2f   arrays..    ///
10950 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
10960 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
10970 3d 22 63 31 22 3e 54 68 65 20 66 69 72 73 74 20  ="c1">The first 
10980 61 72 72 61 79 20 74 6f 20 63 6f 6d 70 61 72 65  array to compare
10990 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
109a0 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
109b0 32 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 61 72  2">The second ar
109c0 72 61 79 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f  ray to compare</
109d0 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
109e0 3c 72 65 74 75 72 6e 73 3e 2d 31 20 69 66 20 63  <returns>-1 if c
109f0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 63  1 is less than c
10a00 32 2c 20 30 20 69 66 20 63 31 20 69 73 20 65 71  2, 0 if c1 is eq
10a10 75 61 6c 20 74 6f 20 63 32 2c 20 61 6e 64 20 31  ual to c2, and 1
10a20 20 69 66 20 63 31 20 69 73 20 67 72 65 61 74 65   if c1 is greate
10a30 72 20 74 68 61 6e 20 63 32 3c 2f 72 65 74 75 72  r than c2</retur
10a40 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  ns>..    public 
10a50 69 6e 74 20 43 6f 6d 70 61 72 65 28 63 68 61 72  int Compare(char
10a60 5b 5d 20 63 31 2c 20 63 68 61 72 5b 5d 20 63 32  [] c1, char[] c2
10a70 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
10a80 72 65 74 75 72 6e 20 5f 66 75 6e 63 2e 5f 62 61  return _func._ba
10a90 73 65 2e 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74  se.ContextCollat
10aa0 65 43 6f 6d 70 61 72 65 28 45 6e 63 6f 64 69 6e  eCompare(Encodin
10ab0 67 2c 20 5f 66 75 6e 63 2e 5f 63 6f 6e 74 65 78  g, _func._contex
10ac0 74 2c 20 63 31 2c 20 63 32 29 3b 0d 0a 20 20 20  t, c1, c2);..   
10ad0 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a               }..  }..}..