System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 83a3d88d15e420dab93ad9a53b922bb552ae378a:


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 6f 6e 20 73 65 71 75 65 6e 63 65 73 0d 0a 20  ion 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 6c 69  / This static li
0d00: 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  st contains all 
0d10: 74 68 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64  the user-defined
0d20: 20 66 75 6e 63 74 69 6f 6e 73 20 64 65 63 6c 61   functions decla
0d30: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 70 72  red using the pr
0d40: 6f 70 65 72 20 61 74 74 72 69 62 75 74 65 73 2e  oper attributes.
0d50: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
0d60: 61 72 79 3e 0d 0a 20 20 20 20 70 72 69 76 61 74  ary>..    privat
0d70: 65 20 73 74 61 74 69 63 20 4c 69 73 74 3c 53 51  e static List<SQ
0d80: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
0d90: 69 62 75 74 65 3e 20 5f 72 65 67 69 73 74 65 72  ibute> _register
0da0: 65 64 46 75 6e 63 74 69 6f 6e 73 3b 0d 0a 0d 0a  edFunctions;....
0db0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
0dc0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72  >..    /// Inter
0dd0: 6e 61 6c 20 63 6f 6e 73 74 72 75 63 74 6f 72 2c  nal constructor,
0de0: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
0df0: 20 66 75 6e 63 74 69 6f 6e 27 73 20 69 6e 74 65   function's inte
0e00: 72 6e 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 0d  rnal variables..
0e10: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
0e20: 72 79 3e 0d 0a 20 20 20 20 70 72 6f 74 65 63 74  ry>..    protect
0e30: 65 64 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  ed SQLiteFunctio
0e40: 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  n()..    {..    
0e50: 20 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69    _contextDataLi
0e60: 73 74 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e  st = new Diction
0e70: 61 72 79 3c 49 6e 74 50 74 72 2c 20 41 67 67 72  ary<IntPtr, Aggr
0e80: 65 67 61 74 65 44 61 74 61 3e 28 29 3b 0d 0a 20  egateData>();.. 
0e90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
0ea0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
0eb0: 2f 2f 20 43 6f 6e 73 74 72 75 63 74 73 20 61 6e  // Constructs an
0ec0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
0ed0: 73 20 63 6c 61 73 73 20 75 73 69 6e 67 20 74 68  s class using th
0ee0: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
0ef0: 2d 74 79 70 65 0d 0a 20 20 20 20 2f 2f 2f 20 63  -type..    /// c
0f00: 6f 6e 76 65 72 73 69 6f 6e 20 70 61 72 61 6d 65  onversion parame
0f10: 74 65 72 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ters...    /// <
0f20: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  /summary>..    /
0f30: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
0f40: 66 6f 72 6d 61 74 22 3e 0d 0a 20 20 20 20 2f 2f  format">..    //
0f50: 2f 20 54 68 65 20 44 61 74 65 54 69 6d 65 20 66  / The DateTime f
0f60: 6f 72 6d 61 74 20 74 6f 20 62 65 20 75 73 65 64  ormat to be used
0f70: 20 77 68 65 6e 20 63 6f 6e 76 65 72 74 69 6e 67   when converting
0f80: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 20 74   string values t
0f90: 6f 20 61 0d 0a 20 20 20 20 2f 2f 2f 20 44 61 74  o a..    /// Dat
0fa0: 65 54 69 6d 65 20 61 6e 64 20 62 69 6e 64 69 6e  eTime and bindin
0fb0: 67 20 44 61 74 65 54 69 6d 65 20 70 61 72 61 6d  g DateTime param
0fc0: 65 74 65 72 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20  eters...    /// 
0fd0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
0fe0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6b  / <param name="k
0ff0: 69 6e 64 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54  ind">..    /// T
1000: 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 44 61  he <see cref="Da
1010: 74 65 54 69 6d 65 4b 69 6e 64 22 20 2f 3e 20 74  teTimeKind" /> t
1020: 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 63  o be used when c
1030: 72 65 61 74 69 6e 67 20 44 61 74 65 54 69 6d 65  reating DateTime
1040: 0d 0a 20 20 20 20 2f 2f 2f 20 76 61 6c 75 65 73  ..    /// values
1050: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  ...    /// </par
1060: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
1070: 72 61 6d 20 6e 61 6d 65 3d 22 66 6f 72 6d 61 74  ram name="format
1080: 53 74 72 69 6e 67 22 3e 0d 0a 20 20 20 20 2f 2f  String">..    //
1090: 2f 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72  / The format str
10a0: 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 77  ing to be used w
10b0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 6e 64 20  hen parsing and 
10c0: 66 6f 72 6d 61 74 74 69 6e 67 20 44 61 74 65 54  formatting DateT
10d0: 69 6d 65 0d 0a 20 20 20 20 2f 2f 2f 20 76 61 6c  ime..    /// val
10e0: 75 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ues...    /// </
10f0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
1100: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 75 74 66  <param name="utf
1110: 31 36 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e 6f  16">..    /// No
1120: 6e 2d 7a 65 72 6f 20 74 6f 20 63 72 65 61 74 65  n-zero to create
1130: 20 61 20 55 54 46 2d 31 36 20 64 61 74 61 2d 74   a UTF-16 data-t
1140: 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63  ype conversion c
1150: 6f 6e 74 65 78 74 3b 20 6f 74 68 65 72 77 69 73  ontext; otherwis
1160: 65 2c 0d 0a 20 20 20 20 2f 2f 2f 20 61 20 55 54  e,..    /// a UT
1170: 46 2d 38 20 64 61 74 61 2d 74 79 70 65 20 63 6f  F-8 data-type co
1180: 6e 76 65 72 73 69 6f 6e 20 63 6f 6e 74 65 78 74  nversion context
1190: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
11a0: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72  ...    /// </par
11b0: 61 6d 3e 0d 0a 20 20 20 20 70 72 6f 74 65 63 74  am>..    protect
11c0: 65 64 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  ed SQLiteFunctio
11d0: 6e 28 0d 0a 20 20 20 20 20 20 20 20 53 51 4c 69  n(..        SQLi
11e0: 74 65 44 61 74 65 46 6f 72 6d 61 74 73 20 66 6f  teDateFormats fo
11f0: 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 44  rmat,..        D
1200: 61 74 65 54 69 6d 65 4b 69 6e 64 20 6b 69 6e 64  ateTimeKind kind
1210: 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ,..        strin
1220: 67 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 2c 0d  g formatString,.
1230: 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 75 74  .        bool ut
1240: 66 31 36 0d 0a 20 20 20 20 20 20 20 20 29 0d 0a  f16..        )..
1250: 20 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 29          : this()
1260: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
1270: 20 69 66 20 28 75 74 66 31 36 29 0d 0a 20 20 20   if (utf16)..   
1280: 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 20 3d           _base =
1290: 20 6e 65 77 20 53 51 4c 69 74 65 33 5f 55 54 46   new SQLite3_UTF
12a0: 31 36 28 66 6f 72 6d 61 74 2c 20 6b 69 6e 64 2c  16(format, kind,
12b0: 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 2c 20 49   formatString, I
12c0: 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 6e 75 6c 6c  ntPtr.Zero, null
12d0: 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20  , false);..     
12e0: 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
12f0: 20 20 20 20 20 5f 62 61 73 65 20 3d 20 6e 65 77       _base = new
1300: 20 53 51 4c 69 74 65 33 28 66 6f 72 6d 61 74 2c   SQLite3(format,
1310: 20 6b 69 6e 64 2c 20 66 6f 72 6d 61 74 53 74 72   kind, formatStr
1320: 69 6e 67 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f  ing, IntPtr.Zero
1330: 2c 20 6e 75 6c 6c 2c 20 66 61 6c 73 65 29 3b 0d  , null, false);.
1340: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
1350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1370: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
13b0: 0a 20 20 20 20 23 72 65 67 69 6f 6e 20 49 44 69  .    #region IDi
13c0: 73 70 6f 73 61 62 6c 65 20 4d 65 6d 62 65 72 73  sposable Members
13d0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
13e0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 44 69 73  ry>..    /// Dis
13f0: 70 6f 73 65 73 20 6f 66 20 61 6e 79 20 61 63 74  poses of any act
1400: 69 76 65 20 63 6f 6e 74 65 78 74 44 61 74 61 20  ive contextData 
1410: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 77  variables that w
1420: 65 72 65 20 6e 6f 74 20 61 75 74 6f 6d 61 74 69  ere not automati
1430: 63 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20 75 70  cally cleaned up
1440: 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  .  Sometimes thi
1450: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 66 0d  s can happen if.
1460: 0a 20 20 20 20 2f 2f 2f 20 73 6f 6d 65 6f 6e 65  .    /// someone
1470: 20 63 6c 6f 73 65 73 20 74 68 65 20 63 6f 6e 6e   closes the conn
1480: 65 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 44  ection while a D
1490: 61 74 61 52 65 61 64 65 72 20 69 73 20 6f 70 65  ataReader is ope
14a0: 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  n...    /// </su
14b0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 75 62 6c  mmary>..    publ
14c0: 69 63 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28  ic void Dispose(
14d0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
14e0: 20 20 44 69 73 70 6f 73 65 28 74 72 75 65 29 3b    Dispose(true);
14f0: 0d 0a 20 20 20 20 20 20 20 20 47 43 2e 53 75 70  ..        GC.Sup
1500: 70 72 65 73 73 46 69 6e 61 6c 69 7a 65 28 74 68  pressFinalize(th
1510: 69 73 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  is);..    }..   
1520: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
1530: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1590: 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f  //....    #regio
15a0: 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22 50  n IDisposable "P
15b0: 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73 0d  attern" Members.
15c0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f  .    private boo
15d0: 6c 20 64 69 73 70 6f 73 65 64 3b 0d 0a 20 20 20  l disposed;..   
15e0: 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 43 68   private void Ch
15f0: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20 2f 2a  eckDisposed() /*
1600: 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 7b   throw */..    {
1610: 0d 0a 23 69 66 20 54 48 52 4f 57 5f 4f 4e 5f 44  ..#if THROW_ON_D
1620: 49 53 50 4f 53 45 44 0d 0a 20 20 20 20 20 20 20  ISPOSED..       
1630: 20 69 66 20 28 64 69 73 70 6f 73 65 64 29 0d 0a   if (disposed)..
1640: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
1650: 77 20 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70  w new ObjectDisp
1660: 6f 73 65 64 45 78 63 65 70 74 69 6f 6e 28 74 79  osedException(ty
1670: 70 65 6f 66 28 53 51 4c 69 74 65 46 75 6e 63 74  peof(SQLiteFunct
1680: 69 6f 6e 29 2e 4e 61 6d 65 29 3b 0d 0a 23 65 6e  ion).Name);..#en
1690: 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  dif..    }....  
16a0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
16b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1700: 2f 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  /....    /// <su
1710: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
1720: 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  Placeholder for 
1730: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 64  a user-defined d
1740: 69 73 70 6f 73 61 6c 20 72 6f 75 74 69 6e 65 0d  isposal routine.
1750: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
1760: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
1770: 72 61 6d 20 6e 61 6d 65 3d 22 64 69 73 70 6f 73  ram name="dispos
1780: 69 6e 67 22 3e 54 72 75 65 20 69 66 20 74 68 65  ing">True if the
1790: 20 6f 62 6a 65 63 74 20 69 73 20 62 65 69 6e 67   object is being
17a0: 20 64 69 73 70 6f 73 65 64 20 65 78 70 6c 69 63   disposed explic
17b0: 69 74 6c 79 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  itly</param>..  
17c0: 20 20 70 72 6f 74 65 63 74 65 64 20 76 69 72 74    protected virt
17d0: 75 61 6c 20 76 6f 69 64 20 44 69 73 70 6f 73 65  ual void Dispose
17e0: 28 62 6f 6f 6c 20 64 69 73 70 6f 73 69 6e 67 29  (bool disposing)
17f0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
1800: 20 69 66 20 28 21 64 69 73 70 6f 73 65 64 29 0d   if (!disposed).
1810: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
1820: 20 20 20 20 20 20 20 20 69 66 20 28 64 69 73 70          if (disp
1830: 6f 73 69 6e 67 29 0d 0a 20 20 20 20 20 20 20 20  osing)..        
1840: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1850: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
1860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20  ///////////..   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1890: 64 69 73 70 6f 73 65 20 6d 61 6e 61 67 65 64 20  dispose managed 
18a0: 72 65 73 6f 75 72 63 65 73 20 68 65 72 65 2e 2e  resources here..
18b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
18c0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
18d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18e0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
18f0: 20 20 20 20 20 20 20 20 20 20 20 49 44 69 73 70             IDisp
1900: 6f 73 61 62 6c 65 20 64 69 73 70 3b 0d 0a 0d 0a  osable disp;....
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 66 6f 72 65 61 63 68 20 28 4b 65 79 56 61 6c 75  foreach (KeyValu
1930: 65 50 61 69 72 3c 49 6e 74 50 74 72 2c 20 41 67  ePair<IntPtr, Ag
1940: 67 72 65 67 61 74 65 44 61 74 61 3e 20 6b 76 20  gregateData> kv 
1950: 69 6e 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c  in _contextDataL
1960: 69 73 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ist)..          
1970: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
1990: 70 20 3d 20 6b 76 2e 56 61 6c 75 65 2e 5f 64 61  p = kv.Value._da
19a0: 74 61 20 61 73 20 49 44 69 73 70 6f 73 61 62 6c  ta as IDisposabl
19b0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
19c0: 20 20 20 20 20 20 20 20 69 66 20 28 64 69 73 70          if (disp
19d0: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 64 69 73 70 2e 44 69 73 70 6f 73 65 28     disp.Dispose(
1a00: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
1a10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1a20: 20 20 20 20 20 20 20 5f 63 6f 6e 74 65 78 74 44         _contextD
1a30: 61 74 61 4c 69 73 74 2e 43 6c 65 61 72 28 29 3b  ataList.Clear();
1a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a50: 20 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69    _contextDataLi
1a60: 73 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  st = null;....  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 66                _f
1a80: 6c 61 67 73 20 3d 20 53 51 4c 69 74 65 43 6f 6e  lags = SQLiteCon
1a90: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4e 6f 6e  nectionFlags.Non
1aa0: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
1ab0: 20 20 20 20 20 20 5f 49 6e 76 6f 6b 65 46 75 6e        _InvokeFun
1ac0: 63 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  c = null;..     
1ad0: 20 20 20 20 20 20 20 20 20 20 20 5f 53 74 65 70             _Step
1ae0: 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  Func = null;..  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 46                _F
1b00: 69 6e 61 6c 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b  inalFunc = null;
1b10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b20: 20 20 5f 43 6f 6d 70 61 72 65 46 75 6e 63 20 3d    _CompareFunc =
1b30: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
1b40: 20 20 20 20 20 20 20 20 5f 62 61 73 65 20 3d 20          _base = 
1b50: 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  null;..         
1b60: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b70: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20  //////////..    
1ba0: 20 20 20 20 20 20 20 20 2f 2f 20 72 65 6c 65 61          // relea
1bb0: 73 65 20 75 6e 6d 61 6e 61 67 65 64 20 72 65 73  se unmanaged res
1bc0: 6f 75 72 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a  ources here.....
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
1be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c00: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
1c10: 20 20 64 69 73 70 6f 73 65 64 20 3d 20 74 72 75    disposed = tru
1c20: 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  e;..        }.. 
1c30: 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65     }..    #endre
1c40: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f  gion....    ////
1c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c60: 2f 2f 2f 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 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1cb0: 20 20 20 23 72 65 67 69 6f 6e 20 44 65 73 74 72     #region Destr
1cc0: 75 63 74 6f 72 0d 0a 20 20 20 20 7e 53 51 4c 69  uctor..    ~SQLi
1cd0: 74 65 46 75 6e 63 74 69 6f 6e 28 29 0d 0a 20 20  teFunction()..  
1ce0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 69 73    {..        Dis
1cf0: 70 6f 73 65 28 66 61 6c 73 65 29 3b 0d 0a 20 20  pose(false);..  
1d00: 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 67    }..    #endreg
1d10: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f  ion....    /////
1d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1d80: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
1d90: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73  .    /// Returns
1da0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1db0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  the underlying c
1dc0: 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 53 51 4c 69  onnection's SQLi
1dd0: 74 65 43 6f 6e 76 65 72 74 20 63 6c 61 73 73 2c  teConvert class,
1de0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75 73   which can be us
1df0: 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 0d 0a 20  ed to convert.. 
1e00: 20 20 20 2f 2f 2f 20 73 74 72 69 6e 67 73 20 61     /// strings a
1e10: 6e 64 20 44 61 74 65 54 69 6d 65 27 73 20 69 6e  nd DateTime's in
1e20: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  to the current c
1e30: 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 65 6e 63 6f  onnection's enco
1e40: 64 69 6e 67 20 73 63 68 65 6d 61 2e 0d 0a 20 20  ding schema...  
1e50: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
1e60: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 53 51 4c  ..    public SQL
1e70: 69 74 65 43 6f 6e 76 65 72 74 20 53 51 4c 69 74  iteConvert SQLit
1e80: 65 43 6f 6e 76 65 72 74 0d 0a 20 20 20 20 7b 0d  eConvert..    {.
1e90: 0a 20 20 20 20 20 20 67 65 74 0d 0a 20 20 20 20  .      get..    
1ea0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 43 68 65    {..        Che
1eb0: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20  ckDisposed();.. 
1ec0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 62         return _b
1ed0: 61 73 65 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ase;..      }.. 
1ee0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
1ef0: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
1f00: 2f 2f 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69  // Scalar functi
1f10: 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 68 69  ons override thi
1f20: 73 20 6d 65 74 68 6f 64 20 74 6f 20 64 6f 20 74  s method to do t
1f30: 68 65 69 72 20 6d 61 67 69 63 2e 0d 0a 20 20 20  heir magic...   
1f40: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
1f50: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b  .    /// <remark
1f60: 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 50 61 72 61  s>..    /// Para
1f70: 6d 65 74 65 72 73 20 70 61 73 73 65 64 20 74 6f  meters passed to
1f80: 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
1f90: 6f 6e 6c 79 20 61 6e 20 61 66 66 69 6e 69 74 79  only an affinity
1fa0: 20 66 6f 72 20 61 20 63 65 72 74 61 69 6e 20 64   for a certain d
1fb0: 61 74 61 20 74 79 70 65 2c 20 74 68 65 72 65 20  ata type, there 
1fc0: 69 73 20 6e 6f 20 75 6e 64 65 72 6c 79 69 6e 67  is no underlying
1fd0: 20 73 63 68 65 6d 61 20 61 76 61 69 6c 61 62 6c   schema availabl
1fe0: 65 0d 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 66 6f  e..    /// to fo
1ff0: 72 63 65 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  rce them into a 
2000: 63 65 72 74 61 69 6e 20 74 79 70 65 2e 20 20 54  certain type.  T
2010: 68 65 72 65 66 6f 72 65 20 74 68 65 20 6f 6e 6c  herefore the onl
2020: 79 20 74 79 70 65 73 20 79 6f 75 20 77 69 6c 6c  y types you will
2030: 20 65 76 65 72 20 73 65 65 20 61 73 20 70 61 72   ever see as par
2040: 61 6d 65 74 65 72 73 20 61 72 65 0d 0a 20 20 20  ameters are..   
2050: 20 2f 2f 2f 20 44 42 4e 75 6c 6c 2e 56 61 6c 75   /// DBNull.Valu
2060: 65 2c 20 49 6e 74 36 34 2c 20 44 6f 75 62 6c 65  e, Int64, Double
2070: 2c 20 53 74 72 69 6e 67 20 6f 72 20 62 79 74 65  , String or byte
2080: 5b 5d 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 2f  [] array...    /
2090: 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20  // </remarks>.. 
20a0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
20b0: 6d 65 3d 22 61 72 67 73 22 3e 54 68 65 20 61 72  me="args">The ar
20c0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20  guments for the 
20d0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f 63 65  command to proce
20e0: 73 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  ss</param>..    
20f0: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 59 6f 75  /// <returns>You
2100: 20 6d 61 79 20 72 65 74 75 72 6e 20 6d 6f 73 74   may return most
2110: 20 73 69 6d 70 6c 65 20 74 79 70 65 73 20 61 73   simple types as
2120: 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c   a return value,
2130: 20 6e 75 6c 6c 20 6f 72 20 44 42 4e 75 6c 6c 2e   null or DBNull.
2140: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
2150: 6e 75 6c 6c 2c 20 44 61 74 65 54 69 6d 65 2c 20  null, DateTime, 
2160: 6f 72 0d 0a 20 20 20 20 2f 2f 2f 20 79 6f 75 20  or..    /// you 
2170: 6d 61 79 20 72 65 74 75 72 6e 20 61 6e 20 45 78  may return an Ex
2180: 63 65 70 74 69 6f 6e 2d 64 65 72 69 76 65 64 20  ception-derived 
2190: 63 6c 61 73 73 20 69 66 20 79 6f 75 20 77 69 73  class if you wis
21a0: 68 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  h to return an e
21b0: 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 20  rror to SQLite. 
21c0: 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   Do not actually
21d0: 20 74 68 72 6f 77 20 74 68 65 20 65 72 72 6f 72   throw the error
21e0: 2c 0d 0a 20 20 20 20 2f 2f 2f 20 6a 75 73 74 20  ,..    /// just 
21f0: 72 65 74 75 72 6e 20 69 74 21 3c 2f 72 65 74 75  return it!</retu
2200: 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63  rns>..    public
2210: 20 76 69 72 74 75 61 6c 20 6f 62 6a 65 63 74 20   virtual object 
2220: 49 6e 76 6f 6b 65 28 6f 62 6a 65 63 74 5b 5d 20  Invoke(object[] 
2230: 61 72 67 73 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  args)..    {..  
2240: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
2250: 64 28 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75  d();..      retu
2260: 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 7d 0d  rn null;..    }.
2270: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
2280: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 67  ary>..    /// Ag
2290: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
22a0: 73 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  s override this 
22b0: 6d 65 74 68 6f 64 20 74 6f 20 64 6f 20 74 68 65  method to do the
22c0: 69 72 20 6d 61 67 69 63 2e 0d 0a 20 20 20 20 2f  ir magic...    /
22d0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
22e0: 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e     /// <remarks>
22f0: 0d 0a 20 20 20 20 2f 2f 2f 20 54 79 70 69 63 61  ..    /// Typica
2300: 6c 6c 79 20 79 6f 75 27 6c 6c 20 62 65 20 75 70  lly you'll be up
2310: 64 61 74 69 6e 67 20 77 68 61 74 65 76 65 72 20  dating whatever 
2320: 79 6f 75 27 76 65 20 70 6c 61 63 65 64 20 69 6e  you've placed in
2330: 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61 74 61   the contextData
2340: 20 66 69 65 6c 64 20 61 6e 64 20 72 65 74 75 72   field and retur
2350: 6e 69 6e 67 20 61 73 20 71 75 69 63 6b 6c 79 20  ning as quickly 
2360: 61 73 20 70 6f 73 73 69 62 6c 65 2e 0d 0a 20 20  as possible...  
2370: 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e    /// </remarks>
2380: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
2390: 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e 54 68 65   name="args">The
23a0: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74   arguments for t
23b0: 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72  he command to pr
23c0: 6f 63 65 73 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ocess</param>.. 
23d0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
23e0: 6d 65 3d 22 73 74 65 70 4e 75 6d 62 65 72 22 3e  me="stepNumber">
23f0: 54 68 65 20 31 2d 62 61 73 65 64 20 73 74 65 70  The 1-based step
2400: 20 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20 69   number.  This i
2410: 73 20 69 6e 63 72 65 6d 65 6d 74 65 64 20 65 61  s incrememted ea
2420: 63 68 20 74 69 6d 65 20 74 68 65 20 73 74 65 70  ch time the step
2430: 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65   method is calle
2440: 64 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  d.</param>..    
2450: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
2460: 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 41 20  "contextData">A 
2470: 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  placeholder for 
2480: 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20  implementers to 
2490: 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75 61 6c  store contextual
24a0: 20 64 61 74 61 20 70 65 72 74 61 69 6e 69 6e 67   data pertaining
24b0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
24c0: 63 6f 6e 74 65 78 74 2e 3c 2f 70 61 72 61 6d 3e  context.</param>
24d0: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 69 72  ..    public vir
24e0: 74 75 61 6c 20 76 6f 69 64 20 53 74 65 70 28 6f  tual void Step(o
24f0: 62 6a 65 63 74 5b 5d 20 61 72 67 73 2c 20 69 6e  bject[] args, in
2500: 74 20 73 74 65 70 4e 75 6d 62 65 72 2c 20 72 65  t stepNumber, re
2510: 66 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74  f object context
2520: 44 61 74 61 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  Data)..    {..  
2530: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
2540: 64 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  d();..    }.... 
2550: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
2560: 0d 0a 20 20 20 20 2f 2f 2f 20 41 67 67 72 65 67  ..    /// Aggreg
2570: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 76  ate functions ov
2580: 65 72 72 69 64 65 20 74 68 69 73 20 6d 65 74 68  erride this meth
2590: 6f 64 20 74 6f 20 66 69 6e 69 73 68 20 74 68 65  od to finish the
25a0: 69 72 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  ir aggregate pro
25b0: 63 65 73 73 69 6e 67 2e 0d 0a 20 20 20 20 2f 2f  cessing...    //
25c0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
25d0: 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d    /// <remarks>.
25e0: 0a 20 20 20 20 2f 2f 2f 20 49 66 20 79 6f 75 20  .    /// If you 
25f0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 79 6f 75 72  implemented your
2600: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2610: 69 6f 6e 20 70 72 6f 70 65 72 6c 79 2c 0d 0a 20  ion properly,.. 
2620: 20 20 20 2f 2f 2f 20 79 6f 75 27 76 65 20 62 65     /// you've be
2630: 65 6e 20 72 65 63 6f 72 64 69 6e 67 20 61 6e 64  en recording and
2640: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
2650: 66 20 79 6f 75 72 20 64 61 74 61 20 69 6e 20 74  f your data in t
2660: 68 65 20 63 6f 6e 74 65 78 74 44 61 74 61 20 6f  he contextData o
2670: 62 6a 65 63 74 20 70 72 6f 76 69 64 65 64 2c 20  bject provided, 
2680: 61 6e 64 20 6e 6f 77 20 61 74 20 74 68 69 73 20  and now at this 
2690: 73 74 61 67 65 20 79 6f 75 20 73 68 6f 75 6c 64  stage you should
26a0: 20 68 61 76 65 0d 0a 20 20 20 20 2f 2f 2f 20 61   have..    /// a
26b0: 6c 6c 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ll the informati
26c0: 6f 6e 20 79 6f 75 20 6e 65 65 64 20 69 6e 20 74  on you need in t
26d0: 68 65 72 65 20 74 6f 20 66 69 67 75 72 65 20 6f  here to figure o
26e0: 75 74 20 77 68 61 74 20 74 6f 20 72 65 74 75 72  ut what to retur
26f0: 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 4e 4f 54 45  n...    /// NOTE
2700: 3a 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  :  It is possibl
2710: 65 20 74 6f 20 61 72 72 69 76 65 20 68 65 72 65  e to arrive here
2720: 20 77 69 74 68 6f 75 74 20 72 65 63 65 69 76 69   without receivi
2730: 6e 67 20 61 20 70 72 65 76 69 6f 75 73 20 63 61  ng a previous ca
2740: 6c 6c 20 74 6f 20 53 74 65 70 28 29 2c 20 69 6e  ll to Step(), in
2750: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
2760: 63 6f 6e 74 65 78 74 44 61 74 61 20 77 69 6c 6c  contextData will
2770: 0d 0a 20 20 20 20 2f 2f 2f 20 62 65 20 6e 75 6c  ..    /// be nul
2780: 6c 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  l.  This can hap
2790: 70 65 6e 20 77 68 65 6e 20 6e 6f 20 72 6f 77 73  pen when no rows
27a0: 20 77 65 72 65 20 72 65 74 75 72 6e 65 64 2e 20   were returned. 
27b0: 20 59 6f 75 20 63 61 6e 20 65 69 74 68 65 72 20   You can either 
27c0: 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 6f 72 20  return null, or 
27d0: 30 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  0 or some other 
27e0: 63 75 73 74 6f 6d 20 72 65 74 75 72 6e 20 76 61  custom return va
27f0: 6c 75 65 0d 0a 20 20 20 20 2f 2f 2f 20 69 66 20  lue..    /// if 
2800: 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2810: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d  ...    /// </rem
2820: 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  arks>..    /// <
2830: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74  param name="cont
2840: 65 78 74 44 61 74 61 22 3e 59 6f 75 72 20 6f 77  extData">Your ow
2850: 6e 20 61 73 73 69 67 6e 65 64 20 63 6f 6e 74 65  n assigned conte
2860: 78 74 44 61 74 61 2c 20 70 72 6f 76 69 64 65 64  xtData, provided
2870: 20 66 6f 72 20 79 6f 75 20 73 6f 20 79 6f 75 20   for you so you 
2880: 63 61 6e 20 72 65 74 75 72 6e 20 79 6f 75 72 20  can return your 
2890: 66 69 6e 61 6c 20 72 65 73 75 6c 74 73 2e 3c 2f  final results.</
28a0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
28b0: 3c 72 65 74 75 72 6e 73 3e 59 6f 75 20 6d 61 79  <returns>You may
28c0: 20 72 65 74 75 72 6e 20 6d 6f 73 74 20 73 69 6d   return most sim
28d0: 70 6c 65 20 74 79 70 65 73 20 61 73 20 61 20 72  ple types as a r
28e0: 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 6e 75 6c  eturn value, nul
28f0: 6c 20 6f 72 20 44 42 4e 75 6c 6c 2e 56 61 6c 75  l or DBNull.Valu
2900: 65 20 74 6f 20 72 65 74 75 72 6e 20 6e 75 6c 6c  e to return null
2910: 2c 20 44 61 74 65 54 69 6d 65 2c 20 6f 72 0d 0a  , DateTime, or..
2920: 20 20 20 20 2f 2f 2f 20 79 6f 75 20 6d 61 79 20      /// you may 
2930: 72 65 74 75 72 6e 20 61 6e 20 45 78 63 65 70 74  return an Except
2940: 69 6f 6e 2d 64 65 72 69 76 65 64 20 63 6c 61 73  ion-derived clas
2950: 73 20 69 66 20 79 6f 75 20 77 69 73 68 20 74 6f  s if you wish to
2960: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2970: 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 44 6f 20   to SQLite.  Do 
2980: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 74 68 72  not actually thr
2990: 6f 77 20 74 68 65 20 65 72 72 6f 72 2c 0d 0a 20  ow the error,.. 
29a0: 20 20 20 2f 2f 2f 20 6a 75 73 74 20 72 65 74 75     /// just retu
29b0: 72 6e 20 69 74 21 0d 0a 20 20 20 20 2f 2f 2f 20  rn it!..    /// 
29c0: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
29d0: 70 75 62 6c 69 63 20 76 69 72 74 75 61 6c 20 6f  public virtual o
29e0: 62 6a 65 63 74 20 46 69 6e 61 6c 28 6f 62 6a 65  bject Final(obje
29f0: 63 74 20 63 6f 6e 74 65 78 74 44 61 74 61 29 0d  ct contextData).
2a00: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 43 68  .    {..      Ch
2a10: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
2a20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
2a30: 6c 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  l;..    }....   
2a40: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
2a50: 20 20 20 20 2f 2f 2f 20 55 73 65 72 2d 64 65 66      /// User-def
2a60: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ined collation s
2a70: 65 71 75 65 6e 63 65 73 20 6f 76 65 72 72 69 64  equences overrid
2a80: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  e this method to
2a90: 20 70 72 6f 76 69 64 65 20 61 20 63 75 73 74 6f   provide a custo
2aa0: 6d 20 73 74 72 69 6e 67 20 73 6f 72 74 69 6e 67  m string sorting
2ab0: 20 61 6c 67 6f 72 69 74 68 6d 2e 0d 0a 20 20 20   algorithm...   
2ac0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
2ad0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
2ae0: 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22 3e 54 68  name="param1">Th
2af0: 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 74  e first string t
2b00: 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d  o compare</param
2b10: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
2b20: 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32 22 3e  m name="param2">
2b30: 54 68 65 20 73 65 63 6f 6e 64 20 73 74 72 6e 69  The second strni
2b40: 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61  g to compare</pa
2b50: 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72  ram>..    /// <r
2b60: 65 74 75 72 6e 73 3e 31 20 69 66 20 70 61 72 61  eturns>1 if para
2b70: 6d 31 20 69 73 20 67 72 65 61 74 65 72 20 74 68  m1 is greater th
2b80: 61 6e 20 70 61 72 61 6d 32 2c 20 30 20 69 66 20  an param2, 0 if 
2b90: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 2c 20  they are equal, 
2ba0: 6f 72 20 2d 31 20 69 66 20 70 61 72 61 6d 31 20  or -1 if param1 
2bb0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 70 61 72  is less than par
2bc0: 61 6d 32 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  am2</returns>.. 
2bd0: 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61     public virtua
2be0: 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 28 73 74  l int Compare(st
2bf0: 72 69 6e 67 20 70 61 72 61 6d 31 2c 20 73 74 72  ring param1, str
2c00: 69 6e 67 20 70 61 72 61 6d 32 29 0d 0a 20 20 20  ing param2)..   
2c10: 20 7b 0d 0a 20 20 20 20 20 20 43 68 65 63 6b 44   {..      CheckD
2c20: 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20 20  isposed();..    
2c30: 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
2c40: 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73   }....    /// <s
2c50: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
2c60: 20 43 6f 6e 76 65 72 74 73 20 61 6e 20 49 6e 74   Converts an Int
2c70: 50 74 72 20 61 72 72 61 79 20 6f 66 20 63 6f 6e  Ptr array of con
2c80: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 73 20 74  text arguments t
2c90: 6f 20 61 6e 20 6f 62 6a 65 63 74 20 61 72 72 61  o an object arra
2ca0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
2cb0: 20 72 65 73 6f 6c 76 65 64 20 70 61 72 61 6d 65   resolved parame
2cc0: 74 65 72 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ters the pointer
2cd0: 73 20 70 6f 69 6e 74 20 74 6f 2e 0d 0a 20 20 20  s point to...   
2ce0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
2cf0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b  .    /// <remark
2d00: 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 50 61 72 61  s>..    /// Para
2d10: 6d 65 74 65 72 73 20 70 61 73 73 65 64 20 74 6f  meters passed to
2d20: 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
2d30: 6f 6e 6c 79 20 61 6e 20 61 66 66 69 6e 69 74 79  only an affinity
2d40: 20 66 6f 72 20 61 20 63 65 72 74 61 69 6e 20 64   for a certain d
2d50: 61 74 61 20 74 79 70 65 2c 20 74 68 65 72 65 20  ata type, there 
2d60: 69 73 20 6e 6f 20 75 6e 64 65 72 6c 79 69 6e 67  is no underlying
2d70: 20 73 63 68 65 6d 61 20 61 76 61 69 6c 61 62 6c   schema availabl
2d80: 65 0d 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 66 6f  e..    /// to fo
2d90: 72 63 65 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  rce them into a 
2da0: 63 65 72 74 61 69 6e 20 74 79 70 65 2e 20 20 54  certain type.  T
2db0: 68 65 72 65 66 6f 72 65 20 74 68 65 20 6f 6e 6c  herefore the onl
2dc0: 79 20 74 79 70 65 73 20 79 6f 75 20 77 69 6c 6c  y types you will
2dd0: 20 65 76 65 72 20 73 65 65 20 61 73 20 70 61 72   ever see as par
2de0: 61 6d 65 74 65 72 73 20 61 72 65 0d 0a 20 20 20  ameters are..   
2df0: 20 2f 2f 2f 20 44 42 4e 75 6c 6c 2e 56 61 6c 75   /// DBNull.Valu
2e00: 65 2c 20 49 6e 74 36 34 2c 20 44 6f 75 62 6c 65  e, Int64, Double
2e10: 2c 20 53 74 72 69 6e 67 20 6f 72 20 62 79 74 65  , String or byte
2e20: 5b 5d 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 2f  [] array...    /
2e30: 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0d 0a 20  // </remarks>.. 
2e40: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
2e50: 6d 65 3d 22 6e 41 72 67 73 22 3e 54 68 65 20 6e  me="nArgs">The n
2e60: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2e70: 74 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  ts</param>..    
2e80: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
2e90: 22 61 72 67 73 70 74 72 22 3e 41 20 70 6f 69 6e  "argsptr">A poin
2ea0: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
2eb0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 3c 2f 70   of arguments</p
2ec0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
2ed0: 72 65 74 75 72 6e 73 3e 41 6e 20 6f 62 6a 65 63  returns>An objec
2ee0: 74 20 61 72 72 61 79 20 6f 66 20 74 68 65 20 61  t array of the a
2ef0: 72 67 75 6d 65 6e 74 73 20 6f 6e 63 65 20 74 68  rguments once th
2f00: 65 79 27 76 65 20 62 65 65 6e 20 63 6f 6e 76 65  ey've been conve
2f10: 72 74 65 64 20 74 6f 20 2e 4e 45 54 20 76 61 6c  rted to .NET val
2f20: 75 65 73 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20  ues</returns>.. 
2f30: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 62 6a 65     internal obje
2f40: 63 74 5b 5d 20 43 6f 6e 76 65 72 74 50 61 72 61  ct[] ConvertPara
2f50: 6d 73 28 69 6e 74 20 6e 41 72 67 73 2c 20 49 6e  ms(int nArgs, In
2f60: 74 50 74 72 20 61 72 67 73 70 74 72 29 0d 0a 20  tPtr argsptr).. 
2f70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a 65     {..      obje
2f80: 63 74 5b 5d 20 70 61 72 6d 73 20 3d 20 6e 65 77  ct[] parms = new
2f90: 20 6f 62 6a 65 63 74 5b 6e 41 72 67 73 5d 3b 0d   object[nArgs];.
2fa0: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
2fb0: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d  OMPACTFRAMEWORK.
2fc0: 0a 20 20 20 20 20 20 49 6e 74 50 74 72 5b 5d 20  .      IntPtr[] 
2fd0: 61 72 67 69 6e 74 20 3d 20 6e 65 77 20 49 6e 74  argint = new Int
2fe0: 50 74 72 5b 6e 41 72 67 73 5d 3b 0d 0a 23 65 6c  Ptr[nArgs];..#el
2ff0: 73 65 0d 0a 20 20 20 20 20 20 69 6e 74 5b 5d 20  se..      int[] 
3000: 61 72 67 69 6e 74 20 3d 20 6e 65 77 20 69 6e 74  argint = new int
3010: 5b 6e 41 72 67 73 5d 3b 0d 0a 23 65 6e 64 69 66  [nArgs];..#endif
3020: 0d 0a 20 20 20 20 20 20 4d 61 72 73 68 61 6c 2e  ..      Marshal.
3030: 43 6f 70 79 28 61 72 67 73 70 74 72 2c 20 61 72  Copy(argsptr, ar
3040: 67 69 6e 74 2c 20 30 2c 20 6e 41 72 67 73 29 3b  gint, 0, nArgs);
3050: 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69  ....      for (i
3060: 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 6e 41  nt n = 0; n < nA
3070: 72 67 73 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20 20  rgs; n++)..     
3080: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 77 69 74   {..        swit
3090: 63 68 20 28 5f 62 61 73 65 2e 47 65 74 50 61 72  ch (_base.GetPar
30a0: 61 6d 56 61 6c 75 65 54 79 70 65 28 28 49 6e 74  amValueType((Int
30b0: 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 29 0d  Ptr)argint[n])).
30c0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
30d0: 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41        case TypeA
30e0: 66 66 69 6e 69 74 79 2e 4e 75 6c 6c 3a 0d 0a 20  ffinity.Null:.. 
30f0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73             parms
3100: 5b 6e 5d 20 3d 20 44 42 4e 75 6c 6c 2e 56 61 6c  [n] = DBNull.Val
3110: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
3120: 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20   break;..       
3130: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
3140: 6e 69 74 79 2e 49 6e 74 36 34 3a 0d 0a 20 20 20  nity.Int64:..   
3150: 20 20 20 20 20 20 20 20 20 70 61 72 6d 73 5b 6e           parms[n
3160: 5d 20 3d 20 5f 62 61 73 65 2e 47 65 74 50 61 72  ] = _base.GetPar
3170: 61 6d 56 61 6c 75 65 49 6e 74 36 34 28 28 49 6e  amValueInt64((In
3180: 74 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 3b  tPtr)argint[n]);
3190: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ..            br
31a0: 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
31b0: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
31c0: 79 2e 44 6f 75 62 6c 65 3a 0d 0a 20 20 20 20 20  y.Double:..     
31d0: 20 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20         parms[n] 
31e0: 3d 20 5f 62 61 73 65 2e 47 65 74 50 61 72 61 6d  = _base.GetParam
31f0: 56 61 6c 75 65 44 6f 75 62 6c 65 28 28 49 6e 74  ValueDouble((Int
3200: 50 74 72 29 61 72 67 69 6e 74 5b 6e 5d 29 3b 0d  Ptr)argint[n]);.
3210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
3220: 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ak;..          c
3230: 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79  ase TypeAffinity
3240: 2e 54 65 78 74 3a 0d 0a 20 20 20 20 20 20 20 20  .Text:..        
3250: 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f      parms[n] = _
3260: 62 61 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c  base.GetParamVal
3270: 75 65 54 65 78 74 28 28 49 6e 74 50 74 72 29 61  ueText((IntPtr)a
3280: 72 67 69 6e 74 5b 6e 5d 29 3b 0d 0a 20 20 20 20  rgint[n]);..    
3290: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
32a0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
32b0: 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62  ypeAffinity.Blob
32c0: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  :..            {
32d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32e0: 69 6e 74 20 78 3b 0d 0a 20 20 20 20 20 20 20 20  int x;..        
32f0: 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 6c 6f        byte[] blo
3300: 62 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  b;....          
3310: 20 20 20 20 78 20 3d 20 28 69 6e 74 29 5f 62 61      x = (int)_ba
3320: 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65  se.GetParamValue
3330: 42 79 74 65 73 28 28 49 6e 74 50 74 72 29 61 72  Bytes((IntPtr)ar
3340: 67 69 6e 74 5b 6e 5d 2c 20 30 2c 20 6e 75 6c 6c  gint[n], 0, null
3350: 2c 20 30 2c 20 30 29 3b 0d 0a 20 20 20 20 20 20  , 0, 0);..      
3360: 20 20 20 20 20 20 20 20 62 6c 6f 62 20 3d 20 6e          blob = n
3370: 65 77 20 62 79 74 65 5b 78 5d 3b 0d 0a 20 20 20  ew byte[x];..   
3380: 20 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65             _base
3390: 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 42 79  .GetParamValueBy
33a0: 74 65 73 28 28 49 6e 74 50 74 72 29 61 72 67 69  tes((IntPtr)argi
33b0: 6e 74 5b 6e 5d 2c 20 30 2c 20 62 6c 6f 62 2c 20  nt[n], 0, blob, 
33c0: 30 2c 20 78 29 3b 0d 0a 20 20 20 20 20 20 20 20  0, x);..        
33d0: 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d 20 3d        parms[n] =
33e0: 20 62 6c 6f 62 3b 0d 0a 20 20 20 20 20 20 20 20   blob;..        
33f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3400: 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20     break;..     
3410: 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66       case TypeAf
3420: 66 69 6e 69 74 79 2e 44 61 74 65 54 69 6d 65 3a  finity.DateTime:
3430: 20 2f 2f 20 4e 65 76 65 72 20 68 61 70 70 65 6e   // Never happen
3440: 73 20 68 65 72 65 20 62 75 74 20 77 68 61 74 20  s here but what 
3450: 74 68 65 20 68 65 63 6b 2c 20 6d 61 79 62 65 20  the heck, maybe 
3460: 69 74 20 77 69 6c 6c 20 6f 6e 65 20 64 61 79 2e  it will one day.
3470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
3480: 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 54  rms[n] = _base.T
3490: 6f 44 61 74 65 54 69 6d 65 28 5f 62 61 73 65 2e  oDateTime(_base.
34a0: 47 65 74 50 61 72 61 6d 56 61 6c 75 65 54 65 78  GetParamValueTex
34b0: 74 28 28 49 6e 74 50 74 72 29 61 72 67 69 6e 74  t((IntPtr)argint
34c0: 5b 6e 5d 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  [n]));..        
34d0: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
34e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
34f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 72        return par
3500: 6d 73 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ms;..    }....  
3510: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
3520: 0a 20 20 20 20 2f 2f 2f 20 54 61 6b 65 73 20 74  .    /// Takes t
3530: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
3540: 66 72 6f 6d 20 49 6e 76 6f 6b 65 28 29 20 61 6e  from Invoke() an
3550: 64 20 46 69 6e 61 6c 28 29 20 61 6e 64 20 66 69  d Final() and fi
3560: 67 75 72 65 73 20 6f 75 74 20 68 6f 77 20 74 6f  gures out how to
3570: 20 72 65 74 75 72 6e 20 69 74 20 74 6f 20 53 51   return it to SQ
3580: 4c 69 74 65 27 73 20 63 6f 6e 74 65 78 74 2e 0d  Lite's context..
3590: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
35a0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
35b0: 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78  ram name="contex
35c0: 74 22 3e 54 68 65 20 63 6f 6e 74 65 78 74 20 74  t">The context t
35d0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
35e0: 61 70 70 6c 69 65 73 20 74 6f 3c 2f 70 61 72 61  applies to</para
35f0: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
3600: 61 6d 20 6e 61 6d 65 3d 22 72 65 74 75 72 6e 56  am name="returnV
3610: 61 6c 75 65 22 3e 54 68 65 20 70 61 72 61 6d 65  alue">The parame
3620: 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f  ter to return to
3630: 20 53 51 4c 69 74 65 3c 2f 70 61 72 61 6d 3e 0d   SQLite</param>.
3640: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69  .    private voi
3650: 64 20 53 65 74 52 65 74 75 72 6e 56 61 6c 75 65  d SetReturnValue
3660: 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c  (IntPtr context,
3670: 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 56 61   object returnVa
3680: 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  lue)..    {..   
3690: 20 20 20 69 66 20 28 72 65 74 75 72 6e 56 61 6c     if (returnVal
36a0: 75 65 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 72 65  ue == null || re
36b0: 74 75 72 6e 56 61 6c 75 65 20 3d 3d 20 44 42 4e  turnValue == DBN
36c0: 75 6c 6c 2e 56 61 6c 75 65 29 0d 0a 20 20 20 20  ull.Value)..    
36d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 5f 62 61    {..        _ba
36e0: 73 65 2e 52 65 74 75 72 6e 4e 75 6c 6c 28 63 6f  se.ReturnNull(co
36f0: 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 20 20 20  ntext);..       
3700: 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20   return;..      
3710: 7d 0d 0a 0d 0a 20 20 20 20 20 20 54 79 70 65 20  }....      Type 
3720: 74 20 3d 20 72 65 74 75 72 6e 56 61 6c 75 65 2e  t = returnValue.
3730: 47 65 74 54 79 70 65 28 29 3b 0d 0a 20 20 20 20  GetType();..    
3740: 20 20 69 66 20 28 74 20 3d 3d 20 74 79 70 65 6f    if (t == typeo
3750: 66 28 44 61 74 65 54 69 6d 65 29 29 0d 0a 20 20  f(DateTime))..  
3760: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 5f      {..        _
3770: 62 61 73 65 2e 52 65 74 75 72 6e 54 65 78 74 28  base.ReturnText(
3780: 63 6f 6e 74 65 78 74 2c 20 5f 62 61 73 65 2e 54  context, _base.T
3790: 6f 53 74 72 69 6e 67 28 28 44 61 74 65 54 69 6d  oString((DateTim
37a0: 65 29 72 65 74 75 72 6e 56 61 6c 75 65 29 29 3b  e)returnValue));
37b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
37c0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
37d0: 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 7b 0d    else..      {.
37e0: 0a 20 20 20 20 20 20 20 20 45 78 63 65 70 74 69  .        Excepti
37f0: 6f 6e 20 72 20 3d 20 72 65 74 75 72 6e 56 61 6c  on r = returnVal
3800: 75 65 20 61 73 20 45 78 63 65 70 74 69 6f 6e 3b  ue as Exception;
3810: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  ....        if (
3820: 72 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  r != null)..    
3830: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3840: 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 45 72 72   _base.ReturnErr
3850: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 72 2e 4d 65  or(context, r.Me
3860: 73 73 61 67 65 29 3b 0d 0a 20 20 20 20 20 20 20  ssage);..       
3870: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20     return;..    
3880: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
3890: 0d 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 28  ..      switch (
38a0: 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e 54 79  SQLiteConvert.Ty
38b0: 70 65 54 6f 41 66 66 69 6e 69 74 79 28 74 29 29  peToAffinity(t))
38c0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
38d0: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
38e0: 6e 69 74 79 2e 4e 75 6c 6c 3a 0d 0a 20 20 20 20  nity.Null:..    
38f0: 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75        _base.Retu
3900: 72 6e 4e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  rnNull(context);
3910: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
3920: 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73  rn;..        cas
3930: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 49  e TypeAffinity.I
3940: 6e 74 36 34 3a 0d 0a 20 20 20 20 20 20 20 20 20  nt64:..         
3950: 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 49 6e 74   _base.ReturnInt
3960: 36 34 28 63 6f 6e 74 65 78 74 2c 20 43 6f 6e 76  64(context, Conv
3970: 65 72 74 2e 54 6f 49 6e 74 36 34 28 72 65 74 75  ert.ToInt64(retu
3980: 72 6e 56 61 6c 75 65 2c 20 43 75 6c 74 75 72 65  rnValue, Culture
3990: 49 6e 66 6f 2e 43 75 72 72 65 6e 74 43 75 6c 74  Info.CurrentCult
39a0: 75 72 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  ure));..        
39b0: 20 20 72 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20    return;..     
39c0: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
39d0: 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0d 0a 20 20  nity.Double:..  
39e0: 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65          _base.Re
39f0: 74 75 72 6e 44 6f 75 62 6c 65 28 63 6f 6e 74 65  turnDouble(conte
3a00: 78 74 2c 20 43 6f 6e 76 65 72 74 2e 54 6f 44 6f  xt, Convert.ToDo
3a10: 75 62 6c 65 28 72 65 74 75 72 6e 56 61 6c 75 65  uble(returnValue
3a20: 2c 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75  , CultureInfo.Cu
3a30: 72 72 65 6e 74 43 75 6c 74 75 72 65 29 29 3b 0d  rrentCulture));.
3a40: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3a50: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65  n;..        case
3a60: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 54 65   TypeAffinity.Te
3a70: 78 74 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 5f  xt:..          _
3a80: 62 61 73 65 2e 52 65 74 75 72 6e 54 65 78 74 28  base.ReturnText(
3a90: 63 6f 6e 74 65 78 74 2c 20 72 65 74 75 72 6e 56  context, returnV
3aa0: 61 6c 75 65 2e 54 6f 53 74 72 69 6e 67 28 29 29  alue.ToString())
3ab0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ;..          ret
3ac0: 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20 63 61  urn;..        ca
3ad0: 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  se TypeAffinity.
3ae0: 42 6c 6f 62 3a 0d 0a 20 20 20 20 20 20 20 20 20  Blob:..         
3af0: 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 42 6c 6f   _base.ReturnBlo
3b00: 62 28 63 6f 6e 74 65 78 74 2c 20 28 62 79 74 65  b(context, (byte
3b10: 5b 5d 29 72 65 74 75 72 6e 56 61 6c 75 65 29 3b  [])returnValue);
3b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
3b30: 72 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  rn;..      }..  
3b40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
3b50: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
3b60: 2f 20 49 6e 74 65 72 6e 61 6c 20 73 63 61 6c 61  / Internal scala
3b70: 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  r callback funct
3b80: 69 6f 6e 2c 20 77 68 69 63 68 20 77 72 61 70 73  ion, which wraps
3b90: 20 74 68 65 20 72 61 77 20 63 6f 6e 74 65 78 74   the raw context
3ba0: 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 63 61 6c   pointer and cal
3bb0: 6c 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 49  ls the virtual I
3bc0: 6e 76 6f 6b 65 28 29 20 6d 65 74 68 6f 64 2e 0d  nvoke() method..
3bd0: 0a 20 20 20 20 2f 2f 2f 20 57 41 52 4e 49 4e 47  .    /// WARNING
3be0: 3a 20 4d 75 73 74 20 6e 6f 74 20 74 68 72 6f 77  : Must not throw
3bf0: 20 65 78 63 65 70 74 69 6f 6e 73 2e 0d 0a 20 20   exceptions...  
3c00: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
3c10: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
3c20: 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22 3e   name="context">
3c30: 41 20 72 61 77 20 63 6f 6e 74 65 78 74 20 70 6f  A raw context po
3c40: 69 6e 74 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20  inter</param>.. 
3c50: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
3c60: 6d 65 3d 22 6e 41 72 67 73 22 3e 4e 75 6d 62 65  me="nArgs">Numbe
3c70: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  r of arguments p
3c80: 61 73 73 65 64 20 69 6e 3c 2f 70 61 72 61 6d 3e  assed in</param>
3c90: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
3ca0: 20 6e 61 6d 65 3d 22 61 72 67 73 70 74 72 22 3e   name="argsptr">
3cb0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
3cc0: 20 61 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   array of argume
3cd0: 6e 74 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  nts</param>..   
3ce0: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 53   internal void S
3cf0: 63 61 6c 61 72 43 61 6c 6c 62 61 63 6b 28 49 6e  calarCallback(In
3d00: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 69 6e  tPtr context, in
3d10: 74 20 6e 41 72 67 73 2c 20 49 6e 74 50 74 72 20  t nArgs, IntPtr 
3d20: 61 72 67 73 70 74 72 29 0d 0a 20 20 20 20 7b 0d  argsptr)..    {.
3d30: 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20  .        try..  
3d40: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3d50: 20 20 20 20 20 5f 63 6f 6e 74 65 78 74 20 3d 20       _context = 
3d60: 63 6f 6e 74 65 78 74 3b 0d 0a 20 20 20 20 20 20  context;..      
3d70: 20 20 20 20 20 20 53 65 74 52 65 74 75 72 6e 56        SetReturnV
3d80: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 0d 0a 20  alue(context,.. 
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
3da0: 6e 76 6f 6b 65 28 43 6f 6e 76 65 72 74 50 61 72  nvoke(ConvertPar
3db0: 61 6d 73 28 6e 41 72 67 73 2c 20 61 72 67 73 70  ams(nArgs, argsp
3dc0: 74 72 29 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20  tr))); /* throw 
3dd0: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  */..        }.. 
3de0: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45 78         catch (Ex
3df0: 63 65 70 74 69 6f 6e 20 65 29 20 2f 2a 20 4e 4f  ception e) /* NO
3e00: 54 45 3a 20 4d 75 73 74 20 63 61 74 63 68 20 41  TE: Must catch A
3e10: 4c 4c 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  LL. */..        
3e20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
3e30: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
3e40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3e50: 20 20 20 69 66 20 28 28 5f 66 6c 61 67 73 20 26     if ((_flags &
3e60: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
3e70: 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61  nFlags.LogCallba
3e80: 63 6b 45 78 63 65 70 74 69 6f 6e 29 20 3d 3d 0d  ckException) ==.
3e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ea0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43           SQLiteC
3eb0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c  onnectionFlags.L
3ec0: 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74  ogCallbackExcept
3ed0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ion)..          
3ee0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
3f00: 69 74 65 4c 6f 67 2e 4c 6f 67 4d 65 73 73 61 67  iteLog.LogMessag
3f10: 65 28 53 51 4c 69 74 65 42 61 73 65 2e 43 4f 52  e(SQLiteBase.COR
3f20: 5f 45 5f 45 58 43 45 50 54 49 4f 4e 2c 0d 0a 20  _E_EXCEPTION,.. 
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f         String.Fo
3f50: 72 6d 61 74 28 43 75 6c 74 75 72 65 49 6e 66 6f  rmat(CultureInfo
3f60: 2e 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 2c  .CurrentCulture,
3f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3f80: 20 20 20 20 20 20 20 20 20 20 22 43 61 75 67 68            "Caugh
3f90: 74 20 65 78 63 65 70 74 69 6f 6e 20 69 6e 20 5c  t exception in \
3fa0: 22 49 6e 76 6f 6b 65 5c 22 20 6d 65 74 68 6f 64  "Invoke\" method
3fb0: 3a 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {0}",..       
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 65 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a   e)); /* throw *
3fe0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
3ff0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4000: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4010: 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20   catch..        
4020: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4030: 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74         // do not
4040: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
4050: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
4060: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
4070: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
4080: 20 2f 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 63 6f   /// Internal co
4090: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
40a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 68 69 63 68   function, which
40b0: 20 77 72 61 70 73 20 75 70 20 74 68 65 20 72 61   wraps up the ra
40c0: 77 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 72  w string pointer
40d0: 73 20 61 6e 64 20 65 78 65 63 75 74 65 73 20 74  s and executes t
40e0: 68 65 20 43 6f 6d 70 61 72 65 28 29 20 76 69 72  he Compare() vir
40f0: 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a  tual function...
4100: 20 20 20 20 2f 2f 2f 20 57 41 52 4e 49 4e 47 3a      /// WARNING:
4110: 20 4d 75 73 74 20 6e 6f 74 20 74 68 72 6f 77 20   Must not throw 
4120: 65 78 63 65 70 74 69 6f 6e 73 2e 0d 0a 20 20 20  exceptions...   
4130: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
4140: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
4150: 6e 61 6d 65 3d 22 70 74 72 22 3e 4e 6f 74 20 75  name="ptr">Not u
4160: 73 65 64 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  sed</param>..   
4170: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
4180: 3d 22 6c 65 6e 31 22 3e 4c 65 6e 67 74 68 20 6f  ="len1">Length o
4190: 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 76 31  f the string pv1
41a0: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
41b0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70  / <param name="p
41c0: 74 72 31 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20  tr1">Pointer to 
41d0: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
41e0: 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72   to compare</par
41f0: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
4200: 72 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e 32 22 3e  ram name="len2">
4210: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74  Length of the st
4220: 72 69 6e 67 20 70 76 32 3c 2f 70 61 72 61 6d 3e  ring pv2</param>
4230: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
4240: 20 6e 61 6d 65 3d 22 70 74 72 32 22 3e 50 6f 69   name="ptr2">Poi
4250: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f  nter to the seco
4260: 6e 64 20 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d  nd string to com
4270: 70 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  pare</param>..  
4280: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 52    /// <returns>R
4290: 65 74 75 72 6e 73 20 2d 31 20 69 66 20 74 68 65  eturns -1 if the
42a0: 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 69 73   first string is
42b0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 73   less than the s
42c0: 65 63 6f 6e 64 2e 20 20 30 20 69 66 20 74 68 65  econd.  0 if the
42d0: 79 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 72 20  y are equal, or 
42e0: 31 20 69 66 20 74 68 65 20 66 69 72 73 74 20 73  1 if the first s
42f0: 74 72 69 6e 67 20 69 73 20 67 72 65 61 74 65 72  tring is greater
4300: 0d 0a 20 20 20 20 2f 2f 2f 20 74 68 61 6e 20 74  ..    /// than t
4310: 68 65 20 73 65 63 6f 6e 64 2e 20 20 52 65 74 75  he second.  Retu
4320: 72 6e 73 20 30 20 69 66 20 61 6e 20 65 78 63 65  rns 0 if an exce
4330: 70 74 69 6f 6e 20 69 73 20 63 61 75 67 68 74 2e  ption is caught.
4340: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
4350: 69 6e 74 65 72 6e 61 6c 20 69 6e 74 20 43 6f 6d  internal int Com
4360: 70 61 72 65 43 61 6c 6c 62 61 63 6b 28 49 6e 74  pareCallback(Int
4370: 50 74 72 20 70 74 72 2c 20 69 6e 74 20 6c 65 6e  Ptr ptr, int len
4380: 31 2c 20 49 6e 74 50 74 72 20 70 74 72 31 2c 20  1, IntPtr ptr1, 
4390: 69 6e 74 20 6c 65 6e 32 2c 20 49 6e 74 50 74 72  int len2, IntPtr
43a0: 20 70 74 72 32 29 0d 0a 20 20 20 20 7b 0d 0a 20   ptr2)..    {.. 
43b0: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
43c0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
43d0: 20 20 20 72 65 74 75 72 6e 20 43 6f 6d 70 61 72     return Compar
43e0: 65 28 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e  e(SQLiteConvert.
43f0: 55 54 46 38 54 6f 53 74 72 69 6e 67 28 70 74 72  UTF8ToString(ptr
4400: 31 2c 20 6c 65 6e 31 29 2c 0d 0a 20 20 20 20 20  1, len1),..     
4410: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
4420: 65 43 6f 6e 76 65 72 74 2e 55 54 46 38 54 6f 53  eConvert.UTF8ToS
4430: 74 72 69 6e 67 28 70 74 72 32 2c 20 6c 65 6e 32  tring(ptr2, len2
4440: 29 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d  )); /* throw */.
4450: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
4460: 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65 70      catch (Excep
4470: 74 69 6f 6e 20 65 29 20 2f 2a 20 4e 4f 54 45 3a  tion e) /* NOTE:
4480: 20 4d 75 73 74 20 63 61 74 63 68 20 41 4c 4c 2e   Must catch ALL.
4490: 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a   */..        {..
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d              try.
44b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 69 66 20 28 28 5f 66 6c 61 67 73 20 26 20 53 51  if ((_flags & SQ
44e0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
44f0: 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45  ags.LogCallbackE
4500: 78 63 65 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20 20  xception) ==..  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
4530: 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43  ectionFlags.LogC
4540: 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e  allbackException
4550: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
4560: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4570: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
4580: 4c 6f 67 2e 4c 6f 67 4d 65 73 73 61 67 65 28 53  Log.LogMessage(S
4590: 51 4c 69 74 65 42 61 73 65 2e 43 4f 52 5f 45 5f  QLiteBase.COR_E_
45a0: 45 58 43 45 50 54 49 4f 4e 2c 0d 0a 20 20 20 20  EXCEPTION,..    
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61      String.Forma
45d0: 74 28 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75  t(CultureInfo.Cu
45e0: 72 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20  rrentCulture,.. 
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 22 43 61 75 67 68 74 20 65         "Caught e
4610: 78 63 65 70 74 69 6f 6e 20 69 6e 20 5c 22 43 6f  xception in \"Co
4620: 6d 70 61 72 65 5c 22 20 28 55 54 46 38 29 20 6d  mpare\" (UTF8) m
4630: 65 74 68 6f 64 3a 20 7b 30 7d 22 2c 0d 0a 20 20  ethod: {0}",..  
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 20 65 29 29 3b 20 2f 2a 20 74 68        e)); /* th
4660: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
4670: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4680: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4690: 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20 20 20        catch..   
46a0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
46c0: 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  o nothing...    
46d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
46e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
46f0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e  //..        // N
4700: 4f 54 45 3a 20 54 68 69 73 20 6d 75 73 74 20 62  OTE: This must b
4710: 65 20 64 6f 6e 65 20 74 6f 20 70 72 65 76 65 6e  e done to preven
4720: 74 20 74 68 65 20 63 6f 72 65 20 53 51 4c 69 74  t the core SQLit
4730: 65 20 6c 69 62 72 61 72 79 20 66 72 6f 6d 0d 0a  e library from..
4740: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
4750: 20 75 73 69 6e 67 20 6f 75 72 20 28 69 6e 76 61   using our (inva
4760: 6c 69 64 29 20 72 65 73 75 6c 74 2e 0d 0a 20 20  lid) result...  
4770: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
4780: 20 20 69 66 20 28 28 5f 62 61 73 65 20 21 3d 20    if ((_base != 
4790: 6e 75 6c 6c 29 20 26 26 20 5f 62 61 73 65 2e 49  null) && _base.I
47a0: 73 4f 70 65 6e 28 29 29 0d 0a 20 20 20 20 20 20  sOpen())..      
47b0: 20 20 20 20 20 20 5f 62 61 73 65 2e 43 61 6e 63        _base.Canc
47c0: 65 6c 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  el();....       
47d0: 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20   return 0;..    
47e0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
47f0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
4800: 49 6e 74 65 72 6e 61 6c 20 63 6f 6c 6c 61 74 69  Internal collati
4810: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 75 6e 63  on sequence func
4820: 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 72 61 70  tion, which wrap
4830: 73 20 75 70 20 74 68 65 20 72 61 77 20 73 74 72  s up the raw str
4840: 69 6e 67 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ing pointers and
4850: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 43 6f   executes the Co
4860: 6d 70 61 72 65 28 29 20 76 69 72 74 75 61 6c 20  mpare() virtual 
4870: 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f  function...    /
4880: 2f 2f 20 57 41 52 4e 49 4e 47 3a 20 4d 75 73 74  // WARNING: Must
4890: 20 6e 6f 74 20 74 68 72 6f 77 20 65 78 63 65 70   not throw excep
48a0: 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20  tions...    /// 
48b0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
48c0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
48d0: 22 70 74 72 22 3e 4e 6f 74 20 75 73 65 64 3c 2f  "ptr">Not used</
48e0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20  param>..    /// 
48f0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e  <param name="len
4900: 31 22 3e 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  1">Length of the
4910: 20 73 74 72 69 6e 67 20 70 76 31 3c 2f 70 61 72   string pv1</par
4920: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
4930: 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 31 22 3e  ram name="ptr1">
4940: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  Pointer to the f
4950: 69 72 73 74 20 73 74 72 69 6e 67 20 74 6f 20 63  irst string to c
4960: 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e 0d 0a  ompare</param>..
4970: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
4980: 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e 67 74  ame="len2">Lengt
4990: 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  h of the string 
49a0: 70 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  pv2</param>..   
49b0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
49c0: 3d 22 70 74 72 32 22 3e 50 6f 69 6e 74 65 72 20  ="ptr2">Pointer 
49d0: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 73 74  to the second st
49e0: 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c  ring to compare<
49f0: 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f  /param>..    ///
4a00: 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e   <returns>Return
4a10: 73 20 2d 31 20 69 66 20 74 68 65 20 66 69 72 73  s -1 if the firs
4a20: 74 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73  t string is less
4a30: 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
4a40: 2e 20 20 30 20 69 66 20 74 68 65 79 20 61 72 65  .  0 if they are
4a50: 20 65 71 75 61 6c 2c 20 6f 72 20 31 20 69 66 20   equal, or 1 if 
4a60: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
4a70: 20 69 73 20 67 72 65 61 74 65 72 0d 0a 20 20 20   is greater..   
4a80: 20 2f 2f 2f 20 74 68 61 6e 20 74 68 65 20 73 65   /// than the se
4a90: 63 6f 6e 64 2e 20 20 52 65 74 75 72 6e 73 20 30  cond.  Returns 0
4aa0: 20 69 66 20 61 6e 20 65 78 63 65 70 74 69 6f 6e   if an exception
4ab0: 20 69 73 20 63 61 75 67 68 74 2e 3c 2f 72 65 74   is caught.</ret
4ac0: 75 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72  urns>..    inter
4ad0: 6e 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 43  nal int CompareC
4ae0: 61 6c 6c 62 61 63 6b 31 36 28 49 6e 74 50 74 72  allback16(IntPtr
4af0: 20 70 74 72 2c 20 69 6e 74 20 6c 65 6e 31 2c 20   ptr, int len1, 
4b00: 49 6e 74 50 74 72 20 70 74 72 31 2c 20 69 6e 74  IntPtr ptr1, int
4b10: 20 6c 65 6e 32 2c 20 49 6e 74 50 74 72 20 70 74   len2, IntPtr pt
4b20: 72 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  r2)..    {..    
4b30: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
4b40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4b50: 72 65 74 75 72 6e 20 43 6f 6d 70 61 72 65 28 53  return Compare(S
4b60: 51 4c 69 74 65 33 5f 55 54 46 31 36 2e 55 54 46  QLite3_UTF16.UTF
4b70: 31 36 54 6f 53 74 72 69 6e 67 28 70 74 72 31 2c  16ToString(ptr1,
4b80: 20 6c 65 6e 31 29 2c 0d 0a 20 20 20 20 20 20 20   len1),..       
4b90: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 33           SQLite3
4ba0: 5f 55 54 46 31 36 2e 55 54 46 31 36 54 6f 53 74  _UTF16.UTF16ToSt
4bb0: 72 69 6e 67 28 70 74 72 32 2c 20 6c 65 6e 32 29  ring(ptr2, len2)
4bc0: 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a  ); /* throw */..
4bd0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4be0: 20 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74     catch (Except
4bf0: 69 6f 6e 20 65 29 20 2f 2a 20 4e 4f 54 45 3a 20  ion e) /* NOTE: 
4c00: 4d 75 73 74 20 63 61 74 63 68 20 41 4c 4c 2e 20  Must catch ALL. 
4c10: 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  */..        {.. 
4c20: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4c50: 66 20 28 28 5f 66 6c 61 67 73 20 26 20 53 51 4c  f ((_flags & SQL
4c60: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
4c70: 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78  gs.LogCallbackEx
4c80: 63 65 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20 20 20  ception) ==..   
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
4cb0: 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61  ctionFlags.LogCa
4cc0: 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e 29  llbackException)
4cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4ce0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
4cf0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 4c           SQLiteL
4d00: 6f 67 2e 4c 6f 67 4d 65 73 73 61 67 65 28 53 51  og.LogMessage(SQ
4d10: 4c 69 74 65 42 61 73 65 2e 43 4f 52 5f 45 5f 45  LiteBase.COR_E_E
4d20: 58 43 45 50 54 49 4f 4e 2c 0d 0a 20 20 20 20 20  XCEPTION,..     
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74     String.Format
4d50: 28 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72  (CultureInfo.Cur
4d60: 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20  rentCulture,..  
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 22 43 61 75 67 68 74 20 65 78        "Caught ex
4d90: 63 65 70 74 69 6f 6e 20 69 6e 20 5c 22 43 6f 6d  ception in \"Com
4da0: 70 61 72 65 5c 22 20 28 55 54 46 31 36 29 20 6d  pare\" (UTF16) m
4db0: 65 74 68 6f 64 3a 20 7b 30 7d 22 2c 0d 0a 20 20  ethod: {0}",..  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 65 29 29 3b 20 2f 2a 20 74 68        e)); /* th
4de0: 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  row */..        
4df0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4e00: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4e10: 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20 20 20        catch..   
4e20: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
4e40: 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  o nothing...    
4e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4e60: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
4e70: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e  //..        // N
4e80: 4f 54 45 3a 20 54 68 69 73 20 6d 75 73 74 20 62  OTE: This must b
4e90: 65 20 64 6f 6e 65 20 74 6f 20 70 72 65 76 65 6e  e done to preven
4ea0: 74 20 74 68 65 20 63 6f 72 65 20 53 51 4c 69 74  t the core SQLit
4eb0: 65 20 6c 69 62 72 61 72 79 20 66 72 6f 6d 0d 0a  e library from..
4ec0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
4ed0: 20 75 73 69 6e 67 20 6f 75 72 20 28 69 6e 76 61   using our (inva
4ee0: 6c 69 64 29 20 72 65 73 75 6c 74 2e 0d 0a 20 20  lid) result...  
4ef0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
4f00: 20 20 69 66 20 28 28 5f 62 61 73 65 20 21 3d 20    if ((_base != 
4f10: 6e 75 6c 6c 29 20 26 26 20 5f 62 61 73 65 2e 49  null) && _base.I
4f20: 73 4f 70 65 6e 28 29 29 0d 0a 20 20 20 20 20 20  sOpen())..      
4f30: 20 20 20 20 20 20 5f 62 61 73 65 2e 43 61 6e 63        _base.Canc
4f40: 65 6c 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  el();....       
4f50: 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20   return 0;..    
4f60: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
4f70: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
4f80: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 67 67  The internal agg
4f90: 72 65 67 61 74 65 20 53 74 65 70 20 66 75 6e 63  regate Step func
4fa0: 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2c 20 77  tion callback, w
4fb0: 68 69 63 68 20 77 72 61 70 73 20 74 68 65 20 72  hich wraps the r
4fc0: 61 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74  aw context point
4fd0: 65 72 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 65  er and calls the
4fe0: 20 76 69 72 74 75 61 6c 20 53 74 65 70 28 29 20   virtual Step() 
4ff0: 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 2f 2f 2f  method...    ///
5000: 20 57 41 52 4e 49 4e 47 3a 20 4d 75 73 74 20 6e   WARNING: Must n
5010: 6f 74 20 74 68 72 6f 77 20 65 78 63 65 70 74 69  ot throw excepti
5020: 6f 6e 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ons...    /// </
5030: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
5040: 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20  / <remarks>..   
5050: 20 2f 2f 2f 20 54 68 69 73 20 66 75 6e 63 74 69   /// This functi
5060: 6f 6e 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  on takes care of
5070: 20 64 6f 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 75   doing the looku
5080: 70 73 20 61 6e 64 20 67 65 74 74 69 6e 67 20 74  ps and getting t
5090: 68 65 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 66  he important inf
50a0: 6f 72 6d 61 74 69 6f 6e 20 70 75 74 20 74 6f 67  ormation put tog
50b0: 65 74 68 65 72 20 74 6f 20 63 61 6c 6c 20 74 68  ether to call th
50c0: 65 20 53 74 65 70 28 29 20 66 75 6e 63 74 69 6f  e Step() functio
50d0: 6e 2e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 61 74  n...    /// That
50e0: 20 69 6e 63 6c 75 64 65 73 20 70 75 6c 6c 69 6e   includes pullin
50f0: 67 20 6f 75 74 20 74 68 65 20 75 73 65 72 27 73  g out the user's
5100: 20 63 6f 6e 74 65 78 74 44 61 74 61 20 61 6e 64   contextData and
5110: 20 75 70 64 61 74 69 6e 67 20 69 74 20 61 66 74   updating it aft
5120: 65 72 20 74 68 65 20 63 61 6c 6c 20 69 73 20 6d  er the call is m
5130: 61 64 65 2e 20 20 57 65 20 75 73 65 20 61 20 73  ade.  We use a s
5140: 6f 72 74 65 64 20 6c 69 73 74 20 66 6f 72 20 74  orted list for t
5150: 68 69 73 20 73 6f 0d 0a 20 20 20 20 2f 2f 2f 20  his so..    /// 
5160: 62 69 6e 61 72 79 20 73 65 61 72 63 68 65 73 20  binary searches 
5170: 63 61 6e 20 62 65 20 64 6f 6e 65 20 74 6f 20 66  can be done to f
5180: 69 6e 64 20 74 68 65 20 64 61 74 61 2e 0d 0a 20  ind the data... 
5190: 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73     /// </remarks
51a0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
51b0: 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78 74 22  m name="context"
51c0: 3e 41 20 72 61 77 20 63 6f 6e 74 65 78 74 20 70  >A raw context p
51d0: 6f 69 6e 74 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a  ointer</param>..
51e0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
51f0: 61 6d 65 3d 22 6e 41 72 67 73 22 3e 4e 75 6d 62  ame="nArgs">Numb
5200: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5210: 70 61 73 73 65 64 20 69 6e 3c 2f 70 61 72 61 6d  passed in</param
5220: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
5230: 6d 20 6e 61 6d 65 3d 22 61 72 67 73 70 74 72 22  m name="argsptr"
5240: 3e 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  >A pointer to th
5250: 65 20 61 72 72 61 79 20 6f 66 20 61 72 67 75 6d  e array of argum
5260: 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  ents</param>..  
5270: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
5280: 53 74 65 70 43 61 6c 6c 62 61 63 6b 28 49 6e 74  StepCallback(Int
5290: 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  Ptr context, int
52a0: 20 6e 41 72 67 73 2c 20 49 6e 74 50 74 72 20 61   nArgs, IntPtr a
52b0: 72 67 73 70 74 72 29 0d 0a 20 20 20 20 7b 0d 0a  rgsptr)..    {..
52c0: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
52d0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
52e0: 20 20 20 20 41 67 67 72 65 67 61 74 65 44 61 74      AggregateDat
52f0: 61 20 64 61 74 61 20 3d 20 6e 75 6c 6c 3b 0d 0a  a data = null;..
5300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
5310: 20 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c 6c 29   (_base != null)
5320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5340: 20 49 6e 74 50 74 72 20 6e 41 75 78 20 3d 20 5f   IntPtr nAux = _
5350: 62 61 73 65 2e 41 67 67 72 65 67 61 74 65 43 6f  base.AggregateCo
5360: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 29 3b 0d  ntext(context);.
5370: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
5380: 20 20 20 69 66 20 28 28 5f 63 6f 6e 74 65 78 74     if ((_context
5390: 44 61 74 61 4c 69 73 74 20 21 3d 20 6e 75 6c 6c  DataList != null
53a0: 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20 20  ) &&..          
53b0: 20 20 20 20 20 20 20 20 20 20 21 5f 63 6f 6e 74            !_cont
53c0: 65 78 74 44 61 74 61 4c 69 73 74 2e 54 72 79 47  extDataList.TryG
53d0: 65 74 56 61 6c 75 65 28 6e 41 75 78 2c 20 6f 75  etValue(nAux, ou
53e0: 74 20 64 61 74 61 29 29 0d 0a 20 20 20 20 20 20  t data))..      
53f0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 64 61 74 61 20 3d 20 6e 65 77 20 41 67 67 72   data = new Aggr
5420: 65 67 61 74 65 44 61 74 61 28 29 3b 0d 0a 20 20  egateData();..  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69    _contextDataLi
5450: 73 74 5b 6e 41 75 78 5d 20 3d 20 64 61 74 61 3b  st[nAux] = data;
5460: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5470: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
5480: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
5490: 20 20 69 66 20 28 64 61 74 61 20 3d 3d 20 6e 75    if (data == nu
54a0: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
54b0: 20 20 20 20 20 64 61 74 61 20 3d 20 6e 65 77 20       data = new 
54c0: 41 67 67 72 65 67 61 74 65 44 61 74 61 28 29 3b  AggregateData();
54d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
54e0: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
54f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5500: 20 20 20 20 5f 63 6f 6e 74 65 78 74 20 3d 20 63      _context = c
5510: 6f 6e 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20  ontext;..       
5520: 20 20 20 20 20 20 20 20 20 53 74 65 70 28 43 6f           Step(Co
5530: 6e 76 65 72 74 50 61 72 61 6d 73 28 6e 41 72 67  nvertParams(nArg
5540: 73 2c 20 61 72 67 73 70 74 72 29 2c 0d 0a 20 20  s, argsptr),..  
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 64 61 74 61 2e 5f 63 6f 75 6e 74 2c 20 72    data._count, r
5570: 65 66 20 64 61 74 61 2e 5f 64 61 74 61 29 3b 20  ef data._data); 
5580: 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
5590: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
55a0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d          finally.
55b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 64 61 74 61 2e 5f 63 6f 75 6e 74 2b 2b 3b 0d 0a  data._count++;..
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
55f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5600: 20 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69    catch (Excepti
5610: 6f 6e 20 65 29 20 2f 2a 20 4e 4f 54 45 3a 20 4d  on e) /* NOTE: M
5620: 75 73 74 20 63 61 74 63 68 20 41 4c 4c 2e 20 2a  ust catch ALL. *
5630: 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  /..        {..  
5640: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
5650: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5670: 20 28 28 5f 66 6c 61 67 73 20 26 20 53 51 4c 69   ((_flags & SQLi
5680: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
5690: 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b 45 78 63  s.LogCallbackExc
56a0: 65 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20 20 20 20  eption) ==..    
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
56d0: 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67 43 61 6c  tionFlags.LogCal
56e0: 6c 62 61 63 6b 45 78 63 65 70 74 69 6f 6e 29 0d  lbackException).
56f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5700: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5710: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 4c 6f          SQLiteLo
5720: 67 2e 4c 6f 67 4d 65 73 73 61 67 65 28 53 51 4c  g.LogMessage(SQL
5730: 69 74 65 42 61 73 65 2e 43 4f 52 5f 45 5f 45 58  iteBase.COR_E_EX
5740: 43 45 50 54 49 4f 4e 2c 0d 0a 20 20 20 20 20 20  CEPTION,..      
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28    String.Format(
5770: 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72  CultureInfo.Curr
5780: 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a 20 20 20  entCulture,..   
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 22 43 61 75 67 68 74 20 65 78 63       "Caught exc
57b0: 65 70 74 69 6f 6e 20 69 6e 20 5c 22 53 74 65 70  eption in \"Step
57c0: 5c 22 20 6d 65 74 68 6f 64 3a 20 7b 31 7d 22 2c  \" method: {1}",
57d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
57e0: 20 20 20 20 20 20 20 20 20 20 65 29 29 3b 20 2f            e)); /
57f0: 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
5800: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5810: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
5820: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 0d            catch.
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
5860: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5870: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d         }..    }.
5880: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
5890: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 6e  ary>..    /// An
58a0: 20 69 6e 74 65 72 6e 61 6c 20 61 67 67 72 65 67   internal aggreg
58b0: 61 74 65 20 46 69 6e 61 6c 20 66 75 6e 63 74 69  ate Final functi
58c0: 6f 6e 20 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69  on callback, whi
58d0: 63 68 20 77 72 61 70 73 20 74 68 65 20 63 6f 6e  ch wraps the con
58e0: 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61 6e 64  text pointer and
58f0: 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72 74 75   calls the virtu
5900: 61 6c 20 46 69 6e 61 6c 28 29 20 6d 65 74 68 6f  al Final() metho
5910: 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 57 41 52 4e  d...    /// WARN
5920: 49 4e 47 3a 20 4d 75 73 74 20 6e 6f 74 20 74 68  ING: Must not th
5930: 72 6f 77 20 65 78 63 65 70 74 69 6f 6e 73 2e 0d  row exceptions..
5940: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
5950: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
5960: 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78  ram name="contex
5970: 74 22 3e 41 20 72 61 77 20 63 6f 6e 74 65 78 74  t">A raw context
5980: 20 70 6f 69 6e 74 65 72 3c 2f 70 61 72 61 6d 3e   pointer</param>
5990: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
59a0: 6f 69 64 20 46 69 6e 61 6c 43 61 6c 6c 62 61 63  oid FinalCallbac
59b0: 6b 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  k(IntPtr context
59c0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
59d0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 7b    try..        {
59e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
59f0: 6a 65 63 74 20 6f 62 6a 20 3d 20 6e 75 6c 6c 3b  ject obj = null;
5a00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5a10: 69 66 20 28 5f 62 61 73 65 20 21 3d 20 6e 75 6c  if (_base != nul
5a20: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
5a30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5a40: 20 20 20 49 6e 74 50 74 72 20 6e 20 3d 20 5f 62     IntPtr n = _b
5a50: 61 73 65 2e 41 67 67 72 65 67 61 74 65 43 6f 6e  ase.AggregateCon
5a60: 74 65 78 74 28 63 6f 6e 74 65 78 74 29 3b 0d 0a  text(context);..
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 41 67 67 72 65 67 61 74 65 44 61 74 61 20 61 67  AggregateData ag
5a90: 67 44 61 74 61 3b 0d 0a 0d 0a 20 20 20 20 20 20  gData;....      
5aa0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 5f            if ((_
5ab0: 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73 74 20  contextDataList 
5ac0: 21 3d 20 6e 75 6c 6c 29 20 26 26 0d 0a 20 20 20  != null) &&..   
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73   _contextDataLis
5af0: 74 2e 54 72 79 47 65 74 56 61 6c 75 65 28 6e 2c  t.TryGetValue(n,
5b00: 20 6f 75 74 20 61 67 67 44 61 74 61 29 29 0d 0a   out aggData))..
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5b30: 20 20 20 20 20 20 20 6f 62 6a 20 3d 20 61 67 67         obj = agg
5b40: 44 61 74 61 2e 5f 64 61 74 61 3b 0d 0a 20 20 20  Data._data;..   
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73   _contextDataLis
5b70: 74 2e 52 65 6d 6f 76 65 28 6e 29 3b 0d 0a 20 20  t.Remove(n);..  
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
5b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
5ba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
5bb0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  y..            {
5bc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5bd0: 20 20 5f 63 6f 6e 74 65 78 74 20 3d 20 63 6f 6e    _context = con
5be0: 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  text;..         
5bf0: 20 20 20 20 20 20 20 53 65 74 52 65 74 75 72 6e         SetReturn
5c00: 56 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 46  Value(context, F
5c10: 69 6e 61 6c 28 6f 62 6a 29 29 3b 20 2f 2a 20 74  inal(obj)); /* t
5c20: 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20  hrow */..       
5c30: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
5c40: 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20      finally..   
5c50: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 49 44 69 73              IDis
5c70: 70 6f 73 61 62 6c 65 20 64 69 73 70 20 3d 20 6f  posable disp = o
5c80: 62 6a 20 61 73 20 49 44 69 73 70 6f 73 61 62 6c  bj as IDisposabl
5c90: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
5ca0: 20 20 20 20 69 66 20 28 64 69 73 70 20 21 3d 20      if (disp != 
5cb0: 6e 75 6c 6c 29 20 64 69 73 70 2e 44 69 73 70 6f  null) disp.Dispo
5cc0: 73 65 28 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a  se(); /* throw *
5cd0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  /..            }
5ce0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
5cf0: 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
5d00: 70 74 69 6f 6e 20 65 29 20 2f 2a 20 4e 4f 54 45  ption e) /* NOTE
5d10: 3a 20 4d 75 73 74 20 63 61 74 63 68 20 41 4c 4c  : Must catch ALL
5d20: 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d  . */..        {.
5d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
5d40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d60: 20 69 66 20 28 28 5f 66 6c 61 67 73 20 26 20 53   if ((_flags & S
5d70: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
5d80: 6c 61 67 73 2e 4c 6f 67 43 61 6c 6c 62 61 63 6b  lags.LogCallback
5d90: 45 78 63 65 70 74 69 6f 6e 29 20 3d 3d 0d 0a 20  Exception) ==.. 
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e         SQLiteCon
5dc0: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2e 4c 6f 67  nectionFlags.Log
5dd0: 43 61 6c 6c 62 61 63 6b 45 78 63 65 70 74 69 6f  CallbackExceptio
5de0: 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)..            
5df0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5e00: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
5e10: 65 4c 6f 67 2e 4c 6f 67 4d 65 73 73 61 67 65 28  eLog.LogMessage(
5e20: 53 51 4c 69 74 65 42 61 73 65 2e 43 4f 52 5f 45  SQLiteBase.COR_E
5e30: 5f 45 58 43 45 50 54 49 4f 4e 2c 0d 0a 20 20 20  _EXCEPTION,..   
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d       String.Form
5e60: 61 74 28 43 75 6c 74 75 72 65 49 6e 66 6f 2e 43  at(CultureInfo.C
5e70: 75 72 72 65 6e 74 43 75 6c 74 75 72 65 2c 0d 0a  urrentCulture,..
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 20 22 43 61 75 67 68 74 20          "Caught 
5ea0: 65 78 63 65 70 74 69 6f 6e 20 69 6e 20 5c 22 46  exception in \"F
5eb0: 69 6e 61 6c 5c 22 20 6d 65 74 68 6f 64 3a 20 7b  inal\" method: {
5ec0: 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 29                e)
5ee0: 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a  ); /* throw */..
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
5f10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
5f20: 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20  tch..           
5f30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5f40: 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e      // do nothin
5f50: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
5f60: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
5f70: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c    }....    /// <
5f80: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
5f90: 2f 20 55 73 69 6e 67 20 72 65 66 6c 65 63 74 69  / Using reflecti
5fa0: 6f 6e 2c 20 65 6e 75 6d 65 72 61 74 65 20 61 6c  on, enumerate al
5fb0: 6c 20 61 73 73 65 6d 62 6c 69 65 73 20 69 6e 20  l assemblies in 
5fc0: 74 68 65 20 63 75 72 72 65 6e 74 20 61 70 70 64  the current appd
5fd0: 6f 6d 61 69 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  omain looking fo
5fe0: 72 20 63 6c 61 73 73 65 73 20 74 68 61 74 0d 0a  r classes that..
5ff0: 20 20 20 20 2f 2f 2f 20 68 61 76 65 20 61 20 53      /// have a S
6000: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74  QLiteFunctionAtt
6010: 72 69 62 75 74 65 20 61 74 74 72 69 62 75 74 65  ribute attribute
6020: 2c 20 61 6e 64 20 72 65 67 69 73 74 65 72 69 6e  , and registerin
6030: 67 20 74 68 65 6d 20 61 63 63 6f 72 64 69 6e 67  g them according
6040: 6c 79 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ly...    /// </s
6050: 75 6d 6d 61 72 79 3e 0d 0a 23 69 66 20 21 50 4c  ummary>..#if !PL
6060: 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52  ATFORM_COMPACTFR
6070: 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 5b 53 65  AMEWORK..    [Se
6080: 63 75 72 69 74 79 2e 50 65 72 6d 69 73 73 69 6f  curity.Permissio
6090: 6e 73 2e 46 69 6c 65 49 4f 50 65 72 6d 69 73 73  ns.FileIOPermiss
60a0: 69 6f 6e 28 53 65 63 75 72 69 74 79 2e 50 65 72  ion(Security.Per
60b0: 6d 69 73 73 69 6f 6e 73 2e 53 65 63 75 72 69 74  missions.Securit
60c0: 79 41 63 74 69 6f 6e 2e 41 73 73 65 72 74 2c 20  yAction.Assert, 
60d0: 41 6c 6c 46 69 6c 65 73 20 3d 20 53 65 63 75 72  AllFiles = Secur
60e0: 69 74 79 2e 50 65 72 6d 69 73 73 69 6f 6e 73 2e  ity.Permissions.
60f0: 46 69 6c 65 49 4f 50 65 72 6d 69 73 73 69 6f 6e  FileIOPermission
6100: 41 63 63 65 73 73 2e 50 61 74 68 44 69 73 63 6f  Access.PathDisco
6110: 76 65 72 79 29 5d 0d 0a 23 65 6e 64 69 66 0d 0a  very)]..#endif..
6120: 20 20 20 20 73 74 61 74 69 63 20 53 51 4c 69 74      static SQLit
6130: 65 46 75 6e 63 74 69 6f 6e 28 29 0d 0a 20 20 20  eFunction()..   
6140: 20 7b 0d 0a 20 20 20 20 20 20 5f 72 65 67 69 73   {..      _regis
6150: 74 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 20 3d  teredFunctions =
6160: 20 6e 65 77 20 4c 69 73 74 3c 53 51 4c 69 74 65   new List<SQLite
6170: 46 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74  FunctionAttribut
6180: 65 3e 28 29 3b 0d 0a 20 20 20 20 20 20 74 72 79  e>();..      try
6190: 0d 0a 20 20 20 20 20 20 7b 0d 0a 23 69 66 20 21  ..      {..#if !
61a0: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
61b0: 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 20  FRAMEWORK..     
61c0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 2f     //..        /
61d0: 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22  / NOTE: If the "
61e0: 4e 6f 5f 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  No_SQLiteFunctio
61f0: 6e 73 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ns" environment 
6200: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 2c  variable is set,
6210: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20  ..        //    
6220: 20 20 20 73 6b 69 70 20 61 6c 6c 20 6f 75 72 20     skip all our 
6230: 73 70 65 63 69 61 6c 20 63 6f 64 65 20 61 6e 64  special code and
6240: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 2e 0d   simply return..
6250: 0a 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20  .        //..   
6260: 20 20 20 20 20 69 66 20 28 45 6e 76 69 72 6f 6e       if (Environ
6270: 6d 65 6e 74 2e 47 65 74 45 6e 76 69 72 6f 6e 6d  ment.GetEnvironm
6280: 65 6e 74 56 61 72 69 61 62 6c 65 28 22 4e 6f 5f  entVariable("No_
6290: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 73 22  SQLiteFunctions"
62a0: 29 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  ) != null)..    
62b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d        return;...
62c0: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 46  .        SQLiteF
62d0: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
62e0: 20 61 74 3b 0d 0a 20 20 20 20 20 20 20 20 53 79   at;..        Sy
62f0: 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e  stem.Reflection.
6300: 41 73 73 65 6d 62 6c 79 5b 5d 20 61 72 41 73 73  Assembly[] arAss
6310: 65 6d 62 6c 69 65 73 20 3d 20 53 79 73 74 65 6d  emblies = System
6320: 2e 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65  .AppDomain.Curre
6330: 6e 74 44 6f 6d 61 69 6e 2e 47 65 74 41 73 73 65  ntDomain.GetAsse
6340: 6d 62 6c 69 65 73 28 29 3b 0d 0a 20 20 20 20 20  mblies();..     
6350: 20 20 20 69 6e 74 20 77 20 3d 20 61 72 41 73 73     int w = arAss
6360: 65 6d 62 6c 69 65 73 2e 4c 65 6e 67 74 68 3b 0d  emblies.Length;.
6370: 0a 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e  .        System.
6380: 52 65 66 6c 65 63 74 69 6f 6e 2e 41 73 73 65 6d  Reflection.Assem
6390: 62 6c 79 4e 61 6d 65 20 73 71 6c 69 74 65 20 3d  blyName sqlite =
63a0: 20 53 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69   System.Reflecti
63b0: 6f 6e 2e 41 73 73 65 6d 62 6c 79 2e 47 65 74 45  on.Assembly.GetE
63c0: 78 65 63 75 74 69 6e 67 41 73 73 65 6d 62 6c 79  xecutingAssembly
63d0: 28 29 2e 47 65 74 4e 61 6d 65 28 29 3b 0d 0a 0d  ().GetName();...
63e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e  .        for (in
63f0: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 77 3b 20  t n = 0; n < w; 
6400: 6e 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  n++)..        {.
6410: 0a 20 20 20 20 20 20 20 20 20 20 54 79 70 65 5b  .          Type[
6420: 5d 20 61 72 54 79 70 65 73 3b 0d 0a 20 20 20 20  ] arTypes;..    
6430: 20 20 20 20 20 20 62 6f 6f 6c 20 66 6f 75 6e 64        bool found
6440: 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20   = false;..     
6450: 20 20 20 20 20 53 79 73 74 65 6d 2e 52 65 66 6c       System.Refl
6460: 65 63 74 69 6f 6e 2e 41 73 73 65 6d 62 6c 79 4e  ection.AssemblyN
6470: 61 6d 65 5b 5d 20 72 65 66 65 72 65 6e 63 65 73  ame[] references
6480: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 72 79  ;..          try
6490: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
64a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 6e             // In
64b0: 73 70 65 63 74 20 6f 6e 6c 79 20 61 73 73 65 6d  spect only assem
64c0: 62 6c 69 65 73 20 74 68 61 74 20 72 65 66 65 72  blies that refer
64d0: 65 6e 63 65 20 53 51 4c 69 74 65 0d 0a 20 20 20  ence SQLite..   
64e0: 20 20 20 20 20 20 20 20 20 72 65 66 65 72 65 6e           referen
64f0: 63 65 73 20 3d 20 61 72 41 73 73 65 6d 62 6c 69  ces = arAssembli
6500: 65 73 5b 6e 5d 2e 47 65 74 52 65 66 65 72 65 6e  es[n].GetReferen
6510: 63 65 64 41 73 73 65 6d 62 6c 69 65 73 28 29 3b  cedAssemblies();
6520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
6530: 74 20 74 20 3d 20 72 65 66 65 72 65 6e 63 65 73  t t = references
6540: 2e 4c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20  .Length;..      
6550: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 7a        for (int z
6560: 20 3d 20 30 3b 20 7a 20 3c 20 74 3b 20 7a 2b 2b   = 0; z < t; z++
6570: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
6580: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6590: 69 66 20 28 72 65 66 65 72 65 6e 63 65 73 5b 7a  if (references[z
65a0: 5d 2e 4e 61 6d 65 20 3d 3d 20 73 71 6c 69 74 65  ].Name == sqlite
65b0: 2e 4e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  .Name)..        
65c0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
65d0: 20 20 20 20 20 20 20 20 20 66 6f 75 6e 64 20 3d           found =
65e0: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
65f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0d 0a          break;..
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
6610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
6620: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
6630: 20 28 66 6f 75 6e 64 20 3d 3d 20 66 61 6c 73 65   (found == false
6640: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
6650: 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20   continue;....  
6660: 20 20 20 20 20 20 20 20 20 20 61 72 54 79 70 65            arType
6670: 73 20 3d 20 61 72 41 73 73 65 6d 62 6c 69 65 73  s = arAssemblies
6680: 5b 6e 5d 2e 47 65 74 54 79 70 65 73 28 29 3b 0d  [n].GetTypes();.
6690: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
66a0: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 52          catch (R
66b0: 65 66 6c 65 63 74 69 6f 6e 2e 52 65 66 6c 65 63  eflection.Reflec
66c0: 74 69 6f 6e 54 79 70 65 4c 6f 61 64 45 78 63 65  tionTypeLoadExce
66d0: 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20  ption e)..      
66e0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
66f0: 20 20 20 61 72 54 79 70 65 73 20 3d 20 65 2e 54     arTypes = e.T
6700: 79 70 65 73 3b 0d 0a 20 20 20 20 20 20 20 20 20  ypes;..         
6710: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
6720: 69 6e 74 20 76 20 3d 20 61 72 54 79 70 65 73 2e  int v = arTypes.
6730: 4c 65 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20 20  Length;..       
6740: 20 20 20 66 6f 72 20 28 69 6e 74 20 78 20 3d 20     for (int x = 
6750: 30 3b 20 78 20 3c 20 76 3b 20 78 2b 2b 29 0d 0a  0; x < v; x++)..
6760: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
6770: 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72 54           if (arT
6780: 79 70 65 73 5b 78 5d 20 3d 3d 20 6e 75 6c 6c 29  ypes[x] == null)
6790: 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20   continue;....  
67a0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
67b0: 5b 5d 20 61 72 41 74 74 20 3d 20 61 72 54 79 70  [] arAtt = arTyp
67c0: 65 73 5b 78 5d 2e 47 65 74 43 75 73 74 6f 6d 41  es[x].GetCustomA
67d0: 74 74 72 69 62 75 74 65 73 28 74 79 70 65 6f 66  ttributes(typeof
67e0: 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41  (SQLiteFunctionA
67f0: 74 74 72 69 62 75 74 65 29 2c 20 66 61 6c 73 65  ttribute), false
6800: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
6810: 69 6e 74 20 75 20 3d 20 61 72 41 74 74 2e 4c 65  int u = arAtt.Le
6820: 6e 67 74 68 3b 0d 0a 20 20 20 20 20 20 20 20 20  ngth;..         
6830: 20 20 20 66 6f 72 20 28 69 6e 74 20 79 20 3d 20     for (int y = 
6840: 30 3b 20 79 20 3c 20 75 3b 20 79 2b 2b 29 0d 0a  0; y < u; y++)..
6850: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20               at 
6870: 3d 20 61 72 41 74 74 5b 79 5d 20 61 73 20 53 51  = arAtt[y] as SQ
6880: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
6890: 69 62 75 74 65 3b 0d 0a 20 20 20 20 20 20 20 20  ibute;..        
68a0: 20 20 20 20 20 20 69 66 20 28 61 74 20 21 3d 20        if (at != 
68b0: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
68c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
68d0: 20 20 20 20 20 20 20 20 61 74 2e 49 6e 73 74 61          at.Insta
68e0: 6e 63 65 54 79 70 65 20 3d 20 61 72 54 79 70 65  nceType = arType
68f0: 73 5b 78 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20  s[x];..         
6900: 20 20 20 20 20 20 20 5f 72 65 67 69 73 74 65 72         _register
6910: 65 64 46 75 6e 63 74 69 6f 6e 73 2e 41 64 64 28  edFunctions.Add(
6920: 61 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  at);..          
6930: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
6940: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
6950: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 23 65  }..        }..#e
6960: 6e 64 69 66 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ndif..      }.. 
6970: 20 20 20 20 20 63 61 74 63 68 20 2f 2f 20 53 51       catch // SQ
6980: 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 63 61  Lite provider ca
6990: 6e 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 6f  n continue witho
69a0: 75 74 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  ut being able to
69b0: 20 66 69 6e 64 20 62 75 69 6c 74 2d 69 6e 20 66   find built-in f
69c0: 75 6e 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  unctions..      
69d0: 7b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  {..      }..    
69e0: 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  }....    /// <su
69f0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
6a00: 4d 61 6e 75 61 6c 20 6d 65 74 68 6f 64 20 6f 66  Manual method of
6a10: 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 66   registering a f
6a20: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 74 79  unction.  The ty
6a30: 70 65 20 6d 75 73 74 20 73 74 69 6c 6c 20 68 61  pe must still ha
6a40: 76 65 20 74 68 65 20 53 51 4c 69 74 65 46 75 6e  ve the SQLiteFun
6a50: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 73 20  ctionAttributes 
6a60: 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b  in order to work
6a70: 0d 0a 20 20 20 20 2f 2f 2f 20 70 72 6f 70 65 72  ..    /// proper
6a80: 6c 79 2c 20 62 75 74 20 74 68 69 73 20 69 73 20  ly, but this is 
6a90: 61 20 77 6f 72 6b 61 72 6f 75 6e 64 20 66 6f 72  a workaround for
6aa0: 20 74 68 65 20 43 6f 6d 70 61 63 74 20 46 72 61   the Compact Fra
6ab0: 6d 65 77 6f 72 6b 20 77 68 65 72 65 20 65 6e 75  mework where enu
6ac0: 6d 65 72 61 74 69 6e 67 20 61 73 73 65 6d 62 6c  merating assembl
6ad0: 69 65 73 20 69 73 20 6e 6f 74 20 63 75 72 72 65  ies is not curre
6ae0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 2e 0d  ntly supported..
6af0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
6b00: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ry>..    /// <pa
6b10: 72 61 6d 20 6e 61 6d 65 3d 22 74 79 70 22 3e 54  ram name="typ">T
6b20: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  he type of the f
6b30: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 67 69 73  unction to regis
6b40: 74 65 72 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  ter</param>..   
6b50: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76   public static v
6b60: 6f 69 64 20 52 65 67 69 73 74 65 72 46 75 6e 63  oid RegisterFunc
6b70: 74 69 6f 6e 28 54 79 70 65 20 74 79 70 29 0d 0a  tion(Type typ)..
6b80: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 6f 62 6a      {..      obj
6b90: 65 63 74 5b 5d 20 61 72 41 74 74 20 3d 20 74 79  ect[] arAtt = ty
6ba0: 70 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 72 69  p.GetCustomAttri
6bb0: 62 75 74 65 73 28 74 79 70 65 6f 66 28 53 51 4c  butes(typeof(SQL
6bc0: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
6bd0: 62 75 74 65 29 2c 20 66 61 6c 73 65 29 3b 0d 0a  bute), false);..
6be0: 20 20 20 20 20 20 69 6e 74 20 75 20 3d 20 61 72        int u = ar
6bf0: 41 74 74 2e 4c 65 6e 67 74 68 3b 0d 0a 20 20 20  Att.Length;..   
6c00: 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f     SQLiteFunctio
6c10: 6e 41 74 74 72 69 62 75 74 65 20 61 74 3b 0d 0a  nAttribute at;..
6c20: 0d 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74  ..      for (int
6c30: 20 79 20 3d 20 30 3b 20 79 20 3c 20 75 3b 20 79   y = 0; y < u; y
6c40: 2b 2b 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ++)..      {..  
6c50: 20 20 20 20 20 20 61 74 20 3d 20 61 72 41 74 74        at = arAtt
6c60: 5b 79 5d 20 61 73 20 53 51 4c 69 74 65 46 75 6e  [y] as SQLiteFun
6c70: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 3b 0d  ctionAttribute;.
6c80: 0a 20 20 20 20 20 20 20 20 69 66 20 28 61 74 20  .        if (at 
6c90: 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
6ca0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61    {..          a
6cb0: 74 2e 49 6e 73 74 61 6e 63 65 54 79 70 65 20 3d  t.InstanceType =
6cc0: 20 74 79 70 3b 0d 0a 20 20 20 20 20 20 20 20 20   typ;..         
6cd0: 20 5f 72 65 67 69 73 74 65 72 65 64 46 75 6e 63   _registeredFunc
6ce0: 74 69 6f 6e 73 2e 41 64 64 28 61 74 29 3b 0d 0a  tions.Add(at);..
6cf0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6d00: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
6d10: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
6d20: 20 20 20 20 2f 2f 2f 20 43 61 6c 6c 65 64 20 62      /// Called b
6d30: 79 20 53 51 4c 69 74 65 42 61 73 65 20 64 65 72  y SQLiteBase der
6d40: 69 76 65 64 20 63 6c 61 73 73 65 73 2c 20 74 68  ived classes, th
6d50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 62 69 6e 64  is function bind
6d60: 73 20 61 6c 6c 20 75 73 65 72 2d 64 65 66 69 6e  s all user-defin
6d70: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  ed functions to 
6d80: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20  a connection... 
6d90: 20 20 20 2f 2f 2f 20 49 74 20 69 73 20 64 6f 6e     /// It is don
6da0: 65 20 74 68 69 73 20 77 61 79 20 73 6f 20 74 68  e this way so th
6db0: 61 74 20 61 6c 6c 20 75 73 65 72 2d 64 65 66 69  at all user-defi
6dc0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  ned functions wi
6dd0: 6c 6c 20 61 63 63 65 73 73 20 74 68 65 20 64 61  ll access the da
6de0: 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
6df0: 20 73 61 6d 65 20 65 6e 63 6f 64 69 6e 67 20 73   same encoding s
6e00: 63 68 65 6d 65 0d 0a 20 20 20 20 2f 2f 2f 20 61  cheme..    /// a
6e10: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6e20: 20 28 55 54 46 2d 38 20 6f 72 20 55 54 46 2d 31   (UTF-8 or UTF-1
6e30: 36 29 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  6)...    /// </s
6e40: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
6e50: 20 3c 72 65 6d 61 72 6b 73 3e 0d 0a 20 20 20 20   <remarks>..    
6e60: 2f 2f 2f 20 54 68 65 20 77 72 61 70 70 65 72 20  /// The wrapper 
6e70: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
6e80: 6e 74 65 72 6f 70 20 77 69 74 68 20 53 51 4c 69  nterop with SQLi
6e90: 74 65 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  te will create a
6ea0: 20 75 6e 69 71 75 65 20 63 6f 6f 6b 69 65 20 76   unique cookie v
6eb0: 61 6c 75 65 2c 20 77 68 69 63 68 20 69 6e 74 65  alue, which inte
6ec0: 72 6e 61 6c 6c 79 20 69 73 20 61 20 70 6f 69 6e  rnally is a poin
6ed0: 74 65 72 20 74 6f 0d 0a 20 20 20 20 2f 2f 2f 20  ter to..    /// 
6ee0: 61 6c 6c 20 74 68 65 20 77 72 61 70 70 65 64 20  all the wrapped 
6ef0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
6f00: 6e 73 2e 20 20 54 68 65 20 69 6e 74 65 72 6f 70  ns.  The interop
6f10: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 69   function uses i
6f20: 74 20 74 6f 20 6d 61 70 20 43 44 65 63 6c 20 63  t to map CDecl c
6f30: 61 6c 6c 62 61 63 6b 73 20 74 6f 20 53 74 64 43  allbacks to StdC
6f40: 61 6c 6c 20 63 61 6c 6c 62 61 63 6b 73 2e 0d 0a  all callbacks...
6f50: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b      /// </remark
6f60: 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  s>..    /// <par
6f70: 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 62 61 73 65  am name="sqlbase
6f80: 22 3e 54 68 65 20 62 61 73 65 20 6f 62 6a 65 63  ">The base objec
6f90: 74 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 66  t on which the f
6fa0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 74 6f 20  unctions are to 
6fb0: 62 69 6e 64 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  bind</param>..  
6fc0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
6fd0: 65 3d 22 66 6c 61 67 73 22 3e 54 68 65 20 66 6c  e="flags">The fl
6fe0: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
6ff0: 69 74 68 20 74 68 65 20 70 61 72 65 6e 74 20 63  ith the parent c
7000: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74  onnection object
7010: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
7020: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72  / <returns>Retur
7030: 6e 73 20 61 20 6c 6f 67 69 63 61 6c 20 6c 69 73  ns a logical lis
7040: 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 77  t of functions w
7050: 68 69 63 68 20 74 68 65 20 63 6f 6e 6e 65 63 74  hich the connect
7060: 69 6f 6e 20 73 68 6f 75 6c 64 20 72 65 74 61 69  ion should retai
7070: 6e 20 75 6e 74 69 6c 20 69 74 20 69 73 20 63 6c  n until it is cl
7080: 6f 73 65 64 2e 3c 2f 72 65 74 75 72 6e 73 3e 0d  osed.</returns>.
7090: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
70a0: 61 74 69 63 20 49 45 6e 75 6d 65 72 61 62 6c 65  atic IEnumerable
70b0: 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 3e  <SQLiteFunction>
70c0: 20 42 69 6e 64 46 75 6e 63 74 69 6f 6e 73 28 53   BindFunctions(S
70d0: 51 4c 69 74 65 42 61 73 65 20 73 71 6c 62 61 73  QLiteBase sqlbas
70e0: 65 2c 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  e, SQLiteConnect
70f0: 69 6f 6e 46 6c 61 67 73 20 66 6c 61 67 73 29 0d  ionFlags flags).
7100: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20  .    {..        
7110: 4c 69 73 74 3c 53 51 4c 69 74 65 46 75 6e 63 74  List<SQLiteFunct
7120: 69 6f 6e 3e 20 6c 46 75 6e 63 74 69 6f 6e 73 20  ion> lFunctions 
7130: 3d 20 6e 65 77 20 4c 69 73 74 3c 53 51 4c 69 74  = new List<SQLit
7140: 65 46 75 6e 63 74 69 6f 6e 3e 28 29 3b 0d 0a 0d  eFunction>();...
7150: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
7160: 20 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e   (SQLiteFunction
7170: 41 74 74 72 69 62 75 74 65 20 70 72 20 69 6e 20  Attribute pr in 
7180: 5f 72 65 67 69 73 74 65 72 65 64 46 75 6e 63 74  _registeredFunct
7190: 69 6f 6e 73 29 0d 0a 20 20 20 20 20 20 20 20 7b  ions)..        {
71a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ..            SQ
71b0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 66 20 3d  LiteFunction f =
71c0: 20 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e   (SQLiteFunction
71d0: 29 41 63 74 69 76 61 74 6f 72 2e 43 72 65 61 74  )Activator.Creat
71e0: 65 49 6e 73 74 61 6e 63 65 28 70 72 2e 49 6e 73  eInstance(pr.Ins
71f0: 74 61 6e 63 65 54 79 70 65 29 3b 0d 0a 20 20 20  tanceType);..   
7200: 20 20 20 20 20 20 20 20 20 42 69 6e 64 46 75 6e           BindFun
7210: 63 74 69 6f 6e 28 73 71 6c 62 61 73 65 2c 20 70  ction(sqlbase, p
7220: 72 2c 20 66 2c 20 66 6c 61 67 73 29 3b 0d 0a 20  r, f, flags);.. 
7230: 20 20 20 20 20 20 20 20 20 20 20 6c 46 75 6e 63             lFunc
7240: 74 69 6f 6e 73 2e 41 64 64 28 66 29 3b 0d 0a 20  tions.Add(f);.. 
7250: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7260: 20 20 20 20 72 65 74 75 72 6e 20 6c 46 75 6e 63      return lFunc
7270: 74 69 6f 6e 73 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  tions;..    }...
7280: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
7290: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73  y>..    /// This
72a0: 20 66 75 6e 63 74 69 6f 6e 20 62 69 6e 64 73 20   function binds 
72b0: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  a user-defined f
72c0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 61 20 63 6f  unctions to a co
72d0: 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 2f  nnection...    /
72e0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
72f0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
7300: 6d 65 3d 22 73 71 6c 69 74 65 42 61 73 65 22 3e  me="sqliteBase">
7310: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73  ..    /// The <s
7320: 65 65 20 63 72 65 66 3d 22 53 51 4c 69 74 65 42  ee cref="SQLiteB
7330: 61 73 65 22 20 2f 3e 20 6f 62 6a 65 63 74 20 69  ase" /> object i
7340: 6e 73 74 61 6e 63 65 20 61 73 73 6f 63 69 61 74  nstance associat
7350: 65 64 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  ed with the..   
7360: 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22   /// <see cref="
7370: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
7380: 22 20 2f 3e 20 74 68 61 74 20 74 68 65 20 66 75  " /> that the fu
7390: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
73a0: 20 62 6f 75 6e 64 20 74 6f 2e 0d 0a 20 20 20 20   bound to...    
73b0: 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  /// </param>..  
73c0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
73d0: 65 3d 22 66 75 6e 63 74 69 6f 6e 41 74 74 72 69  e="functionAttri
73e0: 62 75 74 65 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20  bute">..    /// 
73f0: 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 53  The <see cref="S
7400: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74  QLiteFunctionAtt
7410: 72 69 62 75 74 65 22 2f 3e 20 6f 62 6a 65 63 74  ribute"/> object
7420: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6e 74 61 69   instance contai
7430: 6e 69 6e 67 0d 0a 20 20 20 20 2f 2f 2f 20 74 68  ning..    /// th
7440: 65 20 6d 65 74 61 64 61 74 61 20 66 6f 72 20 74  e metadata for t
7450: 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  he function to b
7460: 65 20 62 6f 75 6e 64 2e 0d 0a 20 20 20 20 2f 2f  e bound...    //
7470: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
7480: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
7490: 22 66 75 6e 63 74 69 6f 6e 22 3e 0d 0a 20 20 20  "function">..   
74a0: 20 2f 2f 2f 20 54 68 65 20 3c 73 65 65 20 63 72   /// The <see cr
74b0: 65 66 3d 22 53 51 4c 69 74 65 46 75 6e 63 74 69  ef="SQLiteFuncti
74c0: 6f 6e 22 2f 3e 20 6f 62 6a 65 63 74 20 69 6e 73  on"/> object ins
74d0: 74 61 6e 63 65 20 74 68 61 74 20 69 6d 70 6c 65  tance that imple
74e0: 6d 65 6e 74 73 20 74 68 65 0d 0a 20 20 20 20 2f  ments the..    /
74f0: 2f 2f 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  // function to b
7500: 65 20 62 6f 75 6e 64 2e 0d 0a 20 20 20 20 2f 2f  e bound...    //
7510: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
7520: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
7530: 22 66 6c 61 67 73 22 3e 0d 0a 20 20 20 20 2f 2f  "flags">..    //
7540: 2f 20 54 68 65 20 66 6c 61 67 73 20 61 73 73 6f  / The flags asso
7550: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7560: 70 61 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  parent connectio
7570: 6e 20 6f 62 6a 65 63 74 2e 0d 0a 20 20 20 20 2f  n object...    /
7580: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
7590: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63   internal static
75a0: 20 76 6f 69 64 20 42 69 6e 64 46 75 6e 63 74 69   void BindFuncti
75b0: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  on(..        SQL
75c0: 69 74 65 42 61 73 65 20 73 71 6c 69 74 65 42 61  iteBase sqliteBa
75d0: 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 53 51 4c  se,..        SQL
75e0: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
75f0: 62 75 74 65 20 66 75 6e 63 74 69 6f 6e 41 74 74  bute functionAtt
7600: 72 69 62 75 74 65 2c 0d 0a 20 20 20 20 20 20 20  ribute,..       
7610: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20   SQLiteFunction 
7620: 66 75 6e 63 74 69 6f 6e 2c 0d 0a 20 20 20 20 20  function,..     
7630: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
7640: 69 6f 6e 46 6c 61 67 73 20 66 6c 61 67 73 0d 0a  ionFlags flags..
7650: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 7b          )..    {
7660: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71  ..        if (sq
7670: 6c 69 74 65 42 61 73 65 20 3d 3d 20 6e 75 6c 6c  liteBase == null
7680: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  )..            t
7690: 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e  hrow new Argumen
76a0: 74 4e 75 6c 6c 45 78 63 65 70 74 69 6f 6e 28 22  tNullException("
76b0: 73 71 6c 69 74 65 42 61 73 65 22 29 3b 0d 0a 0d  sqliteBase");...
76c0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 75 6e  .        if (fun
76d0: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 20 3d  ctionAttribute =
76e0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
76f0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 41       throw new A
7700: 72 67 75 6d 65 6e 74 4e 75 6c 6c 45 78 63 65 70  rgumentNullExcep
7710: 74 69 6f 6e 28 22 66 75 6e 63 74 69 6f 6e 41 74  tion("functionAt
7720: 74 72 69 62 75 74 65 22 29 3b 0d 0a 0d 0a 20 20  tribute");....  
7730: 20 20 20 20 20 20 69 66 20 28 66 75 6e 63 74 69        if (functi
7740: 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  on == null)..   
7750: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
7760: 65 77 20 41 72 67 75 6d 65 6e 74 4e 75 6c 6c 45  ew ArgumentNullE
7770: 78 63 65 70 74 69 6f 6e 28 22 66 75 6e 63 74 69  xception("functi
7780: 6f 6e 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  on");....       
7790: 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 20 66 75   FunctionType fu
77a0: 6e 63 74 69 6f 6e 54 79 70 65 20 3d 20 66 75 6e  nctionType = fun
77b0: 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 2e 46  ctionAttribute.F
77c0: 75 6e 63 54 79 70 65 3b 0d 0a 0d 0a 20 20 20 20  uncType;....    
77d0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 62 61      function._ba
77e0: 73 65 20 3d 20 73 71 6c 69 74 65 42 61 73 65 3b  se = sqliteBase;
77f0: 0d 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  ..        functi
7800: 6f 6e 2e 5f 66 6c 61 67 73 20 3d 20 66 6c 61 67  on._flags = flag
7810: 73 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 75  s;....        fu
7820: 6e 63 74 69 6f 6e 2e 5f 49 6e 76 6f 6b 65 46 75  nction._InvokeFu
7830: 6e 63 20 3d 20 28 66 75 6e 63 74 69 6f 6e 54 79  nc = (functionTy
7840: 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79  pe == FunctionTy
7850: 70 65 2e 53 63 61 6c 61 72 29 20 3f 0d 0a 20 20  pe.Scalar) ?..  
7860: 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 53 51            new SQ
7870: 4c 69 74 65 43 61 6c 6c 62 61 63 6b 28 66 75 6e  LiteCallback(fun
7880: 63 74 69 6f 6e 2e 53 63 61 6c 61 72 43 61 6c 6c  ction.ScalarCall
7890: 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 0d  back) : null;...
78a0: 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .        functio
78b0: 6e 2e 5f 53 74 65 70 46 75 6e 63 20 3d 20 28 66  n._StepFunc = (f
78c0: 75 6e 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 46  unctionType == F
78d0: 75 6e 63 74 69 6f 6e 54 79 70 65 2e 41 67 67 72  unctionType.Aggr
78e0: 65 67 61 74 65 29 20 3f 0d 0a 20 20 20 20 20 20  egate) ?..      
78f0: 20 20 20 20 20 20 6e 65 77 20 53 51 4c 69 74 65        new SQLite
7900: 43 61 6c 6c 62 61 63 6b 28 66 75 6e 63 74 69 6f  Callback(functio
7910: 6e 2e 53 74 65 70 43 61 6c 6c 62 61 63 6b 29 20  n.StepCallback) 
7920: 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  : null;....     
7930: 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 46 69 6e     function._Fin
7940: 61 6c 46 75 6e 63 20 3d 20 28 66 75 6e 63 74 69  alFunc = (functi
7950: 6f 6e 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 69  onType == Functi
7960: 6f 6e 54 79 70 65 2e 41 67 67 72 65 67 61 74 65  onType.Aggregate
7970: 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) ?..           
7980: 20 6e 65 77 20 53 51 4c 69 74 65 46 69 6e 61 6c   new SQLiteFinal
7990: 43 61 6c 6c 62 61 63 6b 28 66 75 6e 63 74 69 6f  Callback(functio
79a0: 6e 2e 46 69 6e 61 6c 43 61 6c 6c 62 61 63 6b 29  n.FinalCallback)
79b0: 20 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20   : null;....    
79c0: 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 43 6f      function._Co
79d0: 6d 70 61 72 65 46 75 6e 63 20 3d 20 28 66 75 6e  mpareFunc = (fun
79e0: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 46 75 6e  ctionType == Fun
79f0: 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74  ctionType.Collat
7a00: 69 6f 6e 29 20 3f 0d 0a 20 20 20 20 20 20 20 20  ion) ?..        
7a10: 20 20 20 20 6e 65 77 20 53 51 4c 69 74 65 43 6f      new SQLiteCo
7a20: 6c 6c 61 74 69 6f 6e 28 66 75 6e 63 74 69 6f 6e  llation(function
7a30: 2e 43 6f 6d 70 61 72 65 43 61 6c 6c 62 61 63 6b  .CompareCallback
7a40: 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  ) : null;....   
7a50: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 2e 5f 43       function._C
7a60: 6f 6d 70 61 72 65 46 75 6e 63 31 36 20 3d 20 28  ompareFunc16 = (
7a70: 66 75 6e 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20  functionType == 
7a80: 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c  FunctionType.Col
7a90: 6c 61 74 69 6f 6e 29 20 3f 0d 0a 20 20 20 20 20  lation) ?..     
7aa0: 20 20 20 20 20 20 20 6e 65 77 20 53 51 4c 69 74         new SQLit
7ab0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 66 75 6e 63 74  eCollation(funct
7ac0: 69 6f 6e 2e 43 6f 6d 70 61 72 65 43 61 6c 6c 62  ion.CompareCallb
7ad0: 61 63 6b 31 36 29 20 3a 20 6e 75 6c 6c 3b 0d 0a  ack16) : null;..
7ae0: 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ..        string
7af0: 20 6e 61 6d 65 20 3d 20 66 75 6e 63 74 69 6f 6e   name = function
7b00: 41 74 74 72 69 62 75 74 65 2e 4e 61 6d 65 3b 0d  Attribute.Name;.
7b10: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 66  ...        if (f
7b20: 75 6e 63 74 69 6f 6e 54 79 70 65 20 21 3d 20 46  unctionType != F
7b30: 75 6e 63 74 69 6f 6e 54 79 70 65 2e 43 6f 6c 6c  unctionType.Coll
7b40: 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ation)..        
7b50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  {..            b
7b60: 6f 6f 6c 20 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ool needCollSeq 
7b70: 3d 20 28 66 75 6e 63 74 69 6f 6e 20 69 73 20 53  = (function is S
7b80: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 45 78 29  QLiteFunctionEx)
7b90: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
7ba0: 20 73 71 6c 69 74 65 42 61 73 65 2e 43 72 65 61   sqliteBase.Crea
7bb0: 74 65 46 75 6e 63 74 69 6f 6e 28 0d 0a 20 20 20  teFunction(..   
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
7bd0: 65 2c 20 66 75 6e 63 74 69 6f 6e 41 74 74 72 69  e, functionAttri
7be0: 62 75 74 65 2e 41 72 67 75 6d 65 6e 74 73 2c 20  bute.Arguments, 
7bf0: 6e 65 65 64 43 6f 6c 6c 53 65 71 2c 0d 0a 20 20  needCollSeq,..  
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 75                fu
7c10: 6e 63 74 69 6f 6e 2e 5f 49 6e 76 6f 6b 65 46 75  nction._InvokeFu
7c20: 6e 63 2c 20 66 75 6e 63 74 69 6f 6e 2e 5f 53 74  nc, function._St
7c30: 65 70 46 75 6e 63 2c 0d 0a 20 20 20 20 20 20 20  epFunc,..       
7c40: 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f           functio
7c50: 6e 2e 5f 46 69 6e 61 6c 46 75 6e 63 29 3b 0d 0a  n._FinalFunc);..
7c60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7c70: 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
7c80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7c90: 73 71 6c 69 74 65 42 61 73 65 2e 43 72 65 61 74  sqliteBase.Creat
7ca0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 0d 0a 20 20 20  eCollation(..   
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
7cc0: 65 2c 20 66 75 6e 63 74 69 6f 6e 2e 5f 43 6f 6d  e, function._Com
7cd0: 70 61 72 65 46 75 6e 63 2c 20 66 75 6e 63 74 69  pareFunc, functi
7ce0: 6f 6e 2e 5f 43 6f 6d 70 61 72 65 46 75 6e 63 31  on._CompareFunc1
7cf0: 36 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  6);..        }..
7d00: 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20      }..  }....  
7d10: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
7d20: 20 2f 2f 2f 20 45 78 74 65 6e 64 73 20 53 51 4c   /// Extends SQL
7d30: 69 74 65 46 75 6e 63 74 69 6f 6e 20 61 6e 64 20  iteFunction and 
7d40: 61 6c 6c 6f 77 73 20 61 6e 20 69 6e 68 65 72 69  allows an inheri
7d50: 74 65 64 20 63 6c 61 73 73 20 74 6f 20 6f 62 74  ted class to obt
7d60: 61 69 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ain the collatin
7d70: 67 20 73 65 71 75 65 6e 63 65 20 61 73 73 6f 63  g sequence assoc
7d80: 69 61 74 65 64 20 77 69 74 68 20 61 20 66 75 6e  iated with a fun
7d90: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0d 0a 20 20 2f  ction call...  /
7da0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
7db0: 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0d 0a   /// <remarks>..
7dc0: 20 20 2f 2f 2f 20 55 73 65 72 2d 64 65 66 69 6e    /// User-defin
7dd0: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  ed functions can
7de0: 20 63 61 6c 6c 20 74 68 65 20 47 65 74 43 6f 6c   call the GetCol
7df0: 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 28 29  lationSequence()
7e00: 20 6d 65 74 68 6f 64 20 69 6e 20 74 68 69 73 20   method in this 
7e10: 63 6c 61 73 73 20 61 6e 64 20 75 73 65 20 69 74  class and use it
7e20: 20 74 6f 20 63 6f 6d 70 61 72 65 20 73 74 72 69   to compare stri
7e30: 6e 67 73 20 61 6e 64 20 63 68 61 72 20 61 72 72  ngs and char arr
7e40: 61 79 73 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 72 65  ays...  /// </re
7e50: 6d 61 72 6b 73 3e 0d 0a 20 20 70 75 62 6c 69 63  marks>..  public
7e60: 20 63 6c 61 73 73 20 53 51 4c 69 74 65 46 75 6e   class SQLiteFun
7e70: 63 74 69 6f 6e 45 78 20 3a 20 53 51 4c 69 74 65  ctionEx : SQLite
7e80: 46 75 6e 63 74 69 6f 6e 0d 0a 20 20 7b 0d 0a 20  Function..  {.. 
7e90: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
7ea0: 0d 0a 20 20 20 20 2f 2f 2f 20 4f 62 74 61 69 6e  ..    /// Obtain
7eb0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
7ec0: 73 65 71 75 65 6e 63 65 20 69 6e 20 65 66 66 65  sequence in effe
7ed0: 63 74 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ct for the given
7ee0: 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20   function...    
7ef0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
7f00: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
7f10: 3e 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20  ></returns>..   
7f20: 20 70 72 6f 74 65 63 74 65 64 20 43 6f 6c 6c 61   protected Colla
7f30: 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 47 65 74  tionSequence Get
7f40: 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63  CollationSequenc
7f50: 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  e()..    {..    
7f60: 20 20 72 65 74 75 72 6e 20 5f 62 61 73 65 2e 47    return _base.G
7f70: 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65  etCollationSeque
7f80: 6e 63 65 28 74 68 69 73 2c 20 5f 63 6f 6e 74 65  nce(this, _conte
7f90: 78 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  xt);..    }.... 
7fa0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
7fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8000: 2f 2f 0d 0a 0d 0a 20 20 20 20 23 72 65 67 69 6f  //....    #regio
8010: 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22 50  n IDisposable "P
8020: 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73 0d  attern" Members.
8030: 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f  .    private boo
8040: 6c 20 64 69 73 70 6f 73 65 64 3b 0d 0a 20 20 20  l disposed;..   
8050: 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 43 68   private void Ch
8060: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20 2f 2a  eckDisposed() /*
8070: 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 7b   throw */..    {
8080: 0d 0a 23 69 66 20 54 48 52 4f 57 5f 4f 4e 5f 44  ..#if THROW_ON_D
8090: 49 53 50 4f 53 45 44 0d 0a 20 20 20 20 20 20 20  ISPOSED..       
80a0: 20 69 66 20 28 64 69 73 70 6f 73 65 64 29 0d 0a   if (disposed)..
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
80c0: 77 20 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70  w new ObjectDisp
80d0: 6f 73 65 64 45 78 63 65 70 74 69 6f 6e 28 74 79  osedException(ty
80e0: 70 65 6f 66 28 53 51 4c 69 74 65 46 75 6e 63 74  peof(SQLiteFunct
80f0: 69 6f 6e 45 78 29 2e 4e 61 6d 65 29 3b 0d 0a 23  ionEx).Name);..#
8100: 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  endif..    }....
8110: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
8120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8170: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 70 72 6f 74 65  ///....    prote
8180: 63 74 65 64 20 6f 76 65 72 72 69 64 65 20 76 6f  cted override vo
8190: 69 64 20 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20  id Dispose(bool 
81a0: 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20  disposing)..    
81b0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 0d 0a  {..        try..
81c0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
81d0: 20 20 20 20 20 20 20 69 66 20 28 21 64 69 73 70         if (!disp
81e0: 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20  osed)..         
81f0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8200: 20 20 20 20 20 20 2f 2f 69 66 20 28 64 69 73 70        //if (disp
8210: 6f 73 69 6e 67 29 0d 0a 20 20 20 20 20 20 20 20  osing)..        
8220: 20 20 20 20 20 20 20 20 2f 2f 7b 0d 0a 20 20 20          //{..   
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
8240: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
8250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8260: 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20 20  ///////..       
8270: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 2f           //    /
8280: 2f 20 64 69 73 70 6f 73 65 20 6d 61 6e 61 67 65  / dispose manage
8290: 64 20 72 65 73 6f 75 72 63 65 73 20 68 65 72 65  d resources here
82a0: 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .....           
82b0: 20 20 20 20 20 2f 2f 20 20 20 20 2f 2f 2f 2f 2f       //    /////
82c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
82d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
82e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
82f0: 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   //}....        
8300: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
8310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 2f 2f 20 72 65 6c 65 61 73 65 20 75 6e 6d 61 6e  // release unman
8350: 61 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68  aged resources h
8360: 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20  ere.....        
8370: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
8380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
83b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
83c0: 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20 20    finally..     
83d0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
83e0: 20 20 62 61 73 65 2e 44 69 73 70 6f 73 65 28 64    base.Dispose(d
83f0: 69 73 70 6f 73 69 6e 67 29 3b 0d 0a 0d 0a 20 20  isposing);....  
8400: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
8410: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
8420: 45 3a 20 45 76 65 72 79 74 68 69 6e 67 20 73 68  E: Everything sh
8430: 6f 75 6c 64 20 62 65 20 66 75 6c 6c 79 20 64 69  ould be fully di
8440: 73 70 6f 73 65 64 20 61 74 20 74 68 69 73 20 70  sposed at this p
8450: 6f 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  oint...         
8460: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
8470: 20 20 20 64 69 73 70 6f 73 65 64 20 3d 20 74 72     disposed = tr
8480: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
8490: 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72      }..    #endr
84a0: 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  egion..  }....  
84b0: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
84c0: 20 2f 2f 2f 20 54 68 65 20 74 79 70 65 20 6f 66   /// The type of
84d0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
84e0: 6e 63 74 69 6f 6e 20 74 6f 20 64 65 63 6c 61 72  nction to declar
84f0: 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  e..  /// </summa
8500: 72 79 3e 0d 0a 20 20 70 75 62 6c 69 63 20 65 6e  ry>..  public en
8510: 75 6d 20 46 75 6e 63 74 69 6f 6e 54 79 70 65 0d  um FunctionType.
8520: 0a 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  .  {..    /// <s
8530: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
8540: 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   Scalar function
8550: 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74  s are designed t
8560: 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 6e 64 20  o be called and 
8570: 72 65 74 75 72 6e 20 61 20 72 65 73 75 6c 74 20  return a result 
8580: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 45 78  immediately.  Ex
8590: 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65 20 41  amples include A
85a0: 42 53 28 29 2c 20 55 70 70 65 72 28 29 2c 20 4c  BS(), Upper(), L
85b0: 6f 77 65 72 28 29 2c 20 65 74 63 2e 0d 0a 20 20  ower(), etc...  
85c0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
85d0: 0d 0a 20 20 20 20 53 63 61 6c 61 72 20 3d 20 30  ..    Scalar = 0
85e0: 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ,..    /// <summ
85f0: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 67  ary>..    /// Ag
8600: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
8610: 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74  s are designed t
8620: 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74  o accumulate dat
8630: 61 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20  a until the end 
8640: 6f 66 20 61 20 63 61 6c 6c 20 61 6e 64 20 74 68  of a call and th
8650: 65 6e 20 72 65 74 75 72 6e 20 61 20 72 65 73 75  en return a resu
8660: 6c 74 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d 20  lt gleaned from 
8670: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65 64 20  the accumulated 
8680: 64 61 74 61 2e 0d 0a 20 20 20 20 2f 2f 2f 20 45  data...    /// E
8690: 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65 20  xamples include 
86a0: 53 55 4d 28 29 2c 20 43 4f 55 4e 54 28 29 2c 20  SUM(), COUNT(), 
86b0: 41 56 47 28 29 2c 20 65 74 63 2e 0d 0a 20 20 20  AVG(), etc...   
86c0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
86d0: 0a 20 20 20 20 41 67 67 72 65 67 61 74 65 20 3d  .    Aggregate =
86e0: 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75   1,..    /// <su
86f0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
8700: 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
8710: 63 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ces are used to 
8720: 73 6f 72 74 20 74 65 78 74 75 61 6c 20 64 61 74  sort textual dat
8730: 61 20 69 6e 20 61 20 63 75 73 74 6f 6d 20 6d 61  a in a custom ma
8740: 6e 6e 65 72 2c 20 61 6e 64 20 61 70 70 65 61 72  nner, and appear
8750: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
8760: 63 6c 61 75 73 65 2e 20 20 54 79 70 69 63 61 6c  clause.  Typical
8770: 6c 79 20 74 65 78 74 20 69 6e 20 61 6e 20 4f 52  ly text in an OR
8780: 44 45 52 20 42 59 20 69 73 0d 0a 20 20 20 20 2f  DER BY is..    /
8790: 2f 2f 20 73 6f 72 74 65 64 20 75 73 69 6e 67 20  // sorted using 
87a0: 61 20 73 74 72 61 69 67 68 74 20 63 61 73 65 2d  a straight case-
87b0: 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6d 70  insensitive comp
87c0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
87d0: 20 20 43 75 73 74 6f 6d 20 63 6f 6c 6c 61 74 69    Custom collati
87e0: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 63 61 6e  ng sequences can
87f0: 20 62 65 20 75 73 65 64 20 74 6f 20 61 6c 74 65   be used to alte
8800: 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  r the behavior o
8810: 66 20 74 65 78 74 20 73 6f 72 74 69 6e 67 0d 0a  f text sorting..
8820: 20 20 20 20 2f 2f 2f 20 69 6e 20 61 20 75 73 65      /// in a use
8830: 72 2d 64 65 66 69 6e 65 64 20 6d 61 6e 6e 65 72  r-defined manner
8840: 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  ...    /// </sum
8850: 6d 61 72 79 3e 0d 0a 20 20 20 20 43 6f 6c 6c 61  mary>..    Colla
8860: 74 69 6f 6e 20 3d 20 32 2c 0d 0a 20 20 7d 0d 0a  tion = 2,..  }..
8870: 0d 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79  ..  /// <summary
8880: 3e 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65  >..  /// An inte
8890: 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b 20 64 65  rnal callback de
88a0: 6c 65 67 61 74 65 20 64 65 63 6c 61 72 61 74 69  legate declarati
88b0: 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d  on...  /// </sum
88c0: 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61  mary>..  /// <pa
88d0: 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65 78  ram name="contex
88e0: 74 22 3e 52 61 77 20 6e 61 74 69 76 65 20 63 6f  t">Raw native co
88f0: 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f  ntext pointer fo
8900: 72 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  r the user funct
8910: 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20  ion.</param>..  
8920: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
8930: 22 61 72 67 63 22 3e 54 6f 74 61 6c 20 6e 75 6d  "argc">Total num
8940: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8950: 20 74 6f 20 74 68 65 20 75 73 65 72 20 66 75 6e   to the user fun
8960: 63 74 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0d 0a  ction.</param>..
8970: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
8980: 65 3d 22 61 72 67 76 22 3e 52 61 77 20 6e 61 74  e="argv">Raw nat
8990: 69 76 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ive pointer to t
89a0: 68 65 20 61 72 72 61 79 20 6f 66 20 72 61 77 20  he array of raw 
89b0: 6e 61 74 69 76 65 20 61 72 67 75 6d 65 6e 74 20  native argument 
89c0: 70 6f 69 6e 74 65 72 73 2e 3c 2f 70 61 72 61 6d  pointers.</param
89d0: 3e 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d  >..#if !PLATFORM
89e0: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
89f0: 4b 0d 0a 20 20 5b 55 6e 6d 61 6e 61 67 65 64 46  K..  [UnmanagedF
8a00: 75 6e 63 74 69 6f 6e 50 6f 69 6e 74 65 72 28 43  unctionPointer(C
8a10: 61 6c 6c 69 6e 67 43 6f 6e 76 65 6e 74 69 6f 6e  allingConvention
8a20: 2e 43 64 65 63 6c 29 5d 0d 0a 23 65 6e 64 69 66  .Cdecl)]..#endif
8a30: 0d 0a 20 20 70 75 62 6c 69 63 20 64 65 6c 65 67  ..  public deleg
8a40: 61 74 65 20 76 6f 69 64 20 53 51 4c 69 74 65 43  ate void SQLiteC
8a50: 61 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63  allback(IntPtr c
8a60: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
8a70: 2c 20 49 6e 74 50 74 72 20 61 72 67 76 29 3b 0d  , IntPtr argv);.
8a80: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
8a90: 0d 0a 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65 72  ..  /// An inter
8aa0: 6e 61 6c 20 66 69 6e 61 6c 20 63 61 6c 6c 62 61  nal final callba
8ab0: 63 6b 20 64 65 6c 65 67 61 74 65 20 64 65 63 6c  ck delegate decl
8ac0: 61 72 61 74 69 6f 6e 2e 0d 0a 20 20 2f 2f 2f 20  aration...  /// 
8ad0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f  </summary>..  //
8ae0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
8af0: 6f 6e 74 65 78 74 22 3e 52 61 77 20 63 6f 6e 74  ontext">Raw cont
8b00: 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ext pointer for 
8b10: 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
8b20: 6e 3c 2f 70 61 72 61 6d 3e 0d 0a 23 69 66 20 21  n</param>..#if !
8b30: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
8b40: 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b 55 6e  FRAMEWORK..  [Un
8b50: 6d 61 6e 61 67 65 64 46 75 6e 63 74 69 6f 6e 50  managedFunctionP
8b60: 6f 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67 43 6f  ointer(CallingCo
8b70: 6e 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c 29 5d  nvention.Cdecl)]
8b80: 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e 74 65  ..#endif..  inte
8b90: 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 76 6f  rnal delegate vo
8ba0: 69 64 20 53 51 4c 69 74 65 46 69 6e 61 6c 43 61  id SQLiteFinalCa
8bb0: 6c 6c 62 61 63 6b 28 49 6e 74 50 74 72 20 63 6f  llback(IntPtr co
8bc0: 6e 74 65 78 74 29 3b 0d 0a 20 20 2f 2f 2f 20 3c  ntext);..  /// <
8bd0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
8be0: 49 6e 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63  Internal callbac
8bf0: 6b 20 64 65 6c 65 67 61 74 65 20 66 6f 72 20 69  k delegate for i
8c00: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 63 6f 6c 6c  mplementing coll
8c10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0d  ation sequences.
8c20: 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79  .  /// </summary
8c30: 3e 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  >..  /// <param 
8c40: 6e 61 6d 65 3d 22 70 75 73 65 72 22 3e 4e 6f 74  name="puser">Not
8c50: 20 75 73 65 64 3c 2f 70 61 72 61 6d 3e 0d 0a 20   used</param>.. 
8c60: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
8c70: 3d 22 6c 65 6e 31 22 3e 4c 65 6e 67 74 68 20 6f  ="len1">Length o
8c80: 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 76 31  f the string pv1
8c90: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20  </param>..  /// 
8ca0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 76 31  <param name="pv1
8cb0: 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  ">Pointer to the
8cc0: 20 66 69 72 73 74 20 73 74 72 69 6e 67 20 74 6f   first string to
8cd0: 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e   compare</param>
8ce0: 0d 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e  ..  /// <param n
8cf0: 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65 6e 67 74  ame="len2">Lengt
8d00: 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  h of the string 
8d10: 70 76 32 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 2f  pv2</param>..  /
8d20: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
8d30: 70 76 32 22 3e 50 6f 69 6e 74 65 72 20 74 6f 20  pv2">Pointer to 
8d40: 74 68 65 20 73 65 63 6f 6e 64 20 73 74 72 69 6e  the second strin
8d50: 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61  g to compare</pa
8d60: 72 61 6d 3e 0d 0a 20 20 2f 2f 2f 20 3c 72 65 74  ram>..  /// <ret
8d70: 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31 20  urns>Returns -1 
8d80: 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74 72  if the first str
8d90: 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ing is less than
8da0: 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30 20   the second.  0 
8db0: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
8dc0: 6c 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20 66  l, or 1 if the f
8dd0: 69 72 73 74 20 73 74 72 69 6e 67 20 69 73 20 67  irst string is g
8de0: 72 65 61 74 65 72 0d 0a 20 20 2f 2f 2f 20 74 68  reater..  /// th
8df0: 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 3c 2f  an the second.</
8e00: 72 65 74 75 72 6e 73 3e 0d 0a 23 69 66 20 21 50  returns>..#if !P
8e10: 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
8e20: 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 5b 55 6e 6d  RAMEWORK..  [Unm
8e30: 61 6e 61 67 65 64 46 75 6e 63 74 69 6f 6e 50 6f  anagedFunctionPo
8e40: 69 6e 74 65 72 28 43 61 6c 6c 69 6e 67 43 6f 6e  inter(CallingCon
8e50: 76 65 6e 74 69 6f 6e 2e 43 64 65 63 6c 29 5d 0d  vention.Cdecl)].
8e60: 0a 23 65 6e 64 69 66 0d 0a 20 20 69 6e 74 65 72  .#endif..  inter
8e70: 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 69 6e 74  nal delegate int
8e80: 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e   SQLiteCollation
8e90: 28 49 6e 74 50 74 72 20 70 75 73 65 72 2c 20 69  (IntPtr puser, i
8ea0: 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74 72 20  nt len1, IntPtr 
8eb0: 70 76 31 2c 20 69 6e 74 20 6c 65 6e 32 2c 20 49  pv1, int len2, I
8ec0: 6e 74 50 74 72 20 70 76 32 29 3b 0d 0a 0d 0a 20  ntPtr pv2);.... 
8ed0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
8ee0: 20 20 2f 2f 2f 20 54 68 65 20 74 79 70 65 20 6f    /// The type o
8ef0: 66 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  f collating sequ
8f00: 65 6e 63 65 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75  ence..  /// </su
8f10: 6d 6d 61 72 79 3e 0d 0a 20 20 70 75 62 6c 69 63  mmary>..  public
8f20: 20 65 6e 75 6d 20 43 6f 6c 6c 61 74 69 6f 6e 54   enum CollationT
8f30: 79 70 65 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20  ypeEnum..  {..  
8f40: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
8f50: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62 75 69  .    /// The bui
8f60: 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63 6f 6c  lt-in BINARY col
8f70: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0d  lating sequence.
8f80: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
8f90: 72 79 3e 0d 0a 20 20 20 20 42 69 6e 61 72 79 20  ry>..    Binary 
8fa0: 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  = 1,..    /// <s
8fb0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
8fc0: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 4e 4f   The built-in NO
8fd0: 43 41 53 45 20 63 6f 6c 6c 61 74 69 6e 67 20 73  CASE collating s
8fe0: 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 2f 2f 2f  equence..    ///
8ff0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
9000: 20 4e 6f 43 61 73 65 20 3d 20 32 2c 0d 0a 20 20   NoCase = 2,..  
9010: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
9020: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62 75 69  .    /// The bui
9030: 6c 74 2d 69 6e 20 52 45 56 45 52 53 45 20 63 6f  lt-in REVERSE co
9040: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9050: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
9060: 61 72 79 3e 0d 0a 20 20 20 20 52 65 76 65 72 73  ary>..    Revers
9070: 65 20 3d 20 33 2c 0d 0a 20 20 20 20 2f 2f 2f 20  e = 3,..    /// 
9080: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
9090: 2f 2f 20 41 20 63 75 73 74 6f 6d 20 75 73 65 72  // A custom user
90a0: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69  -defined collati
90b0: 6e 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20  ng sequence..   
90c0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
90d0: 0a 20 20 20 20 43 75 73 74 6f 6d 20 3d 20 30 2c  .    Custom = 0,
90e0: 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f 2f 2f 20 3c  ..  }....  /// <
90f0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f 20  summary>..  /// 
9100: 54 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  The encoding typ
9110: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
9120: 73 65 71 75 65 6e 63 65 20 75 73 65 73 0d 0a 20  sequence uses.. 
9130: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
9140: 0a 20 20 70 75 62 6c 69 63 20 65 6e 75 6d 20 43  .  public enum C
9150: 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67  ollationEncoding
9160: 45 6e 75 6d 0d 0a 20 20 7b 0d 0a 20 20 20 20 2f  Enum..  {..    /
9170: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
9180: 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74    /// The collat
9190: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
91a0: 55 54 46 38 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  UTF8..    /// </
91b0: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54  summary>..    UT
91c0: 46 38 20 3d 20 31 2c 0d 0a 20 20 20 20 2f 2f 2f  F8 = 1,..    ///
91d0: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
91e0: 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  /// The collatio
91f0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 55 54  n sequence is UT
9200: 46 31 36 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61  F16 little-endia
9210: 6e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  n..    /// </sum
9220: 6d 61 72 79 3e 0d 0a 20 20 20 20 55 54 46 31 36  mary>..    UTF16
9230: 4c 45 20 3d 20 32 2c 0d 0a 20 20 20 20 2f 2f 2f  LE = 2,..    ///
9240: 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20   <summary>..    
9250: 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  /// The collatio
9260: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 55 54  n sequence is UT
9270: 46 31 36 20 62 69 67 2d 65 6e 64 69 61 6e 0d 0a  F16 big-endian..
9280: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
9290: 79 3e 0d 0a 20 20 20 20 55 54 46 31 36 42 45 20  y>..    UTF16BE 
92a0: 3d 20 33 2c 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 2f  = 3,..  }....  /
92b0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
92c0: 2f 2f 2f 20 41 20 73 74 72 75 63 74 20 64 65 73  /// A struct des
92d0: 63 72 69 62 69 6e 67 20 74 68 65 20 63 6f 6c 6c  cribing the coll
92e0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 61  ating sequence a
92f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 65   function is exe
9300: 63 75 74 69 6e 67 20 69 6e 0d 0a 20 20 2f 2f 2f  cuting in..  ///
9310: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 70   </summary>..  p
9320: 75 62 6c 69 63 20 73 74 72 75 63 74 20 43 6f 6c  ublic struct Col
9330: 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 0d 0a  lationSequence..
9340: 20 20 7b 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    {..    /// <su
9350: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
9360: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
9370: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
9380: 63 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ce..    /// </su
9390: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70 75 62 6c  mmary>..    publ
93a0: 69 63 20 73 74 72 69 6e 67 20 4e 61 6d 65 3b 0d  ic string Name;.
93b0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
93c0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20  y>..    /// The 
93d0: 74 79 70 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  type of collatin
93e0: 67 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20  g sequence..    
93f0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
9400: 20 20 20 20 70 75 62 6c 69 63 20 43 6f 6c 6c 61      public Colla
9410: 74 69 6f 6e 54 79 70 65 45 6e 75 6d 20 54 79 70  tionTypeEnum Typ
9420: 65 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73  e;....    /// <s
9430: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
9440: 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
9450: 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  ng of the collat
9460: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0d 0a 20 20  ion sequence..  
9470: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
9480: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 43 6f 6c  ..    public Col
9490: 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e  lationEncodingEn
94a0: 75 6d 20 45 6e 63 6f 64 69 6e 67 3b 0d 0a 0d 0a  um Encoding;....
94b0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
94c0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43 6f 6e 74 65  >..    /// Conte
94d0: 78 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  xt of the functi
94e0: 6f 6e 20 74 68 61 74 20 72 65 71 75 65 73 74 65  on that requeste
94f0: 64 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  d the collating 
9500: 73 65 71 75 65 6e 63 65 0d 0a 20 20 20 20 2f 2f  sequence..    //
9510: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
9520: 20 20 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74    internal SQLit
9530: 65 46 75 6e 63 74 69 6f 6e 20 5f 66 75 6e 63 3b  eFunction _func;
9540: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ....    /// <sum
9550: 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 43  mary>..    /// C
9560: 61 6c 6c 73 20 74 68 65 20 62 61 73 65 20 63 6f  alls the base co
9570: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9580: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
9590: 73 74 72 69 6e 67 73 0d 0a 20 20 20 20 2f 2f 2f  strings..    ///
95a0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
95b0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
95c0: 3d 22 73 31 22 3e 54 68 65 20 66 69 72 73 74 20  ="s1">The first 
95d0: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
95e0: 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f  e</param>..    /
95f0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
9600: 73 32 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 73  s2">The second s
9610: 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65  tring to compare
9620: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
9630: 2f 20 3c 72 65 74 75 72 6e 73 3e 2d 31 20 69 66  / <returns>-1 if
9640: 20 73 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e   s1 is less than
9650: 20 73 32 2c 20 30 20 69 66 20 73 31 20 69 73 20   s2, 0 if s1 is 
9660: 65 71 75 61 6c 20 74 6f 20 73 32 2c 20 61 6e 64  equal to s2, and
9670: 20 31 20 69 66 20 73 31 20 69 73 20 67 72 65 61   1 if s1 is grea
9680: 74 65 72 20 74 68 61 6e 20 73 32 3c 2f 72 65 74  ter than s2</ret
9690: 75 72 6e 73 3e 0d 0a 20 20 20 20 70 75 62 6c 69  urns>..    publi
96a0: 63 20 69 6e 74 20 43 6f 6d 70 61 72 65 28 73 74  c int Compare(st
96b0: 72 69 6e 67 20 73 31 2c 20 73 74 72 69 6e 67 20  ring s1, string 
96c0: 73 32 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  s2)..    {..    
96d0: 20 20 72 65 74 75 72 6e 20 5f 66 75 6e 63 2e 5f    return _func._
96e0: 62 61 73 65 2e 43 6f 6e 74 65 78 74 43 6f 6c 6c  base.ContextColl
96f0: 61 74 65 43 6f 6d 70 61 72 65 28 45 6e 63 6f 64  ateCompare(Encod
9700: 69 6e 67 2c 20 5f 66 75 6e 63 2e 5f 63 6f 6e 74  ing, _func._cont
9710: 65 78 74 2c 20 73 31 2c 20 73 32 29 3b 0d 0a 20  ext, s1, s2);.. 
9720: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20     }....    /// 
9730: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
9740: 2f 2f 20 43 61 6c 6c 73 20 74 68 65 20 62 61 73  // Calls the bas
9750: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
9760: 65 6e 63 65 20 74 6f 20 63 6f 6d 70 61 72 65 20  ence to compare 
9770: 74 77 6f 20 63 68 61 72 61 63 74 65 72 20 61 72  two character ar
9780: 72 61 79 73 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  rays..    /// </
9790: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
97a0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
97b0: 31 22 3e 54 68 65 20 66 69 72 73 74 20 61 72 72  1">The first arr
97c0: 61 79 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70  ay to compare</p
97d0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
97e0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 32 22 3e  param name="c2">
97f0: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 72 61 79  The second array
9800: 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72   to compare</par
9810: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  am>..    /// <re
9820: 74 75 72 6e 73 3e 2d 31 20 69 66 20 63 31 20 69  turns>-1 if c1 i
9830: 73 20 6c 65 73 73 20 74 68 61 6e 20 63 32 2c 20  s less than c2, 
9840: 30 20 69 66 20 63 31 20 69 73 20 65 71 75 61 6c  0 if c1 is equal
9850: 20 74 6f 20 63 32 2c 20 61 6e 64 20 31 20 69 66   to c2, and 1 if
9860: 20 63 31 20 69 73 20 67 72 65 61 74 65 72 20 74   c1 is greater t
9870: 68 61 6e 20 63 32 3c 2f 72 65 74 75 72 6e 73 3e  han c2</returns>
9880: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74  ..    public int
9890: 20 43 6f 6d 70 61 72 65 28 63 68 61 72 5b 5d 20   Compare(char[] 
98a0: 63 31 2c 20 63 68 61 72 5b 5d 20 63 32 29 0d 0a  c1, char[] c2)..
98b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
98c0: 75 72 6e 20 5f 66 75 6e 63 2e 5f 62 61 73 65 2e  urn _func._base.
98d0: 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65 43 6f  ContextCollateCo
98e0: 6d 70 61 72 65 28 45 6e 63 6f 64 69 6e 67 2c 20  mpare(Encoding, 
98f0: 5f 66 75 6e 63 2e 5f 63 6f 6e 74 65 78 74 2c 20  _func._context, 
9900: 63 31 2c 20 63 32 29 3b 0d 0a 20 20 20 20 7d 0d  c1, c2);..    }.
9910: 0a 20 20 7d 0d 0a 7d 0d 0a                       .  }..}..