System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 926f41fc3ef3c12dd3392171c5443fdbaf5e40b8:


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 7e 53 51 4c 69 74 65 46 75 6e 63 74 69 6f    ~SQLiteFunctio
1d60: 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  n()..    {..    
1d70: 20 20 20 20 44 69 73 70 6f 73 65 28 66 61 6c 73      Dispose(fals
1d80: 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  e);..    }..    
1d90: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
1da0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e00: 2f 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  /....    /// <su
1e10: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1e20: 52 65 74 75 72 6e 73 20 61 20 72 65 66 65 72 65  Returns a refere
1e30: 6e 63 65 20 74 6f 20 74 68 65 20 75 6e 64 65 72  nce to the under
1e40: 6c 79 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  lying connection
1e50: 27 73 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  's SQLiteConvert
1e60: 20 63 6c 61 73 73 2c 20 77 68 69 63 68 20 63 61   class, which ca
1e70: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6e  n be used to con
1e80: 76 65 72 74 0d 0a 20 20 20 20 2f 2f 2f 20 73 74  vert..    /// st
1e90: 72 69 6e 67 73 20 61 6e 64 20 44 61 74 65 54 69  rings and DateTi
1ea0: 6d 65 27 73 20 69 6e 74 6f 20 74 68 65 20 63 75  me's into the cu
1eb0: 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
1ec0: 27 73 20 65 6e 63 6f 64 69 6e 67 20 73 63 68 65  's encoding sche
1ed0: 6d 61 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ma...    /// </s
1ee0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 75 62  ummary>..    pub
1ef0: 6c 69 63 20 53 51 4c 69 74 65 43 6f 6e 76 65 72  lic SQLiteConver
1f00: 74 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 0d  t SQLiteConvert.
1f10: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 67 65  .    {..      ge
1f20: 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  t..      {..    
1f30: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
1f40: 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65  d();..        re
1f50: 74 75 72 6e 20 5f 62 61 73 65 3b 0d 0a 20 20 20  turn _base;..   
1f60: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
1f70: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1f80: 0d 0a 20 20 20 20 2f 2f 2f 20 53 63 61 6c 61 72  ..    /// Scalar
1f90: 20 66 75 6e 63 74 69 6f 6e 73 20 6f 76 65 72 72   functions overr
1fa0: 69 64 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  ide this method 
1fb0: 74 6f 20 64 6f 20 74 68 65 69 72 20 6d 61 67 69  to do their magi
1fc0: 63 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  c...    /// </su
1fd0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1fe0: 3c 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f  <remarks>..    /
1ff0: 2f 2f 20 50 61 72 61 6d 65 74 65 72 73 20 70 61  // Parameters pa
2000: 73 73 65 64 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ssed to function
2010: 73 20 68 61 76 65 20 6f 6e 6c 79 20 61 6e 20 61  s have only an a
2020: 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20 63 65  ffinity for a ce
2030: 72 74 61 69 6e 20 64 61 74 61 20 74 79 70 65 2c  rtain data type,
2040: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 75 6e 64   there is no und
2050: 65 72 6c 79 69 6e 67 20 73 63 68 65 6d 61 20 61  erlying schema a
2060: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 2f 2f  vailable..    //
2070: 2f 20 74 6f 20 66 6f 72 63 65 20 74 68 65 6d 20  / to force them 
2080: 69 6e 74 6f 20 61 20 63 65 72 74 61 69 6e 20 74  into a certain t
2090: 79 70 65 2e 20 20 54 68 65 72 65 66 6f 72 65 20  ype.  Therefore 
20a0: 74 68 65 20 6f 6e 6c 79 20 74 79 70 65 73 20 79  the only types y
20b0: 6f 75 20 77 69 6c 6c 20 65 76 65 72 20 73 65 65  ou will ever see
20c0: 20 61 73 20 70 61 72 61 6d 65 74 65 72 73 20 61   as parameters a
20d0: 72 65 0d 0a 20 20 20 20 2f 2f 2f 20 44 42 4e 75  re..    /// DBNu
20e0: 6c 6c 2e 56 61 6c 75 65 2c 20 49 6e 74 36 34 2c  ll.Value, Int64,
20f0: 20 44 6f 75 62 6c 65 2c 20 53 74 72 69 6e 67 20   Double, String 
2100: 6f 72 20 62 79 74 65 5b 5d 20 61 72 72 61 79 2e  or byte[] array.
2110: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61  ..    /// </rema
2120: 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  rks>..    /// <p
2130: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22  aram name="args"
2140: 3e 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66  >The arguments f
2150: 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74  or the command t
2160: 6f 20 70 72 6f 63 65 73 73 3c 2f 70 61 72 61 6d  o process</param
2170: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
2180: 72 6e 73 3e 59 6f 75 20 6d 61 79 20 72 65 74 75  rns>You may retu
2190: 72 6e 20 6d 6f 73 74 20 73 69 6d 70 6c 65 20 74  rn most simple t
21a0: 79 70 65 73 20 61 73 20 61 20 72 65 74 75 72 6e  ypes as a return
21b0: 20 76 61 6c 75 65 2c 20 6e 75 6c 6c 20 6f 72 20   value, null or 
21c0: 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 20 74 6f 20  DBNull.Value to 
21d0: 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 44 61 74  return null, Dat
21e0: 65 54 69 6d 65 2c 20 6f 72 0d 0a 20 20 20 20 2f  eTime, or..    /
21f0: 2f 2f 20 79 6f 75 20 6d 61 79 20 72 65 74 75 72  // you may retur
2200: 6e 20 61 6e 20 45 78 63 65 70 74 69 6f 6e 2d 64  n an Exception-d
2210: 65 72 69 76 65 64 20 63 6c 61 73 73 20 69 66 20  erived class if 
2220: 79 6f 75 20 77 69 73 68 20 74 6f 20 72 65 74 75  you wish to retu
2230: 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
2240: 51 4c 69 74 65 2e 20 20 44 6f 20 6e 6f 74 20 61  QLite.  Do not a
2250: 63 74 75 61 6c 6c 79 20 74 68 72 6f 77 20 74 68  ctually throw th
2260: 65 20 65 72 72 6f 72 2c 0d 0a 20 20 20 20 2f 2f  e error,..    //
2270: 2f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 69 74  / just return it
2280: 21 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  !</returns>..   
2290: 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c 20   public virtual 
22a0: 6f 62 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62  object Invoke(ob
22b0: 6a 65 63 74 5b 5d 20 61 72 67 73 29 0d 0a 20 20  ject[] args)..  
22c0: 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b    {..      Check
22d0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
22e0: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d     return null;.
22f0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
2300: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
2310: 20 2f 2f 2f 20 41 67 67 72 65 67 61 74 65 20 66   /// Aggregate f
2320: 75 6e 63 74 69 6f 6e 73 20 6f 76 65 72 72 69 64  unctions overrid
2330: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  e this method to
2340: 20 64 6f 20 74 68 65 69 72 20 6d 61 67 69 63 2e   do their magic.
2350: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
2360: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ary>..    /// <r
2370: 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f  emarks>..    ///
2380: 20 54 79 70 69 63 61 6c 6c 79 20 79 6f 75 27 6c   Typically you'l
2390: 6c 20 62 65 20 75 70 64 61 74 69 6e 67 20 77 68  l be updating wh
23a0: 61 74 65 76 65 72 20 79 6f 75 27 76 65 20 70 6c  atever you've pl
23b0: 61 63 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  aced in the cont
23c0: 65 78 74 44 61 74 61 20 66 69 65 6c 64 20 61 6e  extData field an
23d0: 64 20 72 65 74 75 72 6e 69 6e 67 20 61 73 20 71  d returning as q
23e0: 75 69 63 6b 6c 79 20 61 73 20 70 6f 73 73 69 62  uickly as possib
23f0: 6c 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72  le...    /// </r
2400: 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f  emarks>..    ///
2410: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72   <param name="ar
2420: 67 73 22 3e 54 68 65 20 61 72 67 75 6d 65 6e 74  gs">The argument
2430: 73 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e  s for the comman
2440: 64 20 74 6f 20 70 72 6f 63 65 73 73 3c 2f 70 61  d to process</pa
2450: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
2460: 61 72 61 6d 20 6e 61 6d 65 3d 22 73 74 65 70 4e  aram name="stepN
2470: 75 6d 62 65 72 22 3e 54 68 65 20 31 2d 62 61 73  umber">The 1-bas
2480: 65 64 20 73 74 65 70 20 6e 75 6d 62 65 72 2e 20  ed step number. 
2490: 20 54 68 69 73 20 69 73 20 69 6e 63 72 65 6d 65   This is increme
24a0: 6d 74 65 64 20 65 61 63 68 20 74 69 6d 65 20 74  mted each time t
24b0: 68 65 20 73 74 65 70 20 6d 65 74 68 6f 64 20 69  he step method i
24c0: 73 20 63 61 6c 6c 65 64 2e 3c 2f 70 61 72 61 6d  s called.</param
24d0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
24e0: 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44  m name="contextD
24f0: 61 74 61 22 3e 41 20 70 6c 61 63 65 68 6f 6c 64  ata">A placehold
2500: 65 72 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  er for implement
2510: 65 72 73 20 74 6f 20 73 74 6f 72 65 20 63 6f 6e  ers to store con
2520: 74 65 78 74 75 61 6c 20 64 61 74 61 20 70 65 72  textual data per
2530: 74 61 69 6e 69 6e 67 20 74 6f 20 74 68 65 20 63  taining to the c
2540: 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 3c  urrent context.<
2550: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70 75 62  /param>..    pub
2560: 6c 69 63 20 76 69 72 74 75 61 6c 20 76 6f 69 64  lic virtual void
2570: 20 53 74 65 70 28 6f 62 6a 65 63 74 5b 5d 20 61   Step(object[] a
2580: 72 67 73 2c 20 69 6e 74 20 73 74 65 70 4e 75 6d  rgs, int stepNum
2590: 62 65 72 2c 20 72 65 66 20 6f 62 6a 65 63 74 20  ber, ref object 
25a0: 63 6f 6e 74 65 78 74 44 61 74 61 29 0d 0a 20 20  contextData)..  
25b0: 20 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b    {..      Check
25c0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
25d0: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
25e0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
25f0: 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
2600: 69 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 68  ions override th
2610: 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 66 69 6e  is method to fin
2620: 69 73 68 20 74 68 65 69 72 20 61 67 67 72 65 67  ish their aggreg
2630: 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0d  ate processing..
2640: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
2650: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ry>..    /// <re
2660: 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20  marks>..    /// 
2670: 49 66 20 79 6f 75 20 69 6d 70 6c 65 6d 65 6e 74  If you implement
2680: 65 64 20 79 6f 75 72 20 61 67 67 72 65 67 61 74  ed your aggregat
2690: 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 70 65  e function prope
26a0: 72 6c 79 2c 0d 0a 20 20 20 20 2f 2f 2f 20 79 6f  rly,..    /// yo
26b0: 75 27 76 65 20 62 65 65 6e 20 72 65 63 6f 72 64  u've been record
26c0: 69 6e 67 20 61 6e 64 20 6b 65 65 70 69 6e 67 20  ing and keeping 
26d0: 74 72 61 63 6b 20 6f 66 20 79 6f 75 72 20 64 61  track of your da
26e0: 74 61 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ta in the contex
26f0: 74 44 61 74 61 20 6f 62 6a 65 63 74 20 70 72 6f  tData object pro
2700: 76 69 64 65 64 2c 20 61 6e 64 20 6e 6f 77 20 61  vided, and now a
2710: 74 20 74 68 69 73 20 73 74 61 67 65 20 79 6f 75  t this stage you
2720: 20 73 68 6f 75 6c 64 20 68 61 76 65 0d 0a 20 20   should have..  
2730: 20 20 2f 2f 2f 20 61 6c 6c 20 74 68 65 20 69 6e    /// all the in
2740: 66 6f 72 6d 61 74 69 6f 6e 20 79 6f 75 20 6e 65  formation you ne
2750: 65 64 20 69 6e 20 74 68 65 72 65 20 74 6f 20 66  ed in there to f
2760: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
2770: 6f 20 72 65 74 75 72 6e 2e 0d 0a 20 20 20 20 2f  o return...    /
2780: 2f 2f 20 4e 4f 54 45 3a 20 20 49 74 20 69 73 20  // NOTE:  It is 
2790: 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 72 72 69  possible to arri
27a0: 76 65 20 68 65 72 65 20 77 69 74 68 6f 75 74 20  ve here without 
27b0: 72 65 63 65 69 76 69 6e 67 20 61 20 70 72 65 76  receiving a prev
27c0: 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 53 74 65  ious call to Ste
27d0: 70 28 29 2c 20 69 6e 20 77 68 69 63 68 20 63 61  p(), in which ca
27e0: 73 65 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61  se the contextDa
27f0: 74 61 20 77 69 6c 6c 0d 0a 20 20 20 20 2f 2f 2f  ta will..    ///
2800: 20 62 65 20 6e 75 6c 6c 2e 20 20 54 68 69 73 20   be null.  This 
2810: 63 61 6e 20 68 61 70 70 65 6e 20 77 68 65 6e 20  can happen when 
2820: 6e 6f 20 72 6f 77 73 20 77 65 72 65 20 72 65 74  no rows were ret
2830: 75 72 6e 65 64 2e 20 20 59 6f 75 20 63 61 6e 20  urned.  You can 
2840: 65 69 74 68 65 72 20 72 65 74 75 72 6e 20 6e 75  either return nu
2850: 6c 6c 2c 20 6f 72 20 30 20 6f 72 20 73 6f 6d 65  ll, or 0 or some
2860: 20 6f 74 68 65 72 20 63 75 73 74 6f 6d 20 72 65   other custom re
2870: 74 75 72 6e 20 76 61 6c 75 65 0d 0a 20 20 20 20  turn value..    
2880: 2f 2f 2f 20 69 66 20 74 68 61 74 20 69 73 20 74  /// if that is t
2890: 68 65 20 63 61 73 65 2e 0d 0a 20 20 20 20 2f 2f  he case...    //
28a0: 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20 20  / </remarks>..  
28b0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
28c0: 65 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e  e="contextData">
28d0: 59 6f 75 72 20 6f 77 6e 20 61 73 73 69 67 6e 65  Your own assigne
28e0: 64 20 63 6f 6e 74 65 78 74 44 61 74 61 2c 20 70  d contextData, p
28f0: 72 6f 76 69 64 65 64 20 66 6f 72 20 79 6f 75 20  rovided for you 
2900: 73 6f 20 79 6f 75 20 63 61 6e 20 72 65 74 75 72  so you can retur
2910: 6e 20 79 6f 75 72 20 66 69 6e 61 6c 20 72 65 73  n your final res
2920: 75 6c 74 73 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ults.</param>.. 
2930: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
2940: 59 6f 75 20 6d 61 79 20 72 65 74 75 72 6e 20 6d  You may return m
2950: 6f 73 74 20 73 69 6d 70 6c 65 20 74 79 70 65 73  ost simple types
2960: 20 61 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c   as a return val
2970: 75 65 2c 20 6e 75 6c 6c 20 6f 72 20 44 42 4e 75  ue, null or DBNu
2980: 6c 6c 2e 56 61 6c 75 65 20 74 6f 20 72 65 74 75  ll.Value to retu
2990: 72 6e 20 6e 75 6c 6c 2c 20 44 61 74 65 54 69 6d  rn null, DateTim
29a0: 65 2c 20 6f 72 0d 0a 20 20 20 20 2f 2f 2f 20 79  e, or..    /// y
29b0: 6f 75 20 6d 61 79 20 72 65 74 75 72 6e 20 61 6e  ou may return an
29c0: 20 45 78 63 65 70 74 69 6f 6e 2d 64 65 72 69 76   Exception-deriv
29d0: 65 64 20 63 6c 61 73 73 20 69 66 20 79 6f 75 20  ed class if you 
29e0: 77 69 73 68 20 74 6f 20 72 65 74 75 72 6e 20 61  wish to return a
29f0: 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74  n error to SQLit
2a00: 65 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61  e.  Do not actua
2a10: 6c 6c 79 20 74 68 72 6f 77 20 74 68 65 20 65 72  lly throw the er
2a20: 72 6f 72 2c 0d 0a 20 20 20 20 2f 2f 2f 20 6a 75  ror,..    /// ju
2a30: 73 74 20 72 65 74 75 72 6e 20 69 74 21 0d 0a 20  st return it!.. 
2a40: 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73     /// </returns
2a50: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 69  >..    public vi
2a60: 72 74 75 61 6c 20 6f 62 6a 65 63 74 20 46 69 6e  rtual object Fin
2a70: 61 6c 28 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78  al(object contex
2a80: 74 44 61 74 61 29 0d 0a 20 20 20 20 7b 0d 0a 20  tData)..    {.. 
2a90: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
2aa0: 65 64 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 74  ed();..      ret
2ab0: 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 7d  urn null;..    }
2ac0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
2ad0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 55  mary>..    /// U
2ae0: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c  ser-defined coll
2af0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
2b00: 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 6d 65  override this me
2b10: 74 68 6f 64 20 74 6f 20 70 72 6f 76 69 64 65 20  thod to provide 
2b20: 61 20 63 75 73 74 6f 6d 20 73 74 72 69 6e 67 20  a custom string 
2b30: 73 6f 72 74 69 6e 67 20 61 6c 67 6f 72 69 74 68  sorting algorith
2b40: 6d 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  m...    /// </su
2b50: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
2b60: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 61 72  <param name="par
2b70: 61 6d 31 22 3e 54 68 65 20 66 69 72 73 74 20 73  am1">The first s
2b80: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
2b90: 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  .</param>..    /
2ba0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
2bb0: 70 61 72 61 6d 32 22 3e 54 68 65 20 73 65 63 6f  param2">The seco
2bc0: 6e 64 20 73 74 72 6e 69 67 20 74 6f 20 63 6f 6d  nd strnig to com
2bd0: 70 61 72 65 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  pare.</param>.. 
2be0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
2bf0: 31 20 69 66 20 70 61 72 61 6d 31 20 69 73 20 67  1 if param1 is g
2c00: 72 65 61 74 65 72 20 74 68 61 6e 20 70 61 72 61  reater than para
2c10: 6d 32 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  m2, 0 if they ar
2c20: 65 20 65 71 75 61 6c 2c 20 6f 72 20 2d 31 20 69  e equal, or -1 i
2c30: 66 20 70 61 72 61 6d 31 20 69 73 20 6c 65 73 73  f param1 is less
2c40: 20 74 68 61 6e 20 70 61 72 61 6d 32 2e 3c 2f 72   than param2.</r
2c50: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62  eturns>..    pub
2c60: 6c 69 63 20 76 69 72 74 75 61 6c 20 69 6e 74 20  lic virtual int 
2c70: 43 6f 6d 70 61 72 65 28 73 74 72 69 6e 67 20 70  Compare(string p
2c80: 61 72 61 6d 31 2c 20 73 74 72 69 6e 67 20 70 61  aram1, string pa
2c90: 72 61 6d 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ram2)..    {..  
2ca0: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
2cb0: 64 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75  d();..      retu
2cc0: 72 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  rn 0;..    }....
2cd0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
2ce0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e 76 65  >..    /// Conve
2cf0: 72 74 73 20 61 6e 20 49 6e 74 50 74 72 20 61 72  rts an IntPtr ar
2d00: 72 61 79 20 6f 66 20 63 6f 6e 74 65 78 74 20 61  ray of context a
2d10: 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 6e 20 6f  rguments to an o
2d20: 62 6a 65 63 74 20 61 72 72 61 79 20 63 6f 6e 74  bject array cont
2d30: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 6f 6c  aining the resol
2d40: 76 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 74  ved parameters t
2d50: 68 65 20 70 6f 69 6e 74 65 72 73 20 70 6f 69 6e  he pointers poin
2d60: 74 20 74 6f 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  t to...    /// <
2d70: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
2d80: 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d 0a 20 20  // <remarks>..  
2d90: 20 20 2f 2f 2f 20 50 61 72 61 6d 65 74 65 72 73    /// Parameters
2da0: 20 70 61 73 73 65 64 20 74 6f 20 66 75 6e 63 74   passed to funct
2db0: 69 6f 6e 73 20 68 61 76 65 20 6f 6e 6c 79 20 61  ions have only a
2dc0: 6e 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 61  n affinity for a
2dd0: 20 63 65 72 74 61 69 6e 20 64 61 74 61 20 74 79   certain data ty
2de0: 70 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  pe, there is no 
2df0: 75 6e 64 65 72 6c 79 69 6e 67 20 73 63 68 65 6d  underlying schem
2e00: 61 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20  a available..   
2e10: 20 2f 2f 2f 20 74 6f 20 66 6f 72 63 65 20 74 68   /// to force th
2e20: 65 6d 20 69 6e 74 6f 20 61 20 63 65 72 74 61 69  em into a certai
2e30: 6e 20 74 79 70 65 2e 20 20 54 68 65 72 65 66 6f  n type.  Therefo
2e40: 72 65 20 74 68 65 20 6f 6e 6c 79 20 74 79 70 65  re the only type
2e50: 73 20 79 6f 75 20 77 69 6c 6c 20 65 76 65 72 20  s you will ever 
2e60: 73 65 65 20 61 73 20 70 61 72 61 6d 65 74 65 72  see as parameter
2e70: 73 20 61 72 65 0d 0a 20 20 20 20 2f 2f 2f 20 44  s are..    /// D
2e80: 42 4e 75 6c 6c 2e 56 61 6c 75 65 2c 20 49 6e 74  BNull.Value, Int
2e90: 36 34 2c 20 44 6f 75 62 6c 65 2c 20 53 74 72 69  64, Double, Stri
2ea0: 6e 67 20 6f 72 20 62 79 74 65 5b 5d 20 61 72 72  ng or byte[] arr
2eb0: 61 79 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72  ay...    /// </r
2ec0: 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f  emarks>..    ///
2ed0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41   <param name="nA
2ee0: 72 67 73 22 3e 54 68 65 20 6e 75 6d 62 65 72 20  rgs">The number 
2ef0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 3c 2f 70 61  of arguments</pa
2f00: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
2f10: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 70  aram name="argsp
2f20: 74 72 22 3e 41 20 70 6f 69 6e 74 65 72 20 74 6f  tr">A pointer to
2f30: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72   the array of ar
2f40: 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0d  guments</param>.
2f50: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
2f60: 73 3e 41 6e 20 6f 62 6a 65 63 74 20 61 72 72 61  s>An object arra
2f70: 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  y of the argumen
2f80: 74 73 20 6f 6e 63 65 20 74 68 65 79 27 76 65 20  ts once they've 
2f90: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
2fa0: 6f 20 2e 4e 45 54 20 76 61 6c 75 65 73 3c 2f 72  o .NET values</r
2fb0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74  eturns>..    int
2fc0: 65 72 6e 61 6c 20 6f 62 6a 65 63 74 5b 5d 20 43  ernal object[] C
2fd0: 6f 6e 76 65 72 74 50 61 72 61 6d 73 28 69 6e 74  onvertParams(int
2fe0: 20 6e 41 72 67 73 2c 20 49 6e 74 50 74 72 20 61   nArgs, IntPtr a
2ff0: 72 67 73 70 74 72 29 0d 0a 20 20 20 20 7b 0d 0a  rgsptr)..    {..
3000: 20 20 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 70        object[] p
3010: 61 72 6d 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63  arms = new objec
3020: 74 5b 6e 41 72 67 73 5d 3b 0d 0a 23 69 66 20 21  t[nArgs];..#if !
3030: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
3040: 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 20  FRAMEWORK..     
3050: 20 49 6e 74 50 74 72 5b 5d 20 61 72 67 69 6e 74   IntPtr[] argint
3060: 20 3d 20 6e 65 77 20 49 6e 74 50 74 72 5b 6e 41   = new IntPtr[nA
3070: 72 67 73 5d 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  rgs];..#else..  
3080: 20 20 20 20 69 6e 74 5b 5d 20 61 72 67 69 6e 74      int[] argint
3090: 20 3d 20 6e 65 77 20 69 6e 74 5b 6e 41 72 67 73   = new int[nArgs
30a0: 5d 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20  ];..#endif..    
30b0: 20 20 4d 61 72 73 68 61 6c 2e 43 6f 70 79 28 61    Marshal.Copy(a
30c0: 72 67 73 70 74 72 2c 20 61 72 67 69 6e 74 2c 20  rgsptr, argint, 
30d0: 30 2c 20 6e 41 72 67 73 29 3b 0d 0a 0d 0a 20 20  0, nArgs);....  
30e0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d      for (int n =
30f0: 20 30 3b 20 6e 20 3c 20 6e 41 72 67 73 3b 20 6e   0; n < nArgs; n
3100: 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ++)..      {..  
3110: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 5f 62        switch (_b
3120: 61 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75  ase.GetParamValu
3130: 65 54 79 70 65 28 28 49 6e 74 50 74 72 29 61 72  eType((IntPtr)ar
3140: 67 69 6e 74 5b 6e 5d 29 29 0d 0a 20 20 20 20 20  gint[n]))..     
3150: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3160: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
3170: 79 2e 4e 75 6c 6c 3a 0d 0a 20 20 20 20 20 20 20  y.Null:..       
3180: 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20       parms[n] = 
3190: 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 3b 0d 0a 20  DBNull.Value;.. 
31a0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
31b0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ;..          cas
31c0: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 49  e TypeAffinity.I
31d0: 6e 74 36 34 3a 0d 0a 20 20 20 20 20 20 20 20 20  nt64:..         
31e0: 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f 62     parms[n] = _b
31f0: 61 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75  ase.GetParamValu
3200: 65 49 6e 74 36 34 28 28 49 6e 74 50 74 72 29 61  eInt64((IntPtr)a
3210: 72 67 69 6e 74 5b 6e 5d 29 3b 0d 0a 20 20 20 20  rgint[n]);..    
3220: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
3230: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
3240: 79 70 65 41 66 66 69 6e 69 74 79 2e 44 6f 75 62  ypeAffinity.Doub
3250: 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le:..           
3260: 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73   parms[n] = _bas
3270: 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 44  e.GetParamValueD
3280: 6f 75 62 6c 65 28 28 49 6e 74 50 74 72 29 61 72  ouble((IntPtr)ar
3290: 67 69 6e 74 5b 6e 5d 29 3b 0d 0a 20 20 20 20 20  gint[n]);..     
32a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
32b0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79           case Ty
32c0: 70 65 41 66 66 69 6e 69 74 79 2e 54 65 78 74 3a  peAffinity.Text:
32d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
32e0: 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47  rms[n] = _base.G
32f0: 65 74 50 61 72 61 6d 56 61 6c 75 65 54 65 78 74  etParamValueText
3300: 28 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74 5b  ((IntPtr)argint[
3310: 6e 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n]);..          
3320: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
3330: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
3340: 69 6e 69 74 79 2e 42 6c 6f 62 3a 0d 0a 20 20 20  inity.Blob:..   
3350: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3360: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 3b            int x;
3370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3380: 62 79 74 65 5b 5d 20 62 6c 6f 62 3b 0d 0a 0d 0a  byte[] blob;....
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 20                x 
33a0: 3d 20 28 69 6e 74 29 5f 62 61 73 65 2e 47 65 74  = (int)_base.Get
33b0: 50 61 72 61 6d 56 61 6c 75 65 42 79 74 65 73 28  ParamValueBytes(
33c0: 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e  (IntPtr)argint[n
33d0: 5d 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c 20 30  ], 0, null, 0, 0
33e0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
33f0: 20 20 62 6c 6f 62 20 3d 20 6e 65 77 20 62 79 74    blob = new byt
3400: 65 5b 78 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20  e[x];..         
3410: 20 20 20 20 20 5f 62 61 73 65 2e 47 65 74 50 61       _base.GetPa
3420: 72 61 6d 56 61 6c 75 65 42 79 74 65 73 28 28 49  ramValueBytes((I
3430: 6e 74 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 2c  ntPtr)argint[n],
3440: 20 30 2c 20 62 6c 6f 62 2c 20 30 2c 20 78 29 3b   0, blob, 0, x);
3450: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3460: 70 61 72 6d 73 5b 6e 5d 20 3d 20 62 6c 6f 62 3b  parms[n] = blob;
3470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
3480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
3490: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ak;..          c
34a0: 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79  ase TypeAffinity
34b0: 2e 44 61 74 65 54 69 6d 65 3a 20 2f 2f 20 4e 65  .DateTime: // Ne
34c0: 76 65 72 20 68 61 70 70 65 6e 73 20 68 65 72 65  ver happens here
34d0: 20 62 75 74 20 77 68 61 74 20 74 68 65 20 68 65   but what the he
34e0: 63 6b 2c 20 6d 61 79 62 65 20 69 74 20 77 69 6c  ck, maybe it wil
34f0: 6c 20 6f 6e 65 20 64 61 79 2e 0d 0a 20 20 20 20  l one day...    
3500: 20 20 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d          parms[n]
3510: 20 3d 20 5f 62 61 73 65 2e 54 6f 44 61 74 65 54   = _base.ToDateT
3520: 69 6d 65 28 5f 62 61 73 65 2e 47 65 74 50 61 72  ime(_base.GetPar
3530: 61 6d 56 61 6c 75 65 54 65 78 74 28 28 49 6e 74  amValueText((Int
3540: 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 29 3b  Ptr)argint[n]));
3550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ..            br
3560: 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  eak;..        }.
3570: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
3580: 72 65 74 75 72 6e 20 70 61 72 6d 73 3b 0d 0a 20  return parms;.. 
3590: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
35a0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
35b0: 2f 2f 20 54 61 6b 65 73 20 74 68 65 20 72 65 74  // Takes the ret
35c0: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 49  urn value from I
35d0: 6e 76 6f 6b 65 28 29 20 61 6e 64 20 46 69 6e 61  nvoke() and Fina
35e0: 6c 28 29 20 61 6e 64 20 66 69 67 75 72 65 73 20  l() and figures 
35f0: 6f 75 74 20 68 6f 77 20 74 6f 20 72 65 74 75 72  out how to retur
3600: 6e 20 69 74 20 74 6f 20 53 51 4c 69 74 65 27 73  n it to SQLite's
3610: 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 2f   context...    /
3620: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
3630: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
3640: 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e 54 68 65  me="context">The
3650: 20 63 6f 6e 74 65 78 74 20 74 68 65 20 72 65 74   context the ret
3660: 75 72 6e 20 76 61 6c 75 65 20 61 70 70 6c 69 65  urn value applie
3670: 73 20 74 6f 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  s to</param>..  
3680: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
3690: 65 3d 22 72 65 74 75 72 6e 56 61 6c 75 65 22 3e  e="returnValue">
36a0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  The parameter to
36b0: 20 72 65 74 75 72 6e 20 74 6f 20 53 51 4c 69 74   return to SQLit
36c0: 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 70  e</param>..    p
36d0: 72 69 76 61 74 65 20 76 6f 69 64 20 53 65 74 52  rivate void SetR
36e0: 65 74 75 72 6e 56 61 6c 75 65 28 49 6e 74 50 74  eturnValue(IntPt
36f0: 72 20 63 6f 6e 74 65 78 74 2c 20 6f 62 6a 65 63  r context, objec
3700: 74 20 72 65 74 75 72 6e 56 61 6c 75 65 29 0d 0a  t returnValue)..
3710: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20      {..      if 
3720: 28 72 65 74 75 72 6e 56 61 6c 75 65 20 3d 3d 20  (returnValue == 
3730: 6e 75 6c 6c 20 7c 7c 20 72 65 74 75 72 6e 56 61  null || returnVa
3740: 6c 75 65 20 3d 3d 20 44 42 4e 75 6c 6c 2e 56 61  lue == DBNull.Va
3750: 6c 75 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  lue)..      {.. 
3760: 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74         _base.Ret
3770: 75 72 6e 4e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  urnNull(context)
3780: 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ;..        retur
3790: 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n;..      }.... 
37a0: 20 20 20 20 20 54 79 70 65 20 74 20 3d 20 72 65       Type t = re
37b0: 74 75 72 6e 56 61 6c 75 65 2e 47 65 74 54 79 70  turnValue.GetTyp
37c0: 65 28 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  e();..      if (
37d0: 74 20 3d 3d 20 74 79 70 65 6f 66 28 44 61 74 65  t == typeof(Date
37e0: 54 69 6d 65 29 29 0d 0a 20 20 20 20 20 20 7b 0d  Time))..      {.
37f0: 0a 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52  .        _base.R
3800: 65 74 75 72 6e 54 65 78 74 28 63 6f 6e 74 65 78  eturnText(contex
3810: 74 2c 20 5f 62 61 73 65 2e 54 6f 53 74 72 69 6e  t, _base.ToStrin
3820: 67 28 28 44 61 74 65 54 69 6d 65 29 72 65 74 75  g((DateTime)retu
3830: 72 6e 56 61 6c 75 65 29 29 3b 0d 0a 20 20 20 20  rnValue));..    
3840: 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20      return;..   
3850: 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65     }..      else
3860: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
3870: 20 20 20 45 78 63 65 70 74 69 6f 6e 20 72 20 3d     Exception r =
3880: 20 72 65 74 75 72 6e 56 61 6c 75 65 20 61 73 20   returnValue as 
3890: 45 78 63 65 70 74 69 6f 6e 3b 0d 0a 0d 0a 20 20  Exception;....  
38a0: 20 20 20 20 20 20 69 66 20 28 72 20 21 3d 20 6e        if (r != n
38b0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ull)..        {.
38c0: 0a 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65  .          _base
38d0: 2e 52 65 74 75 72 6e 45 72 72 6f 72 28 63 6f 6e  .ReturnError(con
38e0: 74 65 78 74 2c 20 72 2e 4d 65 73 73 61 67 65 29  text, r.Message)
38f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ;..          ret
3900: 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  urn;..        }.
3910: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
3920: 20 20 73 77 69 74 63 68 20 28 53 51 4c 69 74 65    switch (SQLite
3930: 43 6f 6e 76 65 72 74 2e 54 79 70 65 54 6f 41 66  Convert.TypeToAf
3940: 66 69 6e 69 74 79 28 74 29 29 0d 0a 20 20 20 20  finity(t))..    
3950: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73    {..        cas
3960: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 4e  e TypeAffinity.N
3970: 75 6c 6c 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ull:..          
3980: 5f 62 61 73 65 2e 52 65 74 75 72 6e 4e 75 6c 6c  _base.ReturnNull
3990: 28 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20  (context);..    
39a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20        return;.. 
39b0: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
39c0: 41 66 66 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0d  Affinity.Int64:.
39d0: 0a 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65  .          _base
39e0: 2e 52 65 74 75 72 6e 49 6e 74 36 34 28 63 6f 6e  .ReturnInt64(con
39f0: 74 65 78 74 2c 20 43 6f 6e 76 65 72 74 2e 54 6f  text, Convert.To
3a00: 49 6e 74 36 34 28 72 65 74 75 72 6e 56 61 6c 75  Int64(returnValu
3a10: 65 2c 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43  e, CultureInfo.C
3a20: 75 72 72 65 6e 74 43 75 6c 74 75 72 65 29 29 3b  urrentCulture));
3a30: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
3a40: 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73  rn;..        cas
3a50: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 44  e TypeAffinity.D
3a60: 6f 75 62 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20  ouble:..        
3a70: 20 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 44 6f    _base.ReturnDo
3a80: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 43 6f  uble(context, Co
3a90: 6e 76 65 72 74 2e 54 6f 44 6f 75 62 6c 65 28 72  nvert.ToDouble(r
3aa0: 65 74 75 72 6e 56 61 6c 75 65 2c 20 43 75 6c 74  eturnValue, Cult
3ab0: 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43  ureInfo.CurrentC
3ac0: 75 6c 74 75 72 65 29 29 3b 0d 0a 20 20 20 20 20  ulture));..     
3ad0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20       return;..  
3ae0: 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41        case TypeA
3af0: 66 66 69 6e 69 74 79 2e 54 65 78 74 3a 0d 0a 20  ffinity.Text:.. 
3b00: 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52           _base.R
3b10: 65 74 75 72 6e 54 65 78 74 28 63 6f 6e 74 65 78  eturnText(contex
3b20: 74 2c 20 72 65 74 75 72 6e 56 61 6c 75 65 2e 54  t, returnValue.T
3b30: 6f 53 74 72 69 6e 67 28 29 29 3b 0d 0a 20 20 20  oString());..   
3b40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a         return;..
3b50: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70          case Typ
3b60: 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62 3a 0d  eAffinity.Blob:.
3b70: 0a 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65  .          _base
3b80: 2e 52 65 74 75 72 6e 42 6c 6f 62 28 63 6f 6e 74  .ReturnBlob(cont
3b90: 65 78 74 2c 20 28 62 79 74 65 5b 5d 29 72 65 74  ext, (byte[])ret
3ba0: 75 72 6e 56 61 6c 75 65 29 3b 0d 0a 20 20 20 20  urnValue);..    
3bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20        return;.. 
3bc0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
3bd0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
3be0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65  y>..    /// Inte
3bf0: 72 6e 61 6c 20 73 63 61 6c 61 72 20 63 61 6c 6c  rnal scalar call
3c00: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2c 20 77  back function, w
3c10: 68 69 63 68 20 77 72 61 70 73 20 74 68 65 20 72  hich wraps the r
3c20: 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74  aw context point
3c30: 65 72 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 65  er and calls the
3c40: 20 76 69 72 74 75 61 6c 20 49 6e 76 6f 6b 65 28   virtual Invoke(
3c50: 29 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 2f  ) method...    /
3c60: 2f 2f 20 57 41 52 4e 49 4e 47 3a 20 4d 75 73 74  // WARNING: Must
3c70: 20 6e 6f 74 20 74 68 72 6f 77 20 65 78 63 65 70   not throw excep
3c80: 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20  tions...    /// 
3c90: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
3ca0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
3cb0: 22 63 6f 6e 74 65 78 74 22 3e 41 20 72 61 77 20  "context">A raw 
3cc0: 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 3c  context pointer<
3cd0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
3ce0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41   <param name="nA
3cf0: 72 67 73 22 3e 4e 75 6d 62 65 72 20 6f 66 20 61  rgs">Number of a
3d00: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
3d10: 69 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  in</param>..    
3d20: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
3d30: 22 61 72 67 73 70 74 72 22 3e 41 20 70 6f 69 6e  "argsptr">A poin
3d40: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
3d50: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 3c 2f 70   of arguments</p
3d60: 61 72 61 6d 3e 0d 0a 20 20 20 20 69 6e 74 65 72  aram>..    inter
3d70: 6e 61 6c 20 76 6f 69 64 20 53 63 61 6c 61 72 43  nal void ScalarC
3d80: 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63  allback(IntPtr c
3d90: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 6e 41 72 67  ontext, int nArg
3da0: 73 2c 20 49 6e 74 50 74 72 20 61 72 67 73 70 74  s, IntPtr argspt
3db0: 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  r)..    {..     
3dc0: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20     try..        
3dd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f  {..            _
3de0: 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 78  context = contex
3df0: 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
3e00: 53 65 74 52 65 74 75 72 6e 56 61 6c 75 65 28 63  SetReturnValue(c
3e10: 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 20  ontext,..       
3e20: 20 20 20 20 20 20 20 20 20 49 6e 76 6f 6b 65 28           Invoke(
3e30: 43 6f 6e 76 65 72 74 50 61 72 61 6d 73 28 6e 41  ConvertParams(nA
3e40: 72 67 73 2c 20 61 72 67 73 70 74 72 29 29 29 3b  rgs, argsptr)));
3e50: 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20   /* throw */..  
3e60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3e70: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
3e80: 6e 20 65 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75  n e) /* NOTE: Mu
3e90: 73 74 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f  st catch ALL. */
3ea0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
3eb0: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
3ec0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3ee0: 28 28 5f 66 6c 61 67 73 20 26 20 53 51 4c 69 74  ((_flags & SQLit
3ef0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  eConnectionFlags
3f00: 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63 65  .LogCallbackExce
3f10: 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20  ption) ==..     
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
3f40: 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c  ionFlags.LogCall
3f50: 62 61 63 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a  backException)..
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3f80: 20 20 20 20 20 20 20 53 51 4c 69 74 65 4c 6f 67         SQLiteLog
3f90: 2e 4c 6f 67 4d 65 73 73 61 67 65 28 53 51 4c 69  .LogMessage(SQLi
3fa0: 74 65 42 61 73 65 2e 43 4f 52 5f 45 5f 45 58 43  teBase.COR_E_EXC
3fb0: 45 50 54 49 4f 4e 2c 0d 0a 20 20 20 20 20 20 20  EPTION,..       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 43   String.Format(C
3fe0: 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65  ultureInfo.Curre
3ff0: 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20  ntCulture,..    
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 22 43 61 75 67 68 74 20 65 78 63 65      "Caught exce
4020: 70 74 69 6f 6e 20 69 6e 20 5c 22 49 6e 76 6f 6b  ption in \"Invok
4030: 65 5c 22 20 6d 65 74 68 6f 64 3a 20 7b 30 7d 22  e\" method: {0}"
4040: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
4050: 20 20 20 20 20 20 20 20 20 20 20 65 29 29 3b 20             e)); 
4060: 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
4080: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
4090: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
40a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
40b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
40c0: 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d   // do nothing..
40d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
40e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d          }..    }
40f0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
4100: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49  mary>..    /// I
4110: 6e 74 65 72 6e 61 6c 20 63 6f 6c 6c 61 74 69 6e  nternal collatin
4120: 67 20 73 65 71 75 65 6e 63 65 20 66 75 6e 63 74  g sequence funct
4130: 69 6f 6e 2c 20 77 68 69 63 68 20 77 72 61 70 73  ion, which wraps
4140: 20 75 70 20 74 68 65 20 72 61 77 20 73 74 72 69   up the raw stri
4150: 6e 67 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ng pointers and 
4160: 65 78 65 63 75 74 65 73 20 74 68 65 20 43 6f 6d  executes the Com
4170: 70 61 72 65 28 29 20 76 69 72 74 75 61 6c 20 66  pare() virtual f
4180: 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f  unction...    //
4190: 2f 20 57 41 52 4e 49 4e 47 3a 20 4d 75 73 74 20  / WARNING: Must 
41a0: 6e 6f 74 20 74 68 72 6f 77 20 65 78 63 65 70 74  not throw except
41b0: 69 6f 6e 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ions...    /// <
41c0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
41d0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
41e0: 70 74 72 22 3e 4e 6f 74 20 75 73 65 64 3c 2f 70  ptr">Not used</p
41f0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
4200: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e 31  param name="len1
4210: 22 3e 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  ">Length of the 
4220: 73 74 72 69 6e 67 20 70 76 31 3c 2f 70 61 72 61  string pv1</para
4230: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
4240: 61 6d 20 6e 61 6d 65 3d 22 70 74 72 31 22 3e 50  am name="ptr1">P
4250: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
4260: 72 73 74 20 73 74 72 69 6e 67 20 74 6f 20 63 6f  rst string to co
4270: 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20  mpare</param>.. 
4280: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
4290: 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e 67 74 68  me="len2">Length
42a0: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70   of the string p
42b0: 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  v2</param>..    
42c0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
42d0: 22 70 74 72 32 22 3e 50 6f 69 6e 74 65 72 20 74  "ptr2">Pointer t
42e0: 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 73 74 72  o the second str
42f0: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f  ing to compare</
4300: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
4310: 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e 73  <returns>Returns
4320: 20 2d 31 20 69 66 20 74 68 65 20 66 69 72 73 74   -1 if the first
4330: 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 20   string is less 
4340: 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e  than the second.
4350: 20 20 30 20 69 66 20 74 68 65 79 20 61 72 65 20    0 if they are 
4360: 65 71 75 61 6c 2c 20 6f 72 20 31 20 69 66 20 74  equal, or 1 if t
4370: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
4380: 69 73 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20  is greater..    
4390: 2f 2f 2f 20 74 68 61 6e 20 74 68 65 20 73 65 63  /// than the sec
43a0: 6f 6e 64 2e 20 20 52 65 74 75 72 6e 73 20 30 20  ond.  Returns 0 
43b0: 69 66 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  if an exception 
43c0: 69 73 20 63 61 75 67 68 74 2e 3c 2f 72 65 74 75  is caught.</retu
43d0: 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e  rns>..    intern
43e0: 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 43 61  al int CompareCa
43f0: 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 70 74  llback(IntPtr pt
4400: 72 2c 20 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74  r, int len1, Int
4410: 50 74 72 20 70 74 72 31 2c 20 69 6e 74 20 6c 65  Ptr ptr1, int le
4420: 6e 32 2c 20 49 6e 74 50 74 72 20 70 74 72 32 29  n2, IntPtr ptr2)
4430: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
4440: 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d   try..        {.
4450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
4460: 75 72 6e 20 43 6f 6d 70 61 72 65 28 53 51 4c 69  urn Compare(SQLi
4470: 74 65 43 6f 6e 76 65 72 74 2e 55 54 46 38 54 6f  teConvert.UTF8To
4480: 53 74 72 69 6e 67 28 70 74 72 31 2c 20 6c 65 6e  String(ptr1, len
4490: 31 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  1),..           
44a0: 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 76 65       SQLiteConve
44b0: 72 74 2e 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rt.UTF8ToString(
44c0: 70 74 72 32 2c 20 6c 65 6e 32 29 29 3b 20 2f 2a  ptr2, len2)); /*
44d0: 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20   throw */..     
44e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 61     }..        ca
44f0: 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65  tch (Exception e
4500: 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20  ) /* NOTE: Must 
4510: 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20  catch ALL. */.. 
4520: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
4530: 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
4540: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
4550: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f            if ((_
4560: 66 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43 6f  flags & SQLiteCo
4570: 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f  nnectionFlags.Lo
4580: 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69  gCallbackExcepti
4590: 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20  on) ==..        
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
45c0: 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63  Flags.LogCallbac
45d0: 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20  kException)..   
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f      SQLiteLog.Lo
4610: 67 4d 65 73 73 61 67 65 28 53 51 4c 69 74 65 42  gMessage(SQLiteB
4620: 61 73 65 2e 43 4f 52 5f 45 5f 45 58 43 45 50 54  ase.COR_E_EXCEPT
4630: 49 4f 4e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ION,..          
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
4650: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 43 75 6c 74  ring.Format(Cult
4660: 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43  ureInfo.CurrentC
4670: 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20 20 20  ulture,..       
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 22 43 61 75 67 68 74 20 65 78 63 65 70 74 69   "Caught excepti
46a0: 6f 6e 20 69 6e 20 5c 22 43 6f 6d 70 61 72 65 5c  on in \"Compare\
46b0: 22 20 28 55 54 46 38 29 20 6d 65 74 68 6f 64 3a  " (UTF8) method:
46c0: 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  e)); /* throw */
46f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4700: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4710: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4720: 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  catch..         
4730: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4740: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
4750: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
4760: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
4770: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20  ..        //..  
4780: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54        // NOTE: T
4790: 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
47a0: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
47b0: 63 6f 72 65 20 53 51 4c 69 74 65 20 6c 69 62 72  core SQLite libr
47c0: 61 72 79 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20  ary from..      
47d0: 20 20 2f 2f 20 20 20 20 20 20 20 75 73 69 6e 67    //       using
47e0: 20 6f 75 72 20 28 69 6e 76 61 6c 69 64 29 20 72   our (invalid) r
47f0: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20  esult...        
4800: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  //..        if (
4810: 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c 6c 29 20  (_base != null) 
4820: 26 26 20 5f 62 61 73 65 2e 49 73 4f 70 65 6e 28  && _base.IsOpen(
4830: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
4840: 5f 62 61 73 65 2e 43 61 6e 63 65 6c 28 29 3b 0d  _base.Cancel();.
4850: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
4860: 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  n 0;..    }.... 
4870: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
4880: 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72 6e  ..    /// Intern
4890: 61 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  al collating seq
48a0: 75 65 6e 63 65 20 66 75 6e 63 74 69 6f 6e 2c 20  uence function, 
48b0: 77 68 69 63 68 20 77 72 61 70 73 20 75 70 20 74  which wraps up t
48c0: 68 65 20 72 61 77 20 73 74 72 69 6e 67 20 70 6f  he raw string po
48d0: 69 6e 74 65 72 73 20 61 6e 64 20 65 78 65 63 75  inters and execu
48e0: 74 65 73 20 74 68 65 20 43 6f 6d 70 61 72 65 28  tes the Compare(
48f0: 29 20 76 69 72 74 75 61 6c 20 66 75 6e 63 74 69  ) virtual functi
4900: 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52  on...    /// WAR
4910: 4e 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74  NING: Must not t
4920: 68 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e  hrow exceptions.
4930: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
4940: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ary>..    /// <p
4950: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 22 3e  aram name="ptr">
4960: 4e 6f 74 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e  Not used</param>
4970: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
4980: 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c 65 6e   name="len1">Len
4990: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
49a0: 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e 0d 0a 20  g pv1</param>.. 
49b0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
49c0: 6d 65 3d 22 70 74 72 31 22 3e 50 6f 69 6e 74 65  me="ptr1">Pointe
49d0: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  r to the first s
49e0: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
49f0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
4a00: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c  / <param name="l
4a10: 65 6e 32 22 3e 4c 65 6e 67 74 68 20 6f 66 20 74  en2">Length of t
4a20: 68 65 20 73 74 72 69 6e 67 20 70 76 32 3c 2f 70  he string pv2</p
4a30: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
4a40: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 32  param name="ptr2
4a50: 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  ">Pointer to the
4a60: 20 73 65 63 6f 6e 64 20 73 74 72 69 6e 67 20 74   second string t
4a70: 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d  o compare</param
4a80: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
4a90: 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31 20 69  rns>Returns -1 i
4aa0: 66 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69  f the first stri
4ab0: 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ng is less than 
4ac0: 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30 20 69  the second.  0 i
4ad0: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
4ae0: 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69  , or 1 if the fi
4af0: 72 73 74 20 73 74 72 69 6e 67 20 69 73 20 67 72  rst string is gr
4b00: 65 61 74 65 72 0d 0a 20 20 20 20 2f 2f 2f 20 74  eater..    /// t
4b10: 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 20  han the second. 
4b20: 20 52 65 74 75 72 6e 73 20 30 20 69 66 20 61 6e   Returns 0 if an
4b30: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 63 61   exception is ca
4b40: 75 67 68 74 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d  ught.</returns>.
4b50: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e  .    internal in
4b60: 74 20 43 6f 6d 70 61 72 65 43 61 6c 6c 62 61 63  t CompareCallbac
4b70: 6b 31 36 28 49 6e 74 50 74 72 20 70 74 72 2c 20  k16(IntPtr ptr, 
4b80: 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74 72  int len1, IntPtr
4b90: 20 70 74 72 31 2c 20 69 6e 74 20 6c 65 6e 32 2c   ptr1, int len2,
4ba0: 20 49 6e 74 50 74 72 20 70 74 72 32 29 0d 0a 20   IntPtr ptr2).. 
4bb0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72     {..        tr
4bc0: 79 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  y..        {..  
4bd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4be0: 20 43 6f 6d 70 61 72 65 28 53 51 4c 69 74 65 33   Compare(SQLite3
4bf0: 5f 55 54 46 31 36 2e 55 54 46 31 36 54 6f 53 74  _UTF16.UTF16ToSt
4c00: 72 69 6e 67 28 70 74 72 31 2c 20 6c 65 6e 31 29  ring(ptr1, len1)
4c10: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
4c20: 20 20 20 53 51 4c 69 74 65 33 5f 55 54 46 31 36     SQLite3_UTF16
4c30: 2e 55 54 46 31 36 54 6f 53 74 72 69 6e 67 28 70  .UTF16ToString(p
4c40: 74 72 32 2c 20 6c 65 6e 32 29 29 3b 20 2f 2a 20  tr2, len2)); /* 
4c50: 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20  throw */..      
4c60: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 74    }..        cat
4c70: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29  ch (Exception e)
4c80: 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63   /* NOTE: Must c
4c90: 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20  atch ALL. */..  
4ca0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4cb0: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
4cc0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
4cd0: 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f 66           if ((_f
4ce0: 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43 6f 6e  lags & SQLiteCon
4cf0: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67  nectionFlags.Log
4d00: 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f  CallbackExceptio
4d10: 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20 20  n) ==..         
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
4d30: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
4d40: 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b  lags.LogCallback
4d50: 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20  Exception)..    
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f 67     SQLiteLog.Log
4d90: 4d 65 73 73 61 67 65 28 53 51 4c 69 74 65 42 61  Message(SQLiteBa
4da0: 73 65 2e 43 4f 52 5f 45 5f 45 58 43 45 50 54 49  se.COR_E_EXCEPTI
4db0: 4f 4e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ON,..           
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72               Str
4dd0: 69 6e 67 2e 46 6f 72 6d 61 74 28 43 75 6c 74 75  ing.Format(Cultu
4de0: 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43 75  reInfo.CurrentCu
4df0: 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20 20 20 20  lture,..        
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 22 43 61 75 67 68 74 20 65 78 63 65 70 74 69 6f  "Caught exceptio
4e20: 6e 20 69 6e 20 5c 22 43 6f 6d 70 61 72 65 5c 22  n in \"Compare\"
4e30: 20 28 55 54 46 31 36 29 20 6d 65 74 68 6f 64 3a   (UTF16) method:
4e40: 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  e)); /* throw */
4e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4e80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4e90: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4ea0: 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  catch..         
4eb0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4ec0: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
4ed0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
4ee0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
4ef0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20  ..        //..  
4f00: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54        // NOTE: T
4f10: 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
4f20: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
4f30: 63 6f 72 65 20 53 51 4c 69 74 65 20 6c 69 62 72  core SQLite libr
4f40: 61 72 79 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20  ary from..      
4f50: 20 20 2f 2f 20 20 20 20 20 20 20 75 73 69 6e 67    //       using
4f60: 20 6f 75 72 20 28 69 6e 76 61 6c 69 64 29 20 72   our (invalid) r
4f70: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20  esult...        
4f80: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  //..        if (
4f90: 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c 6c 29 20  (_base != null) 
4fa0: 26 26 20 5f 62 61 73 65 2e 49 73 4f 70 65 6e 28  && _base.IsOpen(
4fb0: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
4fc0: 5f 62 61 73 65 2e 43 61 6e 63 65 6c 28 29 3b 0d  _base.Cancel();.
4fd0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
4fe0: 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  n 0;..    }.... 
4ff0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
5000: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 69 6e  ..    /// The in
5010: 74 65 72 6e 61 6c 20 61 67 67 72 65 67 61 74 65  ternal aggregate
5020: 20 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 63   Step function c
5030: 61 6c 6c 62 61 63 6b 2c 20 77 68 69 63 68 20 77  allback, which w
5040: 72 61 70 73 20 74 68 65 20 72 61 77 20 63 6f 6e  raps the raw con
5050: 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61 6e 64  text pointer and
5060: 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72 74 75   calls the virtu
5070: 61 6c 20 53 74 65 70 28 29 20 6d 65 74 68 6f 64  al Step() method
5080: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52 4e 49  ...    /// WARNI
5090: 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74 68 72  NG: Must not thr
50a0: 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e 0d 0a  ow exceptions...
50b0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
50c0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d  y>..    /// <rem
50d0: 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54  arks>..    /// T
50e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  his function tak
50f0: 65 73 20 63 61 72 65 20 6f 66 20 64 6f 69 6e 67  es care of doing
5100: 20 74 68 65 20 6c 6f 6f 6b 75 70 73 20 61 6e 64   the lookups and
5110: 20 67 65 74 74 69 6e 67 20 74 68 65 20 69 6d 70   getting the imp
5120: 6f 72 74 61 6e 74 20 69 6e 66 6f 72 6d 61 74 69  ortant informati
5130: 6f 6e 20 70 75 74 20 74 6f 67 65 74 68 65 72 20  on put together 
5140: 74 6f 20 63 61 6c 6c 20 74 68 65 20 53 74 65 70  to call the Step
5150: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20  () function...  
5160: 20 20 2f 2f 2f 20 54 68 61 74 20 69 6e 63 6c 75    /// That inclu
5170: 64 65 73 20 70 75 6c 6c 69 6e 67 20 6f 75 74 20  des pulling out 
5180: 74 68 65 20 75 73 65 72 27 73 20 63 6f 6e 74 65  the user's conte
5190: 78 74 44 61 74 61 20 61 6e 64 20 75 70 64 61 74  xtData and updat
51a0: 69 6e 67 20 69 74 20 61 66 74 65 72 20 74 68 65  ing it after the
51b0: 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 2e 20 20   call is made.  
51c0: 57 65 20 75 73 65 20 61 20 73 6f 72 74 65 64 20  We use a sorted 
51d0: 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 73 6f  list for this so
51e0: 0d 0a 20 20 20 20 2f 2f 2f 20 62 69 6e 61 72 79  ..    /// binary
51f0: 20 73 65 61 72 63 68 65 73 20 63 61 6e 20 62 65   searches can be
5200: 20 64 6f 6e 65 20 74 6f 20 66 69 6e 64 20 74 68   done to find th
5210: 65 20 64 61 74 61 2e 0d 0a 20 20 20 20 2f 2f 2f  e data...    ///
5220: 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20   </remarks>..   
5230: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
5240: 3d 22 63 6f 6e 74 65 78 74 22 3e 41 20 72 61 77  ="context">A raw
5250: 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   context pointer
5260: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
5270: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e  / <param name="n
5280: 41 72 67 73 22 3e 4e 75 6d 62 65 72 20 6f 66 20  Args">Number of 
5290: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
52a0: 20 69 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20   in</param>..   
52b0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
52c0: 3d 22 61 72 67 73 70 74 72 22 3e 41 20 70 6f 69  ="argsptr">A poi
52d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
52e0: 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 3c 2f  y of arguments</
52f0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 69 6e 74 65  param>..    inte
5300: 72 6e 61 6c 20 76 6f 69 64 20 53 74 65 70 43 61  rnal void StepCa
5310: 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63 6f  llback(IntPtr co
5320: 6e 74 65 78 74 2c 20 69 6e 74 20 6e 41 72 67 73  ntext, int nArgs
5330: 2c 20 49 6e 74 50 74 72 20 61 72 67 73 70 74 72  , IntPtr argsptr
5340: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
5350: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
5360: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 67  ..            Ag
5370: 67 72 65 67 61 74 65 44 61 74 61 20 64 61 74 61  gregateData data
5380: 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20   = null;....    
5390: 20 20 20 20 20 20 20 20 69 66 20 28 5f 62 61 73          if (_bas
53a0: 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e != null)..    
53b0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
53c0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 50 74             IntPt
53d0: 72 20 6e 41 75 78 20 3d 20 5f 62 61 73 65 2e 41  r nAux = _base.A
53e0: 67 67 72 65 67 61 74 65 43 6f 6e 74 65 78 74 28  ggregateContext(
53f0: 63 6f 6e 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20  context);....   
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5410: 28 28 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69  ((_contextDataLi
5420: 73 74 20 21 3d 20 6e 75 6c 6c 29 20 26 26 0d 0a  st != null) &&..
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 20 21 5f 63 6f 6e 74 65 78 74 44 61 74      !_contextDat
5450: 61 4c 69 73 74 2e 54 72 79 47 65 74 56 61 6c 75  aList.TryGetValu
5460: 65 28 6e 41 75 78 2c 20 6f 75 74 20 64 61 74 61  e(nAux, out data
5470: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
5480: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5490: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
54a0: 3d 20 6e 65 77 20 41 67 67 72 65 67 61 74 65 44  = new AggregateD
54b0: 61 74 61 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ata();..        
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e              _con
54d0: 74 65 78 74 44 61 74 61 4c 69 73 74 5b 6e 41 75  textDataList[nAu
54e0: 78 5d 20 3d 20 64 61 74 61 3b 0d 0a 20 20 20 20  x] = data;..    
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5500: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
5510: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5520: 64 61 74 61 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  data == null).. 
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5540: 61 74 61 20 3d 20 6e 65 77 20 41 67 67 72 65 67  ata = new Aggreg
5550: 61 74 65 44 61 74 61 28 29 3b 0d 0a 0d 0a 20 20  ateData();....  
5560: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
5570: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63                _c
5590: 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74  ontext = context
55a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
55b0: 20 20 20 53 74 65 70 28 43 6f 6e 76 65 72 74 50     Step(ConvertP
55c0: 61 72 61 6d 73 28 6e 41 72 67 73 2c 20 61 72 67  arams(nArgs, arg
55d0: 73 70 74 72 29 2c 0d 0a 20 20 20 20 20 20 20 20  sptr),..        
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
55f0: 2e 5f 63 6f 75 6e 74 2c 20 72 65 66 20 64 61 74  ._count, ref dat
5600: 61 2e 5f 64 61 74 61 29 3b 20 2f 2a 20 74 68 72  a._data); /* thr
5610: 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  ow */..         
5620: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
5630: 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20    finally..     
5640: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5650: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 2e 5f            data._
5660: 63 6f 75 6e 74 2b 2b 3b 0d 0a 20 20 20 20 20 20  count++;..      
5670: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5680: 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63   }..        catc
5690: 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 20  h (Exception e) 
56a0: 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74 20 63 61  /* NOTE: Must ca
56b0: 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a 20 20 20  tch ALL. */..   
56c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
56d0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
56e0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
56f0: 20 20 20 20 20 20 20 20 69 66 20 28 28 5f 66 6c          if ((_fl
5700: 61 67 73 20 26 20 53 51 4c 69 74 65 43 6f 6e 6e  ags & SQLiteConn
5710: 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43  ectionFlags.LogC
5720: 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e  allbackException
5730: 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20 20 20 20  ) ==..          
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
5750: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
5760: 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45  ags.LogCallbackE
5770: 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20 20 20 20  xception)..     
5780: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c 6f 67 4d    SQLiteLog.LogM
57b0: 65 73 73 61 67 65 28 53 51 4c 69 74 65 42 61 73  essage(SQLiteBas
57c0: 65 2e 43 4f 52 5f 45 5f 45 58 43 45 50 54 49 4f  e.COR_E_EXCEPTIO
57d0: 4e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  N,..            
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
57f0: 6e 67 2e 46 6f 72 6d 61 74 28 43 75 6c 74 75 72  ng.Format(Cultur
5800: 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43 75 6c  eInfo.CurrentCul
5810: 74 75 72 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  ture,..         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5830: 43 61 75 67 68 74 20 65 78 63 65 70 74 69 6f 6e  Caught exception
5840: 20 69 6e 20 5c 22 53 74 65 70 5c 22 20 6d 65 74   in \"Step\" met
5850: 68 6f 64 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  hod: {1}",..    
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 65 29 29 3b 20 2f 2a 20 74 68 72 6f      e)); /* thro
5880: 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20  w */..          
5890: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
58a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
58b0: 20 20 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20      catch..     
58c0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
58d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20            // do 
58e0: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
58f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
5900: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
5910: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
5920: 20 20 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65 72      /// An inter
5930: 6e 61 6c 20 61 67 67 72 65 67 61 74 65 20 46 69  nal aggregate Fi
5940: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  nal function cal
5950: 6c 62 61 63 6b 2c 20 77 68 69 63 68 20 77 72 61  lback, which wra
5960: 70 73 20 74 68 65 20 63 6f 6e 74 65 78 74 20 70  ps the context p
5970: 6f 69 6e 74 65 72 20 61 6e 64 20 63 61 6c 6c 73  ointer and calls
5980: 20 74 68 65 20 76 69 72 74 75 61 6c 20 46 69 6e   the virtual Fin
5990: 61 6c 28 29 20 6d 65 74 68 6f 64 2e 0d 0a 20 20  al() method...  
59a0: 20 20 2f 2f 2f 20 57 41 52 4e 49 4e 47 3a 20 4d    /// WARNING: M
59b0: 75 73 74 20 6e 6f 74 20 74 68 72 6f 77 20 65 78  ust not throw ex
59c0: 63 65 70 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 2f  ceptions...    /
59d0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
59e0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
59f0: 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e 41 20 72  me="context">A r
5a00: 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74  aw context point
5a10: 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  er</param>..    
5a20: 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 46 69  internal void Fi
5a30: 6e 61 6c 43 61 6c 6c 62 61 63 6b 28 49 6e 74 50  nalCallback(IntP
5a40: 74 72 20 63 6f 6e 74 65 78 74 29 0d 0a 20 20 20  tr context)..   
5a50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d   {..        try.
5a60: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
5a70: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 6f          object o
5a80: 62 6a 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  bj = null;....  
5a90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f 62            if (_b
5aa0: 61 73 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ase != null)..  
5ab0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74               Int
5ad0: 50 74 72 20 6e 20 3d 20 5f 62 61 73 65 2e 41 67  Ptr n = _base.Ag
5ae0: 67 72 65 67 61 74 65 43 6f 6e 74 65 78 74 28 63  gregateContext(c
5af0: 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20 20  ontext);..      
5b00: 20 20 20 20 20 20 20 20 20 20 41 67 67 72 65 67            Aggreg
5b10: 61 74 65 44 61 74 61 20 61 67 67 44 61 74 61 3b  ateData aggData;
5b20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5b30: 20 20 20 20 69 66 20 28 28 5f 63 6f 6e 74 65 78      if ((_contex
5b40: 74 44 61 74 61 4c 69 73 74 20 21 3d 20 6e 75 6c  tDataList != nul
5b50: 6c 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20  l) &&..         
5b60: 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e 74             _cont
5b70: 65 78 74 44 61 74 61 4c 69 73 74 2e 54 72 79 47  extDataList.TryG
5b80: 65 74 56 61 6c 75 65 28 6e 2c 20 6f 75 74 20 61  etValue(n, out a
5b90: 67 67 44 61 74 61 29 29 0d 0a 20 20 20 20 20 20  ggData))..      
5ba0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 6f 62 6a 20 3d 20 61 67 67 44 61 74 61 2e 5f   obj = aggData._
5bd0: 64 61 74 61 3b 0d 0a 20 20 20 20 20 20 20 20 20  data;..         
5be0: 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e 74             _cont
5bf0: 65 78 74 44 61 74 61 4c 69 73 74 2e 52 65 6d 6f  extDataList.Remo
5c00: 76 65 28 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20  ve(n);..        
5c10: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5c20: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
5c30: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
5c40: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6e              _con
5c60: 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74 3b 0d  text = context;.
5c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5c80: 20 53 65 74 52 65 74 75 72 6e 56 61 6c 75 65 28   SetReturnValue(
5c90: 63 6f 6e 74 65 78 74 2c 20 46 69 6e 61 6c 28 6f  context, Final(o
5ca0: 62 6a 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a  bj)); /* throw *
5cb0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  /..            }
5cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
5cd0: 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20  nally..         
5ce0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5cf0: 20 20 20 20 20 20 49 44 69 73 70 6f 73 61 62 6c        IDisposabl
5d00: 65 20 64 69 73 70 20 3d 20 6f 62 6a 20 61 73 20  e disp = obj as 
5d10: 49 44 69 73 70 6f 73 61 62 6c 65 3b 0d 0a 20 20  IDisposable;..  
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5d30: 20 28 64 69 73 70 20 21 3d 20 6e 75 6c 6c 29 20   (disp != null) 
5d40: 64 69 73 70 2e 44 69 73 70 6f 73 65 28 29 3b 20  disp.Dispose(); 
5d50: 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
5d60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5d70: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63      }..        c
5d80: 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20  atch (Exception 
5d90: 65 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d 75 73 74  e) /* NOTE: Must
5da0: 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a 2f 0d 0a   catch ALL. */..
5db0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
5dc0: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
5dd0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
5de0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
5df0: 5f 66 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43  _flags & SQLiteC
5e00: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c  onnectionFlags.L
5e10: 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74  ogCallbackExcept
5e20: 69 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20 20 20 20  ion) ==..       
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
5e50: 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61  nFlags.LogCallba
5e60: 63 6b 45 78 63 65 70 74 69 6f 6e 29 0d 0a 20 20  ckException)..  
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
5e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5e90: 20 20 20 20 20 53 51 4c 69 74 65 4c 6f 67 2e 4c       SQLiteLog.L
5ea0: 6f 67 4d 65 73 73 61 67 65 28 53 51 4c 69 74 65  ogMessage(SQLite
5eb0: 42 61 73 65 2e 43 4f 52 5f 45 5f 45 58 43 45 50  Base.COR_E_EXCEP
5ec0: 54 49 4f 4e 2c 0d 0a 20 20 20 20 20 20 20 20 20  TION,..         
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
5ee0: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 43 75 6c  tring.Format(Cul
5ef0: 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74  tureInfo.Current
5f00: 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20 20 20 20  Culture,..      
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 22 43 61 75 67 68 74 20 65 78 63 65 70 74    "Caught except
5f30: 69 6f 6e 20 69 6e 20 5c 22 46 69 6e 61 6c 5c 22  ion in \"Final\"
5f40: 20 6d 65 74 68 6f 64 3a 20 7b 31 7d 22 2c 0d 0a   method: {1}",..
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f60: 20 20 20 20 20 20 20 20 65 29 29 3b 20 2f 2a 20          e)); /* 
5f70: 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20  throw */..      
5f80: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5f90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5fa0: 20 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20          catch.. 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
5fd0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   do nothing...  
5fe0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5ff0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
6000: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
6010: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 55 73 69 6e  y>..    /// Usin
6020: 67 20 72 65 66 6c 65 63 74 69 6f 6e 2c 20 65 6e  g reflection, en
6030: 75 6d 65 72 61 74 65 20 61 6c 6c 20 61 73 73 65  umerate all asse
6040: 6d 62 6c 69 65 73 20 69 6e 20 74 68 65 20 63 75  mblies in the cu
6050: 72 72 65 6e 74 20 61 70 70 64 6f 6d 61 69 6e 20  rrent appdomain 
6060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 6c 61 73  looking for clas
6070: 73 65 73 20 74 68 61 74 0d 0a 20 20 20 20 2f 2f  ses that..    //
6080: 2f 20 68 61 76 65 20 61 20 53 51 4c 69 74 65 46  / have a SQLiteF
6090: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
60a0: 20 61 74 74 72 69 62 75 74 65 2c 20 61 6e 64 20   attribute, and 
60b0: 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 6d  registering them
60c0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0d 0a 20   accordingly... 
60d0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
60e0: 3e 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d  >..#if !PLATFORM
60f0: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
6100: 4b 0d 0a 20 20 20 20 5b 53 65 63 75 72 69 74 79  K..    [Security
6110: 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e 46 69 6c  .Permissions.Fil
6120: 65 49 4f 50 65 72 6d 69 73 73 69 6f 6e 28 53 65  eIOPermission(Se
6130: 63 75 72 69 74 79 2e 50 65 72 6d 69 73 73 69 6f  curity.Permissio
6140: 6e 73 2e 53 65 63 75 72 69 74 79 41 63 74 69 6f  ns.SecurityActio
6150: 6e 2e 41 73 73 65 72 74 2c 20 41 6c 6c 46 69 6c  n.Assert, AllFil
6160: 65 73 20 3d 20 53 65 63 75 72 69 74 79 2e 50 65  es = Security.Pe
6170: 72 6d 69 73 73 69 6f 6e 73 2e 46 69 6c 65 49 4f  rmissions.FileIO
6180: 50 65 72 6d 69 73 73 69 6f 6e 41 63 63 65 73 73  PermissionAccess
6190: 2e 50 61 74 68 44 69 73 63 6f 76 65 72 79 29 5d  .PathDiscovery)]
61a0: 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 73 74  ..#endif..    st
61b0: 61 74 69 63 20 53 51 4c 69 74 65 46 75 6e 63 74  atic SQLiteFunct
61c0: 69 6f 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ion()..    {..  
61d0: 20 20 20 20 5f 72 65 67 69 73 74 65 72 65 64 46      _registeredF
61e0: 75 6e 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 44  unctions = new D
61f0: 69 63 74 69 6f 6e 61 72 79 3c 53 51 4c 69 74 65  ictionary<SQLite
6200: 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74  FunctionAttribut
6210: 65 2c 20 6f 62 6a 65 63 74 3e 28 29 3b 0d 0a 20  e, object>();.. 
6220: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
6230: 7b 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d  {..#if !PLATFORM
6240: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
6250: 4b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20  K..        //.. 
6260: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
6270: 49 66 20 74 68 65 20 22 4e 6f 5f 53 51 4c 69 74  If the "No_SQLit
6280: 65 46 75 6e 63 74 69 6f 6e 73 22 20 65 6e 76 69  eFunctions" envi
6290: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
62a0: 20 69 73 20 73 65 74 2c 0d 0a 20 20 20 20 20 20   is set,..      
62b0: 20 20 2f 2f 20 20 20 20 20 20 20 73 6b 69 70 20    //       skip 
62c0: 61 6c 6c 20 6f 75 72 20 73 70 65 63 69 61 6c 20  all our special 
62d0: 63 6f 64 65 20 61 6e 64 20 73 69 6d 70 6c 79 20  code and simply 
62e0: 72 65 74 75 72 6e 2e 0d 0a 20 20 20 20 20 20 20  return...       
62f0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 69 66 20   //..        if 
6300: 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  (UnsafeNativeMet
6310: 68 6f 64 73 2e 47 65 74 53 65 74 74 69 6e 67 56  hods.GetSettingV
6320: 61 6c 75 65 28 22 4e 6f 5f 53 51 4c 69 74 65 46  alue("No_SQLiteF
6330: 75 6e 63 74 69 6f 6e 73 22 2c 20 6e 75 6c 6c 29  unctions", null)
6340: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
6350: 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a       return;....
6360: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75          SQLiteFu
6370: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20  nctionAttribute 
6380: 61 74 3b 0d 0a 20 20 20 20 20 20 20 20 53 79 73  at;..        Sys
6390: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 41  tem.Reflection.A
63a0: 73 73 65 6d 62 6c 79 5b 5d 20 61 72 41 73 73 65  ssembly[] arAsse
63b0: 6d 62 6c 69 65 73 20 3d 20 53 79 73 74 65 6d 2e  mblies = System.
63c0: 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
63d0: 74 44 6f 6d 61 69 6e 2e 47 65 74 41 73 73 65 6d  tDomain.GetAssem
63e0: 62 6c 69 65 73 28 29 3b 0d 0a 20 20 20 20 20 20  blies();..      
63f0: 20 20 69 6e 74 20 77 20 3d 20 61 72 41 73 73 65    int w = arAsse
6400: 6d 62 6c 69 65 73 2e 4c 65 6e 67 74 68 3b 0d 0a  mblies.Length;..
6410: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 52          System.R
6420: 65 66 6c 65 63 74 69 6f 6e 2e 41 73 73 65 6d 62  eflection.Assemb
6430: 6c 79 4e 61 6d 65 20 73 71 6c 69 74 65 20 3d 20  lyName sqlite = 
6440: 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f  System.Reflectio
6450: 6e 2e 41 73 73 65 6d 62 6c 79 2e 47 65 74 45 78  n.Assembly.GetEx
6460: 65 63 75 74 69 6e 67 41 73 73 65 6d 62 6c 79 28  ecutingAssembly(
6470: 29 2e 47 65 74 4e 61 6d 65 28 29 3b 0d 0a 0d 0a  ).GetName();....
6480: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74          for (int
6490: 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 77 3b 20 6e   n = 0; n < w; n
64a0: 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ++)..        {..
64b0: 20 20 20 20 20 20 20 20 20 20 54 79 70 65 5b 5d            Type[]
64c0: 20 61 72 54 79 70 65 73 3b 0d 0a 20 20 20 20 20   arTypes;..     
64d0: 20 20 20 20 20 62 6f 6f 6c 20 66 6f 75 6e 64 20       bool found 
64e0: 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  = false;..      
64f0: 20 20 20 20 53 79 73 74 65 6d 2e 52 65 66 6c 65      System.Refle
6500: 63 74 69 6f 6e 2e 41 73 73 65 6d 62 6c 79 4e 61  ction.AssemblyNa
6510: 6d 65 5b 5d 20 72 65 66 65 72 65 6e 63 65 73 3b  me[] references;
6520: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 0d  ..          try.
6530: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
6540: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 6e 73            // Ins
6550: 70 65 63 74 20 6f 6e 6c 79 20 61 73 73 65 6d 62  pect only assemb
6560: 6c 69 65 73 20 74 68 61 74 20 72 65 66 65 72 65  lies that refere
6570: 6e 63 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20  nce SQLite..    
6580: 20 20 20 20 20 20 20 20 72 65 66 65 72 65 6e 63          referenc
6590: 65 73 20 3d 20 61 72 41 73 73 65 6d 62 6c 69 65  es = arAssemblie
65a0: 73 5b 6e 5d 2e 47 65 74 52 65 66 65 72 65 6e 63  s[n].GetReferenc
65b0: 65 64 41 73 73 65 6d 62 6c 69 65 73 28 29 3b 0d  edAssemblies();.
65c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
65d0: 20 74 20 3d 20 72 65 66 65 72 65 6e 63 65 73 2e   t = references.
65e0: 4c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20 20  Length;..       
65f0: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 7a 20       for (int z 
6600: 3d 20 30 3b 20 7a 20 3c 20 74 3b 20 7a 2b 2b 29  = 0; z < t; z++)
6610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
6620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
6630: 66 20 28 72 65 66 65 72 65 6e 63 65 73 5b 7a 5d  f (references[z]
6640: 2e 4e 61 6d 65 20 3d 3d 20 73 71 6c 69 74 65 2e  .Name == sqlite.
6650: 4e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20  Name)..         
6660: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
6670: 20 20 20 20 20 20 20 20 66 6f 75 6e 64 20 3d 20          found = 
6680: 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
6690: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20         break;.. 
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
66c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
66d0: 28 66 6f 75 6e 64 20 3d 3d 20 66 61 6c 73 65 29  (found == false)
66e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
66f0: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
6700: 20 20 20 20 20 20 20 20 20 61 72 54 79 70 65 73           arTypes
6710: 20 3d 20 61 72 41 73 73 65 6d 62 6c 69 65 73 5b   = arAssemblies[
6720: 6e 5d 2e 47 65 74 54 79 70 65 73 28 29 3b 0d 0a  n].GetTypes();..
6730: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
6740: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 52 65         catch (Re
6750: 66 6c 65 63 74 69 6f 6e 2e 52 65 66 6c 65 63 74  flection.Reflect
6760: 69 6f 6e 54 79 70 65 4c 6f 61 64 45 78 63 65 70  ionTypeLoadExcep
6770: 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20 20  tion e)..       
6780: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
6790: 20 20 61 72 54 79 70 65 73 20 3d 20 65 2e 54 79    arTypes = e.Ty
67a0: 70 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  pes;..          
67b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
67c0: 6e 74 20 76 20 3d 20 61 72 54 79 70 65 73 2e 4c  nt v = arTypes.L
67d0: 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20 20 20  ength;..        
67e0: 20 20 66 6f 72 20 28 69 6e 74 20 78 20 3d 20 30    for (int x = 0
67f0: 3b 20 78 20 3c 20 76 3b 20 78 2b 2b 29 0d 0a 20  ; x < v; x++).. 
6800: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
6810: 20 20 20 20 20 20 20 20 69 66 20 28 61 72 54 79          if (arTy
6820: 70 65 73 5b 78 5d 20 3d 3d 20 6e 75 6c 6c 29 20  pes[x] == null) 
6830: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
6840: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 5b           object[
6850: 5d 20 61 72 41 74 74 20 3d 20 61 72 54 79 70 65  ] arAtt = arType
6860: 73 5b 78 5d 2e 47 65 74 43 75 73 74 6f 6d 41 74  s[x].GetCustomAt
6870: 74 72 69 62 75 74 65 73 28 74 79 70 65 6f 66 28  tributes(typeof(
6880: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74  SQLiteFunctionAt
6890: 74 72 69 62 75 74 65 29 2c 20 66 61 6c 73 65 29  tribute), false)
68a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
68b0: 6e 74 20 75 20 3d 20 61 72 41 74 74 2e 4c 65 6e  nt u = arAtt.Len
68c0: 67 74 68 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  gth;..          
68d0: 20 20 66 6f 72 20 28 69 6e 74 20 79 20 3d 20 30    for (int y = 0
68e0: 3b 20 79 20 3c 20 75 3b 20 79 2b 2b 29 0d 0a 20  ; y < u; y++).. 
68f0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20 3d              at =
6910: 20 61 72 41 74 74 5b 79 5d 20 61 73 20 53 51 4c   arAtt[y] as SQL
6920: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
6930: 62 75 74 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  bute;..         
6940: 20 20 20 20 20 69 66 20 28 61 74 20 21 3d 20 6e       if (at != n
6950: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
6960: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6970: 20 20 20 20 20 20 20 61 74 2e 49 6e 73 74 61 6e         at.Instan
6980: 63 65 54 79 70 65 20 3d 20 61 72 54 79 70 65 73  ceType = arTypes
6990: 5b 78 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  [x];..          
69a0: 20 20 20 20 20 20 5f 72 65 67 69 73 74 65 72 65        _registere
69b0: 64 46 75 6e 63 74 69 6f 6e 73 2e 41 64 64 28 61  dFunctions.Add(a
69c0: 74 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20 20  t, null);..     
69d0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
69e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
69f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6a00: 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20  }..#endif..     
6a10: 20 7d 0d 0a 20 20 20 20 20 20 63 61 74 63 68 20   }..      catch 
6a20: 2f 2f 20 53 51 4c 69 74 65 20 70 72 6f 76 69 64  // SQLite provid
6a30: 65 72 20 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20  er can continue 
6a40: 77 69 74 68 6f 75 74 20 62 65 69 6e 67 20 61 62  without being ab
6a50: 6c 65 20 74 6f 20 66 69 6e 64 20 62 75 69 6c 74  le to find built
6a60: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 0d 0a 20  -in functions.. 
6a70: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 7d 0d       {..      }.
6a80: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
6a90: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
6aa0: 20 2f 2f 2f 20 4d 61 6e 75 61 6c 20 6d 65 74 68   /// Manual meth
6ab0: 6f 64 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  od of registerin
6ac0: 67 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  g a function.  T
6ad0: 68 65 20 74 79 70 65 20 6d 75 73 74 20 73 74 69  he type must sti
6ae0: 6c 6c 20 68 61 76 65 20 74 68 65 20 53 51 4c 69  ll have the SQLi
6af0: 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  teFunctionAttrib
6b00: 75 74 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  utes in order to
6b10: 20 77 6f 72 6b 0d 0a 20 20 20 20 2f 2f 2f 20 70   work..    /// p
6b20: 72 6f 70 65 72 6c 79 2c 20 62 75 74 20 74 68 69  roperly, but thi
6b30: 73 20 69 73 20 61 20 77 6f 72 6b 61 72 6f 75 6e  s is a workaroun
6b40: 64 20 66 6f 72 20 74 68 65 20 43 6f 6d 70 61 63  d for the Compac
6b50: 74 20 46 72 61 6d 65 77 6f 72 6b 20 77 68 65 72  t Framework wher
6b60: 65 20 65 6e 75 6d 65 72 61 74 69 6e 67 20 61 73  e enumerating as
6b70: 73 65 6d 62 6c 69 65 73 20 69 73 20 6e 6f 74 20  semblies is not 
6b80: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
6b90: 74 65 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ted...    /// </
6ba0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
6bb0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74  / <param name="t
6bc0: 79 70 22 3e 54 68 65 20 74 79 70 65 20 6f 66 20  yp">The type of 
6bd0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  the function to 
6be0: 72 65 67 69 73 74 65 72 3c 2f 70 61 72 61 6d 3e  register</param>
6bf0: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61  ..    public sta
6c00: 74 69 63 20 76 6f 69 64 20 52 65 67 69 73 74 65  tic void Registe
6c10: 72 46 75 6e 63 74 69 6f 6e 28 54 79 70 65 20 74  rFunction(Type t
6c20: 79 70 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  yp)..    {..    
6c30: 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 61 72 41      object[] arA
6c40: 74 74 20 3d 20 74 79 70 2e 47 65 74 43 75 73 74  tt = typ.GetCust
6c50: 6f 6d 41 74 74 72 69 62 75 74 65 73 28 0d 0a 20  omAttributes(.. 
6c60: 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65 6f             typeo
6c70: 66 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  f(SQLiteFunction
6c80: 41 74 74 72 69 62 75 74 65 29 2c 20 66 61 6c 73  Attribute), fals
6c90: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66  e);....        f
6ca0: 6f 72 20 28 69 6e 74 20 79 20 3d 20 30 3b 20 79  or (int y = 0; y
6cb0: 20 3c 20 61 72 41 74 74 2e 4c 65 6e 67 74 68 3b   < arAtt.Length;
6cc0: 20 79 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 7b   y++)..        {
6cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ..            SQ
6ce0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
6cf0: 69 62 75 74 65 20 61 74 20 3d 20 61 72 41 74 74  ibute at = arAtt
6d00: 5b 79 5d 20 61 73 20 53 51 4c 69 74 65 46 75 6e  [y] as SQLiteFun
6d10: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 3b 0d  ctionAttribute;.
6d20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
6d30: 66 20 28 61 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  f (at == null)..
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
6d60: 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 65           Registe
6d70: 72 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 20 20  rFunction(..    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 2e 4e              at.N
6d90: 61 6d 65 2c 20 61 74 2e 41 72 67 75 6d 65 6e 74  ame, at.Argument
6da0: 73 2c 20 61 74 2e 46 75 6e 63 54 79 70 65 2c 20  s, at.FuncType, 
6db0: 61 74 2e 49 6e 73 74 61 6e 63 65 54 79 70 65 2c  at.InstanceType,
6dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6dd0: 20 20 61 74 2e 43 61 6c 6c 62 61 63 6b 29 3b 0d    at.Callback);.
6de0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
6df0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
6e00: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
6e10: 41 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 74 68  Alternative meth
6e20: 6f 64 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  od of registerin
6e30: 67 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  g a function.  T
6e40: 68 69 73 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20  his method..    
6e50: 2f 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  /// does not req
6e60: 75 69 72 65 20 74 68 65 20 73 70 65 63 69 66 69  uire the specifi
6e70: 65 64 20 74 79 70 65 20 74 6f 20 62 65 20 61 6e  ed type to be an
6e80: 6e 6f 74 61 74 65 64 20 77 69 74 68 0d 0a 20 20  notated with..  
6e90: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
6ea0: 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41  "SQLiteFunctionA
6eb0: 74 74 72 69 62 75 74 65 22 20 2f 3e 2e 0d 0a 20  ttribute" />... 
6ec0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
6ed0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
6ee0: 6d 20 6e 61 6d 65 3d 22 6e 61 6d 65 22 3e 0d 0a  m name="name">..
6ef0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 6e 61 6d 65      /// The name
6f00: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
6f10: 20 74 6f 20 72 65 67 69 73 74 65 72 2e 0d 0a 20   to register... 
6f20: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
6f30: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
6f40: 6e 61 6d 65 3d 22 61 72 67 75 6d 65 6e 74 43 6f  name="argumentCo
6f50: 75 6e 74 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54  unt">..    /// T
6f60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
6f70: 75 6d 65 6e 74 73 20 61 63 63 65 70 74 65 64 20  uments accepted 
6f80: 62 79 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  by the function.
6f90: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61  ..    /// </para
6fa0: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
6fb0: 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63 74 69 6f  am name="functio
6fc0: 6e 54 79 70 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f  nType">..    ///
6fd0: 20 54 68 65 20 74 79 70 65 20 6f 66 20 53 51 4c   The type of SQL
6fe0: 69 74 65 20 66 75 6e 63 74 69 6f 6e 20 62 65 69  ite function bei
6ff0: 6e 67 20 72 65 73 69 74 65 72 65 64 20 28 65 2e  ng resitered (e.
7000: 67 2e 20 73 63 61 6c 61 72 2c 0d 0a 20 20 20 20  g. scalar,..    
7010: 2f 2f 2f 20 61 67 67 72 65 67 61 74 65 2c 20 6f  /// aggregate, o
7020: 72 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  r collating sequ
7030: 65 6e 63 65 29 2e 0d 0a 20 20 20 20 2f 2f 2f 20  ence)...    /// 
7040: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
7050: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
7060: 6e 73 74 61 6e 63 65 54 79 70 65 22 3e 0d 0a 20  nstanceType">.. 
7070: 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20     /// The <see 
7080: 63 72 65 66 3d 22 54 79 70 65 22 20 2f 3e 20 74  cref="Type" /> t
7090: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 69 6d 70  hat actually imp
70a0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 66 75 6e 63  lements the func
70b0: 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54  tion...    /// T
70c0: 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  his will only be
70d0: 20 75 73 65 64 20 69 66 20 74 68 65 20 3c 70 61   used if the <pa
70e0: 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 63 61 6c  ramref name="cal
70f0: 6c 62 61 63 6b 22 20 2f 3e 0d 0a 20 20 20 20 2f  lback" />..    /
7100: 2f 2f 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  // parameter is 
7110: 6e 75 6c 6c 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  null...    /// <
7120: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
7130: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 61   <param name="ca
7140: 6c 6c 62 61 63 6b 22 3e 0d 0a 20 20 20 20 2f 2f  llback">..    //
7150: 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d  / The <see cref=
7160: 22 44 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 68  "Delegate" /> th
7170: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
7180: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 0d  e function.  If.
7190: 0a 20 20 20 20 2f 2f 2f 20 74 68 69 73 20 69 73  .    /// this is
71a0: 20 6e 6f 6e 2d 6e 75 6c 6c 2c 20 74 68 65 20 3c   non-null, the <
71b0: 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 69  paramref name="i
71c0: 6e 73 74 61 6e 63 65 54 79 70 65 22 20 2f 3e 20  nstanceType" /> 
71d0: 70 61 72 61 6d 65 74 65 72 0d 0a 20 20 20 20 2f  parameter..    /
71e0: 2f 2f 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  // will be ignor
71f0: 65 64 20 77 68 65 6e 20 74 68 65 20 66 75 6e 63  ed when the func
7200: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
7210: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61  ..    /// </para
7220: 6d 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 73  m>..    public s
7230: 74 61 74 69 63 20 76 6f 69 64 20 52 65 67 69 73  tatic void Regis
7240: 74 65 72 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20  terFunction(..  
7250: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d        string nam
7260: 65 2c 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20  e,..        int 
7270: 61 72 67 75 6d 65 6e 74 43 6f 75 6e 74 2c 0d 0a  argumentCount,..
7280: 20 20 20 20 20 20 20 20 46 75 6e 63 74 69 6f 6e          Function
7290: 54 79 70 65 20 66 75 6e 63 74 69 6f 6e 54 79 70  Type functionTyp
72a0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 54 79 70 65  e,..        Type
72b0: 20 69 6e 73 74 61 6e 63 65 54 79 70 65 2c 0d 0a   instanceType,..
72c0: 20 20 20 20 20 20 20 20 44 65 6c 65 67 61 74 65          Delegate
72d0: 20 63 61 6c 6c 62 61 63 6b 0d 0a 20 20 20 20 20   callback..     
72e0: 20 20 20 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20     )..    {..   
72f0: 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74       SQLiteFunct
7300: 69 6f 6e 41 74 74 72 69 62 75 74 65 20 61 74 20  ionAttribute at 
7310: 3d 20 6e 65 77 20 53 51 4c 69 74 65 46 75 6e 63  = new SQLiteFunc
7320: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 28 0d 0a  tionAttribute(..
7330: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
7340: 2c 20 61 72 67 75 6d 65 6e 74 43 6f 75 6e 74 2c  , argumentCount,
7350: 20 66 75 6e 63 74 69 6f 6e 54 79 70 65 29 3b 0d   functionType);.
7360: 0a 0d 0a 20 20 20 20 20 20 20 20 61 74 2e 49 6e  ...        at.In
7370: 73 74 61 6e 63 65 54 79 70 65 20 3d 20 69 6e 73  stanceType = ins
7380: 74 61 6e 63 65 54 79 70 65 3b 0d 0a 20 20 20 20  tanceType;..    
7390: 20 20 20 20 61 74 2e 43 61 6c 6c 62 61 63 6b 20      at.Callback 
73a0: 3d 20 63 61 6c 6c 62 61 63 6b 3b 0d 0a 0d 0a 20  = callback;.... 
73b0: 20 20 20 20 20 20 20 5f 72 65 67 69 73 74 65 72         _register
73c0: 65 64 46 75 6e 63 74 69 6f 6e 73 2e 41 64 64 28  edFunctions.Add(
73d0: 61 74 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20  at, null);..    
73e0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
73f0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
7400: 43 72 65 61 74 65 73 20 61 20 3c 73 65 65 20 63  Creates a <see c
7410: 72 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74  ref="SQLiteFunct
7420: 69 6f 6e 22 20 2f 3e 20 69 6e 73 74 61 6e 63 65  ion" /> instance
7430: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 70   based on the sp
7440: 65 63 69 66 69 65 64 0d 0a 20 20 20 20 2f 2f 2f  ecified..    ///
7450: 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69   <see cref="SQLi
7460: 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  teFunctionAttrib
7470: 75 74 65 22 20 2f 3e 2e 0d 0a 20 20 20 20 2f 2f  ute" />...    //
7480: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
7490: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
74a0: 65 3d 22 66 75 6e 63 74 69 6f 6e 41 74 74 72 69  e="functionAttri
74b0: 62 75 74 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20  bute">..    /// 
74c0: 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53  The <see cref="S
74d0: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74  QLiteFunctionAtt
74e0: 72 69 62 75 74 65 22 20 2f 3e 20 63 6f 6e 74 61  ribute" /> conta
74f0: 69 6e 69 6e 67 20 74 68 65 20 6d 65 74 61 64 61  ining the metada
7500: 74 61 20 61 62 6f 75 74 0d 0a 20 20 20 20 2f 2f  ta about..    //
7510: 2f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74  / the function t
7520: 6f 20 63 72 65 61 74 65 2e 0d 0a 20 20 20 20 2f  o create...    /
7530: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
7540: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
7550: 3d 22 66 75 6e 63 74 69 6f 6e 22 3e 0d 0a 20 20  ="function">..  
7560: 20 20 2f 2f 2f 20 54 68 65 20 63 72 65 61 74 65    /// The create
7570: 64 20 66 75 6e 63 74 69 6f 6e 20 2d 4f 52 2d 20  d function -OR- 
7580: 6e 75 6c 6c 20 69 66 20 74 68 65 20 66 75 6e 63  null if the func
7590: 74 69 6f 6e 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tion could not b
75a0: 65 20 63 72 65 61 74 65 64 2e 0d 0a 20 20 20 20  e created...    
75b0: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
75c0: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d    /// <returns>.
75d0: 0a 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72  .    /// Non-zer
75e0: 6f 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  o if the functio
75f0: 6e 20 77 61 73 20 63 72 65 61 74 65 64 3b 20 6f  n was created; o
7600: 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0d  therwise, zero..
7610: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72  .    /// </retur
7620: 6e 73 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65  ns>..    private
7630: 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 43 72 65   static bool Cre
7640: 61 74 65 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20  ateFunction(..  
7650: 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63        SQLiteFunc
7660: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 66 75  tionAttribute fu
7670: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 2c  nctionAttribute,
7680: 0d 0a 20 20 20 20 20 20 20 20 6f 75 74 20 53 51  ..        out SQ
7690: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 66 75 6e  LiteFunction fun
76a0: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 29  ction..        )
76b0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
76c0: 20 69 66 20 28 66 75 6e 63 74 69 6f 6e 41 74 74   if (functionAtt
76d0: 72 69 62 75 74 65 20 3d 3d 20 6e 75 6c 6c 29 0d  ribute == null).
76e0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
76f0: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
7700: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
7710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
7720: 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  se;..        }..
7730: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
7740: 28 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75  (functionAttribu
7750: 74 65 2e 43 61 6c 6c 62 61 63 6b 20 21 3d 20 6e  te.Callback != n
7760: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ull)..        {.
7770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6e  .            fun
7780: 63 74 69 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69  ction = new SQLi
7790: 74 65 44 65 6c 65 67 61 74 65 46 75 6e 63 74 69  teDelegateFuncti
77a0: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on(..           
77b0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 41 74 74       functionAtt
77c0: 72 69 62 75 74 65 2e 43 61 6c 6c 62 61 63 6b 29  ribute.Callback)
77d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
77e0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20   return true;.. 
77f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7800: 20 20 65 6c 73 65 20 69 66 20 28 66 75 6e 63 74    else if (funct
7810: 69 6f 6e 41 74 74 72 69 62 75 74 65 2e 49 6e 73  ionAttribute.Ins
7820: 74 61 6e 63 65 54 79 70 65 20 21 3d 20 6e 75 6c  tanceType != nul
7830: 6c 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  l)..        {.. 
7840: 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74             funct
7850: 69 6f 6e 20 3d 20 28 53 51 4c 69 74 65 46 75 6e  ion = (SQLiteFun
7860: 63 74 69 6f 6e 29 41 63 74 69 76 61 74 6f 72 2e  ction)Activator.
7870: 43 72 65 61 74 65 49 6e 73 74 61 6e 63 65 28 0d  CreateInstance(.
7880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7890: 20 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75   functionAttribu
78a0: 74 65 2e 49 6e 73 74 61 6e 63 65 54 79 70 65 29  te.InstanceType)
78b0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
78c0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20   return true;.. 
78d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
78e0: 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
78f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
7900: 75 6e 63 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d  unction = null;.
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
7920: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
7930: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      }..    }....
7940: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
7950: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 61 6c 6c 65  >..    /// Calle
7960: 64 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 42  d by the SQLiteB
7970: 61 73 65 20 64 65 72 69 76 65 64 20 63 6c 61 73  ase derived clas
7980: 73 65 73 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ses, this method
7990: 20 62 69 6e 64 73 20 61 6c 6c 20 72 65 67 69 73   binds all regis
79a0: 74 65 72 65 64 20 28 6b 6e 6f 77 6e 29 20 75 73  tered (known) us
79b0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
79c0: 69 6f 6e 73 20 74 6f 20 61 20 63 6f 6e 6e 65 63  ions to a connec
79d0: 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 49  tion...    /// I
79e0: 74 20 69 73 20 64 6f 6e 65 20 74 68 69 73 20 77  t is done this w
79f0: 61 79 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 75  ay so that all u
7a00: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
7a10: 74 69 6f 6e 73 20 77 69 6c 6c 20 61 63 63 65 73  tions will acces
7a20: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
7a30: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 65 6e  sing the same en
7a40: 63 6f 64 69 6e 67 20 73 63 68 65 6d 65 0d 0a 20  coding scheme.. 
7a50: 20 20 20 2f 2f 2f 20 61 73 20 74 68 65 20 63 6f     /// as the co
7a60: 6e 6e 65 63 74 69 6f 6e 20 28 55 54 46 2d 38 20  nnection (UTF-8 
7a70: 6f 72 20 55 54 46 2d 31 36 29 2e 0d 0a 20 20 20  or UTF-16)...   
7a80: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
7a90: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b  .    /// <remark
7aa0: 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  s>..    /// The 
7ab0: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
7ac0: 73 20 74 68 61 74 20 69 6e 74 65 72 6f 70 20 77  s that interop w
7ad0: 69 74 68 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  ith SQLite will 
7ae0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
7af0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2c 20 77 68  cookie value, wh
7b00: 69 63 68 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69  ich internally i
7b10: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0d 0a  s a pointer to..
7b20: 20 20 20 20 2f 2f 2f 20 61 6c 6c 20 74 68 65 20      /// all the 
7b30: 77 72 61 70 70 65 64 20 63 61 6c 6c 62 61 63 6b  wrapped callback
7b40: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
7b50: 20 69 6e 74 65 72 6f 70 20 66 75 6e 63 74 69 6f   interop functio
7b60: 6e 20 75 73 65 73 20 69 74 20 74 6f 20 6d 61 70  n uses it to map
7b70: 20 43 44 65 63 6c 20 63 61 6c 6c 62 61 63 6b 73   CDecl callbacks
7b80: 20 74 6f 20 53 74 64 43 61 6c 6c 20 63 61 6c 6c   to StdCall call
7b90: 62 61 63 6b 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20  backs...    /// 
7ba0: 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20  </remarks>..    
7bb0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
7bc0: 22 73 71 6c 62 61 73 65 22 3e 54 68 65 20 62 61  "sqlbase">The ba
7bd0: 73 65 20 6f 62 6a 65 63 74 20 6f 6e 20 77 68 69  se object on whi
7be0: 63 68 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ch the functions
7bf0: 20 61 72 65 20 74 6f 20 62 69 6e 64 2e 3c 2f 70   are to bind.</p
7c00: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
7c10: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 6c 61 67  param name="flag
7c20: 73 22 3e 54 68 65 20 66 6c 61 67 73 20 61 73 73  s">The flags ass
7c30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
7c40: 20 70 61 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69   parent connecti
7c50: 6f 6e 20 6f 62 6a 65 63 74 2e 3c 2f 70 61 72 61  on object.</para
7c60: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
7c70: 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 61 20 6c  urns>Returns a l
7c80: 6f 67 69 63 61 6c 20 6c 69 73 74 20 6f 66 20 66  ogical list of f
7c90: 75 6e 63 74 69 6f 6e 73 20 77 68 69 63 68 20 74  unctions which t
7ca0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68  he connection sh
7cb0: 6f 75 6c 64 20 72 65 74 61 69 6e 20 75 6e 74 69  ould retain unti
7cc0: 6c 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 3c  l it is closed.<
7cd0: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 69  /returns>..    i
7ce0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 49  nternal static I
7cf0: 44 69 63 74 69 6f 6e 61 72 79 3c 53 51 4c 69 74  Dictionary<SQLit
7d00: 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75  eFunctionAttribu
7d10: 74 65 2c 20 53 51 4c 69 74 65 46 75 6e 63 74 69  te, SQLiteFuncti
7d20: 6f 6e 3e 20 42 69 6e 64 46 75 6e 63 74 69 6f 6e  on> BindFunction
7d30: 73 28 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  s(..        SQLi
7d40: 74 65 42 61 73 65 20 73 71 6c 62 61 73 65 2c 0d  teBase sqlbase,.
7d50: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43  .        SQLiteC
7d60: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 66  onnectionFlags f
7d70: 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20 29 0d  lags..        ).
7d80: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20  .    {..        
7d90: 49 44 69 63 74 69 6f 6e 61 72 79 3c 53 51 4c 69  IDictionary<SQLi
7da0: 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  teFunctionAttrib
7db0: 75 74 65 2c 20 53 51 4c 69 74 65 46 75 6e 63 74  ute, SQLiteFunct
7dc0: 69 6f 6e 3e 20 6c 46 75 6e 63 74 69 6f 6e 73 20  ion> lFunctions 
7dd0: 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  =..            n
7de0: 65 77 20 44 69 63 74 69 6f 6e 61 72 79 3c 53 51  ew Dictionary<SQ
7df0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
7e00: 69 62 75 74 65 2c 20 53 51 4c 69 74 65 46 75 6e  ibute, SQLiteFun
7e10: 63 74 69 6f 6e 3e 28 29 3b 0d 0a 0d 0a 20 20 20  ction>();....   
7e20: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 4b 65       foreach (Ke
7e30: 79 56 61 6c 75 65 50 61 69 72 3c 53 51 4c 69 74  yValuePair<SQLit
7e40: 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75  eFunctionAttribu
7e50: 74 65 2c 20 6f 62 6a 65 63 74 3e 20 70 61 69 72  te, object> pair
7e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7e70: 20 20 69 6e 20 5f 72 65 67 69 73 74 65 72 65 64    in _registered
7e80: 46 75 6e 63 74 69 6f 6e 73 29 0d 0a 20 20 20 20  Functions)..    
7e90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7ea0: 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f     SQLiteFunctio
7eb0: 6e 41 74 74 72 69 62 75 74 65 20 70 72 20 3d 20  nAttribute pr = 
7ec0: 70 61 69 72 2e 4b 65 79 3b 0d 0a 0d 0a 20 20 20  pair.Key;....   
7ed0: 20 20 20 20 20 20 20 20 20 69 66 20 28 70 72 20           if (pr 
7ee0: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
7ef0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7f00: 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
7f10: 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f     SQLiteFunctio
7f20: 6e 20 66 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n f;....        
7f30: 20 20 20 20 69 66 20 28 43 72 65 61 74 65 46 75      if (CreateFu
7f40: 6e 63 74 69 6f 6e 28 70 72 2c 20 6f 75 74 20 66  nction(pr, out f
7f50: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
7f60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
7f70: 20 20 20 42 69 6e 64 46 75 6e 63 74 69 6f 6e 28     BindFunction(
7f80: 73 71 6c 62 61 73 65 2c 20 70 72 2c 20 66 2c 20  sqlbase, pr, f, 
7f90: 66 6c 61 67 73 29 3b 0d 0a 20 20 20 20 20 20 20  flags);..       
7fa0: 20 20 20 20 20 20 20 20 20 6c 46 75 6e 63 74 69           lFuncti
7fb0: 6f 6e 73 5b 70 72 5d 20 3d 20 66 3b 0d 0a 20 20  ons[pr] = f;..  
7fc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7fd0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
7fe0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 46                lF
8000: 75 6e 63 74 69 6f 6e 73 5b 70 72 5d 20 3d 20 6e  unctions[pr] = n
8010: 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ull;..          
8020: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
8030: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8040: 20 6c 46 75 6e 63 74 69 6f 6e 73 3b 0d 0a 20 20   lFunctions;..  
8050: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
8060: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
8070: 2f 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20  / Called by the 
8080: 53 51 4c 69 74 65 42 61 73 65 20 64 65 72 69 76  SQLiteBase deriv
8090: 65 64 20 63 6c 61 73 73 65 73 2c 20 74 68 69 73  ed classes, this
80a0: 20 6d 65 74 68 6f 64 20 75 6e 62 69 6e 64 73 20   method unbinds 
80b0: 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20 28  all registered (
80c0: 6b 6e 6f 77 6e 29 0d 0a 20 20 20 20 2f 2f 2f 20  known)..    /// 
80d0: 66 75 6e 63 74 69 6f 6e 73 20 2d 4f 52 2d 20 61  functions -OR- a
80e0: 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79 20 62 6f  ll previously bo
80f0: 75 6e 64 20 75 73 65 72 2d 64 65 66 69 6e 65 64  und user-defined
8100: 20 66 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20   functions from 
8110: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20  a connection... 
8120: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
8130: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
8140: 6d 20 6e 61 6d 65 3d 22 73 71 6c 62 61 73 65 22  m name="sqlbase"
8150: 3e 54 68 65 20 62 61 73 65 20 6f 62 6a 65 63 74  >The base object
8160: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
8170: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 74 6f  functions are to
8180: 20 62 65 20 75 6e 62 6f 75 6e 64 2e 3c 2f 70 61   be unbound.</pa
8190: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70  ram>..    /// <p
81a0: 61 72 61 6d 20 6e 61 6d 65 3d 22 66 6c 61 67 73  aram name="flags
81b0: 22 3e 54 68 65 20 66 6c 61 67 73 20 61 73 73 6f  ">The flags asso
81c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
81d0: 70 61 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  parent connectio
81e0: 6e 20 6f 62 6a 65 63 74 2e 3c 2f 70 61 72 61 6d  n object.</param
81f0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
8200: 6d 20 6e 61 6d 65 3d 22 72 65 67 69 73 74 65 72  m name="register
8210: 65 64 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e 6f  ed">..    /// No
8220: 6e 2d 7a 65 72 6f 20 74 6f 20 75 6e 62 69 6e 64  n-zero to unbind
8230: 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20   all registered 
8240: 28 6b 6e 6f 77 6e 29 20 66 75 6e 63 74 69 6f 6e  (known) function
8250: 73 20 2d 4f 52 2d 20 7a 65 72 6f 20 74 6f 20 75  s -OR- zero to u
8260: 6e 62 69 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69  nbind all functi
8270: 6f 6e 73 0d 0a 20 20 20 20 2f 2f 2f 20 63 75 72  ons..    /// cur
8280: 72 65 6e 74 6c 79 20 62 6f 75 6e 64 20 74 6f 20  rently bound to 
8290: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d  the connection..
82a0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d  .    /// </param
82b0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  >..    /// <retu
82c0: 72 6e 73 3e 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns>Non-zero if 
82d0: 61 6c 6c 20 74 68 65 20 73 70 65 63 69 66 69 65  all the specifie
82e0: 64 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  d user-defined f
82f0: 75 6e 63 74 69 6f 6e 73 20 77 65 72 65 20 75 6e  unctions were un
8300: 62 6f 75 6e 64 2e 3c 2f 72 65 74 75 72 6e 73 3e  bound.</returns>
8310: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73  ..    internal s
8320: 74 61 74 69 63 20 62 6f 6f 6c 20 55 6e 62 69 6e  tatic bool Unbin
8330: 64 41 6c 6c 46 75 6e 63 74 69 6f 6e 73 28 0d 0a  dAllFunctions(..
8340: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 42 61          SQLiteBa
8350: 73 65 20 73 71 6c 62 61 73 65 2c 0d 0a 20 20 20  se sqlbase,..   
8360: 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
8370: 63 74 69 6f 6e 46 6c 61 67 73 20 66 6c 61 67 73  ctionFlags flags
8380: 2c 0d 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 20  ,..        bool 
8390: 72 65 67 69 73 74 65 72 65 64 0d 0a 20 20 20 20  registered..    
83a0: 20 20 20 20 29 0d 0a 20 20 20 20 7b 0d 0a 20 20      )..    {..  
83b0: 20 20 20 20 20 20 69 66 20 28 73 71 6c 62 61 73        if (sqlbas
83c0: 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
83d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
83e0: 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
83f0: 20 49 44 69 63 74 69 6f 6e 61 72 79 3c 53 51 4c   IDictionary<SQL
8400: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
8410: 62 75 74 65 2c 20 53 51 4c 69 74 65 46 75 6e 63  bute, SQLiteFunc
8420: 74 69 6f 6e 3e 20 6c 46 75 6e 63 74 69 6f 6e 73  tion> lFunctions
8430: 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   =..            
8440: 73 71 6c 62 61 73 65 2e 46 75 6e 63 74 69 6f 6e  sqlbase.Function
8450: 73 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  s;....        if
8460: 20 28 6c 46 75 6e 63 74 69 6f 6e 73 20 3d 3d 20   (lFunctions == 
8470: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
8480: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
8490: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c  ....        bool
84a0: 20 72 65 73 75 6c 74 20 3d 20 74 72 75 65 3b 0d   result = true;.
84b0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 72  ...        if (r
84c0: 65 67 69 73 74 65 72 65 64 29 0d 0a 20 20 20 20  egistered)..    
84d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
84e0: 20 20 20 66 6f 72 65 61 63 68 20 28 4b 65 79 56     foreach (KeyV
84f0: 61 6c 75 65 50 61 69 72 3c 53 51 4c 69 74 65 46  aluePair<SQLiteF
8500: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
8510: 2c 20 6f 62 6a 65 63 74 3e 20 70 61 69 72 0d 0a  , object> pair..
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 69 6e 20 5f 72 65 67 69 73 74 65 72      in _register
8540: 65 64 46 75 6e 63 74 69 6f 6e 73 29 0d 0a 20 20  edFunctions)..  
8550: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
8570: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
8580: 62 75 74 65 20 70 72 20 3d 20 70 61 69 72 2e 4b  bute pr = pair.K
8590: 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ey;....         
85a0: 20 20 20 20 20 20 20 69 66 20 28 70 72 20 3d 3d         if (pr ==
85b0: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
85d0: 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  inue;....       
85e0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 46           SQLiteF
85f0: 75 6e 63 74 69 6f 6e 20 66 3b 0d 0a 0d 0a 20 20  unction f;....  
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8610: 20 28 21 6c 46 75 6e 63 74 69 6f 6e 73 2e 54 72   (!lFunctions.Tr
8620: 79 47 65 74 56 61 6c 75 65 28 70 72 2c 20 6f 75  yGetValue(pr, ou
8630: 74 20 66 29 20 7c 7c 0d 0a 20 20 20 20 20 20 20  t f) ||..       
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 20               (f 
8650: 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 0d 0a 20 20 20  == null) ||..   
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 21 55 6e 62 69 6e 64 46 75 6e 63 74 69 6f 6e   !UnbindFunction
8680: 28 73 71 6c 62 61 73 65 2c 20 70 72 2c 20 66 2c  (sqlbase, pr, f,
8690: 20 66 6c 61 67 73 29 29 0d 0a 20 20 20 20 20 20   flags))..      
86a0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 72 65 73 75 6c 74 20 3d 20 66 61 6c 73 65 3b   result = false;
86d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
86e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
86f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
8700: 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20         else..   
8710: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
8720: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
8730: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4e 65 65      // NOTE: Nee
8740: 64 20 74 6f 20 75 73 65 20 61 20 63 6f 70 79 20  d to use a copy 
8750: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
8760: 64 69 63 74 69 6f 6e 61 72 79 20 69 6e 20 74 68  dictionary in th
8770: 69 73 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20 20  is method..     
8780: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
8790: 62 65 63 61 75 73 65 20 74 68 65 20 64 69 63 74  because the dict
87a0: 69 6f 6e 61 72 79 20 69 73 20 6d 6f 64 69 66 69  ionary is modifi
87b0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 55 6e  ed within the Un
87c0: 62 69 6e 64 46 75 6e 63 74 69 6f 6e 0d 0a 20 20  bindFunction..  
87d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
87e0: 20 20 20 6d 65 74 68 6f 64 2c 20 77 68 69 63 68     method, which
87f0: 20 69 73 20 63 61 6c 6c 65 64 20 69 6e 73 69 64   is called insid
8800: 65 20 74 68 65 20 6c 6f 6f 70 2e 0d 0a 20 20 20  e the loop...   
8810: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
8820: 20 20 20 20 20 20 20 20 20 6c 46 75 6e 63 74 69           lFuncti
8830: 6f 6e 73 20 3d 20 6e 65 77 20 44 69 63 74 69 6f  ons = new Dictio
8840: 6e 61 72 79 3c 53 51 4c 69 74 65 46 75 6e 63 74  nary<SQLiteFunct
8850: 69 6f 6e 41 74 74 72 69 62 75 74 65 2c 20 53 51  ionAttribute, SQ
8860: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 3e 28 0d 0a  LiteFunction>(..
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0d 0a 0d 0a  lFunctions);....
8890: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
88a0: 61 63 68 20 28 4b 65 79 56 61 6c 75 65 50 61 69  ach (KeyValuePai
88b0: 72 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  r<SQLiteFunction
88c0: 41 74 74 72 69 62 75 74 65 2c 20 53 51 4c 69 74  Attribute, SQLit
88d0: 65 46 75 6e 63 74 69 6f 6e 3e 20 70 61 69 72 0d  eFunction> pair.
88e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
88f0: 20 20 20 20 20 69 6e 20 6c 46 75 6e 63 74 69 6f       in lFunctio
8900: 6e 73 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ns)..           
8910: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8920: 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69      SQLiteFuncti
8930: 6f 6e 41 74 74 72 69 62 75 74 65 20 70 72 20 3d  onAttribute pr =
8940: 20 70 61 69 72 2e 4b 65 79 3b 0d 0a 0d 0a 20 20   pair.Key;....  
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8960: 20 28 70 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20   (pr == null).. 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a     continue;....
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 66  SQLiteFunction f
89b0: 20 3d 20 70 61 69 72 2e 56 61 6c 75 65 3b 0d 0a   = pair.Value;..
89c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
89d0: 20 20 69 66 20 28 28 66 20 3d 3d 20 6e 75 6c 6c    if ((f == null
89e0: 29 20 7c 7c 0d 0a 20 20 20 20 20 20 20 20 20 20  ) ||..          
89f0: 20 20 20 20 20 20 20 20 20 20 21 55 6e 62 69 6e            !Unbin
8a00: 64 46 75 6e 63 74 69 6f 6e 28 73 71 6c 62 61 73  dFunction(sqlbas
8a10: 65 2c 20 70 72 2c 20 66 2c 20 66 6c 61 67 73 29  e, pr, f, flags)
8a20: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8a30: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8a40: 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74            result
8a50: 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20   = false;..     
8a60: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
8a70: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8a80: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8a90: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
8aa0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f  ..    }....    /
8ab0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
8ac0: 20 20 2f 2f 2f 20 54 68 69 73 20 66 75 6e 63 74    /// This funct
8ad0: 69 6f 6e 20 62 69 6e 64 73 20 61 20 75 73 65 72  ion binds a user
8ae0: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
8af0: 6e 20 74 6f 20 61 20 63 6f 6e 6e 65 63 74 69 6f  n to a connectio
8b00: 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  n...    /// </su
8b10: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
8b20: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71 6c  <param name="sql
8b30: 69 74 65 42 61 73 65 22 3e 0d 0a 20 20 20 20 2f  iteBase">..    /
8b40: 2f 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66  // The <see cref
8b50: 3d 22 53 51 4c 69 74 65 42 61 73 65 22 20 2f 3e  ="SQLiteBase" />
8b60: 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65   object instance
8b70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8b80: 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   the..    /// <s
8b90: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 43  ee cref="SQLiteC
8ba0: 6f 6e 6e 65 63 74 69 6f 6e 22 20 2f 3e 20 74 68  onnection" /> th
8bb0: 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
8bc0: 73 68 6f 75 6c 64 20 62 65 20 62 6f 75 6e 64 20  should be bound 
8bd0: 74 6f 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70  to...    /// </p
8be0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
8bf0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63  param name="func
8c00: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 22 3e 0d  tionAttribute">.
8c10: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65  .    /// The <se
8c20: 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46 75  e cref="SQLiteFu
8c30: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 22  nctionAttribute"
8c40: 2f 3e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e  /> object instan
8c50: 63 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20  ce containing.. 
8c60: 20 20 20 2f 2f 2f 20 74 68 65 20 6d 65 74 61 64     /// the metad
8c70: 61 74 61 20 66 6f 72 20 74 68 65 20 66 75 6e 63  ata for the func
8c80: 74 69 6f 6e 20 74 6f 20 62 65 20 62 6f 75 6e 64  tion to be bound
8c90: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  ...    /// </par
8ca0: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
8cb0: 72 61 6d 20 6e 61 6d 65 3d 22 66 75 6e 63 74 69  ram name="functi
8cc0: 6f 6e 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  on">..    /// Th
8cd0: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c  e <see cref="SQL
8ce0: 69 74 65 46 75 6e 63 74 69 6f 6e 22 2f 3e 20 6f  iteFunction"/> o
8cf0: 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 74  bject instance t
8d00: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
8d10: 68 65 0d 0a 20 20 20 20 2f 2f 2f 20 66 75 6e 63  he..    /// func
8d20: 74 69 6f 6e 20 74 6f 20 62 65 20 62 6f 75 6e 64  tion to be bound
8d30: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  ...    /// </par
8d40: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
8d50: 72 61 6d 20 6e 61 6d 65 3d 22 66 6c 61 67 73 22  ram name="flags"
8d60: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 66  >..    /// The f
8d70: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
8d80: 77 69 74 68 20 74 68 65 20 70 61 72 65 6e 74 20  with the parent 
8d90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63  connection objec
8da0: 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61  t...    /// </pa
8db0: 72 61 6d 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e  ram>..    intern
8dc0: 61 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20 42  al static void B
8dd0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20  indFunction(..  
8de0: 20 20 20 20 20 20 53 51 4c 69 74 65 42 61 73 65        SQLiteBase
8df0: 20 73 71 6c 69 74 65 42 61 73 65 2c 0d 0a 20 20   sqliteBase,..  
8e00: 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63        SQLiteFunc
8e10: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 66 75  tionAttribute fu
8e20: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 2c  nctionAttribute,
8e30: 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ..        SQLite
8e40: 46 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f  Function functio
8e50: 6e 2c 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  n,..        SQLi
8e60: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
8e70: 73 20 66 6c 61 67 73 0d 0a 20 20 20 20 20 20 20  s flags..       
8e80: 20 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20   )..    {..     
8e90: 20 20 20 69 66 20 28 73 71 6c 69 74 65 42 61 73     if (sqliteBas
8ea0: 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
8eb0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
8ec0: 77 20 41 72 67 75 6d 65 6e 74 4e 75 6c 6c 45 78  w ArgumentNullEx
8ed0: 63 65 70 74 69 6f 6e 28 22 73 71 6c 69 74 65 42  ception("sqliteB
8ee0: 61 73 65 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ase");....      
8ef0: 20 20 69 66 20 28 66 75 6e 63 74 69 6f 6e 41 74    if (functionAt
8f00: 74 72 69 62 75 74 65 20 3d 3d 20 6e 75 6c 6c 29  tribute == null)
8f10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  ..            th
8f20: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
8f30: 4e 75 6c 6c 45 78 63 65 70 74 69 6f 6e 28 22 66  NullException("f
8f40: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
8f50: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ");....        i
8f60: 66 20 28 66 75 6e 63 74 69 6f 6e 20 3d 3d 20 6e  f (function == n
8f70: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
8f80: 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75    throw new Argu
8f90: 6d 65 6e 74 4e 75 6c 6c 45 78 63 65 70 74 69 6f  mentNullExceptio
8fa0: 6e 28 22 66 75 6e 63 74 69 6f 6e 22 29 3b 0d 0a  n("function");..
8fb0: 0d 0a 20 20 20 20 20 20 20 20 46 75 6e 63 74 69  ..        Functi
8fc0: 6f 6e 54 79 70 65 20 66 75 6e 63 74 69 6f 6e 54  onType functionT
8fd0: 79 70 65 20 3d 20 66 75 6e 63 74 69 6f 6e 41 74  ype = functionAt
8fe0: 74 72 69 62 75 74 65 2e 46 75 6e 63 54 79 70 65  tribute.FuncType
8ff0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 75 6e  ;....        fun
9000: 63 74 69 6f 6e 2e 5f 62 61 73 65 20 3d 20 73 71  ction._base = sq
9010: 6c 69 74 65 42 61 73 65 3b 0d 0a 20 20 20 20 20  liteBase;..     
9020: 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 66 6c 61     function._fla
9030: 67 73 20 3d 20 66 6c 61 67 73 3b 0d 0a 0d 0a 20  gs = flags;.... 
9040: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e         function.
9050: 5f 49 6e 76 6f 6b 65 46 75 6e 63 20 3d 20 28 66  _InvokeFunc = (f
9060: 75 6e 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 46  unctionType == F
9070: 75 6e 63 74 69 6f 6e 54 79 70 65 2e 53 63 61 6c  unctionType.Scal
9080: 61 72 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20  ar) ?..         
9090: 20 20 20 6e 65 77 20 53 51 4c 69 74 65 43 61 6c     new SQLiteCal
90a0: 6c 62 61 63 6b 28 66 75 6e 63 74 69 6f 6e 2e 53  lback(function.S
90b0: 63 61 6c 61 72 43 61 6c 6c 62 61 63 6b 29 20 3a  calarCallback) :
90c0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
90d0: 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 53 74 65 70    function._Step
90e0: 46 75 6e 63 20 3d 20 28 66 75 6e 63 74 69 6f 6e  Func = (function
90f0: 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e  Type == Function
9100: 54 79 70 65 2e 41 67 67 72 65 67 61 74 65 29 20  Type.Aggregate) 
9110: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ?..            n
9120: 65 77 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63  ew SQLiteCallbac
9130: 6b 28 66 75 6e 63 74 69 6f 6e 2e 53 74 65 70 43  k(function.StepC
9140: 61 6c 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b  allback) : null;
9150: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 75 6e 63  ....        func
9160: 74 69 6f 6e 2e 5f 46 69 6e 61 6c 46 75 6e 63 20  tion._FinalFunc 
9170: 3d 20 28 66 75 6e 63 74 69 6f 6e 54 79 70 65 20  = (functionType 
9180: 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e  == FunctionType.
9190: 41 67 67 72 65 67 61 74 65 29 20 3f 0d 0a 20 20  Aggregate) ?..  
91a0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 53 51            new SQ
91b0: 4c 69 74 65 46 69 6e 61 6c 43 61 6c 6c 62 61 63  LiteFinalCallbac
91c0: 6b 28 66 75 6e 63 74 69 6f 6e 2e 46 69 6e 61 6c  k(function.Final
91d0: 43 61 6c 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c  Callback) : null
91e0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 75 6e  ;....        fun
91f0: 63 74 69 6f 6e 2e 5f 43 6f 6d 70 61 72 65 46 75  ction._CompareFu
9200: 6e 63 20 3d 20 28 66 75 6e 63 74 69 6f 6e 54 79  nc = (functionTy
9210: 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79  pe == FunctionTy
9220: 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 20 3f 0d  pe.Collation) ?.
9230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77  .            new
9240: 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e   SQLiteCollation
9250: 28 66 75 6e 63 74 69 6f 6e 2e 43 6f 6d 70 61 72  (function.Compar
9260: 65 43 61 6c 6c 62 61 63 6b 29 20 3a 20 6e 75 6c  eCallback) : nul
9270: 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 75  l;....        fu
9280: 6e 63 74 69 6f 6e 2e 5f 43 6f 6d 70 61 72 65 46  nction._CompareF
9290: 75 6e 63 31 36 20 3d 20 28 66 75 6e 63 74 69 6f  unc16 = (functio
92a0: 6e 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f  nType == Functio
92b0: 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29  nType.Collation)
92c0: 20 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   ?..            
92d0: 6e 65 77 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74  new SQLiteCollat
92e0: 69 6f 6e 28 66 75 6e 63 74 69 6f 6e 2e 43 6f 6d  ion(function.Com
92f0: 70 61 72 65 43 61 6c 6c 62 61 63 6b 31 36 29 20  pareCallback16) 
9300: 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  : null;....     
9310: 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 20 3d     string name =
9320: 20 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75   functionAttribu
9330: 74 65 2e 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20  te.Name;....    
9340: 20 20 20 20 69 66 20 28 66 75 6e 63 74 69 6f 6e      if (function
9350: 54 79 70 65 20 21 3d 20 46 75 6e 63 74 69 6f 6e  Type != Function
9360: 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 0d  Type.Collation).
9370: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
9380: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 65 65          bool nee
9390: 64 43 6f 6c 6c 53 65 71 20 3d 20 28 66 75 6e 63  dCollSeq = (func
93a0: 74 69 6f 6e 20 69 73 20 53 51 4c 69 74 65 46 75  tion is SQLiteFu
93b0: 6e 63 74 69 6f 6e 45 78 29 3b 0d 0a 0d 0a 20 20  nctionEx);....  
93c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
93d0: 42 61 73 65 2e 43 72 65 61 74 65 46 75 6e 63 74  Base.CreateFunct
93e0: 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ion(..          
93f0: 20 20 20 20 20 20 6e 61 6d 65 2c 20 66 75 6e 63        name, func
9400: 74 69 6f 6e 41 74 74 72 69 62 75 74 65 2e 41 72  tionAttribute.Ar
9410: 67 75 6d 65 6e 74 73 2c 20 6e 65 65 64 43 6f 6c  guments, needCol
9420: 6c 53 65 71 2c 0d 0a 20 20 20 20 20 20 20 20 20  lSeq,..         
9430: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e         function.
9440: 5f 49 6e 76 6f 6b 65 46 75 6e 63 2c 20 66 75 6e  _InvokeFunc, fun
9450: 63 74 69 6f 6e 2e 5f 53 74 65 70 46 75 6e 63 2c  ction._StepFunc,
9460: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9470: 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 46 69 6e 61    function._Fina
9480: 6c 46 75 6e 63 2c 20 74 72 75 65 29 3b 0d 0a 20  lFunc, true);.. 
9490: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
94a0: 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
94b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
94c0: 71 6c 69 74 65 42 61 73 65 2e 43 72 65 61 74 65  qliteBase.Create
94d0: 43 6f 6c 6c 61 74 69 6f 6e 28 0d 0a 20 20 20 20  Collation(..    
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
94f0: 2c 20 66 75 6e 63 74 69 6f 6e 2e 5f 43 6f 6d 70  , function._Comp
9500: 61 72 65 46 75 6e 63 2c 20 66 75 6e 63 74 69 6f  areFunc, functio
9510: 6e 2e 5f 43 6f 6d 70 61 72 65 46 75 6e 63 31 36  n._CompareFunc16
9520: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
9530: 20 20 20 74 72 75 65 29 3b 0d 0a 20 20 20 20 20     true);..     
9540: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
9550: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
9560: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 66  ..    /// This f
9570: 75 6e 63 74 69 6f 6e 20 75 6e 62 69 6e 64 73 20  unction unbinds 
9580: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  a user-defined f
9590: 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 61 20  unctions from a 
95a0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20  connection...   
95b0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
95c0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
95d0: 6e 61 6d 65 3d 22 73 71 6c 69 74 65 42 61 73 65  name="sqliteBase
95e0: 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  ">..    /// The 
95f0: 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74  <see cref="SQLit
9600: 65 42 61 73 65 22 20 2f 3e 20 6f 62 6a 65 63 74  eBase" /> object
9610: 20 69 6e 73 74 61 6e 63 65 20 61 73 73 6f 63 69   instance associ
9620: 61 74 65 64 20 77 69 74 68 20 74 68 65 0d 0a 20  ated with the.. 
9630: 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66     /// <see cref
9640: 3d 22 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  ="SQLiteConnecti
9650: 6f 6e 22 20 2f 3e 20 74 68 61 74 20 74 68 65 20  on" /> that the 
9660: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
9670: 62 65 20 62 6f 75 6e 64 20 74 6f 2e 0d 0a 20 20  be bound to...  
9680: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
9690: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
96a0: 61 6d 65 3d 22 66 75 6e 63 74 69 6f 6e 41 74 74  ame="functionAtt
96b0: 72 69 62 75 74 65 22 3e 0d 0a 20 20 20 20 2f 2f  ribute">..    //
96c0: 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d  / The <see cref=
96d0: 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41  "SQLiteFunctionA
96e0: 74 74 72 69 62 75 74 65 22 2f 3e 20 6f 62 6a 65  ttribute"/> obje
96f0: 63 74 20 69 6e 73 74 61 6e 63 65 20 63 6f 6e 74  ct instance cont
9700: 61 69 6e 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20  aining..    /// 
9710: 74 68 65 20 6d 65 74 61 64 61 74 61 20 66 6f 72  the metadata for
9720: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f   the function to
9730: 20 62 65 20 62 6f 75 6e 64 2e 0d 0a 20 20 20 20   be bound...    
9740: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
9750: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
9760: 65 3d 22 66 75 6e 63 74 69 6f 6e 22 3e 0d 0a 20  e="function">.. 
9770: 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20     /// The <see 
9780: 63 72 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63  cref="SQLiteFunc
9790: 74 69 6f 6e 22 2f 3e 20 6f 62 6a 65 63 74 20 69  tion"/> object i
97a0: 6e 73 74 61 6e 63 65 20 74 68 61 74 20 69 6d 70  nstance that imp
97b0: 6c 65 6d 65 6e 74 73 20 74 68 65 0d 0a 20 20 20  lements the..   
97c0: 20 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 20 74 6f   /// function to
97d0: 20 62 65 20 62 6f 75 6e 64 2e 0d 0a 20 20 20 20   be bound...    
97e0: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
97f0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
9800: 65 3d 22 66 6c 61 67 73 22 3e 0d 0a 20 20 20 20  e="flags">..    
9810: 2f 2f 2f 20 54 68 65 20 66 6c 61 67 73 20 61 73  /// The flags as
9820: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
9830: 65 20 70 61 72 65 6e 74 20 63 6f 6e 6e 65 63 74  e parent connect
9840: 69 6f 6e 20 6f 62 6a 65 63 74 2e 0d 0a 20 20 20  ion object...   
9850: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
9860: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
9870: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  Non-zero if the 
9880: 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 6e 62  function was unb
9890: 6f 75 6e 64 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d  ound.</returns>.
98a0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
98b0: 61 74 69 63 20 62 6f 6f 6c 20 55 6e 62 69 6e 64  atic bool Unbind
98c0: 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 20 20 20  Function(..     
98d0: 20 20 20 53 51 4c 69 74 65 42 61 73 65 20 73 71     SQLiteBase sq
98e0: 6c 69 74 65 42 61 73 65 2c 0d 0a 20 20 20 20 20  liteBase,..     
98f0: 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f     SQLiteFunctio
9900: 6e 41 74 74 72 69 62 75 74 65 20 66 75 6e 63 74  nAttribute funct
9910: 69 6f 6e 41 74 74 72 69 62 75 74 65 2c 0d 0a 20  ionAttribute,.. 
9920: 20 20 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e         SQLiteFun
9930: 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2c 0d  ction function,.
9940: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43  .        SQLiteC
9950: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 66  onnectionFlags f
9960: 6c 61 67 73 20 2f 2a 20 4e 4f 54 20 55 53 45 44  lags /* NOT USED
9970: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 29 0d 0a   */..        )..
9980: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69      {..        i
9990: 66 20 28 73 71 6c 69 74 65 42 61 73 65 20 3d 3d  f (sqliteBase ==
99a0: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
99b0: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 41 72      throw new Ar
99c0: 67 75 6d 65 6e 74 4e 75 6c 6c 45 78 63 65 70 74  gumentNullExcept
99d0: 69 6f 6e 28 22 73 71 6c 69 74 65 42 61 73 65 22  ion("sqliteBase"
99e0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  );....        if
99f0: 20 28 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62   (functionAttrib
9a00: 75 74 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ute == null)..  
9a10: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
9a20: 6e 65 77 20 41 72 67 75 6d 65 6e 74 4e 75 6c 6c  new ArgumentNull
9a30: 45 78 63 65 70 74 69 6f 6e 28 22 66 75 6e 63 74  Exception("funct
9a40: 69 6f 6e 41 74 74 72 69 62 75 74 65 22 29 3b 0d  ionAttribute");.
9a50: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 66  ...        if (f
9a60: 75 6e 63 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29  unction == null)
9a70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  ..            th
9a80: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
9a90: 4e 75 6c 6c 45 78 63 65 70 74 69 6f 6e 28 22 66  NullException("f
9aa0: 75 6e 63 74 69 6f 6e 22 29 3b 0d 0a 0d 0a 20 20  unction");....  
9ab0: 20 20 20 20 20 20 46 75 6e 63 74 69 6f 6e 54 79        FunctionTy
9ac0: 70 65 20 66 75 6e 63 74 69 6f 6e 54 79 70 65 20  pe functionType 
9ad0: 3d 20 66 75 6e 63 74 69 6f 6e 41 74 74 72 69 62  = functionAttrib
9ae0: 75 74 65 2e 46 75 6e 63 54 79 70 65 3b 0d 0a 20  ute.FuncType;.. 
9af0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61         string na
9b00: 6d 65 20 3d 20 66 75 6e 63 74 69 6f 6e 41 74 74  me = functionAtt
9b10: 72 69 62 75 74 65 2e 4e 61 6d 65 3b 0d 0a 0d 0a  ribute.Name;....
9b20: 20 20 20 20 20 20 20 20 69 66 20 28 66 75 6e 63          if (func
9b30: 74 69 6f 6e 54 79 70 65 20 21 3d 20 46 75 6e 63  tionType != Func
9b40: 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69  tionType.Collati
9b50: 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  on)..        {..
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
9b70: 20 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 20 28   needCollSeq = (
9b80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 53 51 4c 69  function is SQLi
9b90: 74 65 46 75 6e 63 74 69 6f 6e 45 78 29 3b 0d 0a  teFunctionEx);..
9ba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
9bb0: 74 75 72 6e 20 73 71 6c 69 74 65 42 61 73 65 2e  turn sqliteBase.
9bc0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28 0d  CreateFunction(.
9bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9be0: 20 6e 61 6d 65 2c 20 66 75 6e 63 74 69 6f 6e 41   name, functionA
9bf0: 74 74 72 69 62 75 74 65 2e 41 72 67 75 6d 65 6e  ttribute.Argumen
9c00: 74 73 2c 20 6e 65 65 64 43 6f 6c 6c 53 65 71 2c  ts, needCollSeq,
9c10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9c20: 20 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75    null, null, nu
9c30: 6c 6c 2c 20 66 61 6c 73 65 29 20 3d 3d 20 53 51  ll, false) == SQ
9c40: 4c 69 74 65 45 72 72 6f 72 43 6f 64 65 2e 4f 6b  LiteErrorCode.Ok
9c50: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
9c60: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
9c70: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9c80: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
9c90: 42 61 73 65 2e 43 72 65 61 74 65 43 6f 6c 6c 61  Base.CreateColla
9ca0: 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  tion(..         
9cb0: 20 20 20 20 20 20 20 6e 61 6d 65 2c 20 6e 75 6c         name, nul
9cc0: 6c 2c 20 6e 75 6c 6c 2c 20 66 61 6c 73 65 29 20  l, null, false) 
9cd0: 3d 3d 20 53 51 4c 69 74 65 45 72 72 6f 72 43 6f  == SQLiteErrorCo
9ce0: 64 65 2e 4f 6b 3b 0d 0a 20 20 20 20 20 20 20 20  de.Ok;..        
9cf0: 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d  }..    }..  }...
9d00: 0a 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .  /////////////
9d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d50: 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ....  /// <summa
9d60: 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54 68 69 73 20  ry>..  /// This 
9d70: 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67  <see cref="Deleg
9d80: 61 74 65 22 20 2f 3e 20 74 79 70 65 20 69 73 20  ate" /> type is 
9d90: 75 73 65 64 20 77 69 74 68 20 74 68 65 0d 0a 20  used with the.. 
9da0: 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
9db0: 53 51 4c 69 74 65 44 65 6c 65 67 61 74 65 46 75  SQLiteDelegateFu
9dc0: 6e 63 74 69 6f 6e 2e 49 6e 76 6f 6b 65 22 20 2f  nction.Invoke" /
9dd0: 3e 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 2f 2f 2f  > method...  ///
9de0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f   </summary>..  /
9df0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
9e00: 70 61 72 61 6d 30 22 3e 0d 0a 20 20 2f 2f 2f 20  param0">..  /// 
9e10: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  This is always t
9e20: 68 65 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61  he string litera
9e30: 6c 20 22 49 6e 76 6f 6b 65 22 2e 0d 0a 20 20 2f  l "Invoke"...  /
9e40: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f  // </param>..  /
9e50: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
9e60: 61 72 67 73 22 3e 0d 0a 20 20 2f 2f 2f 20 54 68  args">..  /// Th
9e70: 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  e arguments for 
9e80: 74 68 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74  the scalar funct
9e90: 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61  ion...  /// </pa
9ea0: 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65 74  ram>..  /// <ret
9eb0: 75 72 6e 73 3e 0d 0a 20 20 2f 2f 2f 20 54 68 65  urns>..  /// The
9ec0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 73   result of the s
9ed0: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 2e 0d  calar function..
9ee0: 0a 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73  .  /// </returns
9ef0: 3e 0d 0a 20 20 70 75 62 6c 69 63 20 64 65 6c 65  >..  public dele
9f00: 67 61 74 65 20 6f 62 6a 65 63 74 20 53 51 4c 69  gate object SQLi
9f10: 74 65 49 6e 76 6f 6b 65 44 65 6c 65 67 61 74 65  teInvokeDelegate
9f20: 28 0d 0a 20 20 20 20 73 74 72 69 6e 67 20 70 61  (..    string pa
9f30: 72 61 6d 30 2c 0d 0a 20 20 20 20 6f 62 6a 65 63  ram0,..    objec
9f40: 74 5b 5d 20 61 72 67 73 0d 0a 20 20 29 3b 0d 0a  t[] args..  );..
9f50: 0d 0a 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..  ////////////
9f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9f80: 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d  /....  /// <summ
9fb0: 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54 68 69 73  ary>..  /// This
9fc0: 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65   <see cref="Dele
9fd0: 67 61 74 65 22 20 2f 3e 20 74 79 70 65 20 69 73  gate" /> type is
9fe0: 20 75 73 65 64 20 77 69 74 68 20 74 68 65 0d 0a   used with the..
9ff0: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
a000: 22 53 51 4c 69 74 65 44 65 6c 65 67 61 74 65 46  "SQLiteDelegateF
a010: 75 6e 63 74 69 6f 6e 2e 53 74 65 70 22 20 2f 3e  unction.Step" />
a020: 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 2f 2f 2f 20   method...  /// 
a030: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f  </summary>..  //
a040: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
a050: 61 72 61 6d 30 22 3e 0d 0a 20 20 2f 2f 2f 20 54  aram0">..  /// T
a060: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
a070: 65 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  e string literal
a080: 20 22 53 74 65 70 22 2e 0d 0a 20 20 2f 2f 2f 20   "Step"...  /// 
a090: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20  </param>..  /// 
a0a0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67  <param name="arg
a0b0: 73 22 3e 0d 0a 20 20 2f 2f 2f 20 54 68 65 20 61  s">..  /// The a
a0c0: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  rguments for the
a0d0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a0e0: 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61  ion...  /// </pa
a0f0: 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72  ram>..  /// <par
a100: 61 6d 20 6e 61 6d 65 3d 22 73 74 65 70 4e 75 6d  am name="stepNum
a110: 62 65 72 22 3e 0d 0a 20 20 2f 2f 2f 20 54 68 65  ber">..  /// The
a120: 20 73 74 65 70 20 6e 75 6d 62 65 72 20 28 6f 6e   step number (on
a130: 65 20 62 61 73 65 64 29 2e 20 20 54 68 69 73 20  e based).  This 
a140: 69 73 20 69 6e 63 72 65 6d 65 6d 74 65 64 20 65  is incrememted e
a150: 61 63 68 20 74 69 6d 65 20 74 68 65 0d 0a 20 20  ach time the..  
a160: 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53  /// <see cref="S
a170: 51 4c 69 74 65 44 65 6c 65 67 61 74 65 46 75 6e  QLiteDelegateFun
a180: 63 74 69 6f 6e 2e 53 74 65 70 22 20 2f 3e 20 6d  ction.Step" /> m
a190: 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 2e  ethod is called.
a1a0: 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e  ..  /// </param>
a1b0: 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e  ..  /// <param n
a1c0: 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44 61 74 61  ame="contextData
a1d0: 22 3e 0d 0a 20 20 2f 2f 2f 20 41 20 70 6c 61 63  ">..  /// A plac
a1e0: 65 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70 6c  eholder for impl
a1f0: 65 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f 72  ementers to stor
a200: 65 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61 74  e contextual dat
a210: 61 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20 20  a pertaining..  
a220: 2f 2f 2f 20 74 6f 20 74 68 65 20 63 75 72 72 65  /// to the curre
a230: 6e 74 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 2f  nt context...  /
a240: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 70  // </param>..  p
a250: 75 62 6c 69 63 20 64 65 6c 65 67 61 74 65 20 76  ublic delegate v
a260: 6f 69 64 20 53 51 4c 69 74 65 53 74 65 70 44 65  oid SQLiteStepDe
a270: 6c 65 67 61 74 65 28 0d 0a 20 20 20 20 73 74 72  legate(..    str
a280: 69 6e 67 20 70 61 72 61 6d 30 2c 0d 0a 20 20 20  ing param0,..   
a290: 20 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 2c 0d   object[] args,.
a2a0: 0a 20 20 20 20 69 6e 74 20 73 74 65 70 4e 75 6d  .    int stepNum
a2b0: 62 65 72 2c 0d 0a 20 20 20 20 72 65 66 20 6f 62  ber,..    ref ob
a2c0: 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61  ject contextData
a2d0: 0d 0a 20 20 29 3b 0d 0a 0d 0a 20 20 2f 2f 2f 2f  ..  );....  ////
a2e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a2f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 2f  /////////....  /
a330: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
a340: 2f 2f 2f 20 54 68 69 73 20 3c 73 65 65 20 63 72  /// This <see cr
a350: 65 66 3d 22 44 65 6c 65 67 61 74 65 22 20 2f 3e  ef="Delegate" />
a360: 20 74 79 70 65 20 69 73 20 75 73 65 64 20 77 69   type is used wi
a370: 74 68 20 74 68 65 0d 0a 20 20 2f 2f 2f 20 3c 73  th the..  /// <s
a380: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 44  ee cref="SQLiteD
a390: 65 6c 65 67 61 74 65 46 75 6e 63 74 69 6f 6e 2e  elegateFunction.
a3a0: 46 69 6e 61 6c 22 20 2f 3e 20 6d 65 74 68 6f 64  Final" /> method
a3b0: 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  ...  /// </summa
a3c0: 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61  ry>..  /// <para
a3d0: 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 30 22 3e  m name="param0">
a3e0: 0d 0a 20 20 2f 2f 2f 20 54 68 69 73 20 69 73 20  ..  /// This is 
a3f0: 61 6c 77 61 79 73 20 74 68 65 20 73 74 72 69 6e  always the strin
a400: 67 20 6c 69 74 65 72 61 6c 20 22 46 69 6e 61 6c  g literal "Final
a410: 22 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61  "...  /// </para
a420: 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  m>..  /// <param
a430: 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44 61   name="contextDa
a440: 74 61 22 3e 0d 0a 20 20 2f 2f 2f 20 41 20 70 6c  ta">..  /// A pl
a450: 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d  aceholder for im
a460: 70 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20 73 74  plementers to st
a470: 6f 72 65 20 63 6f 6e 74 65 78 74 75 61 6c 20 64  ore contextual d
a480: 61 74 61 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a  ata pertaining..
a490: 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 63 75 72    /// to the cur
a4a0: 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  rent context... 
a4b0: 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20   /// </param>.. 
a4c0: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a   /// <returns>..
a4d0: 20 20 2f 2f 2f 20 54 68 65 20 72 65 73 75 6c 74    /// The result
a4e0: 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
a4f0: 65 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 2f  e function...  /
a500: 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  // </returns>.. 
a510: 20 70 75 62 6c 69 63 20 64 65 6c 65 67 61 74 65   public delegate
a520: 20 6f 62 6a 65 63 74 20 53 51 4c 69 74 65 46 69   object SQLiteFi
a530: 6e 61 6c 44 65 6c 65 67 61 74 65 28 0d 0a 20 20  nalDelegate(..  
a540: 20 20 73 74 72 69 6e 67 20 70 61 72 61 6d 30 2c    string param0,
a550: 0d 0a 20 20 20 20 6f 62 6a 65 63 74 20 63 6f 6e  ..    object con
a560: 74 65 78 74 44 61 74 61 0d 0a 20 20 29 3b 0d 0a  textData..  );..
a570: 0d 0a 20 20 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 2f 2f 2f  ////////////////
a5b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a5c0: 2f 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d  /....  /// <summ
a5d0: 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54 68 69 73  ary>..  /// This
a5e0: 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65   <see cref="Dele
a5f0: 67 61 74 65 22 20 2f 3e 20 74 79 70 65 20 69 73  gate" /> type is
a600: 20 75 73 65 64 20 77 69 74 68 20 74 68 65 0d 0a   used with the..
a610: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
a620: 22 53 51 4c 69 74 65 44 65 6c 65 67 61 74 65 46  "SQLiteDelegateF
a630: 75 6e 63 74 69 6f 6e 2e 43 6f 6d 70 61 72 65 22  unction.Compare"
a640: 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 2f   /> method...  /
a650: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
a660: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
a670: 3d 22 70 61 72 61 6d 30 22 3e 0d 0a 20 20 2f 2f  ="param0">..  //
a680: 2f 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  / This is always
a690: 20 74 68 65 20 73 74 72 69 6e 67 20 6c 69 74 65   the string lite
a6a0: 72 61 6c 20 22 43 6f 6d 70 61 72 65 22 2e 0d 0a  ral "Compare"...
a6b0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
a6c0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
a6d0: 65 3d 22 70 61 72 61 6d 31 22 3e 0d 0a 20 20 2f  e="param1">..  /
a6e0: 2f 2f 20 54 68 65 20 66 69 72 73 74 20 73 74 72  // The first str
a6f0: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 2e 0d  ing to compare..
a700: 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d  .  /// </param>.
a710: 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61  .  /// <param na
a720: 6d 65 3d 22 70 61 72 61 6d 32 22 3e 0d 0a 20 20  me="param2">..  
a730: 2f 2f 2f 20 54 68 65 20 73 65 63 6f 6e 64 20 73  /// The second s
a740: 74 72 6e 69 67 20 74 6f 20 63 6f 6d 70 61 72 65  trnig to compare
a750: 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d  ...  /// </param
a760: 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  >..  /// <return
a770: 73 3e 0d 0a 20 20 2f 2f 2f 20 41 20 70 6f 73 69  s>..  /// A posi
a780: 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
a790: 74 68 65 20 3c 70 61 72 61 6d 72 65 66 20 6e 61  the <paramref na
a7a0: 6d 65 3d 22 70 61 72 61 6d 31 22 20 2f 3e 20 70  me="param1" /> p
a7b0: 61 72 61 6d 65 74 65 72 20 69 73 0d 0a 20 20 2f  arameter is..  /
a7c0: 2f 2f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  // greater than 
a7d0: 74 68 65 20 3c 70 61 72 61 6d 72 65 66 20 6e 61  the <paramref na
a7e0: 6d 65 3d 22 70 61 72 61 6d 32 22 20 2f 3e 20 70  me="param2" /> p
a7f0: 61 72 61 6d 65 74 65 72 2c 20 61 20 6e 65 67 61  arameter, a nega
a800: 74 69 76 65 0d 0a 20 20 2f 2f 2f 20 69 6e 74 65  tive..  /// inte
a810: 67 65 72 20 69 66 20 74 68 65 20 3c 70 61 72 61  ger if the <para
a820: 6d 72 65 66 20 6e 61 6d 65 3d 22 70 61 72 61 6d  mref name="param
a830: 31 22 20 2f 3e 20 70 61 72 61 6d 65 74 65 72 20  1" /> parameter 
a840: 69 73 20 6c 65 73 73 20 74 68 61 6e 0d 0a 20 20  is less than..  
a850: 2f 2f 2f 20 74 68 65 20 3c 70 61 72 61 6d 72 65  /// the <paramre
a860: 66 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 20  f name="param2" 
a870: 2f 3e 20 70 61 72 61 6d 65 74 65 72 2c 20 6f 72  /> parameter, or
a880: 20 7a 65 72 6f 20 69 66 20 74 68 65 79 20 61 72   zero if they ar
a890: 65 0d 0a 20 20 2f 2f 2f 20 65 71 75 61 6c 2e 0d  e..  /// equal..
a8a0: 0a 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73  .  /// </returns
a8b0: 3e 0d 0a 20 20 70 75 62 6c 69 63 20 64 65 6c 65  >..  public dele
a8c0: 67 61 74 65 20 69 6e 74 20 53 51 4c 69 74 65 43  gate int SQLiteC
a8d0: 6f 6d 70 61 72 65 44 65 6c 65 67 61 74 65 28 0d  ompareDelegate(.
a8e0: 0a 20 20 20 20 73 74 72 69 6e 67 20 70 61 72 61  .    string para
a8f0: 6d 30 2c 0d 0a 20 20 20 20 73 74 72 69 6e 67 20  m0,..    string 
a900: 70 61 72 61 6d 31 2c 0d 0a 20 20 20 20 73 74 72  param1,..    str
a910: 69 6e 67 20 70 61 72 61 6d 32 0d 0a 20 20 29 3b  ing param2..  );
a920: 0d 0a 0d 0a 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ....  //////////
a930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a970: 2f 2f 2f 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c 73 75  ///....  /// <su
a980: 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 54 68  mmary>..  /// Th
a990: 69 73 20 63 6c 61 73 73 20 69 6d 70 6c 65 6d 65  is class impleme
a9a0: 6e 74 73 20 61 20 53 51 4c 69 74 65 20 66 75 6e  nts a SQLite fun
a9b0: 63 74 69 6f 6e 20 75 73 69 6e 67 20 61 20 3c 73  ction using a <s
a9c0: 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67 61 74  ee cref="Delegat
a9d0: 65 22 20 2f 3e 2e 0d 0a 20 20 2f 2f 2f 20 41 6c  e" />...  /// Al
a9e0: 6c 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 65  l the virtual me
a9f0: 74 68 6f 64 73 20 6f 66 20 74 68 65 20 3c 73 65  thods of the <se
aa00: 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46 75  e cref="SQLiteFu
aa10: 6e 63 74 69 6f 6e 22 20 2f 3e 20 63 6c 61 73 73  nction" /> class
aa20: 20 61 72 65 0d 0a 20 20 2f 2f 2f 20 69 6d 70 6c   are..  /// impl
aa30: 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 63 61  emented using ca
aa40: 6c 6c 73 20 74 6f 20 74 68 65 20 3c 73 65 65 20  lls to the <see 
aa50: 63 72 65 66 3d 22 44 65 6c 65 67 61 74 65 2e 44  cref="Delegate.D
aa60: 79 6e 61 6d 69 63 49 6e 76 6f 6b 65 22 20 2f 3e  ynamicInvoke" />
aa70: 0d 0a 20 20 2f 2f 2f 20 6d 65 74 68 6f 64 2e 20  ..  /// method. 
aa80: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   The arguments a
aa90: 72 65 20 70 72 65 73 65 6e 74 65 64 20 69 6e 20  re presented in 
aaa0: 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 74  the same order t
aab0: 68 65 79 20 61 70 70 65 61 72 20 69 6e 0d 0a 20  hey appear in.. 
aac0: 20 2f 2f 2f 20 74 68 65 20 61 73 73 6f 63 69 61   /// the associa
aad0: 74 65 64 20 3c 73 65 65 20 63 72 65 66 3d 22 53  ted <see cref="S
aae0: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 22 20 2f  QLiteFunction" /
aaf0: 3e 20 6d 65 74 68 6f 64 73 20 77 69 74 68 20 6f  > methods with o
ab00: 6e 65 20 65 78 63 65 70 74 69 6f 6e 3a 0d 0a 20  ne exception:.. 
ab10: 20 2f 2f 2f 20 74 68 65 20 66 69 72 73 74 20 61   /// the first a
ab20: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
ab30: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74 75  ame of the virtu
ab40: 61 6c 20 6d 65 74 68 6f 64 20 62 65 69 6e 67 20  al method being 
ab50: 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 0d 0a 20 20  implemented...  
ab60: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
ab70: 20 20 70 75 62 6c 69 63 20 63 6c 61 73 73 20 53    public class S
ab80: 51 4c 69 74 65 44 65 6c 65 67 61 74 65 46 75 6e  QLiteDelegateFun
ab90: 63 74 69 6f 6e 20 3a 20 53 51 4c 69 74 65 46 75  ction : SQLiteFu
aba0: 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20 20 20  nction..  {..   
abb0: 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61     #region Priva
abc0: 74 65 20 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  te Constants..  
abd0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
abe0: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 69  >..      /// Thi
abf0: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  s error message 
ac00: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  is used by the o
ac10: 76 65 72 72 69 64 64 65 6e 20 76 69 72 74 75 61  verridden virtua
ac20: 6c 20 6d 65 74 68 6f 64 73 20 77 68 65 6e 20 74  l methods when t
ac30: 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 63 61  he..      /// ca
ac40: 6c 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74 20 62  llback has not b
ac50: 65 65 6e 20 73 65 74 2e 0d 0a 20 20 20 20 20 20  een set...      
ac60: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
ac70: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
ac80: 6e 73 74 20 73 74 72 69 6e 67 20 4e 6f 43 61 6c  nst string NoCal
ac90: 6c 62 61 63 6b 45 72 72 6f 72 20 3d 20 22 4e 6f  lbackError = "No
aca0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74   callback is set
acb0: 2e 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f  .";....      ///
acc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
acd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ace0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
acf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ad00: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
ad10: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
ad20: 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20 65 72       /// This er
ad30: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 75  ror message is u
ad40: 73 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 72  sed by the overr
ad50: 69 64 64 65 6e 20 3c 73 65 65 20 63 72 65 66 3d  idden <see cref=
ad60: 22 43 6f 6d 70 61 72 65 22 20 2f 3e 0d 0a 20 20  "Compare" />..  
ad70: 20 20 20 20 2f 2f 2f 20 6d 65 74 68 6f 64 20 77      /// method w
ad80: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
ad90: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 74  oes not have a t
ada0: 79 70 65 20 6f 66 20 3c 73 65 65 20 63 72 65 66  ype of <see cref
adb0: 3d 22 49 6e 74 33 32 22 20 2f 3e 2e 0d 0a 20 20  ="Int32" />...  
adc0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
add0: 79 3e 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74  y>..      privat
ade0: 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 52  e const string R
adf0: 65 73 75 6c 74 49 6e 74 33 32 45 72 72 6f 72 20  esultInt32Error 
ae00: 3d 20 22 5c 22 7b 30 7d 5c 22 20 72 65 73 75 6c  = "\"{0}\" resul
ae10: 74 20 6d 75 73 74 20 62 65 20 49 6e 74 33 32 2e  t must be Int32.
ae20: 22 3b 0d 0a 20 20 20 20 20 20 23 65 6e 64 72 65  ";..      #endre
ae30: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f  gion....      //
ae40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae80: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
ae90: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
aea0: 43 6f 6e 73 74 72 75 63 74 6f 72 73 0d 0a 20 20  Constructors..  
aeb0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
aec0: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 43 6f 6e  >..      /// Con
aed0: 73 74 72 75 63 74 73 20 61 6e 20 65 6d 70 74 79  structs an empty
aee0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
aef0: 73 20 63 6c 61 73 73 2e 0d 0a 20 20 20 20 20 20  s class...      
af00: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
af10: 20 20 20 20 20 20 70 75 62 6c 69 63 20 53 51 4c        public SQL
af20: 69 74 65 44 65 6c 65 67 61 74 65 46 75 6e 63 74  iteDelegateFunct
af30: 69 6f 6e 28 29 0d 0a 20 20 20 20 20 20 20 20 20  ion()..         
af40: 20 3a 20 74 68 69 73 28 6e 75 6c 6c 29 0d 0a 20   : this(null).. 
af50: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
af60: 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e    // do nothing.
af70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
af80: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
af90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
afd0: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
afe0: 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 43  ry>..      /// C
aff0: 6f 6e 73 74 72 75 63 74 73 20 61 6e 20 69 6e 73  onstructs an ins
b000: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 63 6c  tance of this cl
b010: 61 73 73 20 75 73 69 6e 67 20 74 68 65 20 73 70  ass using the sp
b020: 65 63 69 66 69 65 64 0d 0a 20 20 20 20 20 20 2f  ecified..      /
b030: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65  // <see cref="De
b040: 6c 65 67 61 74 65 22 20 2f 3e 20 61 73 20 74 68  legate" /> as th
b050: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c  e <see cref="SQL
b060: 69 74 65 46 75 6e 63 74 69 6f 6e 22 20 2f 3e 0d  iteFunction" />.
b070: 0a 20 20 20 20 20 20 2f 2f 2f 20 69 6d 70 6c 65  .      /// imple
b080: 6d 65 6e 74 61 74 69 6f 6e 2e 0d 0a 20 20 20 20  mentation...    
b090: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
b0a0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ..      /// <par
b0b0: 61 6d 20 6e 61 6d 65 3d 22 63 61 6c 6c 62 61 63  am name="callbac
b0c0: 6b 22 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54  k">..      /// T
b0d0: 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65  he <see cref="De
b0e0: 6c 65 67 61 74 65 22 20 2f 3e 20 74 6f 20 62 65  legate" /> to be
b0f0: 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 63 61   used for all ca
b100: 6c 6c 73 20 69 6e 74 6f 20 74 68 65 0d 0a 20 20  lls into the..  
b110: 20 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c 20      /// virtual 
b120: 6d 65 74 68 6f 64 73 20 6e 65 65 64 65 64 20 62  methods needed b
b130: 79 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d  y the <see cref=
b140: 22 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 22  "SQLiteFunction"
b150: 20 2f 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 63   />..      /// c
b160: 6c 61 73 73 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  lass...      ///
b170: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
b180: 20 70 75 62 6c 69 63 20 53 51 4c 69 74 65 44 65   public SQLiteDe
b190: 6c 65 67 61 74 65 46 75 6e 63 74 69 6f 6e 28 0d  legateFunction(.
b1a0: 0a 20 20 20 20 20 20 20 20 20 20 44 65 6c 65 67  .          Deleg
b1b0: 61 74 65 20 63 61 6c 6c 62 61 63 6b 0d 0a 20 20  ate callback..  
b1c0: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
b1d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 68   {..          th
b1e0: 69 73 2e 63 61 6c 6c 62 61 63 6b 20 3d 20 63 61  is.callback = ca
b1f0: 6c 6c 62 61 63 6b 3b 0d 0a 20 20 20 20 20 20 7d  llback;..      }
b200: 0d 0a 20 20 20 20 20 20 23 65 6e 64 72 65 67 69  ..      #endregi
b210: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f  on....      ////
b220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b260: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 23  /////....      #
b270: 72 65 67 69 6f 6e 20 50 72 6f 74 65 63 74 65 64  region Protected
b280: 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20   Methods..      
b290: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
b2a0: 20 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73       /// Returns
b2b0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 72 67   the list of arg
b2c0: 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 3c  uments for the <
b2d0: 73 65 65 20 63 72 65 66 3d 22 49 6e 76 6f 6b 65  see cref="Invoke
b2e0: 22 20 2f 3e 20 6d 65 74 68 6f 64 2c 0d 0a 20 20  " /> method,..  
b2f0: 20 20 20 20 2f 2f 2f 20 61 73 20 61 6e 20 3c 73      /// as an <s
b300: 65 65 20 63 72 65 66 3d 22 41 72 72 61 79 22 20  ee cref="Array" 
b310: 2f 3e 20 6f 66 20 3c 73 65 65 20 63 72 65 66 3d  /> of <see cref=
b320: 22 4f 62 6a 65 63 74 22 20 2f 3e 2e 20 20 54 68  "Object" />.  Th
b330: 65 20 66 69 72 73 74 0d 0a 20 20 20 20 20 20 2f  e first..      /
b340: 2f 2f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  // argument is a
b350: 6c 77 61 79 73 20 74 68 65 20 6c 69 74 65 72 61  lways the litera
b360: 6c 20 73 74 72 69 6e 67 20 22 49 6e 76 6f 6b 65  l string "Invoke
b370: 22 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  "...      /// </
b380: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
b390: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
b3a0: 22 61 72 67 73 22 3e 0d 0a 20 20 20 20 20 20 2f  "args">..      /
b3b0: 2f 2f 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  // The original 
b3c0: 61 72 67 75 6d 65 6e 74 73 20 72 65 63 65 69 76  arguments receiv
b3d0: 65 64 20 62 79 20 74 68 65 20 3c 73 65 65 20 63  ed by the <see c
b3e0: 72 65 66 3d 22 49 6e 76 6f 6b 65 22 20 2f 3e 20  ref="Invoke" /> 
b3f0: 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 20 20 2f  method...      /
b400: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
b410: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
b420: 6d 65 3d 22 65 61 72 6c 79 42 6f 75 6e 64 22 3e  me="earlyBound">
b430: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d  ..      /// Non-
b440: 7a 65 72 6f 20 69 66 20 74 68 65 20 72 65 74 75  zero if the retu
b450: 72 6e 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61  rned arguments a
b460: 72 65 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 75  re going to be u
b470: 73 65 64 20 77 69 74 68 20 74 68 65 0d 0a 20 20  sed with the..  
b480: 20 20 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65      /// <see cre
b490: 66 3d 22 53 51 4c 69 74 65 49 6e 76 6f 6b 65 44  f="SQLiteInvokeD
b4a0: 65 6c 65 67 61 74 65 22 20 2f 3e 20 74 79 70 65  elegate" /> type
b4b0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 7a 65 72  ; otherwise, zer
b4c0: 6f 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  o...      /// </
b4d0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f  param>..      //
b4e0: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
b4f0: 20 20 20 2f 2f 2f 20 54 68 65 20 61 72 67 75 6d     /// The argum
b500: 65 6e 74 73 20 74 6f 20 70 61 73 73 20 74 6f 20  ents to pass to 
b510: 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 3c  the configured <
b520: 73 65 65 20 63 72 65 66 3d 22 44 65 6c 65 67 61  see cref="Delega
b530: 74 65 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20 2f  te" />...      /
b540: 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  // </returns>.. 
b550: 20 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 76       protected v
b560: 69 72 74 75 61 6c 20 6f 62 6a 65 63 74 5b 5d 20  irtual object[] 
b570: 47 65 74 49 6e 76 6f 6b 65 41 72 67 73 28 0d 0a  GetInvokeArgs(..
b580: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
b590: 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20 20 20 20  [] args,..      
b5a0: 20 20 20 20 62 6f 6f 6c 20 65 61 72 6c 79 42 6f      bool earlyBo
b5b0: 75 6e 64 0d 0a 20 20 20 20 20 20 20 20 20 20 29  und..          )
b5c0: 20 2f 2a 20 43 41 4e 4e 4f 54 20 52 45 54 55 52   /* CANNOT RETUR
b5d0: 4e 20 4e 55 4c 4c 20 2a 2f 0d 0a 20 20 20 20 20  N NULL */..     
b5e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
b5f0: 6a 65 63 74 5b 5d 20 6e 65 77 41 72 67 73 20 3d  ject[] newArgs =
b600: 20 6e 65 77 20 6f 62 6a 65 63 74 5b 5d 20 7b 20   new object[] { 
b610: 22 49 6e 76 6f 6b 65 22 2c 20 61 72 67 73 20 7d  "Invoke", args }
b620: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ;....          i
b630: 66 20 28 21 65 61 72 6c 79 42 6f 75 6e 64 29 0d  f (!earlyBound).
b640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
b650: 65 77 41 72 67 73 20 3d 20 6e 65 77 20 6f 62 6a  ewArgs = new obj
b660: 65 63 74 5b 5d 20 7b 20 6e 65 77 41 72 67 73 20  ect[] { newArgs 
b670: 7d 3b 20 2f 2f 20 57 52 41 50 0d 0a 0d 0a 20 20  }; // WRAP....  
b680: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
b690: 65 77 41 72 67 73 3b 0d 0a 20 20 20 20 20 20 7d  ewArgs;..      }
b6a0: 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ....      //////
b6b0: 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f  ///....      ///
b700: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
b710: 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68    /// Returns th
b720: 65 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65  e list of argume
b730: 6e 74 73 20 66 6f 72 20 74 68 65 20 3c 73 65 65  nts for the <see
b740: 20 63 72 65 66 3d 22 53 74 65 70 22 20 2f 3e 20   cref="Step" /> 
b750: 6d 65 74 68 6f 64 2c 0d 0a 20 20 20 20 20 20 2f  method,..      /
b760: 2f 2f 20 61 73 20 61 6e 20 3c 73 65 65 20 63 72  // as an <see cr
b770: 65 66 3d 22 41 72 72 61 79 22 20 2f 3e 20 6f 66  ef="Array" /> of
b780: 20 3c 73 65 65 20 63 72 65 66 3d 22 4f 62 6a 65   <see cref="Obje
b790: 63 74 22 20 2f 3e 2e 20 20 54 68 65 20 66 69 72  ct" />.  The fir
b7a0: 73 74 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 61 72  st..      /// ar
b7b0: 67 75 6d 65 6e 74 20 69 73 20 61 6c 77 61 79 73  gument is always
b7c0: 20 74 68 65 20 6c 69 74 65 72 61 6c 20 73 74 72   the literal str
b7d0: 69 6e 67 20 22 53 74 65 70 22 2e 0d 0a 20 20 20  ing "Step"...   
b7e0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
b7f0: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  >..      /// <pa
b800: 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e  ram name="args">
b810: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20  ..      /// The 
b820: 6f 72 69 67 69 6e 61 6c 20 61 72 67 75 6d 65 6e  original argumen
b830: 74 73 20 72 65 63 65 69 76 65 64 20 62 79 20 74  ts received by t
b840: 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53 74  he <see cref="St
b850: 65 70 22 20 2f 3e 20 6d 65 74 68 6f 64 2e 0d 0a  ep" /> method...
b860: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
b870: 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70  m>..      /// <p
b880: 61 72 61 6d 20 6e 61 6d 65 3d 22 73 74 65 70 4e  aram name="stepN
b890: 75 6d 62 65 72 22 3e 0d 0a 20 20 20 20 20 20 2f  umber">..      /
b8a0: 2f 2f 20 54 68 65 20 73 74 65 70 20 6e 75 6d 62  // The step numb
b8b0: 65 72 20 28 6f 6e 65 20 62 61 73 65 64 29 2e 20  er (one based). 
b8c0: 20 54 68 69 73 20 69 73 20 69 6e 63 72 65 6d 65   This is increme
b8d0: 6d 74 65 64 20 65 61 63 68 20 74 69 6d 65 20 74  mted each time t
b8e0: 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73  he..      /// <s
b8f0: 65 65 20 63 72 65 66 3d 22 53 74 65 70 22 20 2f  ee cref="Step" /
b900: 3e 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  > method is call
b910: 65 64 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  ed...      /// <
b920: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f  /param>..      /
b930: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
b940: 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 0d 0a 20  contextData">.. 
b950: 20 20 20 20 20 2f 2f 2f 20 41 20 70 6c 61 63 65       /// A place
b960: 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70 6c 65  holder for imple
b970: 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f 72 65  menters to store
b980: 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61 74 61   contextual data
b990: 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20 20 20   pertaining..   
b9a0: 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 63 75     /// to the cu
b9b0: 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0d 0a  rrent context...
b9c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
b9d0: 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70  m>..      /// <p
b9e0: 61 72 61 6d 20 6e 61 6d 65 3d 22 65 61 72 6c 79  aram name="early
b9f0: 42 6f 75 6e 64 22 3e 0d 0a 20 20 20 20 20 20 2f  Bound">..      /
ba00: 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  // Non-zero if t
ba10: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 67 75  he returned argu
ba20: 6d 65 6e 74 73 20 61 72 65 20 67 6f 69 6e 67 20  ments are going 
ba30: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
ba40: 74 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  the..      /// <
ba50: 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65  see cref="SQLite
ba60: 53 74 65 70 44 65 6c 65 67 61 74 65 22 20 2f 3e  StepDelegate" />
ba70: 20 74 79 70 65 3b 20 6f 74 68 65 72 77 69 73 65   type; otherwise
ba80: 2c 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 2f  , zero...      /
ba90: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
baa0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
bab0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20  ..      /// The 
bac0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 70 61 73  arguments to pas
bad0: 73 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  s to the configu
bae0: 72 65 64 20 3c 73 65 65 20 63 72 65 66 3d 22 44  red <see cref="D
baf0: 65 6c 65 67 61 74 65 22 20 2f 3e 2e 0d 0a 20 20  elegate" />...  
bb00: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
bb10: 73 3e 0d 0a 20 20 20 20 20 20 70 72 6f 74 65 63  s>..      protec
bb20: 74 65 64 20 76 69 72 74 75 61 6c 20 6f 62 6a 65  ted virtual obje
bb30: 63 74 5b 5d 20 47 65 74 53 74 65 70 41 72 67 73  ct[] GetStepArgs
bb40: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  (..          obj
bb50: 65 63 74 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20  ect[] args,..   
bb60: 20 20 20 20 20 20 20 69 6e 74 20 73 74 65 70 4e         int stepN
bb70: 75 6d 62 65 72 2c 0d 0a 20 20 20 20 20 20 20 20  umber,..        
bb80: 20 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74    object context
bb90: 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20  Data,..         
bba0: 20 62 6f 6f 6c 20 65 61 72 6c 79 42 6f 75 6e 64   bool earlyBound
bbb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 29 20 2f 2a  ..          ) /*
bbc0: 20 43 41 4e 4e 4f 54 20 52 45 54 55 52 4e 20 4e   CANNOT RETURN N
bbd0: 55 4c 4c 20 2a 2f 0d 0a 20 20 20 20 20 20 7b 0d  ULL */..      {.
bbe0: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
bbf0: 74 5b 5d 20 6e 65 77 41 72 67 73 20 3d 20 6e 65  t[] newArgs = ne
bc00: 77 20 6f 62 6a 65 63 74 5b 5d 20 7b 0d 0a 20 20  w object[] {..  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 74 65              "Ste
bc20: 70 22 2c 20 61 72 67 73 2c 20 73 74 65 70 4e 75  p", args, stepNu
bc30: 6d 62 65 72 2c 20 63 6f 6e 74 65 78 74 44 61 74  mber, contextDat
bc40: 61 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0d  a..          };.
bc50: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
bc60: 28 21 65 61 72 6c 79 42 6f 75 6e 64 29 0d 0a 20  (!earlyBound).. 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
bc80: 41 72 67 73 20 3d 20 6e 65 77 20 6f 62 6a 65 63  Args = new objec
bc90: 74 5b 5d 20 7b 20 6e 65 77 41 72 67 73 20 7d 3b  t[] { newArgs };
bca0: 20 2f 2f 20 57 52 41 50 0d 0a 0d 0a 20 20 20 20   // WRAP....    
bcb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77        return new
bcc0: 41 72 67 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  Args;..      }..
bcd0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f  ..      ////////
bce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bcf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bd00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bd10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bd20: 2f 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  /....      /// <
bd30: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20  summary>..      
bd40: 2f 2f 2f 20 55 70 64 61 74 65 73 20 74 68 65 20  /// Updates the 
bd50: 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 73  output arguments
bd60: 20 66 6f 72 20 74 68 65 20 3c 73 65 65 20 63 72   for the <see cr
bd70: 65 66 3d 22 53 74 65 70 22 20 2f 3e 20 6d 65 74  ef="Step" /> met
bd80: 68 6f 64 2c 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  hod,..      /// 
bd90: 75 73 69 6e 67 20 61 6e 20 3c 73 65 65 20 63 72  using an <see cr
bda0: 65 66 3d 22 41 72 72 61 79 22 20 2f 3e 20 6f 66  ef="Array" /> of
bdb0: 20 3c 73 65 65 20 63 72 65 66 3d 22 4f 62 6a 65   <see cref="Obje
bdc0: 63 74 22 20 2f 3e 2e 20 20 54 68 65 20 66 69 72  ct" />.  The fir
bdd0: 73 74 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 61 72  st..      /// ar
bde0: 67 75 6d 65 6e 74 20 69 73 20 61 6c 77 61 79 73  gument is always
bdf0: 20 74 68 65 20 6c 69 74 65 72 61 6c 20 73 74 72   the literal str
be00: 69 6e 67 20 22 53 74 65 70 22 2e 20 20 43 75 72  ing "Step".  Cur
be10: 72 65 6e 74 6c 79 2c 20 6f 6e 6c 79 20 74 68 65  rently, only the
be20: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ..      /// <par
be30: 61 6d 72 65 66 20 6e 61 6d 65 3d 22 63 6f 6e 74  amref name="cont
be40: 65 78 74 44 61 74 61 22 20 2f 3e 20 70 61 72 61  extData" /> para
be50: 6d 65 74 65 72 20 69 73 20 75 70 64 61 74 65 64  meter is updated
be60: 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73  ...      /// </s
be70: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f  ummary>..      /
be80: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
be90: 61 72 67 73 22 3e 0d 0a 20 20 20 20 20 20 2f 2f  args">..      //
bea0: 2f 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 61  / The original a
beb0: 72 67 75 6d 65 6e 74 73 20 72 65 63 65 69 76 65  rguments receive
bec0: 64 20 62 79 20 74 68 65 20 3c 73 65 65 20 63 72  d by the <see cr
bed0: 65 66 3d 22 53 74 65 70 22 20 2f 3e 20 6d 65 74  ef="Step" /> met
bee0: 68 6f 64 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  hod...      /// 
bef0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
bf00: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
bf10: 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 0d 0a  "contextData">..
bf20: 20 20 20 20 20 20 2f 2f 2f 20 41 20 70 6c 61 63        /// A plac
bf30: 65 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70 6c  eholder for impl
bf40: 65 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f 72  ementers to stor
bf50: 65 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61 74  e contextual dat
bf60: 61 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20 20  a pertaining..  
bf70: 20 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 63      /// to the c
bf80: 75 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0d  urrent context..
bf90: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  .      /// </par
bfa0: 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  am>..      /// <
bfb0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 65 61 72 6c  param name="earl
bfc0: 79 42 6f 75 6e 64 22 3e 0d 0a 20 20 20 20 20 20  yBound">..      
bfd0: 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20  /// Non-zero if 
bfe0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 67  the returned arg
bff0: 75 6d 65 6e 74 73 20 61 72 65 20 67 6f 69 6e 67  uments are going
c000: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
c010: 20 74 68 65 0d 0a 20 20 20 20 20 20 2f 2f 2f 20   the..      /// 
c020: 3c 73 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74  <see cref="SQLit
c030: 65 53 74 65 70 44 65 6c 65 67 61 74 65 22 20 2f  eStepDelegate" /
c040: 3e 20 74 79 70 65 3b 20 6f 74 68 65 72 77 69 73  > type; otherwis
c050: 65 2c 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20  e, zero...      
c060: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
c070: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
c080: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65  >..      /// The
c090: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 70 61   arguments to pa
c0a0: 73 73 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  ss to the config
c0b0: 75 72 65 64 20 3c 73 65 65 20 63 72 65 66 3d 22  ured <see cref="
c0c0: 44 65 6c 65 67 61 74 65 22 20 2f 3e 2e 0d 0a 20  Delegate" />... 
c0d0: 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72       /// </retur
c0e0: 6e 73 3e 0d 0a 20 20 20 20 20 20 70 72 6f 74 65  ns>..      prote
c0f0: 63 74 65 64 20 76 69 72 74 75 61 6c 20 76 6f 69  cted virtual voi
c100: 64 20 55 70 64 61 74 65 53 74 65 70 41 72 67 73  d UpdateStepArgs
c110: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  (..          obj
c120: 65 63 74 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20  ect[] args,..   
c130: 20 20 20 20 20 20 20 72 65 66 20 6f 62 6a 65 63         ref objec
c140: 74 20 63 6f 6e 74 65 78 74 44 61 74 61 2c 0d 0a  t contextData,..
c150: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 65            bool e
c160: 61 72 6c 79 42 6f 75 6e 64 0d 0a 20 20 20 20 20  arlyBound..     
c170: 20 20 20 20 20 29 20 2f 2a 20 43 41 4e 4e 4f 54       ) /* CANNOT
c180: 20 52 45 54 55 52 4e 20 4e 55 4c 4c 20 2a 2f 0d   RETURN NULL */.
c190: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
c1a0: 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 6e 65 77      object[] new
c1b0: 41 72 67 73 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  Args;....       
c1c0: 20 20 20 69 66 20 28 65 61 72 6c 79 42 6f 75 6e     if (earlyBoun
c1d0: 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d)..            
c1e0: 20 20 6e 65 77 41 72 67 73 20 3d 20 61 72 67 73    newArgs = args
c1f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  ;..          els
c200: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
c210: 20 6e 65 77 41 72 67 73 20 3d 20 61 72 67 73 5b   newArgs = args[
c220: 30 5d 20 61 73 20 6f 62 6a 65 63 74 5b 5d 3b 0d  0] as object[];.
c230: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
c240: 28 6e 65 77 41 72 67 73 20 3d 3d 20 6e 75 6c 6c  (newArgs == null
c250: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
c260: 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20   return;....    
c270: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 44 61 74        contextDat
c280: 61 20 3d 20 6e 65 77 41 72 67 73 5b 6e 65 77 41  a = newArgs[newA
c290: 72 67 73 2e 4c 65 6e 67 74 68 20 2d 20 31 5d 3b  rgs.Length - 1];
c2a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c2b0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
c2c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
c300: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
c310: 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 52  ry>..      /// R
c320: 65 74 75 72 6e 73 20 74 68 65 20 6c 69 73 74 20  eturns the list 
c330: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  of arguments for
c340: 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22   the <see cref="
c350: 46 69 6e 61 6c 22 20 2f 3e 20 6d 65 74 68 6f 64  Final" /> method
c360: 2c 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 61 73 20  ,..      /// as 
c370: 61 6e 20 3c 73 65 65 20 63 72 65 66 3d 22 41 72  an <see cref="Ar
c380: 72 61 79 22 20 2f 3e 20 6f 66 20 3c 73 65 65 20  ray" /> of <see 
c390: 63 72 65 66 3d 22 4f 62 6a 65 63 74 22 20 2f 3e  cref="Object" />
c3a0: 2e 20 20 54 68 65 20 66 69 72 73 74 0d 0a 20 20  .  The first..  
c3b0: 20 20 20 20 2f 2f 2f 20 61 72 67 75 6d 65 6e 74      /// argument
c3c0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6c   is always the l
c3d0: 69 74 65 72 61 6c 20 73 74 72 69 6e 67 20 22 46  iteral string "F
c3e0: 69 6e 61 6c 22 2e 0d 0a 20 20 20 20 20 20 2f 2f  inal"...      //
c3f0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
c400: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
c410: 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44 61 74 61  ame="contextData
c420: 22 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 41 20  ">..      /// A 
c430: 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  placeholder for 
c440: 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20  implementers to 
c450: 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75 61 6c  store contextual
c460: 20 64 61 74 61 20 70 65 72 74 61 69 6e 69 6e 67   data pertaining
c470: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 74 6f 20 74  ..      /// to t
c480: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
c490: 78 74 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  xt...      /// <
c4a0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f  /param>..      /
c4b0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
c4c0: 65 61 72 6c 79 42 6f 75 6e 64 22 3e 0d 0a 20 20  earlyBound">..  
c4d0: 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f      /// Non-zero
c4e0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
c4f0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 67   arguments are g
c500: 6f 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  oing to be used 
c510: 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20  with the..      
c520: 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53  /// <see cref="S
c530: 51 4c 69 74 65 46 69 6e 61 6c 44 65 6c 65 67 61  QLiteFinalDelega
c540: 74 65 22 20 2f 3e 20 74 79 70 65 3b 20 6f 74 68  te" /> type; oth
c550: 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0d 0a 20  erwise, zero... 
c560: 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d       /// </param
c570: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65  >..      /// <re
c580: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f 2f  turns>..      //
c590: 2f 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  / The arguments 
c5a0: 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 63  to pass to the c
c5b0: 6f 6e 66 69 67 75 72 65 64 20 3c 73 65 65 20 63  onfigured <see c
c5c0: 72 65 66 3d 22 44 65 6c 65 67 61 74 65 22 20 2f  ref="Delegate" /
c5d0: 3e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  >...      /// </
c5e0: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
c5f0: 70 72 6f 74 65 63 74 65 64 20 76 69 72 74 75 61  protected virtua
c600: 6c 20 6f 62 6a 65 63 74 5b 5d 20 47 65 74 46 69  l object[] GetFi
c610: 6e 61 6c 41 72 67 73 28 0d 0a 20 20 20 20 20 20  nalArgs(..      
c620: 20 20 20 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65      object conte
c630: 78 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  xtData,..       
c640: 20 20 20 62 6f 6f 6c 20 65 61 72 6c 79 42 6f 75     bool earlyBou
c650: 6e 64 0d 0a 20 20 20 20 20 20 20 20 20 20 29 20  nd..          ) 
c660: 2f 2a 20 43 41 4e 4e 4f 54 20 52 45 54 55 52 4e  /* CANNOT RETURN
c670: 20 4e 55 4c 4c 20 2a 2f 0d 0a 20 20 20 20 20 20   NULL */..      
c680: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
c690: 65 63 74 5b 5d 20 6e 65 77 41 72 67 73 20 3d 20  ect[] newArgs = 
c6a0: 6e 65 77 20 6f 62 6a 65 63 74 5b 5d 20 7b 20 22  new object[] { "
c6b0: 46 69 6e 61 6c 22 2c 20 63 6f 6e 74 65 78 74 44  Final", contextD
c6c0: 61 74 61 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20  ata };....      
c6d0: 20 20 20 20 69 66 20 28 21 65 61 72 6c 79 42 6f      if (!earlyBo
c6e0: 75 6e 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20  und)..          
c6f0: 20 20 20 20 6e 65 77 41 72 67 73 20 3d 20 6e 65      newArgs = ne
c700: 77 20 6f 62 6a 65 63 74 5b 5d 20 7b 20 6e 65 77  w object[] { new
c710: 41 72 67 73 20 7d 3b 20 2f 2f 20 57 52 41 50 0d  Args }; // WRAP.
c720: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ...          ret
c730: 75 72 6e 20 6e 65 77 41 72 67 73 3b 0d 0a 20 20  urn newArgs;..  
c740: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f      }....      /
c750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c790: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
c7a0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
c7b0: 0a 20 20 20 20 20 20 2f 2f 2f 20 52 65 74 75 72  .      /// Retur
c7c0: 6e 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  ns the list of a
c7d0: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  rguments for the
c7e0: 20 3c 73 65 65 20 63 72 65 66 3d 22 43 6f 6d 70   <see cref="Comp
c7f0: 61 72 65 22 20 2f 3e 20 6d 65 74 68 6f 64 2c 0d  are" /> method,.
c800: 0a 20 20 20 20 20 20 2f 2f 2f 20 61 73 20 61 6e  .      /// as an
c810: 20 3c 73 65 65 20 63 72 65 66 3d 22 41 72 72 61   <see cref="Arra
c820: 79 22 20 2f 3e 20 6f 66 20 3c 73 65 65 20 63 72  y" /> of <see cr
c830: 65 66 3d 22 4f 62 6a 65 63 74 22 20 2f 3e 2e 20  ef="Object" />. 
c840: 20 54 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20   The first..    
c850: 20 20 2f 2f 2f 20 61 72 67 75 6d 65 6e 74 20 69    /// argument i
c860: 73 20 61 6c 77 61 79 73 20 74 68 65 20 6c 69 74  s always the lit
c870: 65 72 61 6c 20 73 74 72 69 6e 67 20 22 43 6f 6d  eral string "Com
c880: 70 61 72 65 22 2e 0d 0a 20 20 20 20 20 20 2f 2f  pare"...      //
c890: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
c8a0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
c8b0: 61 6d 65 3d 22 70 61 72 61 6d 31 22 3e 0d 0a 20  ame="param1">.. 
c8c0: 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69 72       /// The fir
c8d0: 73 74 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d  st string to com
c8e0: 70 61 72 65 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  pare...      ///
c8f0: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
c900: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
c910: 3d 22 70 61 72 61 6d 32 22 3e 0d 0a 20 20 20 20  ="param2">..    
c920: 20 20 2f 2f 2f 20 54 68 65 20 73 65 63 6f 6e 64    /// The second
c930: 20 73 74 72 6e 69 67 20 74 6f 20 63 6f 6d 70 61   strnig to compa
c940: 72 65 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  re...      /// <
c950: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f  /param>..      /
c960: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
c970: 65 61 72 6c 79 42 6f 75 6e 64 22 3e 0d 0a 20 20  earlyBound">..  
c980: 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d 7a 65 72 6f      /// Non-zero
c990: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
c9a0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 67   arguments are g
c9b0: 6f 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  oing to be used 
c9c0: 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20  with the..      
c9d0: 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 53  /// <see cref="S
c9e0: 51 4c 69 74 65 43 6f 6d 70 61 72 65 44 65 6c 65  QLiteCompareDele
c9f0: 67 61 74 65 22 20 2f 3e 20 74 79 70 65 3b 20 6f  gate" /> type; o
ca00: 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0d  therwise, zero..
ca10: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  .      /// </par
ca20: 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  am>..      /// <
ca30: 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20  returns>..      
ca40: 2f 2f 2f 20 54 68 65 20 61 72 67 75 6d 65 6e 74  /// The argument
ca50: 73 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  s to pass to the
ca60: 20 63 6f 6e 66 69 67 75 72 65 64 20 3c 73 65 65   configured <see
ca70: 20 63 72 65 66 3d 22 44 65 6c 65 67 61 74 65 22   cref="Delegate"
ca80: 20 2f 3e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20   />...      /// 
ca90: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
caa0: 20 20 70 72 6f 74 65 63 74 65 64 20 76 69 72 74    protected virt
cab0: 75 61 6c 20 6f 62 6a 65 63 74 5b 5d 20 47 65 74  ual object[] Get
cac0: 43 6f 6d 70 61 72 65 41 72 67 73 28 0d 0a 20 20  CompareArgs(..  
cad0: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70          string p
cae0: 61 72 61 6d 31 2c 0d 0a 20 20 20 20 20 20 20 20  aram1,..        
caf0: 20 20 73 74 72 69 6e 67 20 70 61 72 61 6d 32 2c    string param2,
cb00: 0d 0a 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c  ..          bool
cb10: 20 65 61 72 6c 79 42 6f 75 6e 64 0d 0a 20 20 20   earlyBound..   
cb20: 20 20 20 20 20 20 20 29 20 2f 2a 20 43 41 4e 4e         ) /* CANN
cb30: 4f 54 20 52 45 54 55 52 4e 20 4e 55 4c 4c 20 2a  OT RETURN NULL *
cb40: 2f 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  /..      {..    
cb50: 20 20 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20 6e        object[] n
cb60: 65 77 41 72 67 73 20 3d 20 6e 65 77 20 6f 62 6a  ewArgs = new obj
cb70: 65 63 74 5b 5d 20 7b 20 22 43 6f 6d 70 61 72 65  ect[] { "Compare
cb80: 22 2c 20 70 61 72 61 6d 31 2c 20 70 61 72 61 6d  ", param1, param
cb90: 32 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  2 };....        
cba0: 20 20 69 66 20 28 21 65 61 72 6c 79 42 6f 75 6e    if (!earlyBoun
cbb0: 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d)..            
cbc0: 20 20 6e 65 77 41 72 67 73 20 3d 20 6e 65 77 20    newArgs = new 
cbd0: 6f 62 6a 65 63 74 5b 5d 20 7b 20 6e 65 77 41 72  object[] { newAr
cbe0: 67 73 20 7d 3b 20 2f 2f 20 57 52 41 50 0d 0a 0d  gs }; // WRAP...
cbf0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
cc00: 6e 20 6e 65 77 41 72 67 73 3b 0d 0a 20 20 20 20  n newArgs;..    
cc10: 20 20 7d 0d 0a 20 20 20 20 20 20 23 65 6e 64 72    }..      #endr
cc20: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 2f  egion....      /
cc30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cc40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cc50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cc60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cc70: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
cc80: 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63    #region Public
cc90: 20 50 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   Properties..   
cca0: 20 20 20 70 72 69 76 61 74 65 20 44 65 6c 65 67     private Deleg
ccb0: 61 74 65 20 63 61 6c 6c 62 61 63 6b 3b 0d 0a 20  ate callback;.. 
ccc0: 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72       /// <summar
ccd0: 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68  y>..      /// Th
cce0: 65 20 3c 73 65 65 20 63 72 65 66 3d 22 44 65 6c  e <see cref="Del
ccf0: 65 67 61 74 65 22 20 2f 3e 20 74 6f 20 62 65 20  egate" /> to be 
cd00: 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 63 61 6c  used for all cal
cd10: 6c 73 20 69 6e 74 6f 20 74 68 65 0d 0a 20 20 20  ls into the..   
cd20: 20 20 20 2f 2f 2f 20 76 69 72 74 75 61 6c 20 6d     /// virtual m
cd30: 65 74 68 6f 64 73 20 6e 65 65 64 65 64 20 62 79  ethods needed by
cd40: 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22   the <see cref="
cd50: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 22 20  SQLiteFunction" 
cd60: 2f 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 63 6c  />..      /// cl
cd70: 61 73 73 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ass...      /// 
cd80: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
cd90: 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c    public virtual
cda0: 20 44 65 6c 65 67 61 74 65 20 43 61 6c 6c 62 61   Delegate Callba
cdb0: 63 6b 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  ck..      {..   
cdc0: 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
cdd0: 75 72 6e 20 63 61 6c 6c 62 61 63 6b 3b 20 7d 0d  urn callback; }.
cde0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b  .          set {
cdf0: 20 63 61 6c 6c 62 61 63 6b 20 3d 20 76 61 6c 75   callback = valu
ce00: 65 3b 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  e; }..      }.. 
ce10: 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
ce20: 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  ...      ///////
ce30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ce40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ce50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ce60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ce70: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 23 72 65 67  //....      #reg
ce80: 69 6f 6e 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ion System.Data.
ce90: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 46 75 6e  SQLite.SQLiteFun
cea0: 63 74 69 6f 6e 20 4f 76 65 72 72 69 64 65 73 0d  ction Overrides.
ceb0: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  .      /// <summ
cec0: 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ary>..      /// 
ced0: 54 68 69 73 20 76 69 72 74 75 61 6c 20 6d 65 74  This virtual met
cee0: 68 6f 64 20 69 73 20 74 68 65 20 69 6d 70 6c 65  hod is the imple
cef0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 73 63  mentation for sc
cf00: 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0d  alar functions..
cf10: 0a 20 20 20 20 20 20 2f 2f 2f 20 53 65 65 20 74  .      /// See t
cf20: 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53 51  he <see cref="SQ
cf30: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 2e 49 6e 76  LiteFunction.Inv
cf40: 6f 6b 65 22 20 2f 3e 20 6d 65 74 68 6f 64 20 66  oke" /> method f
cf50: 6f 72 20 6d 6f 72 65 0d 0a 20 20 20 20 20 20 2f  or more..      /
cf60: 2f 2f 20 64 65 74 61 69 6c 73 2e 0d 0a 20 20 20  // details...   
cf70: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
cf80: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  >..      /// <pa
cf90: 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e  ram name="args">
cfa0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20  ..      /// The 
cfb0: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  arguments for th
cfc0: 65 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  e scalar functio
cfd0: 6e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f  n...      /// </
cfe0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f  param>..      //
cff0: 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  / <returns>..   
d000: 20 20 20 2f 2f 2f 20 54 68 65 20 72 65 73 75 6c     /// The resul
d010: 74 20 6f 66 20 74 68 65 20 73 63 61 6c 61 72 20  t of the scalar 
d020: 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  function...     
d030: 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d   /// </returns>.
d040: 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76  .      public ov
d050: 65 72 72 69 64 65 20 6f 62 6a 65 63 74 20 49 6e  erride object In
d060: 76 6f 6b 65 28 0d 0a 20 20 20 20 20 20 20 20 20  voke(..         
d070: 20 6f 62 6a 65 63 74 5b 5d 20 61 72 67 73 20 2f   object[] args /
d080: 2a 20 69 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 20  * in */..       
d090: 20 20 20 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20     )..      {.. 
d0a0: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 61 6c           if (cal
d0b0: 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  lback == null)..
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
d0d0: 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f  row new InvalidO
d0e0: 70 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f  perationExceptio
d0f0: 6e 28 4e 6f 43 61 6c 6c 62 61 63 6b 45 72 72 6f  n(NoCallbackErro
d100: 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  r);....         
d110: 20 53 51 4c 69 74 65 49 6e 76 6f 6b 65 44 65 6c   SQLiteInvokeDel
d120: 65 67 61 74 65 20 69 6e 76 6f 6b 65 44 65 6c 65  egate invokeDele
d130: 67 61 74 65 20 3d 0d 0a 20 20 20 20 20 20 20 20  gate =..        
d140: 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 20 61        callback a
d150: 73 20 53 51 4c 69 74 65 49 6e 76 6f 6b 65 44 65  s SQLiteInvokeDe
d160: 6c 65 67 61 74 65 3b 0d 0a 0d 0a 20 20 20 20 20  legate;....     
d170: 20 20 20 20 20 69 66 20 28 69 6e 76 6f 6b 65 44       if (invokeD
d180: 65 6c 65 67 61 74 65 20 21 3d 20 6e 75 6c 6c 29  elegate != null)
d190: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d1b0: 75 72 6e 20 69 6e 76 6f 6b 65 44 65 6c 65 67 61  urn invokeDelega
d1c0: 74 65 2e 49 6e 76 6f 6b 65 28 22 49 6e 76 6f 6b  te.Invoke("Invok
d1d0: 65 22 2c 20 61 72 67 73 29 3b 20 2f 2a 20 74 68  e", args); /* th
d1e0: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
d1f0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65    }..          e
d200: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  lse..          {
d210: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d220: 72 65 74 75 72 6e 20 63 61 6c 6c 62 61 63 6b 2e  return callback.
d230: 44 79 6e 61 6d 69 63 49 6e 76 6f 6b 65 28 0d 0a  DynamicInvoke(..
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 47 65 74 49 6e 76 6f 6b 65 41 72 67 73 28    GetInvokeArgs(
d260: 61 72 67 73 2c 20 66 61 6c 73 65 29 29 3b 20 2f  args, false)); /
d270: 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
d280: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
d290: 0d 0a 0d 0a 20 20 20 20 20 20 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 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2e0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 2f  ///....      ///
d2f0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
d300: 20 20 2f 2f 2f 20 54 68 69 73 20 76 69 72 74 75    /// This virtu
d310: 61 6c 20 6d 65 74 68 6f 64 20 69 73 20 70 61 72  al method is par
d320: 74 20 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65  t of the impleme
d330: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72  ntation for aggr
d340: 65 67 61 74 65 0d 0a 20 20 20 20 20 20 2f 2f 2f  egate..      ///
d350: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 65 65   functions.  See
d360: 20 74 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22   the <see cref="
d370: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 2e 53  SQLiteFunction.S
d380: 74 65 70 22 20 2f 3e 20 6d 65 74 68 6f 64 0d 0a  tep" /> method..
d390: 20 20 20 20 20 20 2f 2f 2f 20 66 6f 72 20 6d 6f        /// for mo
d3a0: 72 65 20 64 65 74 61 69 6c 73 2e 0d 0a 20 20 20  re details...   
d3b0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
d3c0: 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61  >..      /// <pa
d3d0: 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e  ram name="args">
d3e0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20  ..      /// The 
d3f0: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  arguments for th
d400: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
d410: 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  tion...      ///
d420: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
d430: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
d440: 3d 22 73 74 65 70 4e 75 6d 62 65 72 22 3e 0d 0a  ="stepNumber">..
d450: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 73 74        /// The st
d460: 65 70 20 6e 75 6d 62 65 72 20 28 6f 6e 65 20 62  ep number (one b
d470: 61 73 65 64 29 2e 20 20 54 68 69 73 20 69 73 20  ased).  This is 
d480: 69 6e 63 72 65 6d 65 6d 74 65 64 20 65 61 63 68  incrememted each
d490: 20 74 69 6d 65 20 74 68 65 0d 0a 20 20 20 20 20   time the..     
d4a0: 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
d4b0: 53 74 65 70 22 20 2f 3e 20 6d 65 74 68 6f 64 20  Step" /> method 
d4c0: 69 73 20 63 61 6c 6c 65 64 2e 0d 0a 20 20 20 20  is called...    
d4d0: 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a    /// </param>..
d4e0: 20 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d        /// <param
d4f0: 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 44 61   name="contextDa
d500: 74 61 22 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  ta">..      /// 
d510: 41 20 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f  A placeholder fo
d520: 72 20 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74  r implementers t
d530: 6f 20 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75  o store contextu
d540: 61 6c 20 64 61 74 61 20 70 65 72 74 61 69 6e 69  al data pertaini
d550: 6e 67 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 74 6f  ng..      /// to
d560: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
d570: 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f  text...      ///
d580: 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20   </param>..     
d590: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
d5a0: 20 76 6f 69 64 20 53 74 65 70 28 0d 0a 20 20 20   void Step(..   
d5b0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 5b 5d 20         object[] 
d5c0: 61 72 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  args,         /*
d5d0: 20 69 6e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20   in */..        
d5e0: 20 20 69 6e 74 20 73 74 65 70 4e 75 6d 62 65 72    int stepNumber
d5f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 20 2a  ,        /* in *
d600: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 66  /..          ref
d610: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44   object contextD
d620: 61 74 61 20 2f 2a 20 69 6e 2c 20 6f 75 74 20 2a  ata /* in, out *
d630: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 29 0d 0a  /..          )..
d640: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
d650: 20 20 20 69 66 20 28 63 61 6c 6c 62 61 63 6b 20     if (callback 
d660: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
d670: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
d680: 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69  w InvalidOperati
d690: 6f 6e 45 78 63 65 70 74 69 6f 6e 28 4e 6f 43 61  onException(NoCa
d6a0: 6c 6c 62 61 63 6b 45 72 72 6f 72 29 3b 0d 0a 0d  llbackError);...
d6b0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74  .          SQLit
d6c0: 65 53 74 65 70 44 65 6c 65 67 61 74 65 20 73 74  eStepDelegate st
d6d0: 65 70 44 65 6c 65 67 61 74 65 20 3d 20 63 61 6c  epDelegate = cal
d6e0: 6c 62 61 63 6b 20 61 73 20 53 51 4c 69 74 65 53  lback as SQLiteS
d6f0: 74 65 70 44 65 6c 65 67 61 74 65 3b 0d 0a 0d 0a  tepDelegate;....
d700: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
d710: 65 70 44 65 6c 65 67 61 74 65 20 21 3d 20 6e 75  epDelegate != nu
d720: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ll)..          {
d730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d740: 73 74 65 70 44 65 6c 65 67 61 74 65 2e 49 6e 76  stepDelegate.Inv
d750: 6f 6b 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  oke(..          
d760: 20 20 20 20 20 20 20 20 22 53 74 65 70 22 2c 20          "Step", 
d770: 61 72 67 73 2c 20 73 74 65 70 4e 75 6d 62 65 72  args, stepNumber
d780: 2c 20 72 65 66 20 63 6f 6e 74 65 78 74 44 61 74  , ref contextDat
d790: 61 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d  a); /* throw */.
d7a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d7b0: 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
d7c0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d7d0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 5b           object[
d7e0: 5d 20 6e 65 77 41 72 67 73 20 3d 20 47 65 74 53  ] newArgs = GetS
d7f0: 74 65 70 41 72 67 73 28 0d 0a 20 20 20 20 20 20  tepArgs(..      
d800: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73              args
d810: 2c 20 73 74 65 70 4e 75 6d 62 65 72 2c 20 63 6f  , stepNumber, co
d820: 6e 74 65 78 74 44 61 74 61 2c 20 66 61 6c 73 65  ntextData, false
d830: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
d840: 20 20 20 20 2f 2a 20 49 47 4e 4f 52 45 44 20 2a      /* IGNORED *
d850: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
d860: 20 63 61 6c 6c 62 61 63 6b 2e 44 79 6e 61 6d 69   callback.Dynami
d870: 63 49 6e 76 6f 6b 65 28 6e 65 77 41 72 67 73 29  cInvoke(newArgs)
d880: 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 0d  ; /* throw */...
d890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55  .              U
d8a0: 70 64 61 74 65 53 74 65 70 41 72 67 73 28 6e 65  pdateStepArgs(ne
d8b0: 77 41 72 67 73 2c 20 72 65 66 20 63 6f 6e 74 65  wArgs, ref conte
d8c0: 78 74 44 61 74 61 2c 20 66 61 6c 73 65 29 3b 0d  xtData, false);.
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d8e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f      }....      /
d8f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d930: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
d940: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
d950: 0a 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73 20  .      /// This 
d960: 76 69 72 74 75 61 6c 20 6d 65 74 68 6f 64 20 69  virtual method i
d970: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6d  s part of the im
d980: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  plementation for
d990: 20 61 67 67 72 65 67 61 74 65 0d 0a 20 20 20 20   aggregate..    
d9a0: 20 20 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 73 2e    /// functions.
d9b0: 20 20 53 65 65 20 74 68 65 20 3c 73 65 65 20 63    See the <see c
d9c0: 72 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74  ref="SQLiteFunct
d9d0: 69 6f 6e 2e 46 69 6e 61 6c 22 20 2f 3e 20 6d 65  ion.Final" /> me
d9e0: 74 68 6f 64 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  thod..      /// 
d9f0: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73  for more details
da00: 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73  ...      /// </s
da10: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f  ummary>..      /
da20: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
da30: 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 0d 0a 20  contextData">.. 
da40: 20 20 20 20 20 2f 2f 2f 20 41 20 70 6c 61 63 65       /// A place
da50: 68 6f 6c 64 65 72 20 66 6f 72 20 69 6d 70 6c 65  holder for imple
da60: 6d 65 6e 74 65 72 73 20 74 6f 20 73 74 6f 72 65  menters to store
da70: 20 63 6f 6e 74 65 78 74 75 61 6c 20 64 61 74 61   contextual data
da80: 20 70 65 72 74 61 69 6e 69 6e 67 0d 0a 20 20 20   pertaining..   
da90: 20 20 20 2f 2f 2f 20 74 6f 20 74 68 65 20 63 75     /// to the cu
daa0: 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 2e 0d 0a  rrent context...
dab0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
dac0: 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72  m>..      /// <r
dad0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f  eturns>..      /
dae0: 2f 2f 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  // The result of
daf0: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
db00: 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  unction...      
db10: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
db20: 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65        public ove
db30: 72 72 69 64 65 20 6f 62 6a 65 63 74 20 46 69 6e  rride object Fin
db40: 61 6c 28 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  al(..          o
db50: 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74  bject contextDat
db60: 61 20 2f 2a 20 69 6e 20 2a 2f 0d 0a 20 20 20 20  a /* in */..    
db70: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 7b        )..      {
db80: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
db90: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c  callback == null
dba0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
dbb0: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
dbc0: 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  idOperationExcep
dbd0: 74 69 6f 6e 28 4e 6f 43 61 6c 6c 62 61 63 6b 45  tion(NoCallbackE
dbe0: 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  rror);....      
dbf0: 20 20 20 20 53 51 4c 69 74 65 46 69 6e 61 6c 44      SQLiteFinalD
dc00: 65 6c 65 67 61 74 65 20 66 69 6e 61 6c 44 65 6c  elegate finalDel
dc10: 65 67 61 74 65 20 3d 20 63 61 6c 6c 62 61 63 6b  egate = callback
dc20: 20 61 73 20 53 51 4c 69 74 65 46 69 6e 61 6c 44   as SQLiteFinalD
dc30: 65 6c 65 67 61 74 65 3b 0d 0a 0d 0a 20 20 20 20  elegate;....    
dc40: 20 20 20 20 20 20 69 66 20 28 66 69 6e 61 6c 44        if (finalD
dc50: 65 6c 65 67 61 74 65 20 21 3d 20 6e 75 6c 6c 29  elegate != null)
dc60: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
dc80: 75 72 6e 20 66 69 6e 61 6c 44 65 6c 65 67 61 74  urn finalDelegat
dc90: 65 2e 49 6e 76 6f 6b 65 28 22 46 69 6e 61 6c 22  e.Invoke("Final"
dca0: 2c 20 63 6f 6e 74 65 78 74 44 61 74 61 29 3b 0d  , contextData);.
dcb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
dcc0: 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
dcd0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
dce0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
dcf0: 63 61 6c 6c 62 61 63 6b 2e 44 79 6e 61 6d 69 63  callback.Dynamic
dd00: 49 6e 76 6f 6b 65 28 47 65 74 46 69 6e 61 6c 41  Invoke(GetFinalA
dd10: 72 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  rgs(..          
dd20: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 44          contextD
dd30: 61 74 61 2c 20 63 61 6c 6c 62 61 63 6b 20 69 73  ata, callback is
dd40: 20 53 51 4c 69 74 65 46 69 6e 61 6c 44 65 6c 65   SQLiteFinalDele
dd50: 67 61 74 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77  gate)); /* throw
dd60: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d   */..          }
dd70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
dd80: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
dd90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dda0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ddb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ddc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
ddd0: 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61        /// <summa
dde0: 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 54  ry>..      /// T
ddf0: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 65 74 68  his virtual meth
de00: 6f 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  od is part of th
de10: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
de20: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0d 0a   for collating..
de30: 20 20 20 20 20 20 2f 2f 2f 20 73 65 71 75 65 6e        /// sequen
de40: 63 65 73 2e 20 20 53 65 65 20 74 68 65 20 3c 73  ces.  See the <s
de50: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 46  ee cref="SQLiteF
de60: 75 6e 63 74 69 6f 6e 2e 43 6f 6d 70 61 72 65 22  unction.Compare"
de70: 20 2f 3e 20 6d 65 74 68 6f 64 0d 0a 20 20 20 20   /> method..    
de80: 20 20 2f 2f 2f 20 66 6f 72 20 6d 6f 72 65 20 64    /// for more d
de90: 65 74 61 69 6c 73 2e 0d 0a 20 20 20 20 20 20 2f  etails...      /
dea0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
deb0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
dec0: 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22 3e 0d 0a  name="param1">..
ded0: 20 20 20 20 20 20 2f 2f 2f 20 54 68 65 20 66 69        /// The fi
dee0: 72 73 74 20 73 74 72 69 6e 67 20 74 6f 20 63 6f  rst string to co
def0: 6d 70 61 72 65 2e 0d 0a 20 20 20 20 20 20 2f 2f  mpare...      //
df00: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
df10: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
df20: 65 3d 22 70 61 72 61 6d 32 22 3e 0d 0a 20 20 20  e="param2">..   
df30: 20 20 20 2f 2f 2f 20 54 68 65 20 73 65 63 6f 6e     /// The secon
df40: 64 20 73 74 72 6e 69 67 20 74 6f 20 63 6f 6d 70  d strnig to comp
df50: 61 72 65 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  are...      /// 
df60: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20  </param>..      
df70: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0d 0a 20  /// <returns>.. 
df80: 20 20 20 20 20 2f 2f 2f 20 41 20 70 6f 73 69 74       /// A posit
df90: 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 74  ive integer if t
dfa0: 68 65 20 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d  he <paramref nam
dfb0: 65 3d 22 70 61 72 61 6d 31 22 20 2f 3e 20 70 61  e="param1" /> pa
dfc0: 72 61 6d 65 74 65 72 20 69 73 0d 0a 20 20 20 20  rameter is..    
dfd0: 20 20 2f 2f 2f 20 67 72 65 61 74 65 72 20 74 68    /// greater th
dfe0: 61 6e 20 74 68 65 20 3c 70 61 72 61 6d 72 65 66  an the <paramref
dff0: 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 20 2f   name="param2" /
e000: 3e 20 70 61 72 61 6d 65 74 65 72 2c 20 61 20 6e  > parameter, a n
e010: 65 67 61 74 69 76 65 0d 0a 20 20 20 20 20 20 2f  egative..      /
e020: 2f 2f 20 69 6e 74 65 67 65 72 20 69 66 20 74 68  // integer if th
e030: 65 20 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d 65  e <paramref name
e040: 3d 22 70 61 72 61 6d 31 22 20 2f 3e 20 70 61 72  ="param1" /> par
e050: 61 6d 65 74 65 72 20 69 73 20 6c 65 73 73 20 74  ameter is less t
e060: 68 61 6e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 74  han..      /// t
e070: 68 65 20 3c 70 61 72 61 6d 72 65 66 20 6e 61 6d  he <paramref nam
e080: 65 3d 22 70 61 72 61 6d 32 22 20 2f 3e 20 70 61  e="param2" /> pa
e090: 72 61 6d 65 74 65 72 2c 20 6f 72 20 7a 65 72 6f  rameter, or zero
e0a0: 20 69 66 20 74 68 65 79 20 61 72 65 0d 0a 20 20   if they are..  
e0b0: 20 20 20 20 2f 2f 2f 20 65 71 75 61 6c 2e 0d 0a      /// equal...
e0c0: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75        /// </retu
e0d0: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 70 75 62 6c  rns>..      publ
e0e0: 69 63 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20  ic override int 
e0f0: 43 6f 6d 70 61 72 65 28 0d 0a 20 20 20 20 20 20  Compare(..      
e100: 20 20 20 20 73 74 72 69 6e 67 20 70 61 72 61 6d      string param
e110: 31 2c 20 2f 2a 20 69 6e 20 2a 2f 0d 0a 20 20 20  1, /* in */..   
e120: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 61         string pa
e130: 72 61 6d 32 20 20 2f 2a 20 69 6e 20 2a 2f 0d 0a  ram2  /* in */..
e140: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
e150: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
e160: 69 66 20 28 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  if (callback == 
e170: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
e180: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49       throw new I
e190: 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45  nvalidOperationE
e1a0: 78 63 65 70 74 69 6f 6e 28 4e 6f 43 61 6c 6c 62  xception(NoCallb
e1b0: 61 63 6b 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20  ackError);....  
e1c0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f          SQLiteCo
e1d0: 6d 70 61 72 65 44 65 6c 65 67 61 74 65 20 63 6f  mpareDelegate co
e1e0: 6d 70 61 72 65 44 65 6c 65 67 61 74 65 20 3d 0d  mpareDelegate =.
e1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
e200: 61 6c 6c 62 61 63 6b 20 61 73 20 53 51 4c 69 74  allback as SQLit
e210: 65 43 6f 6d 70 61 72 65 44 65 6c 65 67 61 74 65  eCompareDelegate
e220: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ;....          i
e230: 66 20 28 63 6f 6d 70 61 72 65 44 65 6c 65 67 61  f (compareDelega
e240: 74 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  te != null)..   
e250: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
e260: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
e270: 6f 6d 70 61 72 65 44 65 6c 65 67 61 74 65 2e 49  ompareDelegate.I
e280: 6e 76 6f 6b 65 28 22 43 6f 6d 70 61 72 65 22 2c  nvoke("Compare",
e290: 20 70 61 72 61 6d 31 2c 20 70 61 72 61 6d 32 29   param1, param2)
e2a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
e2b0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
e2c0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
e2d0: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
e2e0: 74 20 72 65 73 75 6c 74 20 3d 20 63 61 6c 6c 62  t result = callb
e2f0: 61 63 6b 2e 44 79 6e 61 6d 69 63 49 6e 76 6f 6b  ack.DynamicInvok
e300: 65 28 47 65 74 43 6f 6d 70 61 72 65 41 72 67 73  e(GetCompareArgs
e310: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
e320: 20 20 20 20 20 70 61 72 61 6d 31 2c 20 70 61 72       param1, par
e330: 61 6d 32 2c 20 66 61 6c 73 65 29 29 3b 20 2f 2a  am2, false)); /*
e340: 20 74 68 72 6f 77 20 2a 2f 0d 0a 0d 0a 20 20 20   throw */....   
e350: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
e360: 65 73 75 6c 74 20 69 73 20 69 6e 74 29 0d 0a 20  esult is int).. 
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 72 65 73   return (int)res
e390: 75 6c 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ult;....        
e3a0: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
e3b0: 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e  InvalidOperation
e3c0: 45 78 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67  Exception(String
e3d0: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73 75              Resu
e3f0: 6c 74 49 6e 74 33 32 45 72 72 6f 72 2c 20 22 43  ltInt32Error, "C
e400: 6f 6d 70 61 72 65 22 29 29 3b 0d 0a 20 20 20 20  ompare"));..    
e410: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
e420: 0d 0a 20 20 20 20 20 20 23 65 6e 64 72 65 67 69  ..      #endregi
e430: 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f  on..  }....  ///
e440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
e490: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
e4a0: 20 2f 2f 2f 20 45 78 74 65 6e 64 73 20 53 51 4c   /// Extends SQL
e4b0: 69 74 65 46 75 6e 63 74 69 6f 6e 20 61 6e 64 20  iteFunction and 
e4c0: 61 6c 6c 6f 77 73 20 61 6e 20 69 6e 68 65 72 69  allows an inheri
e4d0: 74 65 64 20 63 6c 61 73 73 20 74 6f 20 6f 62 74  ted class to obt
e4e0: 61 69 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ain the collatin
e4f0: 67 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63  g sequence assoc
e500: 69 61 74 65 64 20 77 69 74 68 20 61 20 66 75 6e  iated with a fun
e510: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0d 0a 20 20 2f  ction call...  /
e520: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
e530: 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d 0a   /// <remarks>..
e540: 20 20 2f 2f 2f 20 55 73 65 72 2d 64 65 66 69 6e    /// User-defin
e550: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  ed functions can
e560: 20 63 61 6c 6c 20 74 68 65 20 47 65 74 43 6f 6c   call the GetCol
e570: 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 28 29  lationSequence()
e580: 20 6d 65 74 68 6f 64 20 69 6e 20 74 68 69 73 20   method in this 
e590: 63 6c 61 73 73 20 61 6e 64 20 75 73 65 20 69 74  class and use it
e5a0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 73 74 72 69   to compare stri
e5b0: 6e 67 73 20 61 6e 64 20 63 68 61 72 20 61 72 72  ngs and char arr
e5c0: 61 79 73 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 72 65  ays...  /// </re
e5d0: 6d 61 72 6b 73 3e 0d 0a 20 20 70 75 62 6c 69 63  marks>..  public
e5e0: 20 63 6c 61 73 73 20 53 51 4c 69 74 65 46 75 6e   class SQLiteFun
e5f0: 63 74 69 6f 6e 45 78 20 3a 20 53 51 4c 69 74 65  ctionEx : SQLite
e600: 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20  Function..  {.. 
e610: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
e620: 0d 0a 20 20 20 20 2f 2f 2f 20 4f 62 74 61 69 6e  ..    /// Obtain
e630: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
e640: 73 65 71 75 65 6e 63 65 20 69 6e 20 65 66 66 65  sequence in effe
e650: 63 74 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ct for the given
e660: 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20   function...    
e670: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
e680: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
e690: 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
e6a0: 20 70 72 6f 74 65 63 74 65 64 20 43 6f 6c 6c 61   protected Colla
e6b0: 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 47 65 74  tionSequence Get
e6c0: 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63  CollationSequenc
e6d0: 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  e()..    {..    
e6e0: 20 20 72 65 74 75 72 6e 20 5f 62 61 73 65 2e 47    return _base.G
e6f0: 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65  etCollationSeque
e700: 6e 63 65 28 74 68 69 73 2c 20 5f 63 6f 6e 74 65  nce(this, _conte
e710: 78 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  xt);..    }.... 
e720: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
e730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e780: 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f  //....    #regio
e790: 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22 50  n IDisposable "P
e7a0: 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73 0d  attern" Members.
e7b0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f  .    private boo
e7c0: 6c 20 64 69 73 70 6f 73 65 64 3b 0d 0a 20 20 20  l disposed;..   
e7d0: 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 43 68   private void Ch
e7e0: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20 2f 2a  eckDisposed() /*
e7f0: 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 7b   throw */..    {
e800: 0d 0a 23 69 66 20 54 48 52 4f 57 5f 4f 4e 5f 44  ..#if THROW_ON_D
e810: 49 53 50 4f 53 45 44 0d 0a 20 20 20 20 20 20 20  ISPOSED..       
e820: 20 69 66 20 28 64 69 73 70 6f 73 65 64 29 0d 0a   if (disposed)..
e830: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
e840: 77 20 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70  w new ObjectDisp
e850: 6f 73 65 64 45 78 63 65 70 74 69 6f 6e 28 74 79  osedException(ty
e860: 70 65 6f 66 28 53 51 4c 69 74 65 46 75 6e 63 74  peof(SQLiteFunct
e870: 69 6f 6e 45 78 29 2e 4e 61 6d 65 29 3b 0d 0a 23  ionEx).Name);..#
e880: 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  endif..    }....
e890: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
e8a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e8b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e8c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e8d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e8e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e8f0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 70 72 6f 74 65  ///....    prote
e900: 63 74 65 64 20 6f 76 65 72 72 69 64 65 20 76 6f  cted override vo
e910: 69 64 20 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20  id Dispose(bool 
e920: 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20  disposing)..    
e930: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a  {..        try..
e940: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
e950: 20 20 20 20 20 20 20 69 66 20 28 21 64 69 73 70         if (!disp
e960: 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  osed)..         
e970: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
e980: 20 20 20 20 20 20 2f 2f 69 66 20 28 64 69 73 70        //if (disp
e990: 6f 73 69 6e 67 29 0d 0a 20 20 20 20 20 20 20 20  osing)..        
e9a0: 20 20 20 20 20 20 20 20 2f 2f 7b 0d 0a 20 20 20          //{..   
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
e9c0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
e9d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e9e0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20  ///////..       
e9f0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 2f           //    /
ea00: 2f 20 64 69 73 70 6f 73 65 20 6d 61 6e 61 67 65  / dispose manage
ea10: 64 20 72 65 73 6f 75 72 63 65 73 20 68 65 72 65  d resources here
ea20: 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .....           
ea30: 20 20 20 20 20 2f 2f 20 20 20 20 2f 2f 2f 2f 2f       //    /////
ea40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ea50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
ea60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea70: 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   //}....        
ea80: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
ea90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eaa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 2f 2f 20 72 65 6c 65 61 73 65 20 75 6e 6d 61 6e  // release unman
ead0: 61 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68  aged resources h
eae0: 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20  ere.....        
eaf0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
eb00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eb10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
eb30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
eb40: 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20    finally..     
eb50: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
eb60: 20 20 62 61 73 65 2e 44 69 73 70 6f 73 65 28 64    base.Dispose(d
eb70: 69 73 70 6f 73 69 6e 67 29 3b 0d 0a 0d 0a 20 20  isposing);....  
eb80: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
eb90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
eba0: 45 3a 20 45 76 65 72 79 74 68 69 6e 67 20 73 68  E: Everything sh
ebb0: 6f 75 6c 64 20 62 65 20 66 75 6c 6c 79 20 64 69  ould be fully di
ebc0: 73 70 6f 73 65 64 20 61 74 20 74 68 69 73 20 70  sposed at this p
ebd0: 6f 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  oint...         
ebe0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
ebf0: 20 20 20 64 69 73 70 6f 73 65 64 20 3d 20 74 72     disposed = tr
ec00: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
ec10: 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72      }..    #endr
ec20: 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  egion..  }....  
ec30: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
ec40: 20 2f 2f 2f 20 54 68 65 20 74 79 70 65 20 6f 66   /// The type of
ec50: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
ec60: 6e 63 74 69 6f 6e 20 74 6f 20 64 65 63 6c 61 72  nction to declar
ec70: 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  e..  /// </summa
ec80: 72 79 3e 0d 0a 20 20 70 75 62 6c 69 63 20 65 6e  ry>..  public en
ec90: 75 6d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 0d  um FunctionType.
eca0: 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  .  {..    /// <s
ecb0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
ecc0: 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   Scalar function
ecd0: 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74  s are designed t
ece0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 6e 64 20  o be called and 
ecf0: 72 65 74 75 72 6e 20 61 20 72 65 73 75 6c 74 20  return a result 
ed00: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 45 78  immediately.  Ex
ed10: 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65 20 41  amples include A
ed20: 42 53 28 29 2c 20 55 70 70 65 72 28 29 2c 20 4c  BS(), Upper(), L
ed30: 6f 77 65 72 28 29 2c 20 65 74 63 2e 0d 0a 20 20  ower(), etc...  
ed40: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
ed50: 0d 0a 20 20 20 20 53 63 61 6c 61 72 20 3d 20 30  ..    Scalar = 0
ed60: 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ,..    /// <summ
ed70: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 67  ary>..    /// Ag
ed80: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
ed90: 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74  s are designed t
eda0: 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74  o accumulate dat
edb0: 61 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20  a until the end 
edc0: 6f 66 20 61 20 63 61 6c 6c 20 61 6e 64 20 74 68  of a call and th
edd0: 65 6e 20 72 65 74 75 72 6e 20 61 20 72 65 73 75  en return a resu
ede0: 6c 74 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20  lt gleaned from 
edf0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65 64 20  the accumulated 
ee00: 64 61 74 61 2e 0d 0a 20 20 20 20 2f 2f 2f 20 45  data...    /// E
ee10: 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65 20  xamples include 
ee20: 53 55 4d 28 29 2c 20 43 4f 55 4e 54 28 29 2c 20  SUM(), COUNT(), 
ee30: 41 56 47 28 29 2c 20 65 74 63 2e 0d 0a 20 20 20  AVG(), etc...   
ee40: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
ee50: 0a 20 20 20 20 41 67 67 72 65 67 61 74 65 20 3d  .    Aggregate =
ee60: 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75   1,..    /// <su
ee70: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
ee80: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
ee90: 63 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ces are used to 
eea0: 73 6f 72 74 20 74 65 78 74 75 61 6c 20 64 61 74  sort textual dat
eeb0: 61 20 69 6e 20 61 20 63 75 73 74 6f 6d 20 6d 61  a in a custom ma
eec0: 6e 6e 65 72 2c 20 61 6e 64 20 61 70 70 65 61 72  nner, and appear
eed0: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
eee0: 63 6c 61 75 73 65 2e 20 20 54 79 70 69 63 61 6c  clause.  Typical
eef0: 6c 79 20 74 65 78 74 20 69 6e 20 61 6e 20 4f 52  ly text in an OR
ef00: 44 45 52 20 42 59 20 69 73 0d 0a 20 20 20 20 2f  DER BY is..    /
ef10: 2f 2f 20 73 6f 72 74 65 64 20 75 73 69 6e 67 20  // sorted using 
ef20: 61 20 73 74 72 61 69 67 68 74 20 63 61 73 65 2d  a straight case-
ef30: 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6d 70  insensitive comp
ef40: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
ef50: 20 20 43 75 73 74 6f 6d 20 63 6f 6c 6c 61 74 69    Custom collati
ef60: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 63 61 6e  ng sequences can
ef70: 20 62 65 20 75 73 65 64 20 74 6f 20 61 6c 74 65   be used to alte
ef80: 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  r the behavior o
ef90: 66 20 74 65 78 74 20 73 6f 72 74 69 6e 67 0d 0a  f text sorting..
efa0: 20 20 20 20 2f 2f 2f 20 69 6e 20 61 20 75 73 65      /// in a use
efb0: 72 2d 64 65 66 69 6e 65 64 20 6d 61 6e 6e 65 72  r-defined manner
efc0: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
efd0: 6d 61 72 79 3e 0d 0a 20 20 20 20 43 6f 6c 6c 61  mary>..    Colla
efe0: 74 69 6f 6e 20 3d 20 32 2c 0d 0a 20 20 7d 0d 0a  tion = 2,..  }..
eff0: 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79  ..  /// <summary
f000: 3e 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65  >..  /// An inte
f010: 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 20 64 65  rnal callback de
f020: 6c 65 67 61 74 65 20 64 65 63 6c 61 72 61 74 69  legate declarati
f030: 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d  on...  /// </sum
f040: 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61  mary>..  /// <pa
f050: 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78  ram name="contex
f060: 74 22 3e 52 61 77 20 6e 61 74 69 76 65 20 63 6f  t">Raw native co
f070: 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f  ntext pointer fo
f080: 72 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  r the user funct
f090: 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  ion.</param>..  
f0a0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
f0b0: 22 61 72 67 63 22 3e 54 6f 74 61 6c 20 6e 75 6d  "argc">Total num
f0c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
f0d0: 20 74 6f 20 74 68 65 20 75 73 65 72 20 66 75 6e   to the user fun
f0e0: 63 74 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0d 0a  ction.</param>..
f0f0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
f100: 65 3d 22 61 72 67 76 22 3e 52 61 77 20 6e 61 74  e="argv">Raw nat
f110: 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ive pointer to t
f120: 68 65 20 61 72 72 61 79 20 6f 66 20 72 61 77 20  he array of raw 
f130: 6e 61 74 69 76 65 20 61 72 67 75 6d 65 6e 74 20  native argument 
f140: 70 6f 69 6e 74 65 72 73 2e 3c 2f 70 61 72 61 6d  pointers.</param
f150: 3e 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d  >..#if !PLATFORM
f160: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
f170: 4b 0d 0a 20 20 5b 55 6e 6d 61 6e 61 67 65 64 46  K..  [UnmanagedF
f180: 75 6e 63 74 69 6f 6e 50 6f 69 6e 74 65 72 28 43  unctionPointer(C
f190: 61 6c 6c 69 6e 67 43 6f 6e 76 65 6e 74 69 6f 6e  allingConvention
f1a0: 2e 43 64 65 63 6c 29 5d 0d 0a 23 65 6e 64 69 66  .Cdecl)]..#endif
f1b0: 0d 0a 20 20 70 75 62 6c 69 63 20 64 65 6c 65 67  ..  public deleg
f1c0: 61 74 65 20 76 6f 69 64 20 53 51 4c 69 74 65 43  ate void SQLiteC
f1d0: 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63  allback(IntPtr c
f1e0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
f1f0: 2c 20 49 6e 74 50 74 72 20 61 72 67 76 29 3b 0d  , IntPtr argv);.
f200: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
f210: 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65 72  ..  /// An inter
f220: 6e 61 6c 20 66 69 6e 61 6c 20 63 61 6c 6c 62 61  nal final callba
f230: 63 6b 20 64 65 6c 65 67 61 74 65 20 64 65 63 6c  ck delegate decl
f240: 61 72 61 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20  aration...  /// 
f250: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f  </summary>..  //
f260: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
f270: 6f 6e 74 65 78 74 22 3e 52 61 77 20 63 6f 6e 74  ontext">Raw cont
f280: 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ext pointer for 
f290: 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
f2a0: 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 23 69 66 20 21  n</param>..#if !
f2b0: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
f2c0: 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b 55 6e  FRAMEWORK..  [Un
f2d0: 6d 61 6e 61 67 65 64 46 75 6e 63 74 69 6f 6e 50  managedFunctionP
f2e0: 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67 43 6f  ointer(CallingCo
f2f0: 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c 29 5d  nvention.Cdecl)]
f300: 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e 74 65  ..#endif..  inte
f310: 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 76 6f  rnal delegate vo
f320: 69 64 20 53 51 4c 69 74 65 46 69 6e 61 6c 43 61  id SQLiteFinalCa
f330: 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63 6f  llback(IntPtr co
f340: 6e 74 65 78 74 29 3b 0d 0a 20 20 2f 2f 2f 20 3c  ntext);..  /// <
f350: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
f360: 49 6e 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63  Internal callbac
f370: 6b 20 64 65 6c 65 67 61 74 65 20 66 6f 72 20 69  k delegate for i
f380: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 63 6f 6c 6c  mplementing coll
f390: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 0d  ating sequences.
f3a0: 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
f3b0: 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  >..  /// <param 
f3c0: 6e 61 6d 65 3d 22 70 75 73 65 72 22 3e 4e 6f 74  name="puser">Not
f3d0: 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e 0d 0a 20   used</param>.. 
f3e0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
f3f0: 3d 22 6c 65 6e 31 22 3e 4c 65 6e 67 74 68 20 6f  ="len1">Length o
f400: 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 76 31  f the string pv1
f410: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20  </param>..  /// 
f420: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 76 31  <param name="pv1
f430: 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  ">Pointer to the
f440: 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 74 6f   first string to
f450: 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e   compare</param>
f460: 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e  ..  /// <param n
f470: 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e 67 74  ame="len2">Lengt
f480: 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  h of the string 
f490: 70 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f  pv2</param>..  /
f4a0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
f4b0: 70 76 32 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20  pv2">Pointer to 
f4c0: 74 68 65 20 73 65 63 6f 6e 64 20 73 74 72 69 6e  the second strin
f4d0: 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61  g to compare</pa
f4e0: 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65 74  ram>..  /// <ret
f4f0: 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31 20  urns>Returns -1 
f500: 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74 72  if the first str
f510: 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ing is less than
f520: 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30 20   the second.  0 
f530: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
f540: 6c 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20 66  l, or 1 if the f
f550: 69 72 73 74 20 73 74 72 69 6e 67 20 69 73 20 67  irst string is g
f560: 72 65 61 74 65 72 0d 0a 20 20 2f 2f 2f 20 74 68  reater..  /// th
f570: 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 3c 2f  an the second.</
f580: 72 65 74 75 72 6e 73 3e 0d 0a 23 69 66 20 21 50  returns>..#if !P
f590: 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
f5a0: 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b 55 6e 6d  RAMEWORK..  [Unm
f5b0: 61 6e 61 67 65 64 46 75 6e 63 74 69 6f 6e 50 6f  anagedFunctionPo
f5c0: 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67 43 6f 6e  inter(CallingCon
f5d0: 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c 29 5d 0d  vention.Cdecl)].
f5e0: 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e 74 65 72  .#endif..  inter
f5f0: 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 69 6e 74  nal delegate int
f600: 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e   SQLiteCollation
f610: 28 49 6e 74 50 74 72 20 70 75 73 65 72 2c 20 69  (IntPtr puser, i
f620: 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74 72 20  nt len1, IntPtr 
f630: 70 76 31 2c 20 69 6e 74 20 6c 65 6e 32 2c 20 49  pv1, int len2, I
f640: 6e 74 50 74 72 20 70 76 32 29 3b 0d 0a 0d 0a 20  ntPtr pv2);.... 
f650: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
f660: 20 20 2f 2f 2f 20 54 68 65 20 74 79 70 65 20 6f    /// The type o
f670: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
f680: 65 6e 63 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75  ence..  /// </su
f690: 6d 6d 61 72 79 3e 0d 0a 20 20 70 75 62 6c 69 63  mmary>..  public
f6a0: 20 65 6e 75 6d 20 43 6f 6c 6c 61 74 69 6f 6e 54   enum CollationT
f6b0: 79 70 65 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20  ypeEnum..  {..  
f6c0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
f6d0: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62 75 69  .    /// The bui
f6e0: 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c  lt-in BINARY col
f6f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0d  lating sequence.
f700: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
f710: 72 79 3e 0d 0a 20 20 20 20 42 69 6e 61 72 79 20  ry>..    Binary 
f720: 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  = 1,..    /// <s
f730: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
f740: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 4e 4f   The built-in NO
f750: 43 41 53 45 20 63 6f 6c 6c 61 74 69 6e 67 20 73  CASE collating s
f760: 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 2f 2f 2f  equence..    ///
f770: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
f780: 20 4e 6f 43 61 73 65 20 3d 20 32 2c 0d 0a 20 20   NoCase = 2,..  
f790: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
f7a0: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62 75 69  .    /// The bui
f7b0: 6c 74 2d 69 6e 20 52 45 56 45 52 53 45 20 63 6f  lt-in REVERSE co
f7c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f7d0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
f7e0: 61 72 79 3e 0d 0a 20 20 20 20 52 65 76 65 72 73  ary>..    Revers
f7f0: 65 20 3d 20 33 2c 0d 0a 20 20 20 20 2f 2f 2f 20  e = 3,..    /// 
f800: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
f810: 2f 2f 20 41 20 63 75 73 74 6f 6d 20 75 73 65 72  // A custom user
f820: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69  -defined collati
f830: 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20  ng sequence..   
f840: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
f850: 0a 20 20 20 20 43 75 73 74 6f 6d 20 3d 20 30 2c  .    Custom = 0,
f860: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c  ..  }....  /// <
f870: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
f880: 54 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  The encoding typ
f890: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
f8a0: 73 65 71 75 65 6e 63 65 20 75 73 65 73 0d 0a 20  sequence uses.. 
f8b0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
f8c0: 0a 20 20 70 75 62 6c 69 63 20 65 6e 75 6d 20 43  .  public enum C
f8d0: 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67  ollationEncoding
f8e0: 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20 20 20 2f  Enum..  {..    /
f8f0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
f900: 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74    /// The collat
f910: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
f920: 55 54 46 38 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  UTF8..    /// </
f930: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54  summary>..    UT
f940: 46 38 20 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f  F8 = 1,..    ///
f950: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
f960: 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  /// The collatio
f970: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 55 54  n sequence is UT
f980: 46 31 36 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  F16 little-endia
f990: 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  n..    /// </sum
f9a0: 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54 46 31 36  mary>..    UTF16
f9b0: 4c 45 20 3d 20 32 2c 0d 0a 20 20 20 20 2f 2f 2f  LE = 2,..    ///
f9c0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
f9d0: 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  /// The collatio
f9e0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 55 54  n sequence is UT
f9f0: 46 31 36 20 62 69 67 2d 65 6e 64 69 61 6e 0d 0a  F16 big-endian..
fa00: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
fa10: 79 3e 0d 0a 20 20 20 20 55 54 46 31 36 42 45 20  y>..    UTF16BE 
fa20: 3d 20 33 2c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f  = 3,..  }....  /
fa30: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
fa40: 2f 2f 2f 20 41 20 73 74 72 75 63 74 20 64 65 73  /// A struct des
fa50: 63 72 69 62 69 6e 67 20 74 68 65 20 63 6f 6c 6c  cribing the coll
fa60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 61  ating sequence a
fa70: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 65   function is exe
fa80: 63 75 74 69 6e 67 20 69 6e 0d 0a 20 20 2f 2f 2f  cuting in..  ///
fa90: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 70   </summary>..  p
faa0: 75 62 6c 69 63 20 73 74 72 75 63 74 20 43 6f 6c  ublic struct Col
fab0: 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 0d 0a  lationSequence..
fac0: 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    {..    /// <su
fad0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
fae0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
faf0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fb00: 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ce..    /// </su
fb10: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 75 62 6c  mmary>..    publ
fb20: 69 63 20 73 74 72 69 6e 67 20 4e 61 6d 65 3b 0d  ic string Name;.
fb30: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
fb40: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  y>..    /// The 
fb50: 74 79 70 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  type of collatin
fb60: 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20  g sequence..    
fb70: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
fb80: 20 20 20 20 70 75 62 6c 69 63 20 43 6f 6c 6c 61      public Colla
fb90: 74 69 6f 6e 54 79 70 65 45 6e 75 6d 20 54 79 70  tionTypeEnum Typ
fba0: 65 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  e;....    /// <s
fbb0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
fbc0: 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
fbd0: 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  ng of the collat
fbe0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0d 0a 20 20  ion sequence..  
fbf0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
fc00: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 43 6f 6c  ..    public Col
fc10: 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e  lationEncodingEn
fc20: 75 6d 20 45 6e 63 6f 64 69 6e 67 3b 0d 0a 0d 0a  um Encoding;....
fc30: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
fc40: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e 74 65  >..    /// Conte
fc50: 78 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  xt of the functi
fc60: 6f 6e 20 74 68 61 74 20 72 65 71 75 65 73 74 65  on that requeste
fc70: 64 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  d the collating 
fc80: 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 2f 2f  sequence..    //
fc90: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
fca0: 20 20 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74    internal SQLit
fcb0: 65 46 75 6e 63 74 69 6f 6e 20 5f 66 75 6e 63 3b  eFunction _func;
fcc0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
fcd0: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43  mary>..    /// C
fce0: 61 6c 6c 73 20 74 68 65 20 62 61 73 65 20 63 6f  alls the base co
fcf0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fd00: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
fd10: 73 74 72 69 6e 67 73 0d 0a 20 20 20 20 2f 2f 2f  strings..    ///
fd20: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
fd30: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
fd40: 3d 22 73 31 22 3e 54 68 65 20 66 69 72 73 74 20  ="s1">The first 
fd50: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
fd60: 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  e</param>..    /
fd70: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
fd80: 73 32 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 73  s2">The second s
fd90: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
fda0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
fdb0: 2f 20 3c 72 65 74 75 72 6e 73 3e 2d 31 20 69 66  / <returns>-1 if
fdc0: 20 73 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e   s1 is less than
fdd0: 20 73 32 2c 20 30 20 69 66 20 73 31 20 69 73 20   s2, 0 if s1 is 
fde0: 65 71 75 61 6c 20 74 6f 20 73 32 2c 20 61 6e 64  equal to s2, and
fdf0: 20 31 20 69 66 20 73 31 20 69 73 20 67 72 65 61   1 if s1 is grea
fe00: 74 65 72 20 74 68 61 6e 20 73 32 3c 2f 72 65 74  ter than s2</ret
fe10: 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69  urns>..    publi
fe20: 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 28 73 74  c int Compare(st
fe30: 72 69 6e 67 20 73 31 2c 20 73 74 72 69 6e 67 20  ring s1, string 
fe40: 73 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  s2)..    {..    
fe50: 20 20 72 65 74 75 72 6e 20 5f 66 75 6e 63 2e 5f    return _func._
fe60: 62 61 73 65 2e 43 6f 6e 74 65 78 74 43 6f 6c 6c  base.ContextColl
fe70: 61 74 65 43 6f 6d 70 61 72 65 28 45 6e 63 6f 64  ateCompare(Encod
fe80: 69 6e 67 2c 20 5f 66 75 6e 63 2e 5f 63 6f 6e 74  ing, _func._cont
fe90: 65 78 74 2c 20 73 31 2c 20 73 32 29 3b 0d 0a 20  ext, s1, s2);.. 
fea0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
feb0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
fec0: 2f 2f 20 43 61 6c 6c 73 20 74 68 65 20 62 61 73  // Calls the bas
fed0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fee0: 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20  ence to compare 
fef0: 74 77 6f 20 63 68 61 72 61 63 74 65 72 20 61 72  two character ar
ff00: 72 61 79 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  rays..    /// </
ff10: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
ff20: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
ff30: 31 22 3e 54 68 65 20 66 69 72 73 74 20 61 72 72  1">The first arr
ff40: 61 79 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70  ay to compare</p
ff50: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
ff60: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 32 22 3e  param name="c2">
ff70: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 72 61 79  The second array
ff80: 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72   to compare</par
ff90: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  am>..    /// <re
ffa0: 74 75 72 6e 73 3e 2d 31 20 69 66 20 63 31 20 69  turns>-1 if c1 i
ffb0: 73 20 6c 65 73 73 20 74 68 61 6e 20 63 32 2c 20  s less than c2, 
ffc0: 30 20 69 66 20 63 31 20 69 73 20 65 71 75 61 6c  0 if c1 is equal
ffd0: 20 74 6f 20 63 32 2c 20 61 6e 64 20 31 20 69 66   to c2, and 1 if
ffe0: 20 63 31 20 69 73 20 67 72 65 61 74 65 72 20 74   c1 is greater t
fff0: 68 61 6e 20 63 32 3c 2f 72 65 74 75 72 6e 73 3e  han c2</returns>
10000 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74  ..    public int
10010 20 43 6f 6d 70 61 72 65 28 63 68 61 72 5b 5d 20   Compare(char[] 
10020 63 31 2c 20 63 68 61 72 5b 5d 20 63 32 29 0d 0a  c1, char[] c2)..
10030 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
10040 75 72 6e 20 5f 66 75 6e 63 2e 5f 62 61 73 65 2e  urn _func._base.
10050 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65 43 6f  ContextCollateCo
10060 6d 70 61 72 65 28 45 6e 63 6f 64 69 6e 67 2c 20  mpare(Encoding, 
10070 5f 66 75 6e 63 2e 5f 63 6f 6e 74 65 78 74 2c 20  _func._context, 
10080 63 31 2c 20 63 32 29 3b 0d 0a 20 20 20 20 7d 0d  c1, c2);..    }.
10090 0a 20 20 7d 0d 0a 7d 0d 0a                       .  }..}..