System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 9ab69b6a7cdc717068305614f0168d848177f53d:


0000: ef bb bf 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20  ************. * 
0040: 41 44 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61  ADO.NET 2.0 Data
0050: 20 50 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51   Provider for SQ
0060: 4c 69 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58  Lite Version 3.X
0070: 0a 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52  . * Written by R
0080: 6f 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72  obert Simpson (r
0090: 6f 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c  obert@blackcastl
00a0: 65 73 6f 66 74 2e 63 6f 6d 29 0a 20 2a 20 0a 20  esoft.com). * . 
00b0: 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68  * Released to th
00c0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c  e public domain,
00d0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e   use at your own
00e0: 20 72 69 73 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a   risk!. ********
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2f 0a 0a 6e 61 6d 65 73 70 61 63 65 20 53 79 73  /..namespace Sys
0130: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0a  tem.Data.SQLite.
0140: 7b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  {.  using System
0150: 3b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  ;.  using System
0160: 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 3b 0a 20 20  .Collections;.  
0170: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6c  using System.Col
0180: 6c 65 63 74 69 6f 6e 73 2e 47 65 6e 65 72 69 63  lections.Generic
0190: 3b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  ;.  using System
01a0: 2e 52 75 6e 74 69 6d 65 2e 49 6e 74 65 72 6f 70  .Runtime.Interop
01b0: 53 65 72 76 69 63 65 73 3b 0a 20 20 75 73 69 6e  Services;.  usin
01c0: 67 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c 69  g System.Globali
01d0: 7a 61 74 69 6f 6e 3b 0a 0a 20 20 2f 2f 2f 20 3c  zation;..  /// <
01e0: 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 54  summary>.  /// T
01f0: 68 65 20 74 79 70 65 20 6f 66 20 75 73 65 72 2d  he type of user-
0200: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
0210: 20 74 6f 20 64 65 63 6c 61 72 65 0a 20 20 2f 2f   to declare.  //
0220: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 70  / </summary>.  p
0230: 75 62 6c 69 63 20 65 6e 75 6d 20 46 75 6e 63 74  ublic enum Funct
0240: 69 6f 6e 54 79 70 65 0a 20 20 7b 0a 20 20 20 20  ionType.  {.    
0250: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20  /// <summary>.  
0260: 20 20 2f 2f 2f 20 53 63 61 6c 61 72 20 66 75 6e    /// Scalar fun
0270: 63 74 69 6f 6e 73 20 61 72 65 20 64 65 73 69 67  ctions are desig
0280: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
0290: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 72 65   and return a re
02a0: 73 75 6c 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  sult immediately
02b0: 2e 20 20 45 78 61 6d 70 6c 65 73 20 69 6e 63 6c  .  Examples incl
02c0: 75 64 65 20 41 42 53 28 29 2c 20 55 70 70 65 72  ude ABS(), Upper
02d0: 28 29 2c 20 4c 6f 77 65 72 28 29 2c 20 65 74 63  (), Lower(), etc
02e0: 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
02f0: 61 72 79 3e 0a 20 20 20 20 53 63 61 6c 61 72 20  ary>.    Scalar 
0300: 3d 20 30 2c 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  = 0,.    /// <su
0310: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 41  mmary>.    /// A
0320: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
0330: 6e 73 20 61 72 65 20 64 65 73 69 67 6e 65 64 20  ns are designed 
0340: 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61  to accumulate da
0350: 74 61 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64  ta until the end
0360: 20 6f 66 20 61 20 63 61 6c 6c 20 61 6e 64 20 74   of a call and t
0370: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 72 65 73  hen return a res
0380: 75 6c 74 20 67 6c 65 61 6e 65 64 20 66 72 6f 6d  ult gleaned from
0390: 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 65 64   the accumulated
03a0: 20 64 61 74 61 2e 0a 20 20 20 20 2f 2f 2f 20 45   data..    /// E
03b0: 78 61 6d 70 6c 65 73 20 69 6e 63 6c 75 64 65 20  xamples include 
03c0: 53 55 4d 28 29 2c 20 43 4f 55 4e 54 28 29 2c 20  SUM(), COUNT(), 
03d0: 41 56 47 28 29 2c 20 65 74 63 2e 0a 20 20 20 20  AVG(), etc..    
03e0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
03f0: 20 20 20 41 67 67 72 65 67 61 74 65 20 3d 20 31     Aggregate = 1
0400: 2c 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ,.    /// <summa
0410: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 43 6f 6c 6c  ry>.    /// Coll
0420: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
0430: 61 72 65 20 75 73 65 64 20 74 6f 20 73 6f 72 74  are used to sort
0440: 20 74 65 78 74 75 61 6c 20 64 61 74 61 20 69 6e   textual data in
0450: 20 61 20 63 75 73 74 6f 6d 20 6d 61 6e 6e 65 72   a custom manner
0460: 2c 20 61 6e 64 20 61 70 70 65 61 72 20 69 6e 20  , and appear in 
0470: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
0480: 73 65 2e 20 20 54 79 70 69 63 61 6c 6c 79 20 74  se.  Typically t
0490: 65 78 74 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ext in an ORDER 
04a0: 42 59 20 69 73 0a 20 20 20 20 2f 2f 2f 20 73 6f  BY is.    /// so
04b0: 72 74 65 64 20 75 73 69 6e 67 20 61 20 73 74 72  rted using a str
04c0: 61 69 67 68 74 20 63 61 73 65 2d 69 6e 73 65 6e  aight case-insen
04d0: 73 69 74 69 76 65 20 63 6f 6d 70 61 72 69 73 6f  sitive compariso
04e0: 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 43 75 73  n function.  Cus
04f0: 74 6f 6d 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  tom collating se
0500: 71 75 65 6e 63 65 73 20 63 61 6e 20 62 65 20 75  quences can be u
0510: 73 65 64 20 74 6f 20 61 6c 74 65 72 20 74 68 65  sed to alter the
0520: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 65 78   behavior of tex
0530: 74 20 73 6f 72 74 69 6e 67 0a 20 20 20 20 2f 2f  t sorting.    //
0540: 2f 20 69 6e 20 61 20 75 73 65 72 2d 64 65 66 69  / in a user-defi
0550: 6e 65 64 20 6d 61 6e 6e 65 72 2e 0a 20 20 20 20  ned manner..    
0560: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
0570: 20 20 20 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 32     Collation = 2
0580: 2c 0a 20 20 7d 0a 0a 20 20 2f 2f 2f 20 3c 73 75  ,.  }..  /// <su
0590: 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 41 6e 20  mmary>.  /// An 
05a0: 69 6e 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63  internal callbac
05b0: 6b 20 64 65 6c 65 67 61 74 65 20 64 65 63 6c 61  k delegate decla
05c0: 72 61 74 69 6f 6e 2e 0a 20 20 2f 2f 2f 20 3c 2f  ration..  /// </
05d0: 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20 3c  summary>.  /// <
05e0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74  param name="cont
05f0: 65 78 74 22 3e 52 61 77 20 63 6f 6e 74 65 78 74  ext">Raw context
0600: 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65   pointer for the
0610: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 3c 2f   user function</
0620: 70 61 72 61 6d 3e 0a 20 20 2f 2f 2f 20 3c 70 61  param>.  /// <pa
0630: 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73 22  ram name="nArgs"
0640: 3e 43 6f 75 6e 74 20 6f 66 20 61 72 67 75 6d 65  >Count of argume
0650: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74  nts to the funct
0660: 69 6f 6e 3c 2f 70 61 72 61 6d 3e 0a 20 20 2f 2f  ion</param>.  //
0670: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61  / <param name="a
0680: 72 67 73 70 74 72 22 3e 41 20 70 6f 69 6e 74 65  rgsptr">A pointe
0690: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
06a0: 66 20 61 72 67 75 6d 65 6e 74 20 70 6f 69 6e 74  f argument point
06b0: 65 72 73 3c 2f 70 61 72 61 6d 3e 0a 20 20 69 6e  ers</param>.  in
06c0: 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20  ternal delegate 
06d0: 76 6f 69 64 20 53 51 4c 69 74 65 43 61 6c 6c 62  void SQLiteCallb
06e0: 61 63 6b 28 69 6e 74 20 63 6f 6e 74 65 78 74 2c  ack(int context,
06f0: 20 69 6e 74 20 6e 41 72 67 73 2c 20 49 6e 74 50   int nArgs, IntP
0700: 74 72 20 61 72 67 73 70 74 72 29 3b 0a 20 20 2f  tr argsptr);.  /
0710: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f  // <summary>.  /
0720: 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 63 61 6c 6c  // Internal call
0730: 62 61 63 6b 20 64 65 6c 65 67 61 74 65 20 66 6f  back delegate fo
0740: 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 63  r implementing c
0750: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0760: 65 73 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  es.  /// </summa
0770: 72 79 3e 0a 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ry>.  /// <param
0780: 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c 65 6e   name="len1">Len
0790: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
07a0: 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e 0a 20 20  g pv1</param>.  
07b0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
07c0: 22 70 76 31 22 3e 50 6f 69 6e 74 65 72 20 74 6f  "pv1">Pointer to
07d0: 20 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e   the first strin
07e0: 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61  g to compare</pa
07f0: 72 61 6d 3e 0a 20 20 2f 2f 2f 20 3c 70 61 72 61  ram>.  /// <para
0800: 6d 20 6e 61 6d 65 3d 22 6c 65 6e 32 22 3e 4c 65  m name="len2">Le
0810: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69  ngth of the stri
0820: 6e 67 20 70 76 32 3c 2f 70 61 72 61 6d 3e 0a 20  ng pv2</param>. 
0830: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
0840: 3d 22 70 76 32 22 3e 50 6f 69 6e 74 65 72 20 74  ="pv2">Pointer t
0850: 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 73 74 72  o the second str
0860: 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f  ing to compare</
0870: 70 61 72 61 6d 3e 0a 20 20 2f 2f 2f 20 3c 72 65  param>.  /// <re
0880: 74 75 72 6e 73 3e 52 65 74 75 72 6e 73 20 2d 31  turns>Returns -1
0890: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74   if the first st
08a0: 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61  ring is less tha
08b0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 20 20 30  n the second.  0
08c0: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
08d0: 61 6c 2c 20 6f 72 20 31 20 69 66 20 74 68 65 20  al, or 1 if the 
08e0: 66 69 72 73 74 20 73 74 72 69 6e 67 20 69 73 20  first string is 
08f0: 67 72 65 61 74 65 72 0a 20 20 2f 2f 2f 20 74 68  greater.  /// th
0900: 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2e 3c 2f  an the second.</
0910: 72 65 74 75 72 6e 73 3e 0a 20 20 69 6e 74 65 72  returns>.  inter
0920: 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 69 6e 74  nal delegate int
0930: 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e   SQLiteCollation
0940: 28 69 6e 74 20 6c 65 6e 31 2c 20 49 6e 74 50 74  (int len1, IntPt
0950: 72 20 70 76 31 2c 20 69 6e 74 20 6c 65 6e 32 2c  r pv1, int len2,
0960: 20 49 6e 74 50 74 72 20 70 76 32 29 3b 0a 0a 20   IntPtr pv2);.. 
0970: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
0980: 20 2f 2f 2f 20 54 68 69 73 20 61 62 73 74 72 61   /// This abstra
0990: 63 74 20 63 6c 61 73 73 20 69 73 20 64 65 73 69  ct class is desi
09a0: 67 6e 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 75  gned to handle u
09b0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
09c0: 74 69 6f 6e 73 20 65 61 73 69 6c 79 2e 20 20 41  tions easily.  A
09d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
09e0: 65 20 64 65 72 69 76 65 64 20 63 6c 61 73 73 20  e derived class 
09f0: 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68  is made for each
0a00: 0a 20 20 2f 2f 2f 20 63 6f 6e 6e 65 63 74 69 6f  .  /// connectio
0a10: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
0a20: 65 2e 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  e..  /// </summa
0a30: 72 79 3e 0a 20 20 2f 2f 2f 20 3c 72 65 6d 61 72  ry>.  /// <remar
0a40: 6b 73 3e 0a 20 20 2f 2f 2f 20 41 6c 74 68 6f 75  ks>.  /// Althou
0a50: 67 68 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  gh there is one 
0a60: 69 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 63 6c  instance of a cl
0a70: 61 73 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d  ass derived from
0a80: 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20   SQLiteFunction 
0a90: 70 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  per database con
0aa0: 6e 65 63 74 69 6f 6e 2c 20 74 68 65 20 64 65 72  nection, the der
0ab0: 69 76 65 64 20 63 6c 61 73 73 20 68 61 73 20 6e  ived class has n
0ac0: 6f 20 61 63 63 65 73 73 0a 20 20 2f 2f 2f 20 74  o access.  /// t
0ad0: 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  o the underlying
0ae0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68   connection.  Th
0af0: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0b00: 74 6f 20 64 65 74 65 72 20 69 6d 70 6c 65 6d 65  to deter impleme
0b10: 6e 74 65 72 73 20 66 72 6f 6d 20 74 68 69 6e 6b  nters from think
0b20: 69 6e 67 20 69 74 20 77 6f 75 6c 64 20 62 65 20  ing it would be 
0b30: 61 20 67 6f 6f 64 20 69 64 65 61 20 74 6f 20 6d  a good idea to m
0b40: 61 6b 65 20 64 61 74 61 62 61 73 65 0a 20 20 2f  ake database.  /
0b50: 2f 2f 20 63 61 6c 6c 73 20 64 75 72 69 6e 67 20  // calls during 
0b60: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 20 20 2f 2f  processing..  //
0b70: 2f 20 0a 20 20 2f 2f 2f 20 49 74 20 69 73 20 69  / .  /// It is i
0b80: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 64 69 73 74  mportant to dist
0b90: 69 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20  inguish between 
0ba0: 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e  a per-connection
0bb0: 20 69 6e 73 74 61 6e 63 65 2c 20 61 6e 64 20 61   instance, and a
0bc0: 20 70 65 72 2d 53 51 4c 20 73 74 61 74 65 6d 65   per-SQL stateme
0bd0: 6e 74 20 63 6f 6e 74 65 78 74 2e 20 20 4f 6e 65  nt context.  One
0be0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
0bf0: 73 20 63 6c 61 73 73 0a 20 20 2f 2f 2f 20 73 65  s class.  /// se
0c00: 72 76 69 63 65 73 20 61 6c 6c 20 53 51 4c 20 73  rvices all SQL s
0c10: 74 61 74 65 6d 65 6e 74 73 20 62 65 69 6e 67 20  tatements being 
0c20: 73 74 65 70 70 65 64 20 74 68 72 6f 75 67 68 20  stepped through 
0c30: 6f 6e 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  on that connecti
0c40: 6f 6e 2c 20 61 6e 64 20 74 68 65 72 65 20 63 61  on, and there ca
0c50: 6e 20 62 65 20 6d 61 6e 79 2e 20 20 4f 6e 65 20  n be many.  One 
0c60: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 73 74 6f  should never sto
0c70: 72 65 20 70 65 72 2d 73 74 61 74 65 6d 65 6e 74  re per-statement
0c80: 0a 20 20 2f 2f 2f 20 69 6e 66 6f 72 6d 61 74 69  .  /// informati
0c90: 6f 6e 20 69 6e 20 6d 65 6d 62 65 72 20 76 61 72  on in member var
0ca0: 69 61 62 6c 65 73 20 6f 66 20 75 73 65 72 2d 64  iables of user-d
0cb0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20  efined function 
0cc0: 63 6c 61 73 73 65 73 2e 0a 20 20 2f 2f 2f 20 0a  classes..  /// .
0cd0: 20 20 2f 2f 2f 20 46 6f 72 20 61 67 67 72 65 67    /// For aggreg
0ce0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 61  ate functions, a
0cf0: 6c 77 61 79 73 20 63 72 65 61 74 65 20 61 6e 64  lways create and
0d00: 20 73 74 6f 72 65 20 79 6f 75 72 20 70 65 72 2d   store your per-
0d10: 73 74 61 74 65 6d 65 6e 74 20 64 61 74 61 20 69  statement data i
0d20: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 44 61 74  n the contextDat
0d30: 61 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20  a object on the 
0d40: 31 73 74 20 73 74 65 70 2e 20 20 54 68 69 73 20  1st step.  This 
0d50: 64 61 74 61 20 77 69 6c 6c 0a 20 20 2f 2f 2f 20  data will.  /// 
0d60: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
0d70: 20 66 72 65 65 64 20 66 6f 72 20 79 6f 75 20 28   freed for you (
0d80: 61 6e 64 20 44 69 73 70 6f 73 65 28 29 20 63 61  and Dispose() ca
0d90: 6c 6c 65 64 20 69 66 20 74 68 65 20 69 74 65 6d  lled if the item
0da0: 20 73 75 70 70 6f 72 74 73 20 49 44 69 73 70 6f   supports IDispo
0db0: 73 61 62 6c 65 29 20 77 68 65 6e 20 74 68 65 20  sable) when the 
0dc0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 6c 65  statement comple
0dd0: 74 65 73 2e 0a 20 20 2f 2f 2f 20 3c 2f 72 65 6d  tes..  /// </rem
0de0: 61 72 6b 73 3e 0a 20 20 70 75 62 6c 69 63 20 61  arks>.  public a
0df0: 62 73 74 72 61 63 74 20 63 6c 61 73 73 20 53 51  bstract class SQ
0e00: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 20 3a 20 49  LiteFunction : I
0e10: 44 69 73 70 6f 73 61 62 6c 65 0a 20 20 7b 0a 20  Disposable.  {. 
0e20: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
0e30: 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 62 61 73  .    /// The bas
0e40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 69  e connection thi
0e50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 74  s function is at
0e60: 74 61 63 68 65 64 20 74 6f 0a 20 20 20 20 2f 2f  tached to.    //
0e70: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
0e80: 20 70 72 69 76 61 74 65 20 53 51 4c 69 74 65 42   private SQLiteB
0e90: 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ase             
0ea0: 20 5f 62 61 73 65 3b 0a 20 20 20 20 2f 2f 2f 20   _base;.    /// 
0eb0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  <summary>.    //
0ec0: 2f 20 55 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  / Used internall
0ed0: 79 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20  y to keep track 
0ee0: 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  of memory alloca
0ef0: 74 65 64 20 66 6f 72 20 61 67 67 72 65 67 61 74  ted for aggregat
0f00: 65 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  e functions.    
0f10: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
0f20: 20 20 20 70 72 69 76 61 74 65 20 69 6e 74 20 20     private int  
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 20 20 5f 69 6e 74 65 72 6f 70 43 6f 6f 6b 69     _interopCooki
0f50: 65 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  e;.    /// <summ
0f60: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 49 6e 74  ary>.    /// Int
0f70: 65 72 6e 61 6c 20 61 72 72 61 79 20 75 73 65 64  ernal array used
0f80: 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   to keep track o
0f90: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
0fa0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 64 61 74  tion context dat
0fb0: 61 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  a.    /// </summ
0fc0: 61 72 79 3e 0a 20 20 20 20 70 72 69 76 61 74 65  ary>.    private
0fd0: 20 53 6f 72 74 65 64 4c 69 73 74 3c 69 6e 74 2c   SortedList<int,
0fe0: 20 6f 62 6a 65 63 74 3e 20 5f 63 6f 6e 74 65 78   object> _contex
0ff0: 74 44 61 74 61 4c 69 73 74 3b 0a 0a 20 20 20 20  tDataList;..    
1000: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20  /// <summary>.  
1010: 20 20 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65    /// Holds a re
1020: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
1030: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
1040: 20 66 6f 72 20 75 73 65 72 20 66 75 6e 63 74 69   for user functi
1050: 6f 6e 73 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ons.    /// </su
1060: 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72 69 76 61  mmary>.    priva
1070: 74 65 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63  te SQLiteCallbac
1080: 6b 20 20 5f 49 6e 76 6f 6b 65 46 75 6e 63 3b 0a  k  _InvokeFunc;.
1090: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
10a0: 3e 0a 20 20 20 20 2f 2f 2f 20 48 6f 6c 64 73 20  >.    /// Holds 
10b0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
10c0: 68 65 20 63 61 6c 6c 62 61 6b 63 20 66 75 6e 63  he callbakc func
10d0: 74 69 6f 6e 20 66 6f 72 20 73 74 65 70 70 69 6e  tion for steppin
10e0: 67 20 69 6e 20 61 6e 20 61 67 67 72 65 67 61 74  g in an aggregat
10f0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2f  e function.    /
1100: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
1110: 20 20 70 72 69 76 61 74 65 20 53 51 4c 69 74 65    private SQLite
1120: 43 61 6c 6c 62 61 63 6b 20 20 5f 53 74 65 70 46  Callback  _StepF
1130: 75 6e 63 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  unc;.    /// <su
1140: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 48  mmary>.    /// H
1150: 6f 6c 64 73 20 61 20 72 65 66 65 72 65 6e 63 65  olds a reference
1160: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
1170: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 69   function for fi
1180: 6e 61 6c 69 7a 69 6e 67 20 61 6e 20 61 67 67 72  nalizing an aggr
1190: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 20  egate function. 
11a0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
11b0: 3e 0a 20 20 20 20 70 72 69 76 61 74 65 20 53 51  >.    private SQ
11c0: 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 20 5f 46  LiteCallback  _F
11d0: 69 6e 61 6c 46 75 6e 63 3b 0a 20 20 20 20 2f 2f  inalFunc;.    //
11e0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
11f0: 2f 2f 2f 20 48 6f 6c 64 73 20 61 20 72 65 66 65  /// Holds a refe
1200: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 61 6c  rence to the cal
1210: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66  lback function f
1220: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
1230: 75 65 6e 63 65 73 0a 20 20 20 20 2f 2f 2f 20 3c  uences.    /// <
1240: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72  /summary>.    pr
1250: 69 76 61 74 65 20 53 51 4c 69 74 65 43 6f 6c 6c  ivate SQLiteColl
1260: 61 74 69 6f 6e 20 5f 43 6f 6d 70 61 72 65 46 75  ation _CompareFu
1270: 6e 63 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  nc;..    /// <su
1280: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54  mmary>.    /// T
1290: 68 69 73 20 73 74 61 74 69 63 20 6c 69 73 74 20  his static list 
12a0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 74 68 65  contains all the
12b0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
12c0: 6e 63 74 69 6f 6e 73 20 64 65 63 6c 61 72 65 64  nctions declared
12d0: 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f 70 65   using the prope
12e0: 72 20 61 74 74 72 69 62 75 74 65 73 2e 0a 20 20  r attributes..  
12f0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
1300: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
1310: 74 69 63 20 4c 69 73 74 3c 53 51 4c 69 74 65 46  tic List<SQLiteF
1320: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
1330: 3e 20 5f 72 65 67 69 73 74 65 72 65 64 46 75 6e  > _registeredFun
1340: 63 74 69 6f 6e 73 20 3d 20 6e 65 77 20 4c 69 73  ctions = new Lis
1350: 74 3c 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  t<SQLiteFunction
1360: 41 74 74 72 69 62 75 74 65 3e 28 29 3b 0a 0a 20  Attribute>();.. 
1370: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
1380: 0a 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72 6e 61  .    /// Interna
1390: 6c 20 63 6f 6e 73 74 72 75 63 74 6f 72 2c 20 69  l constructor, i
13a0: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
13b0: 75 6e 63 74 69 6f 6e 27 73 20 69 6e 74 65 72 6e  unction's intern
13c0: 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  al variables..  
13d0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
13e0: 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 53  .    protected S
13f0: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 29 0a  QLiteFunction().
1400: 20 20 20 20 7b 0a 20 20 20 20 20 20 5f 63 6f 6e      {.      _con
1410: 74 65 78 74 44 61 74 61 4c 69 73 74 20 3d 20 6e  textDataList = n
1420: 65 77 20 53 6f 72 74 65 64 4c 69 73 74 3c 69 6e  ew SortedList<in
1430: 74 2c 20 6f 62 6a 65 63 74 3e 28 29 3b 0a 20 20  t, object>();.  
1440: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    }..    /// <su
1450: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52  mmary>.    /// R
1460: 65 74 75 72 6e 73 20 61 20 72 65 66 65 72 65 6e  eturns a referen
1470: 63 65 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ce to the underl
1480: 79 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ying connection'
1490: 73 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 20  s SQLiteConvert 
14a0: 63 6c 61 73 73 2c 20 77 68 69 63 68 20 63 61 6e  class, which can
14b0: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6e 76   be used to conv
14c0: 65 72 74 0a 20 20 20 20 2f 2f 2f 20 73 74 72 69  ert.    /// stri
14d0: 6e 67 73 20 61 6e 64 20 44 61 74 65 54 69 6d 65  ngs and DateTime
14e0: 27 73 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  's into the curr
14f0: 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ent connection's
1500: 20 65 6e 63 6f 64 69 6e 67 20 73 63 68 65 6d 61   encoding schema
1510: 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
1520: 61 72 79 3e 0a 20 20 20 20 70 75 62 6c 69 63 20  ary>.    public 
1530: 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 20 53 51  SQLiteConvert SQ
1540: 4c 69 74 65 43 6f 6e 76 65 72 74 0a 20 20 20 20  LiteConvert.    
1550: 7b 0a 20 20 20 20 20 20 67 65 74 0a 20 20 20 20  {.      get.    
1560: 20 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75    {.        retu
1570: 72 6e 20 5f 62 61 73 65 3b 0a 20 20 20 20 20 20  rn _base;.      
1580: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  }.    }..    ///
1590: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
15a0: 2f 2f 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69  // Scalar functi
15b0: 6f 6e 73 20 6f 76 65 72 72 69 64 65 20 74 68 69  ons override thi
15c0: 73 20 6d 65 74 68 6f 64 20 74 6f 20 64 6f 20 74  s method to do t
15d0: 68 65 69 72 20 6d 61 67 69 63 2e 0a 20 20 20 20  heir magic..    
15e0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
15f0: 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e     /// <remarks>
1600: 0a 20 20 20 20 2f 2f 2f 20 50 61 72 61 6d 65 74  .    /// Paramet
1610: 65 72 73 20 70 61 73 73 65 64 20 74 6f 20 66 75  ers passed to fu
1620: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 6f 6e 6c  nctions have onl
1630: 79 20 61 6e 20 61 66 66 69 6e 69 74 79 20 66 6f  y an affinity fo
1640: 72 20 61 20 63 65 72 74 61 69 6e 20 64 61 74 61  r a certain data
1650: 20 74 79 70 65 2c 20 74 68 65 72 65 20 69 73 20   type, there is 
1660: 6e 6f 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 63  no underlying sc
1670: 68 65 6d 61 20 61 76 61 69 6c 61 62 6c 65 0a 20  hema available. 
1680: 20 20 20 2f 2f 2f 20 74 6f 20 66 6f 72 63 65 20     /// to force 
1690: 74 68 65 6d 20 69 6e 74 6f 20 61 20 63 65 72 74  them into a cert
16a0: 61 69 6e 20 74 79 70 65 2e 20 20 54 68 65 72 65  ain type.  There
16b0: 66 6f 72 65 20 74 68 65 20 6f 6e 6c 79 20 74 79  fore the only ty
16c0: 70 65 73 20 79 6f 75 20 77 69 6c 6c 20 65 76 65  pes you will eve
16d0: 72 20 73 65 65 20 61 73 20 70 61 72 61 6d 65 74  r see as paramet
16e0: 65 72 73 20 61 72 65 0a 20 20 20 20 2f 2f 2f 20  ers are.    /// 
16f0: 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 2c 20 49 6e  DBNull.Value, In
1700: 74 36 34 2c 20 44 6f 75 62 6c 65 2c 20 53 74 72  t64, Double, Str
1710: 69 6e 67 20 6f 72 20 62 79 74 65 5b 5d 20 61 72  ing or byte[] ar
1720: 72 61 79 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72  ray..    /// </r
1730: 65 6d 61 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20  emarks>.    /// 
1740: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67  <param name="arg
1750: 73 22 3e 54 68 65 20 61 72 67 75 6d 65 6e 74 73  s">The arguments
1760: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 61 6e 64   for the command
1770: 20 74 6f 20 70 72 6f 63 65 73 73 3c 2f 70 61 72   to process</par
1780: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  am>.    /// <ret
1790: 75 72 6e 73 3e 59 6f 75 20 6d 61 79 20 72 65 74  urns>You may ret
17a0: 75 72 6e 20 6d 6f 73 74 20 73 69 6d 70 6c 65 20  urn most simple 
17b0: 74 79 70 65 73 20 61 73 20 61 20 72 65 74 75 72  types as a retur
17c0: 6e 20 76 61 6c 75 65 2c 20 6e 75 6c 6c 20 6f 72  n value, null or
17d0: 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 20 74 6f   DBNull.Value to
17e0: 20 72 65 74 75 72 6e 20 6e 75 6c 6c 2c 20 44 61   return null, Da
17f0: 74 65 54 69 6d 65 2c 20 6f 72 0a 20 20 20 20 2f  teTime, or.    /
1800: 2f 2f 20 79 6f 75 20 6d 61 79 20 72 65 74 75 72  // you may retur
1810: 6e 20 61 6e 20 45 78 63 65 70 74 69 6f 6e 2d 64  n an Exception-d
1820: 65 72 69 76 65 64 20 63 6c 61 73 73 20 69 66 20  erived class if 
1830: 79 6f 75 20 77 69 73 68 20 74 6f 20 72 65 74 75  you wish to retu
1840: 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
1850: 51 4c 69 74 65 2e 20 20 44 6f 20 6e 6f 74 20 61  QLite.  Do not a
1860: 63 74 75 61 6c 6c 79 20 74 68 72 6f 77 20 74 68  ctually throw th
1870: 65 20 65 72 72 6f 72 2c 0a 20 20 20 20 2f 2f 2f  e error,.    ///
1880: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 69 74 21   just return it!
1890: 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 70  </returns>.    p
18a0: 75 62 6c 69 63 20 76 69 72 74 75 61 6c 20 6f 62  ublic virtual ob
18b0: 6a 65 63 74 20 49 6e 76 6f 6b 65 28 6f 62 6a 65  ject Invoke(obje
18c0: 63 74 5b 5d 20 61 72 67 73 29 0a 20 20 20 20 7b  ct[] args).    {
18d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75  .      return nu
18e0: 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ll;.    }..    /
18f0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20  // <summary>.   
1900: 20 2f 2f 2f 20 41 67 67 72 65 67 61 74 65 20 66   /// Aggregate f
1910: 75 6e 63 74 69 6f 6e 73 20 6f 76 65 72 72 69 64  unctions overrid
1920: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  e this method to
1930: 20 64 6f 20 74 68 65 69 72 20 6d 61 67 69 63 2e   do their magic.
1940: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
1950: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d  ry>.    /// <rem
1960: 61 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 54 79  arks>.    /// Ty
1970: 70 69 63 61 6c 6c 79 20 79 6f 75 27 6c 6c 20 62  pically you'll b
1980: 65 20 75 70 64 61 74 69 6e 67 20 77 68 61 74 65  e updating whate
1990: 76 65 72 20 79 6f 75 27 76 65 20 70 6c 61 63 65  ver you've place
19a0: 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  d in the context
19b0: 44 61 74 61 20 66 69 65 6c 64 20 61 6e 64 20 72  Data field and r
19c0: 65 74 75 72 6e 69 6e 67 20 61 73 20 71 75 69 63  eturning as quic
19d0: 6b 6c 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  kly as possible.
19e0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72  .    /// </remar
19f0: 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ks>.    /// <par
1a00: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 22 3e 54  am name="args">T
1a10: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  he arguments for
1a20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   the command to 
1a30: 70 72 6f 63 65 73 73 3c 2f 70 61 72 61 6d 3e 0a  process</param>.
1a40: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
1a50: 61 6d 65 3d 22 73 74 65 70 4e 75 6d 62 65 72 22  ame="stepNumber"
1a60: 3e 54 68 65 20 31 2d 62 61 73 65 64 20 73 74 65  >The 1-based ste
1a70: 70 20 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20  p number.  This 
1a80: 69 73 20 69 6e 63 72 65 6d 65 6d 74 65 64 20 65  is incrememted e
1a90: 61 63 68 20 74 69 6d 65 20 74 68 65 20 73 74 65  ach time the ste
1aa0: 70 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  p method is call
1ab0: 65 64 2e 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20  ed.</param>.    
1ac0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1ad0: 22 63 6f 6e 74 65 78 74 44 61 74 61 22 3e 41 20  "contextData">A 
1ae0: 70 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  placeholder for 
1af0: 69 6d 70 6c 65 6d 65 6e 74 65 72 73 20 74 6f 20  implementers to 
1b00: 73 74 6f 72 65 20 63 6f 6e 74 65 78 74 75 61 6c  store contextual
1b10: 20 64 61 74 61 20 70 65 72 74 61 69 6e 69 6e 67   data pertaining
1b20: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1b30: 63 6f 6e 74 65 78 74 2e 3c 2f 70 61 72 61 6d 3e  context.</param>
1b40: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 69 72 74  .    public virt
1b50: 75 61 6c 20 76 6f 69 64 20 53 74 65 70 28 6f 62  ual void Step(ob
1b60: 6a 65 63 74 5b 5d 20 61 72 67 73 2c 20 69 6e 74  ject[] args, int
1b70: 20 73 74 65 70 4e 75 6d 62 65 72 2c 20 72 65 66   stepNumber, ref
1b80: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44   object contextD
1b90: 61 74 61 29 0a 20 20 20 20 7b 0a 20 20 20 20 7d  ata).    {.    }
1ba0: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
1bb0: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 41 67 67 72  ry>.    /// Aggr
1bc0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1bd0: 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 6d 65  override this me
1be0: 74 68 6f 64 20 74 6f 20 66 69 6e 69 73 68 20 74  thod to finish t
1bf0: 68 65 69 72 20 61 67 67 72 65 67 61 74 65 20 70  heir aggregate p
1c00: 72 6f 63 65 73 73 69 6e 67 2e 0a 20 20 20 20 2f  rocessing..    /
1c10: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
1c20: 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a    /// <remarks>.
1c30: 20 20 20 20 2f 2f 2f 20 49 66 20 79 6f 75 20 69      /// If you i
1c40: 6d 70 6c 65 6d 65 6e 74 65 64 20 79 6f 75 72 20  mplemented your 
1c50: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1c60: 6f 6e 20 70 72 6f 70 65 72 6c 79 2c 0a 20 20 20  on properly,.   
1c70: 20 2f 2f 2f 20 79 6f 75 27 76 65 20 62 65 65 6e   /// you've been
1c80: 20 72 65 63 6f 72 64 69 6e 67 20 61 6e 64 20 6b   recording and k
1c90: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
1ca0: 79 6f 75 72 20 64 61 74 61 20 69 6e 20 74 68 65  your data in the
1cb0: 20 63 6f 6e 74 65 78 74 44 61 74 61 20 6f 62 6a   contextData obj
1cc0: 65 63 74 20 70 72 6f 76 69 64 65 64 2c 20 61 6e  ect provided, an
1cd0: 64 20 6e 6f 77 20 61 74 20 74 68 69 73 20 73 74  d now at this st
1ce0: 61 67 65 20 79 6f 75 20 73 68 6f 75 6c 64 20 68  age you should h
1cf0: 61 76 65 0a 20 20 20 20 2f 2f 2f 20 61 6c 6c 20  ave.    /// all 
1d00: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1d10: 79 6f 75 20 6e 65 65 64 20 69 6e 20 74 68 65 72  you need in ther
1d20: 65 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  e to figure out 
1d30: 77 68 61 74 20 74 6f 20 72 65 74 75 72 6e 2e 0a  what to return..
1d40: 20 20 20 20 2f 2f 2f 20 4e 4f 54 45 3a 20 20 49      /// NOTE:  I
1d50: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1d60: 20 61 72 72 69 76 65 20 68 65 72 65 20 77 69 74   arrive here wit
1d70: 68 6f 75 74 20 72 65 63 65 69 76 69 6e 67 20 61  hout receiving a
1d80: 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
1d90: 6f 20 53 74 65 70 28 29 2c 20 69 6e 20 77 68 69  o Step(), in whi
1da0: 63 68 20 63 61 73 65 20 74 68 65 20 63 6f 6e 74  ch case the cont
1db0: 65 78 74 44 61 74 61 20 77 69 6c 6c 0a 20 20 20  extData will.   
1dc0: 20 2f 2f 2f 20 62 65 20 6e 75 6c 6c 2e 20 20 54   /// be null.  T
1dd0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
1de0: 68 65 6e 20 6e 6f 20 72 6f 77 73 20 77 65 72 65  hen no rows were
1df0: 20 72 65 74 75 72 6e 65 64 2e 20 20 59 6f 75 20   returned.  You 
1e00: 63 61 6e 20 65 69 74 68 65 72 20 72 65 74 75 72  can either retur
1e10: 6e 20 6e 75 6c 6c 2c 20 6f 72 20 30 20 6f 72 20  n null, or 0 or 
1e20: 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 73 74 6f  some other custo
1e30: 6d 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 20  m return value. 
1e40: 20 20 20 2f 2f 2f 20 69 66 20 74 68 61 74 20 69     /// if that i
1e50: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
1e60: 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0a 20  /// </remarks>. 
1e70: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
1e80: 6d 65 3d 22 63 6f 6e 74 65 78 74 44 61 74 61 22  me="contextData"
1e90: 3e 59 6f 75 72 20 6f 77 6e 20 61 73 73 69 67 6e  >Your own assign
1ea0: 65 64 20 63 6f 6e 74 65 78 74 44 61 74 61 2c 20  ed contextData, 
1eb0: 70 72 6f 76 69 64 65 64 20 66 6f 72 20 79 6f 75  provided for you
1ec0: 20 73 6f 20 79 6f 75 20 63 61 6e 20 72 65 74 75   so you can retu
1ed0: 72 6e 20 79 6f 75 72 20 66 69 6e 61 6c 20 72 65  rn your final re
1ee0: 73 75 6c 74 73 2e 3c 2f 70 61 72 61 6d 3e 0a 20  sults.</param>. 
1ef0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
1f00: 59 6f 75 20 6d 61 79 20 72 65 74 75 72 6e 20 6d  You may return m
1f10: 6f 73 74 20 73 69 6d 70 6c 65 20 74 79 70 65 73  ost simple types
1f20: 20 61 73 20 61 20 72 65 74 75 72 6e 20 76 61 6c   as a return val
1f30: 75 65 2c 20 6e 75 6c 6c 20 6f 72 20 44 42 4e 75  ue, null or DBNu
1f40: 6c 6c 2e 56 61 6c 75 65 20 74 6f 20 72 65 74 75  ll.Value to retu
1f50: 72 6e 20 6e 75 6c 6c 2c 20 44 61 74 65 54 69 6d  rn null, DateTim
1f60: 65 2c 20 6f 72 0a 20 20 20 20 2f 2f 2f 20 79 6f  e, or.    /// yo
1f70: 75 20 6d 61 79 20 72 65 74 75 72 6e 20 61 6e 20  u may return an 
1f80: 45 78 63 65 70 74 69 6f 6e 2d 64 65 72 69 76 65  Exception-derive
1f90: 64 20 63 6c 61 73 73 20 69 66 20 79 6f 75 20 77  d class if you w
1fa0: 69 73 68 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ish to return an
1fb0: 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
1fc0: 2e 20 20 44 6f 20 6e 6f 74 20 61 63 74 75 61 6c  .  Do not actual
1fd0: 6c 79 20 74 68 72 6f 77 20 74 68 65 20 65 72 72  ly throw the err
1fe0: 6f 72 2c 0a 20 20 20 20 2f 2f 2f 20 6a 75 73 74  or,.    /// just
1ff0: 20 72 65 74 75 72 6e 20 69 74 21 0a 20 20 20 20   return it!.    
2000: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0a 20  /// </returns>. 
2010: 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61     public virtua
2020: 6c 20 6f 62 6a 65 63 74 20 46 69 6e 61 6c 28 6f  l object Final(o
2030: 62 6a 65 63 74 20 63 6f 6e 74 65 78 74 44 61 74  bject contextDat
2040: 61 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  a).    {.      r
2050: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20  eturn null;.    
2060: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  }..    /// <summ
2070: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 55 73 65  ary>.    /// Use
2080: 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74  r-defined collat
2090: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 76  ion sequences ov
20a0: 65 72 72 69 64 65 20 74 68 69 73 20 6d 65 74 68  erride this meth
20b0: 6f 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20  od to provide a 
20c0: 63 75 73 74 6f 6d 20 73 74 72 69 6e 67 20 73 6f  custom string so
20d0: 72 74 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 2e  rting algorithm.
20e0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
20f0: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ry>.    /// <par
2100: 61 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 31 22  am name="param1"
2110: 3e 54 68 65 20 66 69 72 73 74 20 73 74 72 69 6e  >The first strin
2120: 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f 70 61  g to compare</pa
2130: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ram>.    /// <pa
2140: 72 61 6d 20 6e 61 6d 65 3d 22 70 61 72 61 6d 32  ram name="param2
2150: 22 3e 54 68 65 20 73 65 63 6f 6e 64 20 73 74 72  ">The second str
2160: 6e 69 67 20 74 6f 20 63 6f 6d 70 61 72 65 3c 2f  nig to compare</
2170: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c  param>.    /// <
2180: 72 65 74 75 72 6e 73 3e 31 20 69 66 20 70 61 72  returns>1 if par
2190: 61 6d 31 20 69 73 20 67 72 65 61 74 65 72 20 74  am1 is greater t
21a0: 68 61 6e 20 70 61 72 61 6d 32 2c 20 30 20 69 66  han param2, 0 if
21b0: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 2c   they are equal,
21c0: 20 6f 72 20 2d 31 20 69 66 20 70 61 72 61 6d 31   or -1 if param1
21d0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 70 61   is less than pa
21e0: 72 61 6d 32 3c 2f 72 65 74 75 72 6e 73 3e 0a 20  ram2</returns>. 
21f0: 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61     public virtua
2200: 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 28 73 74  l int Compare(st
2210: 72 69 6e 67 20 70 61 72 61 6d 31 2c 20 73 74 72  ring param1, str
2220: 69 6e 67 20 70 61 72 61 6d 32 29 0a 20 20 20 20  ing param2).    
2230: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
2240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  ;.    }..    ///
2250: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
2260: 2f 2f 20 43 6f 6e 76 65 72 74 73 20 61 6e 20 49  // Converts an I
2270: 6e 74 50 74 72 20 61 72 72 61 79 20 6f 66 20 63  ntPtr array of c
2280: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 73  ontext arguments
2290: 20 74 6f 20 61 6e 20 6f 62 6a 65 63 74 20 61 72   to an object ar
22a0: 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ray containing t
22b0: 68 65 20 72 65 73 6f 6c 76 65 64 20 70 61 72 61  he resolved para
22c0: 6d 65 74 65 72 73 20 74 68 65 20 70 6f 69 6e 74  meters the point
22d0: 65 72 73 20 70 6f 69 6e 74 20 74 6f 2e 0a 20 20  ers point to..  
22e0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
22f0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b  .    /// <remark
2300: 73 3e 0a 20 20 20 20 2f 2f 2f 20 50 61 72 61 6d  s>.    /// Param
2310: 65 74 65 72 73 20 70 61 73 73 65 64 20 74 6f 20  eters passed to 
2320: 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 6f  functions have o
2330: 6e 6c 79 20 61 6e 20 61 66 66 69 6e 69 74 79 20  nly an affinity 
2340: 66 6f 72 20 61 20 63 65 72 74 61 69 6e 20 64 61  for a certain da
2350: 74 61 20 74 79 70 65 2c 20 74 68 65 72 65 20 69  ta type, there i
2360: 73 20 6e 6f 20 75 6e 64 65 72 6c 79 69 6e 67 20  s no underlying 
2370: 73 63 68 65 6d 61 20 61 76 61 69 6c 61 62 6c 65  schema available
2380: 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 66 6f 72 63  .    /// to forc
2390: 65 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 63 65  e them into a ce
23a0: 72 74 61 69 6e 20 74 79 70 65 2e 20 20 54 68 65  rtain type.  The
23b0: 72 65 66 6f 72 65 20 74 68 65 20 6f 6e 6c 79 20  refore the only 
23c0: 74 79 70 65 73 20 79 6f 75 20 77 69 6c 6c 20 65  types you will e
23d0: 76 65 72 20 73 65 65 20 61 73 20 70 61 72 61 6d  ver see as param
23e0: 65 74 65 72 73 20 61 72 65 0a 20 20 20 20 2f 2f  eters are.    //
23f0: 2f 20 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 2c 20  / DBNull.Value, 
2400: 49 6e 74 36 34 2c 20 44 6f 75 62 6c 65 2c 20 53  Int64, Double, S
2410: 74 72 69 6e 67 20 6f 72 20 62 79 74 65 5b 5d 20  tring or byte[] 
2420: 61 72 72 61 79 2e 0a 20 20 20 20 2f 2f 2f 20 3c  array..    /// <
2430: 2f 72 65 6d 61 72 6b 73 3e 0a 20 20 20 20 2f 2f  /remarks>.    //
2440: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e  / <param name="n
2450: 41 72 67 73 22 3e 54 68 65 20 6e 75 6d 62 65 72  Args">The number
2460: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 3c 2f 70   of arguments</p
2470: 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  aram>.    /// <p
2480: 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 70  aram name="argsp
2490: 74 72 22 3e 41 20 70 6f 69 6e 74 65 72 20 74 6f  tr">A pointer to
24a0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72   the array of ar
24b0: 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d 3e 0a  guments</param>.
24c0: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
24d0: 3e 41 6e 20 6f 62 6a 65 63 74 20 61 72 72 61 79  >An object array
24e0: 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
24f0: 73 20 6f 6e 63 65 20 74 68 65 79 27 76 65 20 62  s once they've b
2500: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
2510: 20 2e 4e 45 54 20 76 61 6c 75 65 73 3c 2f 72 65   .NET values</re
2520: 74 75 72 6e 73 3e 0a 20 20 20 20 69 6e 74 65 72  turns>.    inter
2530: 6e 61 6c 20 6f 62 6a 65 63 74 5b 5d 20 43 6f 6e  nal object[] Con
2540: 76 65 72 74 50 61 72 61 6d 73 28 69 6e 74 20 6e  vertParams(int n
2550: 41 72 67 73 2c 20 49 6e 74 50 74 72 20 61 72 67  Args, IntPtr arg
2560: 73 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20  sptr).    {.    
2570: 20 20 6f 62 6a 65 63 74 5b 5d 20 70 61 72 6d 73    object[] parms
2580: 20 3d 20 6e 65 77 20 6f 62 6a 65 63 74 5b 6e 41   = new object[nA
2590: 72 67 73 5d 3b 0a 20 20 20 20 20 20 69 6e 74 5b  rgs];.      int[
25a0: 5d 20 61 72 67 69 6e 74 20 3d 20 6e 65 77 20 69  ] argint = new i
25b0: 6e 74 5b 6e 41 72 67 73 5d 3b 0a 20 20 20 20 20  nt[nArgs];.     
25c0: 20 2f 2f 73 74 72 69 6e 67 20 73 3b 0a 20 20 20   //string s;.   
25d0: 20 20 20 2f 2f 44 61 74 65 54 69 6d 65 20 64 74     //DateTime dt
25e0: 3b 0a 0a 20 20 20 20 20 20 4d 61 72 73 68 61 6c  ;..      Marshal
25f0: 2e 43 6f 70 79 28 61 72 67 73 70 74 72 2c 20 61  .Copy(argsptr, a
2600: 72 67 69 6e 74 2c 20 30 2c 20 6e 41 72 67 73 29  rgint, 0, nArgs)
2610: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e  ;..      for (in
2620: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 6e 41 72  t n = 0; n < nAr
2630: 67 73 3b 20 6e 2b 2b 29 0a 20 20 20 20 20 20 7b  gs; n++).      {
2640: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20  .        switch 
2650: 28 5f 62 61 73 65 2e 47 65 74 50 61 72 61 6d 56  (_base.GetParamV
2660: 61 6c 75 65 54 79 70 65 28 61 72 67 69 6e 74 5b  alueType(argint[
2670: 6e 5d 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  n])).        {. 
2680: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79           case Ty
2690: 70 65 41 66 66 69 6e 69 74 79 2e 4e 75 6c 6c 3a  peAffinity.Null:
26a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72  .            par
26b0: 6d 73 5b 6e 5d 20 3d 20 44 42 4e 75 6c 6c 2e 56  ms[n] = DBNull.V
26c0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alue;.          
26d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26e0: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
26f0: 6e 69 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20 20  nity.Int64:.    
2700: 20 20 20 20 20 20 20 20 70 61 72 6d 73 5b 6e 5d          parms[n]
2710: 20 3d 20 5f 62 61 73 65 2e 47 65 74 50 61 72 61   = _base.GetPara
2720: 6d 56 61 6c 75 65 49 6e 74 36 34 28 61 72 67 69  mValueInt64(argi
2730: 6e 74 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20  nt[n]);.        
2740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2750: 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66       case TypeAf
2760: 66 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a 20  finity.Double:. 
2770: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 6d 73             parms
2780: 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47 65 74 50  [n] = _base.GetP
2790: 61 72 61 6d 56 61 6c 75 65 44 6f 75 62 6c 65 28  aramValueDouble(
27a0: 61 72 67 69 6e 74 5b 6e 5d 29 3b 0a 20 20 20 20  argint[n]);.    
27b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27c0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79           case Ty
27d0: 70 65 41 66 66 69 6e 69 74 79 2e 54 65 78 74 3a  peAffinity.Text:
27e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72  .            par
27f0: 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73 65 2e 47 65  ms[n] = _base.Ge
2800: 74 50 61 72 61 6d 56 61 6c 75 65 54 65 78 74 28  tParamValueText(
2810: 61 72 67 69 6e 74 5b 6e 5d 29 3b 0a 20 20 20 20  argint[n]);.    
2820: 20 20 20 20 20 20 20 20 2f 2f 73 20 3d 20 5f 62          //s = _b
2830: 61 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75  ase.GetParamValu
2840: 65 54 65 78 74 28 61 72 67 69 6e 74 5b 6e 5d 29  eText(argint[n])
2850: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ;.            //
2860: 69 66 20 28 5f 62 61 73 65 2e 54 72 79 54 6f 44  if (_base.TryToD
2870: 61 74 65 54 69 6d 65 28 73 2c 20 6f 75 74 20 64  ateTime(s, out d
2880: 74 29 20 3d 3d 20 74 72 75 65 29 20 70 61 72 6d  t) == true) parm
2890: 73 5b 6e 5d 20 3d 20 64 74 3b 0a 20 20 20 20 20  s[n] = dt;.     
28a0: 20 20 20 20 20 20 20 2f 2f 65 6c 73 65 20 70 61         //else pa
28b0: 72 6d 73 5b 6e 5d 20 3d 20 73 3b 0a 20 20 20 20  rms[n] = s;.    
28c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28d0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79           case Ty
28e0: 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62 3a  peAffinity.Blob:
28f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2910: 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   x;.            
2920: 20 20 62 79 74 65 5b 5d 20 62 6c 6f 62 3b 0a 0a    byte[] blob;..
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 20                x 
2940: 3d 20 28 69 6e 74 29 5f 62 61 73 65 2e 47 65 74  = (int)_base.Get
2950: 50 61 72 61 6d 56 61 6c 75 65 42 79 74 65 73 28  ParamValueBytes(
2960: 61 72 67 69 6e 74 5b 6e 5d 2c 20 30 2c 20 6e 75  argint[n], 0, nu
2970: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 0, 0);.     
2980: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 20 3d 20           blob = 
2990: 6e 65 77 20 62 79 74 65 5b 78 5d 3b 0a 20 20 20  new byte[x];.   
29a0: 20 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65             _base
29b0: 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65 42 79  .GetParamValueBy
29c0: 74 65 73 28 61 72 67 69 6e 74 5b 6e 5d 2c 20 30  tes(argint[n], 0
29d0: 2c 20 62 6c 6f 62 2c 20 30 2c 20 78 29 3b 0a 20  , blob, 0, x);. 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72               par
29f0: 6d 73 5b 6e 5d 20 3d 20 62 6c 6f 62 3b 0a 20 20  ms[n] = blob;.  
2a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2a20: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 79           case Ty
2a30: 70 65 41 66 66 69 6e 69 74 79 2e 44 61 74 65 54  peAffinity.DateT
2a40: 69 6d 65 3a 20 2f 2f 20 4e 65 76 65 72 20 68 61  ime: // Never ha
2a50: 70 70 65 6e 73 20 68 65 72 65 20 62 75 74 20 77  ppens here but w
2a60: 68 61 74 20 74 68 65 20 68 65 63 6b 2c 20 6d 61  hat the heck, ma
2a70: 79 62 65 20 69 74 20 77 69 6c 6c 20 6f 6e 65 20  ybe it will one 
2a80: 64 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  day..           
2a90: 20 70 61 72 6d 73 5b 6e 5d 20 3d 20 5f 62 61 73   parms[n] = _bas
2aa0: 65 2e 54 6f 44 61 74 65 54 69 6d 65 28 5f 62 61  e.ToDateTime(_ba
2ab0: 73 65 2e 47 65 74 50 61 72 61 6d 56 61 6c 75 65  se.GetParamValue
2ac0: 54 65 78 74 28 61 72 67 69 6e 74 5b 6e 5d 29 29  Text(argint[n]))
2ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2ae0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2b00: 75 72 6e 20 70 61 72 6d 73 3b 0a 20 20 20 20 7d  urn parms;.    }
2b10: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
2b20: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 61 6b 65  ry>.    /// Take
2b30: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
2b40: 75 65 20 66 72 6f 6d 20 49 6e 76 6f 6b 65 28 29  ue from Invoke()
2b50: 20 61 6e 64 20 46 69 6e 61 6c 28 29 20 61 6e 64   and Final() and
2b60: 20 66 69 67 75 72 65 73 20 6f 75 74 20 68 6f 77   figures out how
2b70: 20 74 6f 20 72 65 74 75 72 6e 20 69 74 20 74 6f   to return it to
2b80: 20 53 51 4c 69 74 65 27 73 20 63 6f 6e 74 65 78   SQLite's contex
2b90: 74 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  t..    /// </sum
2ba0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  mary>.    /// <p
2bb0: 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6e 74 65  aram name="conte
2bc0: 78 74 22 3e 54 68 65 20 63 6f 6e 74 65 78 74 20  xt">The context 
2bd0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2be0: 20 61 70 70 6c 69 65 73 20 74 6f 3c 2f 70 61 72   applies to</par
2bf0: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  am>.    /// <par
2c00: 61 6d 20 6e 61 6d 65 3d 22 72 65 74 75 72 6e 56  am name="returnV
2c10: 61 6c 75 65 22 3e 54 68 65 20 70 61 72 61 6d 65  alue">The parame
2c20: 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f  ter to return to
2c30: 20 53 51 4c 69 74 65 3c 2f 70 61 72 61 6d 3e 0a   SQLite</param>.
2c40: 20 20 20 20 76 6f 69 64 20 53 65 74 52 65 74 75      void SetRetu
2c50: 72 6e 56 61 6c 75 65 28 69 6e 74 20 63 6f 6e 74  rnValue(int cont
2c60: 65 78 74 2c 20 6f 62 6a 65 63 74 20 72 65 74 75  ext, object retu
2c70: 72 6e 56 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20  rnValue).    {. 
2c80: 20 20 20 20 20 69 66 20 28 72 65 74 75 72 6e 56       if (returnV
2c90: 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20  alue == null || 
2ca0: 72 65 74 75 72 6e 56 61 6c 75 65 20 3d 3d 20 44  returnValue == D
2cb0: 42 4e 75 6c 6c 2e 56 61 6c 75 65 29 0a 20 20 20  BNull.Value).   
2cc0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 5f 62 61     {.        _ba
2cd0: 73 65 2e 52 65 74 75 72 6e 4e 75 6c 6c 28 63 6f  se.ReturnNull(co
2ce0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
2cf0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
2d00: 0a 20 20 20 20 20 20 54 79 70 65 20 74 20 3d 20  .      Type t = 
2d10: 72 65 74 75 72 6e 56 61 6c 75 65 2e 47 65 74 54  returnValue.GetT
2d20: 79 70 65 28 29 3b 0a 20 20 20 20 20 20 69 66 20  ype();.      if 
2d30: 28 74 20 3d 3d 20 74 79 70 65 6f 66 28 44 61 74  (t == typeof(Dat
2d40: 65 54 69 6d 65 29 29 0a 20 20 20 20 20 20 7b 0a  eTime)).      {.
2d50: 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65          _base.Re
2d60: 74 75 72 6e 54 65 78 74 28 63 6f 6e 74 65 78 74  turnText(context
2d70: 2c 20 5f 62 61 73 65 2e 54 6f 53 74 72 69 6e 67  , _base.ToString
2d80: 28 28 44 61 74 65 54 69 6d 65 29 72 65 74 75 72  ((DateTime)retur
2d90: 6e 56 61 6c 75 65 29 29 3b 0a 20 20 20 20 20 20  nValue));.      
2da0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2db0: 7d 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20  }.      else.   
2dc0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 45 78 63     {.        Exc
2dd0: 65 70 74 69 6f 6e 20 72 20 3d 20 72 65 74 75 72  eption r = retur
2de0: 6e 56 61 6c 75 65 20 61 73 20 45 78 63 65 70 74  nValue as Except
2df0: 69 6f 6e 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ion;..        if
2e00: 20 28 72 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20   (r != null).   
2e10: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2e20: 20 5f 62 61 73 65 2e 52 65 74 75 72 6e 45 72 72   _base.ReturnErr
2e30: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 72 2e 4d 65  or(context, r.Me
2e40: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
2e50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
2e60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
2e70: 20 20 20 73 77 69 74 63 68 20 28 53 51 4c 69 74     switch (SQLit
2e80: 65 43 6f 6e 76 65 72 74 2e 54 79 70 65 54 6f 41  eConvert.TypeToA
2e90: 66 66 69 6e 69 74 79 28 74 29 29 0a 20 20 20 20  ffinity(t)).    
2ea0: 20 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65    {.        case
2eb0: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 4e 75   TypeAffinity.Nu
2ec0: 6c 6c 3a 0a 20 20 20 20 20 20 20 20 20 20 5f 62  ll:.          _b
2ed0: 61 73 65 2e 52 65 74 75 72 6e 4e 75 6c 6c 28 63  ase.ReturnNull(c
2ee0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2ef0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
2f00: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
2f10: 6e 69 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20 20  nity.Int64:.    
2f20: 20 20 20 20 20 20 5f 62 61 73 65 2e 52 65 74 75        _base.Retu
2f30: 72 6e 49 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  rnInt64(context,
2f40: 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 36 34   Convert.ToInt64
2f50: 28 72 65 74 75 72 6e 56 61 6c 75 65 2c 20 43 75  (returnValue, Cu
2f60: 6c 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e  ltureInfo.Curren
2f70: 74 43 75 6c 74 75 72 65 29 29 3b 0a 20 20 20 20  tCulture));.    
2f80: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2f90: 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41        case TypeA
2fa0: 66 66 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a  ffinity.Double:.
2fb0: 20 20 20 20 20 20 20 20 20 20 5f 62 61 73 65 2e            _base.
2fc0: 52 65 74 75 72 6e 44 6f 75 62 6c 65 28 63 6f 6e  ReturnDouble(con
2fd0: 74 65 78 74 2c 20 43 6f 6e 76 65 72 74 2e 54 6f  text, Convert.To
2fe0: 44 6f 75 62 6c 65 28 72 65 74 75 72 6e 56 61 6c  Double(returnVal
2ff0: 75 65 2c 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e  ue, CultureInfo.
3000: 43 75 72 72 65 6e 74 43 75 6c 74 75 72 65 29 29  CurrentCulture))
3010: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
3020: 72 6e 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  rn;.        case
3030: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 54 65   TypeAffinity.Te
3040: 78 74 3a 0a 20 20 20 20 20 20 20 20 20 20 5f 62  xt:.          _b
3050: 61 73 65 2e 52 65 74 75 72 6e 54 65 78 74 28 63  ase.ReturnText(c
3060: 6f 6e 74 65 78 74 2c 20 72 65 74 75 72 6e 56 61  ontext, returnVa
3070: 6c 75 65 2e 54 6f 53 74 72 69 6e 67 28 29 29 3b  lue.ToString());
3080: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
3090: 6e 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  n;.        case 
30a0: 54 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f  TypeAffinity.Blo
30b0: 62 3a 0a 20 20 20 20 20 20 20 20 20 20 5f 62 61  b:.          _ba
30c0: 73 65 2e 52 65 74 75 72 6e 42 6c 6f 62 28 63 6f  se.ReturnBlob(co
30d0: 6e 74 65 78 74 2c 20 28 62 79 74 65 5b 5d 29 72  ntext, (byte[])r
30e0: 65 74 75 72 6e 56 61 6c 75 65 29 3b 0a 20 20 20  eturnValue);.   
30f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3110: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
3120: 20 20 20 20 2f 2f 2f 20 49 6e 74 65 72 6e 61 6c      /// Internal
3130: 20 73 63 61 6c 61 72 20 63 61 6c 6c 62 61 63 6b   scalar callback
3140: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 68 69 63 68   function, which
3150: 20 77 72 61 70 73 20 74 68 65 20 72 61 77 20 63   wraps the raw c
3160: 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61  ontext pointer a
3170: 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72  nd calls the vir
3180: 74 75 61 6c 20 49 6e 76 6f 6b 65 28 29 20 6d 65  tual Invoke() me
3190: 74 68 6f 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f  thod..    /// </
31a0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
31b0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f   <param name="co
31c0: 6e 74 65 78 74 22 3e 41 20 72 61 77 20 63 6f 6e  ntext">A raw con
31d0: 74 65 78 74 20 70 6f 69 6e 74 65 72 3c 2f 70 61  text pointer</pa
31e0: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ram>.    /// <pa
31f0: 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73 22  ram name="nArgs"
3200: 3e 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d  >Number of argum
3210: 65 6e 74 73 20 70 61 73 73 65 64 20 69 6e 3c 2f  ents passed in</
3220: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c  param>.    /// <
3230: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73  param name="args
3240: 70 74 72 22 3e 41 20 70 6f 69 6e 74 65 72 20 74  ptr">A pointer t
3250: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61  o the array of a
3260: 72 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d 3e  rguments</param>
3270: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
3280: 69 64 20 53 63 61 6c 61 72 43 61 6c 6c 62 61 63  id ScalarCallbac
3290: 6b 28 69 6e 74 20 63 6f 6e 74 65 78 74 2c 20 69  k(int context, i
32a0: 6e 74 20 6e 41 72 67 73 2c 20 49 6e 74 50 74 72  nt nArgs, IntPtr
32b0: 20 61 72 67 73 70 74 72 29 0a 20 20 20 20 7b 0a   argsptr).    {.
32c0: 20 20 20 20 20 20 53 65 74 52 65 74 75 72 6e 56        SetReturnV
32d0: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 49 6e  alue(context, In
32e0: 76 6f 6b 65 28 43 6f 6e 76 65 72 74 50 61 72 61  voke(ConvertPara
32f0: 6d 73 28 6e 41 72 67 73 2c 20 61 72 67 73 70 74  ms(nArgs, argspt
3300: 72 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r)));.    }..   
3310: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
3320: 20 20 20 2f 2f 2f 20 49 6e 74 65 72 6e 61 6c 20     /// Internal 
3330: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
3340: 63 65 20 66 75 6e 63 74 69 6f 6e 2c 20 77 68 69  ce function, whi
3350: 63 68 20 77 72 61 70 73 20 75 70 20 74 68 65 20  ch wraps up the 
3360: 72 61 77 20 73 74 72 69 6e 67 20 70 6f 69 6e 74  raw string point
3370: 65 72 73 20 61 6e 64 20 65 78 65 63 75 74 65 73  ers and executes
3380: 20 74 68 65 20 43 6f 6d 70 61 72 65 28 29 20 76   the Compare() v
3390: 69 72 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 2e  irtual function.
33a0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
33b0: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ry>.    /// <par
33c0: 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e 31 22 3e 4c  am name="len1">L
33d0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
33e0: 69 6e 67 20 70 76 31 3c 2f 70 61 72 61 6d 3e 0a  ing pv1</param>.
33f0: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
3400: 61 6d 65 3d 22 70 74 72 31 22 3e 50 6f 69 6e 74  ame="ptr1">Point
3410: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
3420: 73 74 72 69 6e 67 20 74 6f 20 63 6f 6d 70 61 72  string to compar
3430: 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f  e</param>.    //
3440: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c  / <param name="l
3450: 65 6e 32 22 3e 4c 65 6e 67 74 68 20 6f 66 20 74  en2">Length of t
3460: 68 65 20 73 74 72 69 6e 67 20 70 76 32 3c 2f 70  he string pv2</p
3470: 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  aram>.    /// <p
3480: 61 72 61 6d 20 6e 61 6d 65 3d 22 70 74 72 32 22  aram name="ptr2"
3490: 3e 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  >Pointer to the 
34a0: 73 65 63 6f 6e 64 20 73 74 72 69 6e 67 20 74 6f  second string to
34b0: 20 63 6f 6d 70 61 72 65 3c 2f 70 61 72 61 6d 3e   compare</param>
34c0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
34d0: 73 3e 52 65 74 75 72 6e 73 20 2d 31 20 69 66 20  s>Returns -1 if 
34e0: 74 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67  the first string
34f0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
3500: 65 20 73 65 63 6f 6e 64 2e 20 20 30 20 69 66 20  e second.  0 if 
3510: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 2c 20  they are equal, 
3520: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 72 73  or 1 if the firs
3530: 74 20 73 74 72 69 6e 67 20 69 73 20 67 72 65 61  t string is grea
3540: 74 65 72 0a 20 20 20 20 2f 2f 2f 20 74 68 61 6e  ter.    /// than
3550: 20 74 68 65 20 73 65 63 6f 6e 64 2e 3c 2f 72 65   the second.</re
3560: 74 75 72 6e 73 3e 0a 20 20 20 20 69 6e 74 65 72  turns>.    inter
3570: 6e 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 43  nal int CompareC
3580: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6c 65 6e 31  allback(int len1
3590: 2c 20 49 6e 74 50 74 72 20 70 74 72 31 2c 20 69  , IntPtr ptr1, i
35a0: 6e 74 20 6c 65 6e 32 2c 20 49 6e 74 50 74 72 20  nt len2, IntPtr 
35b0: 70 74 72 32 29 0a 20 20 20 20 7b 0a 20 20 20 20  ptr2).    {.    
35c0: 20 20 72 65 74 75 72 6e 20 43 6f 6d 70 61 72 65    return Compare
35d0: 28 5f 62 61 73 65 2e 54 6f 53 74 72 69 6e 67 28  (_base.ToString(
35e0: 70 74 72 31 2c 20 6c 65 6e 31 29 2c 20 5f 62 61  ptr1, len1), _ba
35f0: 73 65 2e 54 6f 53 74 72 69 6e 67 28 70 74 72 32  se.ToString(ptr2
3600: 2c 20 6c 65 6e 32 29 29 3b 0a 20 20 20 20 7d 0a  , len2));.    }.
3610: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
3620: 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 69  y>.    /// The i
3630: 6e 74 65 72 6e 61 6c 20 61 67 67 72 65 67 61 74  nternal aggregat
3640: 65 20 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e Step function 
3650: 63 61 6c 6c 62 61 63 6b 2c 20 77 68 69 63 68 20  callback, which 
3660: 77 72 61 70 73 20 74 68 65 20 72 61 77 20 63 6f  wraps the raw co
3670: 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 61 6e  ntext pointer an
3680: 64 20 63 61 6c 6c 73 20 74 68 65 20 76 69 72 74  d calls the virt
3690: 75 61 6c 20 53 74 65 70 28 29 20 6d 65 74 68 6f  ual Step() metho
36a0: 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  d..    /// </sum
36b0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72  mary>.    /// <r
36c0: 65 6d 61 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20  emarks>.    /// 
36d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
36e0: 6b 65 73 20 63 61 72 65 20 6f 66 20 64 6f 69 6e  kes care of doin
36f0: 67 20 74 68 65 20 6c 6f 6f 6b 75 70 73 20 61 6e  g the lookups an
3700: 64 20 67 65 74 74 69 6e 67 20 74 68 65 20 69 6d  d getting the im
3710: 70 6f 72 74 61 6e 74 20 69 6e 66 6f 72 6d 61 74  portant informat
3720: 69 6f 6e 20 70 75 74 20 74 6f 67 65 74 68 65 72  ion put together
3730: 20 74 6f 20 63 61 6c 6c 20 74 68 65 20 53 74 65   to call the Ste
3740: 70 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  p() function..  
3750: 20 20 2f 2f 2f 20 54 68 61 74 20 69 6e 63 6c 75    /// That inclu
3760: 64 65 73 20 70 75 6c 6c 69 6e 67 20 6f 75 74 20  des pulling out 
3770: 74 68 65 20 75 73 65 72 27 73 20 63 6f 6e 74 65  the user's conte
3780: 78 74 44 61 74 61 20 61 6e 64 20 75 70 64 61 74  xtData and updat
3790: 69 6e 67 20 69 74 20 61 66 74 65 72 20 74 68 65  ing it after the
37a0: 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 2e 20 20   call is made.  
37b0: 57 65 20 75 73 65 20 61 20 73 6f 72 74 65 64 20  We use a sorted 
37c0: 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 73 6f  list for this so
37d0: 0a 20 20 20 20 2f 2f 2f 20 62 69 6e 61 72 79 20  .    /// binary 
37e0: 73 65 61 72 63 68 65 73 20 63 61 6e 20 62 65 20  searches can be 
37f0: 64 6f 6e 65 20 74 6f 20 66 69 6e 64 20 74 68 65  done to find the
3800: 20 64 61 74 61 2e 0a 20 20 20 20 2f 2f 2f 20 3c   data..    /// <
3810: 2f 72 65 6d 61 72 6b 73 3e 0a 20 20 20 20 2f 2f  /remarks>.    //
3820: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63  / <param name="c
3830: 6f 6e 74 65 78 74 22 3e 41 20 72 61 77 20 63 6f  ontext">A raw co
3840: 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 3c 2f 70  ntext pointer</p
3850: 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  aram>.    /// <p
3860: 61 72 61 6d 20 6e 61 6d 65 3d 22 6e 41 72 67 73  aram name="nArgs
3870: 22 3e 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  ">Number of argu
3880: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 69 6e 3c  ments passed in<
3890: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20  /param>.    /// 
38a0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 61 72 67  <param name="arg
38b0: 73 70 74 72 22 3e 41 20 70 6f 69 6e 74 65 72 20  sptr">A pointer 
38c0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
38d0: 61 72 67 75 6d 65 6e 74 73 3c 2f 70 61 72 61 6d  arguments</param
38e0: 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  >.    internal v
38f0: 6f 69 64 20 53 74 65 70 43 61 6c 6c 62 61 63 6b  oid StepCallback
3900: 28 69 6e 74 20 63 6f 6e 74 65 78 74 2c 20 69 6e  (int context, in
3910: 74 20 6e 41 72 67 73 2c 20 49 6e 74 50 74 72 20  t nArgs, IntPtr 
3920: 61 72 67 73 70 74 72 29 0a 20 20 20 20 7b 0a 20  argsptr).    {. 
3930: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 5f 62 61       int n = _ba
3940: 73 65 2e 41 67 67 72 65 67 61 74 65 43 6f 75 6e  se.AggregateCoun
3950: 74 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  t(context);.    
3960: 20 20 69 6e 74 20 6e 41 75 78 3b 0a 20 20 20 20    int nAux;.    
3970: 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20 3d 20 6e    object obj = n
3980: 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 6e 41 75 78  ull;..      nAux
3990: 20 3d 20 5f 62 61 73 65 2e 41 67 67 72 65 67 61   = _base.Aggrega
39a0: 74 65 43 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  teContext(contex
39b0: 74 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  t);.      if (n 
39c0: 3e 20 31 29 20 6f 62 6a 20 3d 20 5f 63 6f 6e 74  > 1) obj = _cont
39d0: 65 78 74 44 61 74 61 4c 69 73 74 5b 6e 41 75 78  extDataList[nAux
39e0: 5d 3b 0a 0a 20 20 20 20 20 20 53 74 65 70 28 43  ];..      Step(C
39f0: 6f 6e 76 65 72 74 50 61 72 61 6d 73 28 6e 41 72  onvertParams(nAr
3a00: 67 73 2c 20 61 72 67 73 70 74 72 29 2c 20 6e 2c  gs, argsptr), n,
3a10: 20 72 65 66 20 6f 62 6a 29 3b 0a 20 20 20 20 20   ref obj);.     
3a20: 20 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73   _contextDataLis
3a30: 74 5b 6e 41 75 78 5d 20 3d 20 6f 62 6a 3b 20 20  t[nAux] = obj;  
3a40: 20 20 20 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20      .    }..    
3a50: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20  /// <summary>.  
3a60: 20 20 2f 2f 2f 20 41 6e 20 69 6e 74 65 72 6e 61    /// An interna
3a70: 6c 20 61 67 67 72 65 67 61 74 65 20 46 69 6e 61  l aggregate Fina
3a80: 6c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  l function callb
3a90: 61 63 6b 2c 20 77 68 69 63 68 20 77 72 61 70 73  ack, which wraps
3aa0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 70 6f 69   the context poi
3ab0: 6e 74 65 72 20 61 6e 64 20 63 61 6c 6c 73 20 74  nter and calls t
3ac0: 68 65 20 76 69 72 74 75 61 6c 20 46 69 6e 61 6c  he virtual Final
3ad0: 28 29 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20 2f  () method..    /
3ae0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
3af0: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
3b00: 65 3d 22 63 6f 6e 74 65 78 74 22 3e 41 20 72 61  e="context">A ra
3b10: 77 20 63 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  w context pointe
3b20: 72 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f  r</param>.    //
3b30: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6e  / <param name="n
3b40: 41 72 67 73 22 3e 4e 6f 74 20 75 73 65 64 2c 20  Args">Not used, 
3b50: 61 6c 77 61 79 73 20 7a 65 72 6f 3c 2f 70 61 72  always zero</par
3b60: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  am>.    /// <par
3b70: 61 6d 20 6e 61 6d 65 3d 22 61 72 67 73 70 74 72  am name="argsptr
3b80: 22 3e 4e 6f 74 20 75 73 65 64 2c 20 61 6c 77 61  ">Not used, alwa
3b90: 79 73 20 7a 65 72 6f 3c 2f 70 61 72 61 6d 3e 0a  ys zero</param>.
3ba0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
3bb0: 64 20 46 69 6e 61 6c 43 61 6c 6c 62 61 63 6b 28  d FinalCallback(
3bc0: 69 6e 74 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74  int context, int
3bd0: 20 6e 41 72 67 73 2c 20 49 6e 74 50 74 72 20 61   nArgs, IntPtr a
3be0: 72 67 73 70 74 72 29 0a 20 20 20 20 7b 0a 20 20  rgsptr).    {.  
3bf0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 5f 62 61 73      int n = _bas
3c00: 65 2e 41 67 67 72 65 67 61 74 65 43 6f 6e 74 65  e.AggregateConte
3c10: 78 74 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  xt(context);.   
3c20: 20 20 20 6f 62 6a 65 63 74 20 6f 62 6a 20 3d 20     object obj = 
3c30: 6e 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 20  null;..      if 
3c40: 28 5f 63 6f 6e 74 65 78 74 44 61 74 61 4c 69 73  (_contextDataLis
3c50: 74 2e 43 6f 6e 74 61 69 6e 73 4b 65 79 28 6e 29  t.ContainsKey(n)
3c60: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
3c70: 20 20 6f 62 6a 20 3d 20 5f 63 6f 6e 74 65 78 74    obj = _context
3c80: 44 61 74 61 4c 69 73 74 5b 6e 5d 3b 0a 20 20 20  DataList[n];.   
3c90: 20 20 20 20 20 5f 63 6f 6e 74 65 78 74 44 61 74       _contextDat
3ca0: 61 4c 69 73 74 2e 52 65 6d 6f 76 65 28 6e 29 3b  aList.Remove(n);
3cb0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
3cc0: 53 65 74 52 65 74 75 72 6e 56 61 6c 75 65 28 63  SetReturnValue(c
3cd0: 6f 6e 74 65 78 74 2c 20 46 69 6e 61 6c 28 6f 62  ontext, Final(ob
3ce0: 6a 29 29 3b 0a 0a 20 20 20 20 20 20 49 44 69 73  j));..      IDis
3cf0: 70 6f 73 61 62 6c 65 20 64 69 73 70 20 3d 20 6f  posable disp = o
3d00: 62 6a 20 61 73 20 49 44 69 73 70 6f 73 61 62 6c  bj as IDisposabl
3d10: 65 3b 0a 20 20 20 20 20 20 69 66 20 28 64 69 73  e;.      if (dis
3d20: 70 20 21 3d 20 6e 75 6c 6c 29 20 64 69 73 70 2e  p != null) disp.
3d30: 44 69 73 70 6f 73 65 28 29 3b 0a 20 20 20 20 7d  Dispose();.    }
3d40: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
3d50: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 50 6c 61 63  ry>.    /// Plac
3d60: 65 68 6f 6c 64 65 72 20 66 6f 72 20 61 20 75 73  eholder for a us
3d70: 65 72 2d 64 65 66 69 6e 65 64 20 64 69 73 70 6f  er-defined dispo
3d80: 73 61 6c 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  sal routine.    
3d90: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
3da0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
3db0: 6d 65 3d 22 64 69 73 70 6f 73 69 6e 67 22 3e 54  me="disposing">T
3dc0: 72 75 65 20 69 66 20 74 68 65 20 6f 62 6a 65 63  rue if the objec
3dd0: 74 20 69 73 20 62 65 69 6e 67 20 64 69 73 70 6f  t is being dispo
3de0: 73 65 64 20 65 78 70 6c 69 63 69 74 6c 79 3c 2f  sed explicitly</
3df0: 70 61 72 61 6d 3e 0a 20 20 20 20 70 72 6f 74 65  param>.    prote
3e00: 63 74 65 64 20 76 69 72 74 75 61 6c 20 76 6f 69  cted virtual voi
3e10: 64 20 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20 64  d Dispose(bool d
3e20: 69 73 70 6f 73 69 6e 67 29 0a 20 20 20 20 7b 0a  isposing).    {.
3e30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c      }..    /// <
3e40: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
3e50: 20 44 69 73 70 6f 73 65 73 20 6f 66 20 61 6e 79   Disposes of any
3e60: 20 61 63 74 69 76 65 20 63 6f 6e 74 65 78 74 44   active contextD
3e70: 61 74 61 20 76 61 72 69 61 62 6c 65 73 20 74 68  ata variables th
3e80: 61 74 20 77 65 72 65 20 6e 6f 74 20 61 75 74 6f  at were not auto
3e90: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 65 61 6e 65  matically cleane
3ea0: 64 20 75 70 2e 20 20 53 6f 6d 65 74 69 6d 65 73  d up.  Sometimes
3eb0: 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
3ec0: 20 69 66 0a 20 20 20 20 2f 2f 2f 20 73 6f 6d 65   if.    /// some
3ed0: 6f 6e 65 20 63 6c 6f 73 65 73 20 74 68 65 20 63  one closes the c
3ee0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 68 69 6c 65 20  onnection while 
3ef0: 61 20 44 61 74 61 52 65 61 64 65 72 20 69 73 20  a DataReader is 
3f00: 6f 70 65 6e 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f  open..    /// </
3f10: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 75 62  summary>.    pub
3f20: 6c 69 63 20 76 6f 69 64 20 44 69 73 70 6f 73 65  lic void Dispose
3f30: 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 44  ().    {.      D
3f40: 69 73 70 6f 73 65 28 74 72 75 65 29 3b 0a 0a 20  ispose(true);.. 
3f50: 20 20 20 20 20 49 44 69 73 70 6f 73 61 62 6c 65       IDisposable
3f60: 20 64 69 73 70 3b 0a 0a 20 20 20 20 20 20 66 6f   disp;..      fo
3f70: 72 65 61 63 68 20 28 4b 65 79 56 61 6c 75 65 50  reach (KeyValueP
3f80: 61 69 72 3c 69 6e 74 2c 20 6f 62 6a 65 63 74 3e  air<int, object>
3f90: 20 6b 76 20 69 6e 20 5f 63 6f 6e 74 65 78 74 44   kv in _contextD
3fa0: 61 74 61 4c 69 73 74 29 0a 20 20 20 20 20 20 7b  ataList).      {
3fb0: 0a 20 20 20 20 20 20 20 20 64 69 73 70 20 3d 20  .        disp = 
3fc0: 6b 76 2e 56 61 6c 75 65 20 61 73 20 49 44 69 73  kv.Value as IDis
3fd0: 70 6f 73 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  posable;.       
3fe0: 20 69 66 20 28 64 69 73 70 20 21 3d 20 6e 75 6c   if (disp != nul
3ff0: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  l).          dis
4000: 70 2e 44 69 73 70 6f 73 65 28 29 3b 0a 20 20 20  p.Dispose();.   
4010: 20 20 20 7d 0a 20 20 20 20 20 20 5f 63 6f 6e 74     }.      _cont
4020: 65 78 74 44 61 74 61 4c 69 73 74 2e 43 6c 65 61  extDataList.Clea
4030: 72 28 29 3b 0a 0a 20 20 20 20 20 20 5f 49 6e 76  r();..      _Inv
4040: 6f 6b 65 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b 0a  okeFunc = null;.
4050: 20 20 20 20 20 20 5f 53 74 65 70 46 75 6e 63 20        _StepFunc 
4060: 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 5f 46  = null;.      _F
4070: 69 6e 61 6c 46 75 6e 63 20 3d 20 6e 75 6c 6c 3b  inalFunc = null;
4080: 0a 20 20 20 20 20 20 5f 43 6f 6d 70 61 72 65 46  .      _CompareF
4090: 75 6e 63 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  unc = null;.    
40a0: 20 20 5f 62 61 73 65 20 3d 20 6e 75 6c 6c 3b 0a    _base = null;.
40b0: 20 20 20 20 20 20 5f 63 6f 6e 74 65 78 74 44 61        _contextDa
40c0: 74 61 4c 69 73 74 20 3d 20 6e 75 6c 6c 3b 0a 0a  taList = null;..
40d0: 20 20 20 20 20 20 47 43 2e 53 75 70 70 72 65 73        GC.Suppres
40e0: 73 46 69 6e 61 6c 69 7a 65 28 74 68 69 73 29 3b  sFinalize(this);
40f0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 50 4c 41  .    }..#if !PLA
4100: 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
4110: 4d 45 57 4f 52 4b 0a 20 20 20 20 2f 2f 2f 20 3c  MEWORK.    /// <
4120: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
4130: 20 55 73 69 6e 67 20 72 65 66 6c 65 63 74 69 6f   Using reflectio
4140: 6e 2c 20 65 6e 75 6d 65 72 61 74 65 20 61 6c 6c  n, enumerate all
4150: 20 61 73 73 65 6d 62 6c 69 65 73 20 69 6e 20 74   assemblies in t
4160: 68 65 20 63 75 72 72 65 6e 74 20 61 70 70 64 6f  he current appdo
4170: 6d 61 69 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  main looking for
4180: 20 63 6c 61 73 73 65 73 20 74 68 61 74 0a 20 20   classes that.  
4190: 20 20 2f 2f 2f 20 68 61 76 65 20 61 20 53 51 4c    /// have a SQL
41a0: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
41b0: 62 75 74 65 20 61 74 74 72 69 62 75 74 65 2c 20  bute attribute, 
41c0: 61 6e 64 20 72 65 67 69 73 74 65 72 69 6e 67 20  and registering 
41d0: 74 68 65 6d 20 61 63 63 6f 72 64 69 6e 67 6c 79  them accordingly
41e0: 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
41f0: 61 72 79 3e 0a 20 20 20 20 73 74 61 74 69 63 20  ary>.    static 
4200: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 28 29  SQLiteFunction()
4210: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53 51 4c  .    {.      SQL
4220: 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72 69  iteFunctionAttri
4230: 62 75 74 65 20 61 74 3b 0a 20 20 20 20 20 20 53  bute at;.      S
4240: 79 73 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e  ystem.Reflection
4250: 2e 41 73 73 65 6d 62 6c 79 5b 5d 20 61 72 41 73  .Assembly[] arAs
4260: 73 65 6d 62 6c 69 65 73 20 3d 20 53 79 73 74 65  semblies = Syste
4270: 6d 2e 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72  m.AppDomain.Curr
4280: 65 6e 74 44 6f 6d 61 69 6e 2e 47 65 74 41 73 73  entDomain.GetAss
4290: 65 6d 62 6c 69 65 73 28 29 3b 0a 20 20 20 20 20  emblies();.     
42a0: 20 69 6e 74 20 77 20 3d 20 61 72 41 73 73 65 6d   int w = arAssem
42b0: 62 6c 69 65 73 2e 4c 65 6e 67 74 68 3b 0a 0a 20  blies.Length;.. 
42c0: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
42d0: 3d 20 30 3b 20 6e 20 3c 20 77 3b 20 6e 2b 2b 29  = 0; n < w; n++)
42e0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
42f0: 20 54 79 70 65 5b 5d 20 61 72 54 79 70 65 73 3b   Type[] arTypes;
4300: 0a 20 20 20 20 20 20 20 20 74 72 79 0a 20 20 20  .        try.   
4310: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
4320: 20 61 72 54 79 70 65 73 20 3d 20 61 72 41 73 73   arTypes = arAss
4330: 65 6d 62 6c 69 65 73 5b 6e 5d 2e 47 65 74 54 79  emblies[n].GetTy
4340: 70 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  pes();.        }
4350: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28  .        catch (
4360: 52 65 66 6c 65 63 74 69 6f 6e 2e 52 65 66 6c 65  Reflection.Refle
4370: 63 74 69 6f 6e 54 79 70 65 4c 6f 61 64 45 78 63  ctionTypeLoadExc
4380: 65 70 74 69 6f 6e 20 65 29 0a 20 20 20 20 20 20  eption e).      
4390: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 72    {.          ar
43a0: 54 79 70 65 73 20 3d 20 65 2e 54 79 70 65 73 3b  Types = e.Types;
43b0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
43c0: 20 20 20 20 69 6e 74 20 76 20 3d 20 61 72 54 79      int v = arTy
43d0: 70 65 73 2e 4c 65 6e 67 74 68 3b 0a 20 20 20 20  pes.Length;.    
43e0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 78 20 3d      for (int x =
43f0: 20 30 3b 20 78 20 3c 20 76 3b 20 78 2b 2b 29 0a   0; x < v; x++).
4400: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
4410: 20 20 20 20 69 66 20 28 61 72 54 79 70 65 73 5b      if (arTypes[
4420: 78 5d 20 3d 3d 20 6e 75 6c 6c 29 20 63 6f 6e 74  x] == null) cont
4430: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  inue;..         
4440: 20 6f 62 6a 65 63 74 5b 5d 20 61 72 41 74 74 20   object[] arAtt 
4450: 3d 20 61 72 54 79 70 65 73 5b 78 5d 2e 47 65 74  = arTypes[x].Get
4460: 43 75 73 74 6f 6d 41 74 74 72 69 62 75 74 65 73  CustomAttributes
4470: 28 74 79 70 65 6f 66 28 53 51 4c 69 74 65 46 75  (typeof(SQLiteFu
4480: 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65 29  nctionAttribute)
4490: 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  , false);.      
44a0: 20 20 20 20 69 6e 74 20 75 20 3d 20 61 72 41 74      int u = arAt
44b0: 74 2e 4c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20  t.Length;.      
44c0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 79 20 3d      for (int y =
44d0: 20 30 3b 20 79 20 3c 20 75 3b 20 79 2b 2b 29 0a   0; y < u; y++).
44e0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
44f0: 20 20 20 20 20 20 20 20 61 74 20 3d 20 61 72 41          at = arA
4500: 74 74 5b 79 5d 20 61 73 20 53 51 4c 69 74 65 46  tt[y] as SQLiteF
4510: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
4520: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
4530: 20 28 61 74 20 21 3d 20 6e 75 6c 6c 29 0a 20 20   (at != null).  
4540: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
4550: 20 20 20 20 20 20 20 20 20 20 61 74 2e 5f 69 6e            at._in
4560: 73 74 61 6e 63 65 54 79 70 65 20 3d 20 61 72 54  stanceType = arT
4570: 79 70 65 73 5b 78 5d 3b 0a 20 20 20 20 20 20 20  ypes[x];.       
4580: 20 20 20 20 20 20 20 5f 72 65 67 69 73 74 65 72         _register
4590: 65 64 46 75 6e 63 74 69 6f 6e 73 2e 41 64 64 28  edFunctions.Add(
45a0: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  at);.           
45b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
45c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
45d0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
45e0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
45f0: 20 20 20 2f 2f 2f 20 4d 61 6e 75 61 6c 20 6d 65     /// Manual me
4600: 74 68 6f 64 20 6f 66 20 72 65 67 69 73 74 65 72  thod of register
4610: 69 6e 67 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20  ing a function. 
4620: 20 54 68 65 20 74 79 70 65 20 6d 75 73 74 20 73   The type must s
4630: 74 69 6c 6c 20 68 61 76 65 20 74 68 65 20 53 51  till have the SQ
4640: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
4650: 69 62 75 74 65 73 20 69 6e 20 6f 72 64 65 72 20  ibutes in order 
4660: 74 6f 20 77 6f 72 6b 0a 20 20 20 20 2f 2f 2f 20  to work.    /// 
4670: 70 72 6f 70 65 72 6c 79 2c 20 62 75 74 20 74 68  properly, but th
4680: 69 73 20 69 73 20 61 20 77 6f 72 6b 61 72 6f 75  is is a workarou
4690: 6e 64 20 66 6f 72 20 74 68 65 20 43 6f 6d 70 61  nd for the Compa
46a0: 63 74 20 46 72 61 6d 65 77 6f 72 6b 20 77 68 65  ct Framework whe
46b0: 72 65 20 65 6e 75 6d 65 72 61 74 69 6e 67 20 61  re enumerating a
46c0: 73 73 65 6d 62 6c 69 65 73 20 69 73 20 6e 6f 74  ssemblies is not
46d0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
46e0: 72 74 65 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f  rted..    /// </
46f0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
4700: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74 79   <param name="ty
4710: 70 22 3e 54 68 65 20 74 79 70 65 20 6f 66 20 74  p">The type of t
4720: 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72  he function to r
4730: 65 67 69 73 74 65 72 3c 2f 70 61 72 61 6d 3e 0a  egister</param>.
4740: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
4750: 63 20 76 6f 69 64 20 52 65 67 69 73 74 65 72 46  c void RegisterF
4760: 75 6e 63 74 69 6f 6e 28 54 79 70 65 20 74 79 70  unction(Type typ
4770: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6f 62  ).    {.      ob
4780: 6a 65 63 74 5b 5d 20 61 72 41 74 74 20 3d 20 74  ject[] arAtt = t
4790: 79 70 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 72  yp.GetCustomAttr
47a0: 69 62 75 74 65 73 28 74 79 70 65 6f 66 28 53 51  ibutes(typeof(SQ
47b0: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 41 74 74 72  LiteFunctionAttr
47c0: 69 62 75 74 65 29 2c 20 66 61 6c 73 65 29 3b 0a  ibute), false);.
47d0: 20 20 20 20 20 20 69 6e 74 20 75 20 3d 20 61 72        int u = ar
47e0: 41 74 74 2e 4c 65 6e 67 74 68 3b 0a 20 20 20 20  Att.Length;.    
47f0: 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e    SQLiteFunction
4800: 41 74 74 72 69 62 75 74 65 20 61 74 3b 0a 0a 20  Attribute at;.. 
4810: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 79 20       for (int y 
4820: 3d 20 30 3b 20 79 20 3c 20 75 3b 20 79 2b 2b 29  = 0; y < u; y++)
4830: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
4840: 20 61 74 20 3d 20 61 72 41 74 74 5b 79 5d 20 61   at = arAtt[y] a
4850: 73 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  s SQLiteFunction
4860: 41 74 74 72 69 62 75 74 65 3b 0a 20 20 20 20 20  Attribute;.     
4870: 20 20 20 69 66 20 28 61 74 20 21 3d 20 6e 75 6c     if (at != nul
4880: 6c 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  l).        {.   
4890: 20 20 20 20 20 20 20 61 74 2e 5f 69 6e 73 74 61         at._insta
48a0: 6e 63 65 54 79 70 65 20 3d 20 74 79 70 3b 0a 20  nceType = typ;. 
48b0: 20 20 20 20 20 20 20 20 20 5f 72 65 67 69 73 74           _regist
48c0: 65 72 65 64 46 75 6e 63 74 69 6f 6e 73 2e 41 64  eredFunctions.Ad
48d0: 64 28 61 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  d(at);.        }
48e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
48f0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2f 2f 20 3c  endif..    /// <
4900: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
4910: 20 43 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74   Called by SQLit
4920: 65 42 61 73 65 20 64 65 72 69 76 65 64 20 63 6c  eBase derived cl
4930: 61 73 73 65 73 2c 20 74 68 69 73 20 66 75 6e 63  asses, this func
4940: 74 69 6f 6e 20 62 69 6e 64 73 20 61 6c 6c 20 75  tion binds all u
4950: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
4960: 74 69 6f 6e 73 20 74 6f 20 61 20 63 6f 6e 6e 65  tions to a conne
4970: 63 74 69 6f 6e 2e 0a 20 20 20 20 2f 2f 2f 20 49  ction..    /// I
4980: 74 20 69 73 20 64 6f 6e 65 20 74 68 69 73 20 77  t is done this w
4990: 61 79 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 75  ay so that all u
49a0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
49b0: 74 69 6f 6e 73 20 77 69 6c 6c 20 61 63 63 65 73  tions will acces
49c0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
49d0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 65 6e  sing the same en
49e0: 63 6f 64 69 6e 67 20 73 63 68 65 6d 65 0a 20 20  coding scheme.  
49f0: 20 20 2f 2f 2f 20 61 73 20 74 68 65 20 63 6f 6e    /// as the con
4a00: 6e 65 63 74 69 6f 6e 20 28 55 54 46 2d 38 20 6f  nection (UTF-8 o
4a10: 72 20 55 54 46 2d 31 36 29 2e 0a 20 20 20 20 2f  r UTF-16)..    /
4a20: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
4a30: 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a    /// <remarks>.
4a40: 20 20 20 20 2f 2f 2f 20 54 68 65 20 77 72 61 70      /// The wrap
4a50: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  per functions th
4a60: 61 74 20 69 6e 74 65 72 6f 70 20 77 69 74 68 20  at interop with 
4a70: 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 72 65 61  SQLite will crea
4a80: 74 65 20 61 20 75 6e 69 71 75 65 20 63 6f 6f 6b  te a unique cook
4a90: 65 20 76 61 6c 75 65 2c 20 77 68 69 63 68 20 69  e value, which i
4aa0: 6e 74 65 72 6e 61 6c 6c 79 20 69 73 20 61 20 70  nternally is a p
4ab0: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 20 20 2f 2f  ointer to.    //
4ac0: 2f 20 61 6c 6c 20 74 68 65 20 77 72 61 70 70 65  / all the wrappe
4ad0: 64 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  d callback funct
4ae0: 69 6f 6e 73 2e 20 20 54 68 65 20 69 6e 74 65 72  ions.  The inter
4af0: 6f 70 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  op function uses
4b00: 20 69 74 20 74 6f 20 6d 61 70 20 43 44 65 63 6c   it to map CDecl
4b10: 20 63 61 6c 6c 62 61 63 6b 73 20 74 6f 20 53 74   callbacks to St
4b20: 64 43 61 6c 6c 20 63 61 6c 6c 62 61 63 6b 73 2e  dCall callbacks.
4b30: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72  .    /// </remar
4b40: 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ks>.    /// <par
4b50: 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 62 61 73 65  am name="sqlbase
4b60: 22 3e 54 68 65 20 62 61 73 65 20 6f 62 6a 65 63  ">The base objec
4b70: 74 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 66  t on which the f
4b80: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 74 6f 20  unctions are to 
4b90: 62 69 6e 64 3c 2f 70 61 72 61 6d 3e 0a 20 20 20  bind</param>.   
4ba0: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65   /// <returns>Re
4bb0: 74 75 72 6e 73 20 61 6e 20 61 72 72 61 79 20 6f  turns an array o
4bc0: 66 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 69 63  f functions whic
4bd0: 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  h the connection
4be0: 20 6f 62 6a 65 63 74 20 73 68 6f 75 6c 64 20 72   object should r
4bf0: 65 74 61 69 6e 20 75 6e 74 69 6c 20 74 68 65 20  etain until the 
4c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c  connection is cl
4c10: 6f 73 65 64 2e 3c 2f 72 65 74 75 72 6e 73 3e 0a  osed.</returns>.
4c20: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61      internal sta
4c30: 74 69 63 20 53 51 4c 69 74 65 46 75 6e 63 74 69  tic SQLiteFuncti
4c40: 6f 6e 5b 5d 20 42 69 6e 64 46 75 6e 63 74 69 6f  on[] BindFunctio
4c50: 6e 73 28 53 51 4c 69 74 65 42 61 73 65 20 73 71  ns(SQLiteBase sq
4c60: 6c 62 61 73 65 29 0a 20 20 20 20 7b 0a 20 20 20  lbase).    {.   
4c70: 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f     SQLiteFunctio
4c80: 6e 20 66 3b 0a 20 20 20 20 20 20 4c 69 73 74 3c  n f;.      List<
4c90: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 3e 20  SQLiteFunction> 
4ca0: 6c 46 75 6e 63 74 69 6f 6e 73 20 3d 20 6e 65 77  lFunctions = new
4cb0: 20 4c 69 73 74 3c 53 51 4c 69 74 65 46 75 6e 63   List<SQLiteFunc
4cc0: 74 69 6f 6e 3e 28 29 3b 0a 0a 20 20 20 20 20 20  tion>();..      
4cd0: 66 6f 72 65 61 63 68 20 28 53 51 4c 69 74 65 46  foreach (SQLiteF
4ce0: 75 6e 63 74 69 6f 6e 41 74 74 72 69 62 75 74 65  unctionAttribute
4cf0: 20 70 72 20 69 6e 20 5f 72 65 67 69 73 74 65 72   pr in _register
4d00: 65 64 46 75 6e 63 74 69 6f 6e 73 29 0a 20 20 20  edFunctions).   
4d10: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 66 20 3d     {.        f =
4d20: 20 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e   (SQLiteFunction
4d30: 29 41 63 74 69 76 61 74 6f 72 2e 43 72 65 61 74  )Activator.Creat
4d40: 65 49 6e 73 74 61 6e 63 65 28 70 72 2e 5f 69 6e  eInstance(pr._in
4d50: 73 74 61 6e 63 65 54 79 70 65 29 3b 0a 20 20 20  stanceType);.   
4d60: 20 20 20 20 20 66 2e 5f 62 61 73 65 20 3d 20 73       f._base = s
4d70: 71 6c 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20  qlbase;.        
4d80: 66 2e 5f 49 6e 76 6f 6b 65 46 75 6e 63 20 3d 20  f._InvokeFunc = 
4d90: 28 70 72 2e 46 75 6e 63 54 79 70 65 20 3d 3d 20  (pr.FuncType == 
4da0: 46 75 6e 63 74 69 6f 6e 54 79 70 65 2e 53 63 61  FunctionType.Sca
4db0: 6c 61 72 29 20 3f 20 6e 65 77 20 53 51 4c 69 74  lar) ? new SQLit
4dc0: 65 43 61 6c 6c 62 61 63 6b 28 66 2e 53 63 61 6c  eCallback(f.Scal
4dd0: 61 72 43 61 6c 6c 62 61 63 6b 29 20 3a 20 6e 75  arCallback) : nu
4de0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 66 2e 5f 53  ll;.        f._S
4df0: 74 65 70 46 75 6e 63 20 3d 20 28 70 72 2e 46 75  tepFunc = (pr.Fu
4e00: 6e 63 54 79 70 65 20 3d 3d 20 46 75 6e 63 74 69  ncType == Functi
4e10: 6f 6e 54 79 70 65 2e 41 67 67 72 65 67 61 74 65  onType.Aggregate
4e20: 29 20 3f 20 6e 65 77 20 53 51 4c 69 74 65 43 61  ) ? new SQLiteCa
4e30: 6c 6c 62 61 63 6b 28 66 2e 53 74 65 70 43 61 6c  llback(f.StepCal
4e40: 6c 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0a 20  lback) : null;. 
4e50: 20 20 20 20 20 20 20 66 2e 5f 46 69 6e 61 6c 46         f._FinalF
4e60: 75 6e 63 20 3d 20 28 70 72 2e 46 75 6e 63 54 79  unc = (pr.FuncTy
4e70: 70 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79  pe == FunctionTy
4e80: 70 65 2e 41 67 67 72 65 67 61 74 65 29 20 3f 20  pe.Aggregate) ? 
4e90: 6e 65 77 20 53 51 4c 69 74 65 43 61 6c 6c 62 61  new SQLiteCallba
4ea0: 63 6b 28 66 2e 46 69 6e 61 6c 43 61 6c 6c 62 61  ck(f.FinalCallba
4eb0: 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0a 20 20 20 20  ck) : null;.    
4ec0: 20 20 20 20 66 2e 5f 43 6f 6d 70 61 72 65 46 75      f._CompareFu
4ed0: 6e 63 20 3d 20 28 70 72 2e 46 75 6e 63 54 79 70  nc = (pr.FuncTyp
4ee0: 65 20 3d 3d 20 46 75 6e 63 74 69 6f 6e 54 79 70  e == FunctionTyp
4ef0: 65 2e 43 6f 6c 6c 61 74 69 6f 6e 29 20 3f 20 6e  e.Collation) ? n
4f00: 65 77 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69  ew SQLiteCollati
4f10: 6f 6e 28 66 2e 43 6f 6d 70 61 72 65 43 61 6c 6c  on(f.CompareCall
4f20: 62 61 63 6b 29 20 3a 20 6e 75 6c 6c 3b 0a 0a 20  back) : null;.. 
4f30: 20 20 20 20 20 20 20 69 66 20 28 70 72 2e 46 75         if (pr.Fu
4f40: 6e 63 54 79 70 65 20 21 3d 20 46 75 6e 63 74 69  ncType != Functi
4f50: 6f 6e 54 79 70 65 2e 43 6f 6c 6c 61 74 69 6f 6e  onType.Collation
4f60: 29 0a 20 20 20 20 20 20 20 20 20 20 66 2e 5f 69  ).          f._i
4f70: 6e 74 65 72 6f 70 43 6f 6f 6b 69 65 20 3d 20 73  nteropCookie = s
4f80: 71 6c 62 61 73 65 2e 43 72 65 61 74 65 46 75 6e  qlbase.CreateFun
4f90: 63 74 69 6f 6e 28 70 72 2e 4e 61 6d 65 2c 20 70  ction(pr.Name, p
4fa0: 72 2e 41 72 67 75 6d 65 6e 74 73 2c 20 66 2e 5f  r.Arguments, f._
4fb0: 49 6e 76 6f 6b 65 46 75 6e 63 2c 20 66 2e 5f 53  InvokeFunc, f._S
4fc0: 74 65 70 46 75 6e 63 2c 20 66 2e 5f 46 69 6e 61  tepFunc, f._Fina
4fd0: 6c 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  lFunc);.        
4fe0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 66  else.          f
4ff0: 2e 5f 69 6e 74 65 72 6f 70 43 6f 6f 6b 69 65 20  ._interopCookie 
5000: 3d 20 73 71 6c 62 61 73 65 2e 43 72 65 61 74 65  = sqlbase.Create
5010: 43 6f 6c 6c 61 74 69 6f 6e 28 70 72 2e 4e 61 6d  Collation(pr.Nam
5020: 65 2c 20 66 2e 5f 43 6f 6d 70 61 72 65 46 75 6e  e, f._CompareFun
5030: 63 29 3b 0a 0a 0a 20 20 20 20 20 20 20 20 6c 46  c);...        lF
5040: 75 6e 63 74 69 6f 6e 73 2e 41 64 64 28 66 29 3b  unctions.Add(f);
5050: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5060: 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 5b 5d  SQLiteFunction[]
5070: 20 61 72 46 75 6e 63 74 69 6f 6e 73 20 3d 20 6e   arFunctions = n
5080: 65 77 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  ew SQLiteFunctio
5090: 6e 5b 6c 46 75 6e 63 74 69 6f 6e 73 2e 43 6f 75  n[lFunctions.Cou
50a0: 6e 74 5d 3b 0a 20 20 20 20 20 20 6c 46 75 6e 63  nt];.      lFunc
50b0: 74 69 6f 6e 73 2e 43 6f 70 79 54 6f 28 61 72 46  tions.CopyTo(arF
50c0: 75 6e 63 74 69 6f 6e 73 2c 20 30 29 3b 0a 0a 20  unctions, 0);.. 
50d0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 46 75       return arFu
50e0: 6e 63 74 69 6f 6e 73 3b 0a 20 20 20 20 7d 0a 0a  nctions;.    }..
50f0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
5100: 3e 0a 20 20 20 20 2f 2f 2f 20 49 73 73 75 65 64  >.    /// Issued
5110: 20 61 66 74 65 72 20 74 68 65 20 62 61 73 65 20   after the base 
5120: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c  connection is cl
5130: 6f 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  osed, this funct
5140: 69 6f 6e 20 63 6c 65 61 6e 73 20 75 70 20 61 6c  ion cleans up al
5150: 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  l user-defined f
5160: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 64 69 73  unctions and dis
5170: 70 6f 73 65 73 20 6f 66 20 74 68 65 6d 2e 0a 20  poses of them.. 
5180: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
5190: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61 72  >.    /// <remar
51a0: 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 43 6c 65 61  ks>.    /// Clea
51b0: 6e 69 6e 67 20 75 70 20 68 65 72 65 20 69 73 20  ning up here is 
51c0: 64 6f 6e 65 20 6d 61 69 6e 6c 79 20 62 65 63 61  done mainly beca
51d0: 75 73 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72  use of the inter
51e0: 6f 70 20 77 72 61 70 70 65 72 2e 20 20 49 74 20  op wrapper.  It 
51f0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
5200: 20 74 6f 20 68 6f 6c 64 20 61 20 72 65 66 65 72   to hold a refer
5210: 65 6e 63 65 20 74 6f 20 61 6c 6c 20 74 68 65 0a  ence to all the.
5220: 20 20 20 20 2f 2f 2f 20 64 65 6c 65 67 61 74 65      /// delegate
5230: 73 2c 20 61 6e 64 20 6e 6f 77 20 6d 75 73 74 20  s, and now must 
5240: 66 72 65 65 20 74 68 61 74 20 6d 65 6d 6f 72 79  free that memory
5250: 2e 0a 20 20 20 20 2f 2f 2f 20 46 72 65 65 69 6e  ..    /// Freein
5260: 67 20 69 73 20 64 6f 6e 65 20 61 66 74 65 72 20  g is done after 
5270: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
5280: 73 20 63 6c 6f 73 65 64 20 74 6f 20 65 6e 73 75  s closed to ensu
5290: 72 65 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 73 20  re no callbacks 
52a0: 67 65 74 20 68 69 74 20 61 66 74 65 72 20 77 65  get hit after we
52b0: 27 76 65 20 66 72 65 65 64 20 74 68 65 20 63 6f  've freed the co
52c0: 6f 6b 69 65 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f  okie..    /// </
52d0: 72 65 6d 61 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f  remarks>.    ///
52e0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 71   <param name="sq
52f0: 6c 62 61 73 65 22 3e 54 68 65 20 62 61 73 65 20  lbase">The base 
5300: 53 51 4c 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f  SQLite connectio
5310: 6e 20 6f 62 6a 65 63 74 3c 2f 70 61 72 61 6d 3e  n object</param>
5320: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
5330: 6e 61 6d 65 3d 22 61 72 22 3e 41 6e 20 61 72 72  name="ar">An arr
5340: 61 79 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  ay of user-defin
5350: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72  ed functions for
5360: 20 74 68 69 73 20 6f 62 6a 65 63 74 3c 2f 70 61   this object</pa
5370: 72 61 6d 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61  ram>.    interna
5380: 6c 20 73 74 61 74 69 63 20 76 6f 69 64 20 55 6e  l static void Un
5390: 62 69 6e 64 46 75 6e 63 74 69 6f 6e 73 28 53 51  bindFunctions(SQ
53a0: 4c 69 74 65 42 61 73 65 20 73 71 6c 62 61 73 65  LiteBase sqlbase
53b0: 2c 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  , SQLiteFunction
53c0: 5b 5d 20 61 72 29 0a 20 20 20 20 7b 0a 20 20 20  [] ar).    {.   
53d0: 20 20 20 69 66 20 28 61 72 20 3d 3d 20 6e 75 6c     if (ar == nul
53e0: 6c 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  l) return;..    
53f0: 20 20 69 6e 74 20 78 20 3d 20 61 72 2e 4c 65 6e    int x = ar.Len
5400: 67 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 20 28  gth;.      for (
5410: 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 78  int n = 0; n < x
5420: 3b 20 6e 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20  ; n++).      {. 
5430: 20 20 20 20 20 20 20 73 71 6c 62 61 73 65 2e 46         sqlbase.F
5440: 72 65 65 46 75 6e 63 74 69 6f 6e 28 61 72 5b 6e  reeFunction(ar[n
5450: 5d 2e 5f 69 6e 74 65 72 6f 70 43 6f 6f 6b 69 65  ]._interopCookie
5460: 29 3b 0a 20 20 20 20 20 20 20 20 61 72 5b 6e 5d  );.        ar[n]
5470: 2e 44 69 73 70 6f 73 65 28 29 3b 0a 20 20 20 20  .Dispose();.    
5480: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.