System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7c98f1696709e04f06e232981d59e66e9e934c27:


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 52 75 6e 74 69 6d 65 2e 49 6e 74 65 72 6f 70  .Runtime.Interop
0170: 53 65 72 76 69 63 65 73 3b 0a 20 20 75 73 69 6e  Services;.  usin
0180: 67 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74  g System.Collect
0190: 69 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0a 0a 20  ions.Generic;.. 
01a0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
01b0: 20 2f 2f 2f 20 54 68 69 73 20 63 6c 61 73 73 20   /// This class 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 53 51 4c 69 74  implements SQLit
01d0: 65 42 61 73 65 20 63 6f 6d 70 6c 65 74 65 6c 79  eBase completely
01e0: 2c 20 61 6e 64 20 69 73 20 74 68 65 20 67 75 74  , and is the gut
01f0: 73 20 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68  s of the code th
0200: 61 74 20 69 6e 74 65 72 6f 70 27 73 20 53 51 4c  at interop's SQL
0210: 69 74 65 20 77 69 74 68 20 2e 4e 45 54 0a 20 20  ite with .NET.  
0220: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
0230: 20 69 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73 20   internal class 
0240: 53 51 4c 69 74 65 33 20 3a 20 53 51 4c 69 74 65  SQLite3 : SQLite
0250: 42 61 73 65 0a 20 20 7b 0a 20 20 20 20 2f 2f 2f  Base.  {.    ///
0260: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
0270: 2f 2f 20 54 68 65 20 6f 70 61 71 75 65 20 70 6f  // The opaque po
0280: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 74  inter returned t
0290: 6f 20 75 73 20 62 79 20 74 68 65 20 73 71 6c 69  o us by the sqli
02a0: 74 65 20 70 72 6f 76 69 64 65 72 0a 20 20 20 20  te provider.    
02b0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
02c0: 20 20 20 70 72 6f 74 65 63 74 65 64 20 69 6e 74     protected int
02d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 73                _s
02e0: 71 6c 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ql;.    /// <sum
02f0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68  mary>.    /// Th
0300: 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  e user-defined f
0310: 75 6e 63 74 69 6f 6e 73 20 72 65 67 69 73 74 65  unctions registe
0320: 72 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6e 6e  red on this conn
0330: 65 63 74 69 6f 6e 0a 20 20 20 20 2f 2f 2f 20 3c  ection.    /// <
0340: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72  /summary>.    pr
0350: 6f 74 65 63 74 65 64 20 53 51 4c 69 74 65 46 75  otected SQLiteFu
0360: 6e 63 74 69 6f 6e 5b 5d 20 5f 66 75 6e 63 74 69  nction[] _functi
0370: 6f 6e 73 41 72 72 61 79 3b 0a 0a 20 20 20 20 69  onsArray;..    i
0380: 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 33 28  nternal SQLite3(
0390: 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 66  DateTimeFormat f
03a0: 6d 74 29 0a 20 20 20 20 20 20 3a 20 62 61 73 65  mt).      : base
03b0: 28 66 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  (fmt).    {.    
03c0: 20 20 5f 73 71 6c 20 3d 20 30 3b 0a 20 20 20 20    _sql = 0;.    
03d0: 20 20 5f 66 75 6e 63 74 69 6f 6e 73 41 72 72 61    _functionsArra
03e0: 79 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  y = null;.    }.
03f0: 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 6f  .    protected o
0400: 76 65 72 72 69 64 65 20 76 6f 69 64 20 44 69 73  verride void Dis
0410: 70 6f 73 65 28 62 6f 6f 6c 20 62 44 69 73 70 6f  pose(bool bDispo
0420: 73 69 6e 67 29 0a 20 20 20 20 7b 0a 20 20 20 20  sing).    {.    
0430: 20 20 43 6c 6f 73 65 28 29 3b 0a 20 20 20 20 7d    Close();.    }
0440: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
0450: 76 65 72 72 69 64 65 20 76 6f 69 64 20 43 6c 6f  verride void Clo
0460: 73 65 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  se().    {.     
0470: 20 69 66 20 28 5f 73 71 6c 20 21 3d 20 30 29 0a   if (_sql != 0).
0480: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0490: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
04a0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
04b0: 74 65 33 5f 63 6c 6f 73 65 5f 69 6e 74 65 72 6f  te3_close_intero
04c0: 70 28 5f 73 71 6c 29 3b 0a 20 20 20 20 20 20 20  p(_sql);.       
04d0: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
04e0: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
04f0: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
0500: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
0510: 20 20 20 20 20 53 51 4c 69 74 65 46 75 6e 63 74       SQLiteFunct
0520: 69 6f 6e 2e 55 6e 62 69 6e 64 46 75 6e 63 74 69  ion.UnbindFuncti
0530: 6f 6e 73 28 74 68 69 73 2c 20 5f 66 75 6e 63 74  ons(this, _funct
0540: 69 6f 6e 73 41 72 72 61 79 29 3b 0a 20 20 20 20  ionsArray);.    
0550: 20 20 7d 0a 20 20 20 20 20 20 5f 73 71 6c 20 3d    }.      _sql =
0560: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
0570: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
0580: 20 76 6f 69 64 20 43 61 6e 63 65 6c 28 29 0a 20   void Cancel(). 
0590: 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66     {.      Unsaf
05a0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
05b0: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
05c0: 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 29 3b 0a  _interop(_sql);.
05d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
05e0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
05f0: 69 6e 67 20 56 65 72 73 69 6f 6e 0a 20 20 20 20  ing Version.    
0600: 7b 0a 20 20 20 20 20 20 67 65 74 0a 20 20 20 20  {.      get.    
0610: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
0620: 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 72 65 74  len;.        ret
0630: 75 72 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73  urn ToString(Uns
0640: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
0650: 2e 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  .sqlite3_libvers
0660: 69 6f 6e 5f 69 6e 74 65 72 6f 70 28 6f 75 74 20  ion_interop(out 
0670: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  len), len);.    
0680: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
0690: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
06a0: 20 69 6e 74 20 43 68 61 6e 67 65 73 0a 20 20 20   int Changes.   
06b0: 20 7b 0a 20 20 20 20 20 20 67 65 74 0a 20 20 20   {.      get.   
06c0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74     {.        ret
06d0: 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65  urn UnsafeNative
06e0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
06f0: 63 68 61 6e 67 65 73 5f 69 6e 74 65 72 6f 70 28  changes_interop(
0700: 5f 73 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _sql);.      }. 
0710: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
0720: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
0730: 20 4f 70 65 6e 28 73 74 72 69 6e 67 20 73 74 72   Open(string str
0740: 46 69 6c 65 6e 61 6d 65 29 0a 20 20 20 20 7b 0a  Filename).    {.
0750: 20 20 20 20 20 20 69 66 20 28 5f 73 71 6c 20 21        if (_sql !
0760: 3d 20 30 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  = 0) return;.   
0770: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
0780: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
0790: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e 74 65  qlite3_open_inte
07a0: 72 6f 70 28 54 6f 55 54 46 38 28 73 74 72 46 69  rop(ToUTF8(strFi
07b0: 6c 65 6e 61 6d 65 29 2c 20 6f 75 74 20 5f 73 71  lename), out _sq
07c0: 6c 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  l);.      if (n 
07d0: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
07e0: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
07f0: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
0800: 72 28 29 29 3b 0a 0a 20 20 20 20 20 20 5f 66 75  r());..      _fu
0810: 6e 63 74 69 6f 6e 73 41 72 72 61 79 20 3d 20 53  nctionsArray = S
0820: 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e 2e 42 69  QLiteFunction.Bi
0830: 6e 64 46 75 6e 63 74 69 6f 6e 73 28 74 68 69 73  ndFunctions(this
0840: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
0850: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
0860: 76 6f 69 64 20 53 65 74 54 69 6d 65 6f 75 74 28  void SetTimeout(
0870: 69 6e 74 20 6e 54 69 6d 65 6f 75 74 4d 53 29 0a  int nTimeoutMS).
0880: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
0890: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
08a0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
08b0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 5f 69 6e 74  busy_timeout_int
08c0: 65 72 6f 70 28 5f 73 71 6c 2c 20 6e 54 69 6d 65  erop(_sql, nTime
08d0: 6f 75 74 4d 53 29 3b 0a 20 20 20 20 20 20 69 66  outMS);.      if
08e0: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
08f0: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
0900: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
0910: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
0920: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
0930: 65 72 72 69 64 65 20 76 6f 69 64 20 45 78 65 63  erride void Exec
0940: 75 74 65 28 73 74 72 69 6e 67 20 73 74 72 53 71  ute(string strSq
0950: 6c 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 49  l).    {.      I
0960: 6e 74 50 74 72 20 70 3b 0a 20 20 20 20 20 20 73  ntPtr p;.      s
0970: 74 72 69 6e 67 20 73 74 72 20 3d 20 73 74 72 53  tring str = strS
0980: 71 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ql;.      int le
0990: 6e 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  n;..      int n 
09a0: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
09b0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 65 78  thods.sqlite3_ex
09c0: 65 63 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  ec_interop(_sql,
09d0: 20 54 6f 55 54 46 38 28 73 74 72 53 71 6c 29 2c   ToUTF8(strSql),
09e0: 20 30 2c 20 30 2c 20 6f 75 74 20 70 2c 20 6f 75   0, 0, out p, ou
09f0: 74 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  t len);.      if
0a00: 20 28 70 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65   (p != IntPtr.Ze
0a10: 72 6f 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ro).      {.    
0a20: 20 20 20 20 73 74 72 20 3d 20 54 6f 53 74 72 69      str = ToStri
0a30: 6e 67 28 70 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  ng(p, len);.    
0a40: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
0a50: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
0a60: 66 72 65 65 5f 69 6e 74 65 72 6f 70 28 70 29 3b  free_interop(p);
0a70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
0a80: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
0a90: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
0aa0: 69 6f 6e 28 6e 2c 20 73 74 72 29 3b 0a 20 20 20  ion(n, str);.   
0ab0: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
0ac0: 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 53   override bool S
0ad0: 74 65 70 28 53 51 4c 69 74 65 53 74 61 74 65 6d  tep(SQLiteStatem
0ae0: 65 6e 74 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a  ent stmt).    {.
0af0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
0b00: 20 20 20 6c 6f 6e 67 20 64 77 74 69 63 6b 20 3d     long dwtick =
0b10: 20 30 3b 0a 20 20 20 20 20 20 52 61 6e 64 6f 6d   0;.      Random
0b20: 20 72 6e 64 20 3d 20 6e 75 6c 6c 3b 0a 0a 20 20   rnd = null;..  
0b30: 20 20 20 20 77 68 69 6c 65 20 28 74 72 75 65 29      while (true)
0b40: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
0b50: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
0b60: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
0b70: 5f 73 74 65 70 5f 69 6e 74 65 72 6f 70 28 73 74  _step_interop(st
0b80: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29  mt._sqlite_stmt)
0b90: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e  ;..        if (n
0ba0: 20 3d 3d 20 31 30 30 29 20 72 65 74 75 72 6e 20   == 100) return 
0bb0: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  true;.        if
0bc0: 20 28 6e 20 3d 3d 20 31 30 31 29 20 72 65 74 75   (n == 101) retu
0bd0: 72 6e 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20 20  rn false;..     
0be0: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 0a 20 20     if (n > 0).  
0bf0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0c00: 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20    int r;.       
0c10: 20 20 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20 6f     // An error o
0c20: 63 63 75 72 72 65 64 2c 20 61 74 74 65 6d 70 74  ccurred, attempt
0c30: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
0c40: 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  atement.  If the
0c50: 20 72 65 73 65 74 20 77 6f 72 6b 65 64 20 62 65   reset worked be
0c60: 63 61 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  cause the.      
0c70: 20 20 20 20 2f 2f 20 73 63 68 65 6d 61 20 68 61      // schema ha
0c80: 73 20 63 68 61 6e 67 65 64 2c 20 72 65 2d 74 72  s changed, re-tr
0c90: 79 20 74 68 65 20 73 74 65 70 20 61 67 61 69 6e  y the step again
0ca0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 72  .  Otherwise thr
0cb0: 6f 77 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ow the original 
0cc0: 65 72 72 6f 72 2e 0a 0a 20 20 20 20 20 20 20 20  error...        
0cd0: 20 20 72 20 3d 20 52 65 73 65 74 28 73 74 6d 74    r = Reset(stmt
0ce0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
0cf0: 20 28 72 20 3d 3d 20 30 29 0a 20 20 20 20 20 20   (r == 0).      
0d00: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
0d10: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
0d20: 6e 2c 20 22 69 6e 20 53 74 65 70 28 29 22 29 3b  n, "in Step()");
0d30: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
0d40: 69 66 20 28 72 20 3d 3d 20 36 20 26 26 20 73 74  if (r == 6 && st
0d50: 6d 74 2e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 6e  mt._command != n
0d60: 75 6c 6c 29 20 2f 2f 20 53 51 4c 49 54 45 5f 4c  ull) // SQLITE_L
0d70: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 20 20 20  OCKED.          
0d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
0d90: 20 4b 65 65 70 20 74 72 79 69 6e 67 0a 20 20 20   Keep trying.   
0da0: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 77 74           if (dwt
0db0: 69 63 6b 20 3d 3d 20 30 29 20 2f 2f 20 46 69 72  ick == 0) // Fir
0dc0: 73 74 20 74 69 6d 65 20 77 65 27 76 65 20 65 6e  st time we've en
0dd0: 63 6f 75 6e 74 65 72 65 64 20 74 68 65 20 6c 6f  countered the lo
0de0: 63 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  ck.            {
0df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
0e00: 77 74 69 63 6b 20 3d 20 44 61 74 65 54 69 6d 65  wtick = DateTime
0e10: 2e 4e 6f 77 2e 54 69 63 6b 73 20 2b 20 28 73 74  .Now.Ticks + (st
0e20: 6d 74 2e 5f 63 6f 6d 6d 61 6e 64 2e 5f 63 6f 6d  mt._command._com
0e30: 6d 61 6e 64 54 69 6d 65 6f 75 74 20 2a 20 31 30  mandTimeout * 10
0e40: 30 30 30 30 30 30 29 3b 0a 20 20 20 20 20 20 20  000000);.       
0e50: 20 20 20 20 20 20 20 72 6e 64 20 3d 20 6e 65 77         rnd = new
0e60: 20 52 61 6e 64 6f 6d 28 29 3b 0a 20 20 20 20 20   Random();.     
0e70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0e80: 20 20 20 20 20 2f 2f 20 49 66 20 77 65 27 76 65       // If we've
0e90: 20 65 78 63 65 65 64 65 64 20 74 68 65 20 63 6f   exceeded the co
0ea0: 6d 6d 61 6e 64 27 73 20 74 69 6d 65 6f 75 74 2c  mmand's timeout,
0eb0: 20 67 69 76 65 20 75 70 20 61 6e 64 20 74 68 72   give up and thr
0ec0: 6f 77 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20  ow an error.    
0ed0: 20 20 20 20 20 20 20 20 69 66 20 28 44 61 74 65          if (Date
0ee0: 54 69 6d 65 2e 4e 6f 77 2e 54 69 63 6b 73 20 2d  Time.Now.Ticks -
0ef0: 20 64 77 74 69 63 6b 20 3e 20 30 29 0a 20 20 20   dwtick > 0).   
0f00: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
0f10: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
0f20: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
0f30: 6f 6e 28 72 2c 20 22 69 6e 20 53 74 65 70 28 29  on(r, "in Step()
0f40: 20 2d 20 74 69 6d 65 6f 75 74 22 29 3b 0a 20 20   - timeout");.  
0f50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0f60: 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20          else.   
0f70: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
0f80: 20 20 20 20 20 20 20 20 20 2f 2f 20 4f 74 68 65           // Othe
0f90: 72 77 69 73 65 20 73 6c 65 65 70 20 66 6f 72 20  rwise sleep for 
0fa0: 61 20 72 61 6e 64 6f 6d 20 61 6d 6f 75 6e 74 20  a random amount 
0fb0: 6f 66 20 74 69 6d 65 20 75 70 20 74 6f 20 32 35  of time up to 25
0fc0: 30 6d 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  0ms.            
0fd0: 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65    UnsafeNativeMe
0fe0: 74 68 6f 64 73 2e 53 6c 65 65 70 28 28 75 69 6e  thods.Sleep((uin
0ff0: 74 29 72 6e 64 2e 4e 65 78 74 28 31 2c 20 32 35  t)rnd.Next(1, 25
1000: 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0));.           
1010: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
1020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1030: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  }.    }..    int
1040: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76  ernal override v
1050: 6f 69 64 20 46 69 6e 61 6c 69 7a 65 28 53 51 4c  oid Finalize(SQL
1060: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
1070: 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  t).    {.      i
1080: 66 20 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  f (stmt._sqlite_
1090: 73 74 6d 74 20 3e 20 30 29 0a 20 20 20 20 20 20  stmt > 0).      
10a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
10b0: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
10c0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 66 69  thods.sqlite3_fi
10d0: 6e 61 6c 69 7a 65 5f 69 6e 74 65 72 6f 70 28 73  nalize_interop(s
10e0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
10f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e  );.        if (n
1100: 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20   > 0) throw new 
1110: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
1120: 6e 2c 20 22 69 6e 20 46 69 6e 61 6c 69 7a 65 28  n, "in Finalize(
1130: 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )");.      }.   
1140: 20 20 20 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f     stmt._sqlite_
1150: 73 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  stmt = 0;.    }.
1160: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
1170: 65 72 72 69 64 65 20 69 6e 74 20 52 65 73 65 74  erride int Reset
1180: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
1190: 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20   stmt).    {.   
11a0: 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20     int n;..     
11b0: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
11c0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
11d0: 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70 28 73  _reset_interop(s
11e0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
11f0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 49 66 20  );..      // If 
1200: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
1210: 65 64 2c 20 74 72 79 20 61 6e 64 20 72 65 2d 70  ed, try and re-p
1220: 72 65 70 61 72 65 20 69 74 0a 20 20 20 20 20 20  repare it.      
1230: 69 66 20 28 6e 20 3d 3d 20 31 37 29 20 2f 2f 20  if (n == 17) // 
1240: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20  SQLITE_SCHEMA.  
1250: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f      {.        //
1260: 20 52 65 63 72 65 61 74 65 20 61 20 64 75 6d 6d   Recreate a dumm
1270: 79 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  y statement.    
1280: 20 20 20 20 69 6e 74 20 6e 63 20 3d 20 30 3b 0a      int nc = 0;.
1290: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73          string s
12a0: 74 72 3b 0a 20 20 20 20 20 20 20 20 75 73 69 6e  tr;.        usin
12b0: 67 20 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  g (SQLiteStateme
12c0: 6e 74 20 74 6d 70 20 3d 20 50 72 65 70 61 72 65  nt tmp = Prepare
12d0: 28 73 74 6d 74 2e 5f 73 71 6c 53 74 61 74 65 6d  (stmt._sqlStatem
12e0: 65 6e 74 2c 20 72 65 66 20 6e 63 2c 20 6f 75 74  ent, ref nc, out
12f0: 20 73 74 72 29 29 0a 20 20 20 20 20 20 20 20 7b   str)).        {
1300: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 69  .          // Fi
1310: 6e 61 6c 69 7a 65 20 74 68 65 20 65 78 69 73 74  nalize the exist
1320: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ing statement.  
1330: 20 20 20 20 20 20 20 20 46 69 6e 61 6c 69 7a 65          Finalize
1340: 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 20  (stmt);..       
1350: 20 20 20 2f 2f 20 52 65 61 73 73 69 67 6e 20 61     // Reassign a
1360: 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 70   new statement p
1370: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 6c  ointer to the ol
1380: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  d statement and 
1390: 63 6c 65 61 72 20 74 68 65 20 74 65 6d 70 6f 72  clear the tempor
13a0: 61 72 79 20 6f 6e 65 0a 20 20 20 20 20 20 20 20  ary one.        
13b0: 20 20 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73    stmt._sqlite_s
13c0: 74 6d 74 20 3d 20 74 6d 70 2e 5f 73 71 6c 69 74  tmt = tmp._sqlit
13d0: 65 5f 73 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  e_stmt;.        
13e0: 20 20 74 6d 70 2e 5f 73 71 6c 69 74 65 5f 73 74    tmp._sqlite_st
13f0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  mt = 0;..       
1400: 20 20 20 2f 2f 20 52 65 61 70 70 6c 79 20 70 61     // Reapply pa
1410: 72 61 6d 65 74 65 72 73 0a 20 20 20 20 20 20 20  rameters.       
1420: 20 20 20 73 74 6d 74 2e 42 69 6e 64 50 61 72 61     stmt.BindPara
1430: 6d 65 74 65 72 73 28 29 3b 0a 20 20 20 20 20 20  meters();.      
1440: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
1450: 72 6e 20 2d 31 3b 20 2f 2f 20 52 65 73 65 74 20  rn -1; // Reset 
1460: 77 61 73 20 4f 4b 2c 20 77 69 74 68 20 73 63 68  was OK, with sch
1470: 65 6d 61 20 63 68 61 6e 67 65 0a 20 20 20 20 20  ema change.     
1480: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
1490: 20 28 6e 20 3d 3d 20 36 29 20 2f 2f 20 53 51 4c   (n == 6) // SQL
14a0: 49 54 45 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  ITE_LOCKED.     
14b0: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 0a 20 20     return n;..  
14c0: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 0a 20      if (n > 0). 
14d0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
14e0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
14f0: 28 6e 2c 20 22 69 6e 20 52 65 73 65 74 28 29 22  (n, "in Reset()"
1500: 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
1510: 20 30 3b 20 2f 2f 20 57 65 20 72 65 73 65 74 20   0; // We reset 
1520: 4f 4b 2c 20 6e 6f 20 73 63 68 65 6d 61 20 63 68  OK, no schema ch
1530: 61 6e 67 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20  anges.    }..   
1540: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
1550: 64 65 20 73 74 72 69 6e 67 20 53 51 4c 69 74 65  de string SQLite
1560: 4c 61 73 74 45 72 72 6f 72 28 29 0a 20 20 20 20  LastError().    
1570: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
1580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f  .      return To
1590: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
15a0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
15b0: 65 33 5f 65 72 72 6d 73 67 5f 69 6e 74 65 72 6f  e3_errmsg_intero
15c0: 70 28 5f 73 71 6c 2c 20 6f 75 74 20 6c 65 6e 29  p(_sql, out len)
15d0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  , len);.    }.. 
15e0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
15f0: 72 69 64 65 20 53 51 4c 69 74 65 53 74 61 74 65  ride SQLiteState
1600: 6d 65 6e 74 20 50 72 65 70 61 72 65 28 73 74 72  ment Prepare(str
1610: 69 6e 67 20 73 74 72 53 71 6c 2c 20 72 65 66 20  ing strSql, ref 
1620: 69 6e 74 20 6e 50 61 72 61 6d 53 74 61 72 74 2c  int nParamStart,
1630: 20 6f 75 74 20 73 74 72 69 6e 67 20 73 74 72 52   out string strR
1640: 65 6d 61 69 6e 29 0a 20 20 20 20 7b 0a 20 20 20  emain).    {.   
1650: 20 20 20 69 6e 74 20 73 74 6d 74 3b 0a 20 20 20     int stmt;.   
1660: 20 20 20 49 6e 74 50 74 72 20 70 74 72 3b 0a 20     IntPtr ptr;. 
1670: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20       int len;.. 
1680: 20 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20       byte[] b = 
1690: 54 6f 55 54 46 38 28 73 74 72 53 71 6c 29 3b 0a  ToUTF8(strSql);.
16a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
16b0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
16c0: 64 73 2e 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ds.sqlite3_prepa
16d0: 72 65 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  re_interop(_sql,
16e0: 20 62 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20 31   b, b.Length - 1
16f0: 2c 20 6f 75 74 20 73 74 6d 74 2c 20 6f 75 74 20  , out stmt, out 
1700: 70 74 72 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a 20  ptr, out len);. 
1710: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
1720: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
1730: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 22 69 6e  Exception(n, "in
1740: 20 50 72 65 70 61 72 65 28 29 22 29 3b 0a 0a 20   Prepare()");.. 
1750: 20 20 20 20 20 73 74 72 52 65 6d 61 69 6e 20 3d       strRemain =
1760: 20 54 6f 53 74 72 69 6e 67 28 70 74 72 2c 20 6c   ToString(ptr, l
1770: 65 6e 29 3b 0a 0a 20 20 20 20 20 20 53 51 4c 69  en);..      SQLi
1780: 74 65 53 74 61 74 65 6d 65 6e 74 20 63 6d 64 20  teStatement cmd 
1790: 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 69 66  = null;.      if
17a0: 20 28 73 74 6d 74 20 3e 20 30 29 20 63 6d 64 20   (stmt > 0) cmd 
17b0: 3d 20 6e 65 77 20 53 51 4c 69 74 65 53 74 61 74  = new SQLiteStat
17c0: 65 6d 65 6e 74 28 74 68 69 73 2c 20 73 74 6d 74  ement(this, stmt
17d0: 2c 20 73 74 72 53 71 6c 2e 53 75 62 73 74 72 69  , strSql.Substri
17e0: 6e 67 28 30 2c 20 73 74 72 53 71 6c 2e 4c 65 6e  ng(0, strSql.Len
17f0: 67 74 68 20 2d 20 73 74 72 52 65 6d 61 69 6e 2e  gth - strRemain.
1800: 4c 65 6e 67 74 68 29 2c 20 72 65 66 20 6e 50 61  Length), ref nPa
1810: 72 61 6d 53 74 61 72 74 29 3b 0a 0a 20 20 20 20  ramStart);..    
1820: 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0a 20 20    return cmd;.  
1830: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
1840: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
1850: 42 69 6e 64 5f 44 6f 75 62 6c 65 28 53 51 4c 69  Bind_Double(SQLi
1860: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
1870: 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 64 6f 75  , int index, dou
1880: 62 6c 65 20 76 61 6c 75 65 29 0a 20 20 20 20 7b  ble value).    {
1890: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
18a0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
18b0: 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ds.sqlite3_bind_
18c0: 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73  double_interop(s
18d0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
18e0: 2c 20 69 6e 64 65 78 2c 20 72 65 66 20 76 61 6c  , index, ref val
18f0: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e  ue);.      if (n
1900: 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20   > 0) throw new 
1910: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
1920: 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  n, SQLiteLastErr
1930: 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  or());.    }..  
1940: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
1950: 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 49 6e  ide void Bind_In
1960: 74 33 32 28 53 51 4c 69 74 65 53 74 61 74 65 6d  t32(SQLiteStatem
1970: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
1980: 64 65 78 2c 20 69 6e 74 20 76 61 6c 75 65 29 0a  dex, int value).
1990: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
19a0: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
19b0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
19c0: 62 69 6e 64 5f 69 6e 74 5f 69 6e 74 65 72 6f 70  bind_int_interop
19d0: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
19e0: 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75 65  mt, index, value
19f0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  );.      if (n >
1a00: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
1a10: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
1a20: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
1a30: 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ());.    }..    
1a40: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
1a50: 65 20 76 6f 69 64 20 42 69 6e 64 5f 49 6e 74 36  e void Bind_Int6
1a60: 34 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  4(SQLiteStatemen
1a70: 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65  t stmt, int inde
1a80: 78 2c 20 6c 6f 6e 67 20 76 61 6c 75 65 29 0a 20  x, long value). 
1a90: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e     {.      int n
1aa0: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
1ab0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62  ethods.sqlite3_b
1ac0: 69 6e 64 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f  ind_int64_intero
1ad0: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
1ae0: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 72 65 66 20  tmt, index, ref 
1af0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  value);.      if
1b00: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
1b10: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
1b20: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
1b30: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
1b40: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
1b50: 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64  erride void Bind
1b60: 5f 54 65 78 74 28 53 51 4c 69 74 65 53 74 61 74  _Text(SQLiteStat
1b70: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
1b80: 69 6e 64 65 78 2c 20 73 74 72 69 6e 67 20 76 61  index, string va
1b90: 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  lue).    {.     
1ba0: 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54   byte[] b = ToUT
1bb0: 46 38 28 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  F8(value);.     
1bc0: 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e   int n = UnsafeN
1bd0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
1be0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 5f 69  ite3_bind_text_i
1bf0: 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c  nterop(stmt._sql
1c00: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c  ite_stmt, index,
1c10: 20 62 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20 31   b, b.Length - 1
1c20: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 20  , -1);.      if 
1c30: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
1c40: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
1c50: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
1c60: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  rror());.    }..
1c70: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
1c80: 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f  rride void Bind_
1c90: 44 61 74 65 54 69 6d 65 28 53 51 4c 69 74 65 53  DateTime(SQLiteS
1ca0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
1cb0: 6e 74 20 69 6e 64 65 78 2c 20 44 61 74 65 54 69  nt index, DateTi
1cc0: 6d 65 20 64 74 29 0a 20 20 20 20 7b 0a 20 20 20  me dt).    {.   
1cd0: 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f     byte[] b = To
1ce0: 55 54 46 38 28 64 74 29 3b 0a 20 20 20 20 20 20  UTF8(dt);.      
1cf0: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
1d00: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
1d10: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 5f 69 6e  te3_bind_text_in
1d20: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
1d30: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
1d40: 62 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20 31 2c  b, b.Length - 1,
1d50: 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 20 28   -1);.      if (
1d60: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
1d70: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
1d80: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
1d90: 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ror());.    }.. 
1da0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
1db0: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 42  ride void Bind_B
1dc0: 6c 6f 62 28 53 51 4c 69 74 65 53 74 61 74 65 6d  lob(SQLiteStatem
1dd0: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
1de0: 64 65 78 2c 20 62 79 74 65 5b 5d 20 62 6c 6f 62  dex, byte[] blob
1df0: 44 61 74 61 29 0a 20 20 20 20 7b 0a 20 20 20 20  Data).    {.    
1e00: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
1e10: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
1e20: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 5f  lite3_bind_blob_
1e30: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
1e40: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
1e50: 2c 20 62 6c 6f 62 44 61 74 61 2c 20 62 6c 6f 62  , blobData, blob
1e60: 44 61 74 61 2e 4c 65 6e 67 74 68 2c 20 2d 31 29  Data.Length, -1)
1e70: 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20  ;.      if (n > 
1e80: 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c  0) throw new SQL
1e90: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
1ea0: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
1eb0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
1ec0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
1ed0: 20 76 6f 69 64 20 42 69 6e 64 5f 4e 75 6c 6c 28   void Bind_Null(
1ee0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
1ef0: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29  stmt, int index)
1f00: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
1f10: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
1f20: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
1f30: 5f 62 69 6e 64 5f 6e 75 6c 6c 5f 69 6e 74 65 72  _bind_null_inter
1f40: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
1f50: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20  stmt, index);.  
1f60: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
1f70: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
1f80: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
1f90: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  teLastError());.
1fa0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
1fb0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74  nal override int
1fc0: 20 42 69 6e 64 5f 50 61 72 61 6d 43 6f 75 6e 74   Bind_ParamCount
1fd0: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
1fe0: 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20   stmt).    {.   
1ff0: 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65     return Unsafe
2000: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
2010: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2020: 65 74 65 72 5f 63 6f 75 6e 74 5f 69 6e 74 65 72  eter_count_inter
2030: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
2040: 73 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  stmt);.    }..  
2050: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
2060: 69 64 65 20 73 74 72 69 6e 67 20 42 69 6e 64 5f  ide string Bind_
2070: 50 61 72 61 6d 4e 61 6d 65 28 53 51 4c 69 74 65  ParamName(SQLite
2080: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
2090: 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b  int index).    {
20a0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
20b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f 53        return ToS
20c0: 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69  tring(UnsafeNati
20d0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
20e0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
20f0: 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74  _name_interop(st
2100: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
2110: 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29   index, out len)
2120: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  , len);.    }.. 
2130: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
2140: 72 69 64 65 20 69 6e 74 20 42 69 6e 64 5f 50 61  ride int Bind_Pa
2150: 72 61 6d 49 6e 64 65 78 28 53 51 4c 69 74 65 53  ramIndex(SQLiteS
2160: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 73  tatement stmt, s
2170: 74 72 69 6e 67 20 70 61 72 61 6d 4e 61 6d 65 29  tring paramName)
2180: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74  .    {.      ret
2190: 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65  urn UnsafeNative
21a0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
21b0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
21c0: 6e 64 65 78 5f 69 6e 74 65 72 6f 70 28 73 74 6d  ndex_interop(stm
21d0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
21e0: 54 6f 55 54 46 38 28 70 61 72 61 6d 4e 61 6d 65  ToUTF8(paramName
21f0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
2200: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
2210: 20 69 6e 74 20 43 6f 6c 75 6d 6e 43 6f 75 6e 74   int ColumnCount
2220: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
2230: 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20   stmt).    {.   
2240: 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65     return Unsafe
2250: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
2260: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
2270: 6e 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  nt_interop(stmt.
2280: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 20  _sqlite_stmt);. 
2290: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
22a0: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
22b0: 6e 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 53 51  ng ColumnName(SQ
22c0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
22d0: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20  mt, int index). 
22e0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c     {.      int l
22f0: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
2300: 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65   ToString(Unsafe
2310: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
2320: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
2330: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
2340: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2350: 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65  ex, out len), le
2360: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
2370: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
2380: 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 54 79   string ColumnTy
2390: 70 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  pe(SQLiteStateme
23a0: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
23b0: 65 78 2c 20 6f 75 74 20 54 79 70 65 41 66 66 69  ex, out TypeAffi
23c0: 6e 69 74 79 20 6e 41 66 66 69 6e 69 74 79 29 0a  nity nAffinity).
23d0: 20 20 20 20 7b 0a 20 20 20 20 20 20 6e 41 66 66      {.      nAff
23e0: 69 6e 69 74 79 20 3d 20 54 79 70 65 41 66 66 69  inity = TypeAffi
23f0: 6e 69 74 79 2e 4e 6f 6e 65 3b 0a 0a 20 20 20 20  nity.None;..    
2400: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
2410: 20 49 6e 74 50 74 72 20 70 20 3d 20 55 6e 73 61   IntPtr p = Unsa
2420: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
2430: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
2440: 65 63 6c 74 79 70 65 5f 69 6e 74 65 72 6f 70 28  ecltype_interop(
2450: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
2460: 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65  t, index, out le
2470: 6e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 20  n);.      if (p 
2480: 21 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 20  != IntPtr.Zero) 
2490: 72 65 74 75 72 6e 20 54 6f 53 74 72 69 6e 67 28  return ToString(
24a0: 70 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 65  p, len);.      e
24b0: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  lse.      {.    
24c0: 20 20 20 20 6e 41 66 66 69 6e 69 74 79 20 3d 20      nAffinity = 
24d0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
24e0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
24f0: 6d 6e 5f 74 79 70 65 5f 69 6e 74 65 72 6f 70 28  mn_type_interop(
2500: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
2510: 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  t, index);.     
2520: 20 20 20 73 77 69 74 63 68 20 28 6e 41 66 66 69     switch (nAffi
2530: 6e 69 74 79 29 0a 20 20 20 20 20 20 20 20 7b 0a  nity).        {.
2540: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
2550: 79 70 65 41 66 66 69 6e 69 74 79 2e 49 6e 74 36  ypeAffinity.Int6
2560: 34 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  4:.            r
2570: 65 74 75 72 6e 20 22 42 49 47 49 4e 54 22 3b 0a  eturn "BIGINT";.
2580: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
2590: 79 70 65 41 66 66 69 6e 69 74 79 2e 44 6f 75 62  ypeAffinity.Doub
25a0: 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  le:.            
25b0: 72 65 74 75 72 6e 20 22 44 4f 55 42 4c 45 22 3b  return "DOUBLE";
25c0: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
25d0: 54 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f  TypeAffinity.Blo
25e0: 62 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  b:.            r
25f0: 65 74 75 72 6e 20 22 42 4c 4f 42 22 3b 0a 20 20  eturn "BLOB";.  
2600: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
2610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2620: 75 72 6e 20 22 54 45 58 54 22 3b 0a 20 20 20 20  urn "TEXT";.    
2630: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2640: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
2650: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43  l override int C
2660: 6f 6c 75 6d 6e 49 6e 64 65 78 28 53 51 4c 69 74  olumnIndex(SQLit
2670: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
2680: 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 4e 61   string columnNa
2690: 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  me).    {.      
26a0: 69 6e 74 20 78 20 3d 20 43 6f 6c 75 6d 6e 43 6f  int x = ColumnCo
26b0: 75 6e 74 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20  unt(stmt);..    
26c0: 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30    for (int n = 0
26d0: 3b 20 6e 20 3c 20 78 3b 20 6e 2b 2b 29 0a 20 20  ; n < x; n++).  
26e0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66      {.        if
26f0: 20 28 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65   (String.Compare
2700: 28 63 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 43 6f 6c  (columnName, Col
2710: 75 6d 6e 4e 61 6d 65 28 73 74 6d 74 2c 20 6e 29  umnName(stmt, n)
2720: 2c 20 74 72 75 65 29 20 3d 3d 20 30 29 20 72 65  , true) == 0) re
2730: 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  turn n;.      }.
2740: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
2750: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
2760: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 64 6f  rnal override do
2770: 75 62 6c 65 20 47 65 74 44 6f 75 62 6c 65 28 53  uble GetDouble(S
2780: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
2790: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
27a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 64 6f 75 62      {.      doub
27b0: 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  le value;.      
27c0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
27d0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
27e0: 6d 6e 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f  mn_double_intero
27f0: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
2800: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
2810: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 72 65  value);.      re
2820: 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20  turn value;.    
2830: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
2840: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47 65 74  override int Get
2850: 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61 74  Int32(SQLiteStat
2860: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
2870: 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20  index).    {.   
2880: 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65     return Unsafe
2890: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
28a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
28b0: 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73  _interop(stmt._s
28c0: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
28d0: 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  x);.    }..    i
28e0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
28f0: 20 6c 6f 6e 67 20 47 65 74 49 6e 74 36 34 28 53   long GetInt64(S
2900: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
2910: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
2920: 20 20 20 20 7b 0a 20 20 20 20 20 20 6c 6f 6e 67      {.      long
2930: 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 55 6e   value;.      Un
2940: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
2950: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
2960: 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73  _int64_interop(s
2970: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
2980: 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 76 61 6c  , index, out val
2990: 75 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ue);.      retur
29a0: 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a  n value;.    }..
29b0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
29c0: 72 72 69 64 65 20 73 74 72 69 6e 67 20 47 65 74  rride string Get
29d0: 54 65 78 74 28 53 51 4c 69 74 65 53 74 61 74 65  Text(SQLiteState
29e0: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
29f0: 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20  ndex).    {.    
2a00: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
2a10: 20 72 65 74 75 72 6e 20 54 6f 53 74 72 69 6e 67   return ToString
2a20: 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  (UnsafeNativeMet
2a30: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
2a40: 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70  umn_text_interop
2a50: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
2a60: 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c  mt, index, out l
2a70: 65 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d  en), len);.    }
2a80: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
2a90: 76 65 72 72 69 64 65 20 44 61 74 65 54 69 6d 65  verride DateTime
2aa0: 20 47 65 74 44 61 74 65 54 69 6d 65 28 53 51 4c   GetDateTime(SQL
2ab0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
2ac0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
2ad0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65    {.      int le
2ae0: 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  n;.      return 
2af0: 54 6f 44 61 74 65 54 69 6d 65 28 55 6e 73 61 66  ToDateTime(Unsaf
2b00: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2b10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2b20: 78 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  xt_interop(stmt.
2b30: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
2b40: 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c  dex, out len), l
2b50: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
2b60: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2b70: 65 20 6c 6f 6e 67 20 47 65 74 42 79 74 65 73 28  e long GetBytes(
2b80: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
2b90: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c  stmt, int index,
2ba0: 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65 74   int nDataOffset
2bb0: 2c 20 62 79 74 65 5b 5d 20 62 44 65 73 74 2c 20  , byte[] bDest, 
2bc0: 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74 20  int nStart, int 
2bd0: 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20  nLength).    {. 
2be0: 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72 3b       IntPtr ptr;
2bf0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b  .      int nlen;
2c00: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69  .      int nCopi
2c10: 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20  ed = nLength;.. 
2c20: 20 20 20 20 20 6e 6c 65 6e 20 3d 20 55 6e 73 61       nlen = Unsa
2c30: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
2c40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2c50: 79 74 65 73 5f 69 6e 74 65 72 6f 70 28 73 74 6d  ytes_interop(stm
2c60: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
2c70: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 74  index);.      pt
2c80: 72 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  r = UnsafeNative
2c90: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
2ca0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 5f 69 6e 74 65  column_blob_inte
2cb0: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
2cc0: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 0a  _stmt, index);..
2cd0: 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74 20        if (bDest 
2ce0: 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20  == null) return 
2cf0: 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20  nlen;..      if 
2d00: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61 72  (nCopied + nStar
2d10: 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74 68  t > bDest.Length
2d20: 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65 73  ) nCopied = bDes
2d30: 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61 72  t.Length - nStar
2d40: 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f  t;.      if (nCo
2d50: 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66 73  pied + nDataOffs
2d60: 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69  et > nlen) nCopi
2d70: 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74  ed = nlen - nDat
2d80: 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  aOffset;..      
2d90: 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30 29  if (nCopied > 0)
2da0: 0a 20 20 20 20 20 20 20 20 4d 61 72 73 68 61 6c  .        Marshal
2db0: 2e 43 6f 70 79 28 28 49 6e 74 50 74 72 29 28 70  .Copy((IntPtr)(p
2dc0: 74 72 2e 54 6f 49 6e 74 33 32 28 29 20 2b 20 6e  tr.ToInt32() + n
2dd0: 44 61 74 61 4f 66 66 73 65 74 29 2c 20 62 44 65  DataOffset), bDe
2de0: 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70  st, nStart, nCop
2df0: 69 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  ied);.      else
2e00: 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a 20   nCopied = 0;.. 
2e10: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f 70       return nCop
2e20: 69 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ied;.    }..    
2e30: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2e40: 65 20 6c 6f 6e 67 20 47 65 74 43 68 61 72 73 28  e long GetChars(
2e50: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
2e60: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c  stmt, int index,
2e70: 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65 74   int nDataOffset
2e80: 2c 20 63 68 61 72 5b 5d 20 62 44 65 73 74 2c 20  , char[] bDest, 
2e90: 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74 20  int nStart, int 
2ea0: 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20  nLength).    {. 
2eb0: 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a 20       int nlen;. 
2ec0: 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65 64       int nCopied
2ed0: 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20   = nLength;..   
2ee0: 20 20 20 73 74 72 69 6e 67 20 73 74 72 20 3d 20     string str = 
2ef0: 47 65 74 54 65 78 74 28 73 74 6d 74 2c 20 69 6e  GetText(stmt, in
2f00: 64 65 78 29 3b 0a 20 20 20 20 20 20 6e 6c 65 6e  dex);.      nlen
2f10: 20 3d 20 73 74 72 2e 4c 65 6e 67 74 68 3b 0a 0a   = str.Length;..
2f20: 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74 20        if (bDest 
2f30: 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20  == null) return 
2f40: 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20  nlen;..      if 
2f50: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61 72  (nCopied + nStar
2f60: 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74 68  t > bDest.Length
2f70: 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65 73  ) nCopied = bDes
2f80: 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61 72  t.Length - nStar
2f90: 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f  t;.      if (nCo
2fa0: 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66 73  pied + nDataOffs
2fb0: 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69  et > nlen) nCopi
2fc0: 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74  ed = nlen - nDat
2fd0: 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  aOffset;..      
2fe0: 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30 29  if (nCopied > 0)
2ff0: 0a 20 20 20 20 20 20 20 20 73 74 72 2e 43 6f 70  .        str.Cop
3000: 79 54 6f 28 6e 44 61 74 61 4f 66 66 73 65 74 2c  yTo(nDataOffset,
3010: 20 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c 20   bDest, nStart, 
3020: 6e 43 6f 70 69 65 64 29 3b 0a 20 20 20 20 20 20  nCopied);.      
3030: 65 6c 73 65 20 6e 43 6f 70 69 65 64 20 3d 20 30  else nCopied = 0
3040: 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
3050: 6e 43 6f 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a  nCopied;.    }..
3060: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
3070: 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 4e 75 6c  rride bool IsNul
3080: 6c 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  l(SQLiteStatemen
3090: 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65  t stmt, int inde
30a0: 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  x).    {.      r
30b0: 65 74 75 72 6e 20 28 55 6e 73 61 66 65 4e 61 74  eturn (UnsafeNat
30c0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
30d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 5f 69  e3_column_type_i
30e0: 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c  nterop(stmt._sql
30f0: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29  ite_stmt, index)
3100: 20 3d 3d 20 54 79 70 65 41 66 66 69 6e 69 74 79   == TypeAffinity
3110: 2e 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  .Null);.    }.. 
3120: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
3130: 72 69 64 65 20 69 6e 74 20 41 67 67 72 65 67 61  ride int Aggrega
3140: 74 65 43 6f 75 6e 74 28 69 6e 74 20 63 6f 6e 74  teCount(int cont
3150: 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ext).    {.     
3160: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
3170: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3180: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
3190: 75 6e 74 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74  unt_interop(cont
31a0: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
31b0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
31c0: 64 65 20 69 6e 74 20 43 72 65 61 74 65 46 75 6e  de int CreateFun
31d0: 63 74 69 6f 6e 28 73 74 72 69 6e 67 20 73 74 72  ction(string str
31e0: 46 75 6e 63 74 69 6f 6e 2c 20 69 6e 74 20 6e 41  Function, int nA
31f0: 72 67 73 2c 20 53 51 4c 69 74 65 43 61 6c 6c 62  rgs, SQLiteCallb
3200: 61 63 6b 20 66 75 6e 63 2c 20 53 51 4c 69 74 65  ack func, SQLite
3210: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 73 74 65  Callback funcste
3220: 70 2c 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63  p, SQLiteCallbac
3230: 6b 20 66 75 6e 63 66 69 6e 61 6c 29 0a 20 20 20  k funcfinal).   
3240: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f   {.      int nCo
3250: 6f 6b 69 65 3b 0a 0a 20 20 20 20 20 20 69 6e 74  okie;..      int
3260: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
3270: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
3280: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
3290: 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54  _interop(_sql, T
32a0: 6f 55 54 46 38 28 73 74 72 46 75 6e 63 74 69 6f  oUTF8(strFunctio
32b0: 6e 29 2c 20 6e 41 72 67 73 2c 20 31 2c 20 66 75  n), nArgs, 1, fu
32c0: 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66 75  nc, funcstep, fu
32d0: 6e 63 66 69 6e 61 6c 2c 20 6f 75 74 20 6e 43 6f  ncfinal, out nCo
32e0: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 69 66 20  okie);.      if 
32f0: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
3300: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
3310: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
3320: 72 72 6f 72 28 29 29 3b 0a 0a 20 20 20 20 20 20  rror());..      
3330: 72 65 74 75 72 6e 20 6e 43 6f 6f 6b 69 65 3b 0a  return nCookie;.
3340: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
3350: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74  nal override int
3360: 20 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   CreateCollation
3370: 28 73 74 72 69 6e 67 20 73 74 72 43 6f 6c 6c 61  (string strColla
3380: 74 69 6f 6e 2c 20 53 51 4c 69 74 65 43 6f 6c 6c  tion, SQLiteColl
3390: 61 74 69 6f 6e 20 66 75 6e 63 29 0a 20 20 20 20  ation func).    
33a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6f  {.      int nCoo
33b0: 6b 69 65 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20  kie;..      int 
33c0: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
33d0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
33e0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
33f0: 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54  _interop(_sql, T
3400: 6f 55 54 46 38 28 73 74 72 43 6f 6c 6c 61 74 69  oUTF8(strCollati
3410: 6f 6e 29 2c 20 31 2c 20 30 2c 20 66 75 6e 63 2c  on), 1, 0, func,
3420: 20 6f 75 74 20 6e 43 6f 6f 6b 69 65 29 3b 0a 20   out nCookie);. 
3430: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
3440: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
3450: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
3460: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
3470: 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ..      return n
3480: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 7d 0a 0a 20  Cookie;.    }.. 
3490: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
34a0: 72 69 64 65 20 76 6f 69 64 20 46 72 65 65 46 75  ride void FreeFu
34b0: 6e 63 74 69 6f 6e 28 69 6e 74 20 6e 43 6f 6f 6b  nction(int nCook
34c0: 69 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ie).    {.      
34d0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
34e0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 66 75 6e 63  ods.sqlite3_func
34f0: 74 69 6f 6e 5f 66 72 65 65 5f 63 61 6c 6c 62 61  tion_free_callba
3500: 63 6b 63 6f 6f 6b 69 65 28 6e 43 6f 6f 6b 69 65  ckcookie(nCookie
3510: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
3520: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
3530: 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c  long GetParamVal
3540: 75 65 42 79 74 65 73 28 69 6e 74 20 70 2c 20 69  ueBytes(int p, i
3550: 6e 74 20 6e 44 61 74 61 4f 66 66 73 65 74 2c 20  nt nDataOffset, 
3560: 62 79 74 65 5b 5d 20 62 44 65 73 74 2c 20 69 6e  byte[] bDest, in
3570: 74 20 6e 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c  t nStart, int nL
3580: 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20 20 20  ength).    {.   
3590: 20 20 20 49 6e 74 50 74 72 20 70 74 72 3b 0a 20     IntPtr ptr;. 
35a0: 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a 20       int nlen;. 
35b0: 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65 64       int nCopied
35c0: 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20   = nLength;..   
35d0: 20 20 20 6e 6c 65 6e 20 3d 20 55 6e 73 61 66 65     nlen = Unsafe
35e0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
35f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
3600: 73 5f 69 6e 74 65 72 6f 70 28 70 29 3b 0a 20 20  s_interop(p);.  
3610: 20 20 20 20 70 74 72 20 3d 20 55 6e 73 61 66 65      ptr = Unsafe
3620: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
3630: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
3640: 5f 69 6e 74 65 72 6f 70 28 70 29 3b 0a 0a 20 20  _interop(p);..  
3650: 20 20 20 20 69 66 20 28 62 44 65 73 74 20 3d 3d      if (bDest ==
3660: 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 6e 6c   null) return nl
3670: 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e  en;..      if (n
3680: 43 6f 70 69 65 64 20 2b 20 6e 53 74 61 72 74 20  Copied + nStart 
3690: 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74 68 29 20  > bDest.Length) 
36a0: 6e 43 6f 70 69 65 64 20 3d 20 62 44 65 73 74 2e  nCopied = bDest.
36b0: 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61 72 74 3b  Length - nStart;
36c0: 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70 69  .      if (nCopi
36d0: 65 64 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74  ed + nDataOffset
36e0: 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64   > nlen) nCopied
36f0: 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f   = nlen - nDataO
3700: 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 69 66  ffset;..      if
3710: 20 28 6e 43 6f 70 69 65 64 20 3e 20 30 29 0a 20   (nCopied > 0). 
3720: 20 20 20 20 20 20 20 4d 61 72 73 68 61 6c 2e 43         Marshal.C
3730: 6f 70 79 28 28 49 6e 74 50 74 72 29 28 70 74 72  opy((IntPtr)(ptr
3740: 2e 54 6f 49 6e 74 33 32 28 29 20 2b 20 6e 44 61  .ToInt32() + nDa
3750: 74 61 4f 66 66 73 65 74 29 2c 20 62 44 65 73 74  taOffset), bDest
3760: 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70 69 65  , nStart, nCopie
3770: 64 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 6e  d);.      else n
3780: 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a 20 20 20  Copied = 0;..   
3790: 20 20 20 72 65 74 75 72 6e 20 6e 43 6f 70 69 65     return nCopie
37a0: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  d;.    }..    in
37b0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
37c0: 64 6f 75 62 6c 65 20 47 65 74 50 61 72 61 6d 56  double GetParamV
37d0: 61 6c 75 65 44 6f 75 62 6c 65 28 69 6e 74 20 70  alueDouble(int p
37e0: 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  tr).    {.      
37f0: 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
3800: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
3810: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
3820: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 5f 69 6e 74  value_double_int
3830: 65 72 6f 70 28 70 74 72 2c 20 6f 75 74 20 76 61  erop(ptr, out va
3840: 6c 75 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  lue);.      retu
3850: 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a  rn value;.    }.
3860: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
3870: 65 72 72 69 64 65 20 69 6e 74 20 47 65 74 50 61  erride int GetPa
3880: 72 61 6d 56 61 6c 75 65 49 6e 74 33 32 28 69 6e  ramValueInt32(in
3890: 74 20 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20  t ptr).    {.   
38a0: 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65     return Unsafe
38b0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
38c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 5f  lite3_value_int_
38d0: 69 6e 74 65 72 6f 70 28 70 74 72 29 3b 0a 20 20  interop(ptr);.  
38e0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
38f0: 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67 20  l override long 
3900: 47 65 74 50 61 72 61 6d 56 61 6c 75 65 49 6e 74  GetParamValueInt
3910: 36 34 28 69 6e 74 20 70 74 72 29 0a 20 20 20 20  64(int ptr).    
3920: 7b 0a 20 20 20 20 20 20 49 6e 74 36 34 20 76 61  {.      Int64 va
3930: 6c 75 65 3b 0a 20 20 20 20 20 20 55 6e 73 61 66  lue;.      Unsaf
3940: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3950: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3960: 36 34 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20  64_interop(ptr, 
3970: 6f 75 74 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  out value);.    
3980: 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a    return value;.
3990: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
39a0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
39b0: 69 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c 75  ing GetParamValu
39c0: 65 54 65 78 74 28 69 6e 74 20 70 74 72 29 0a 20  eText(int ptr). 
39d0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c     {.      int l
39e0: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
39f0: 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65   ToString(Unsafe
3a00: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
3a10: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
3a20: 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f 75  _interop(ptr, ou
3a30: 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20  t len), len);.  
3a40: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
3a50: 6c 20 6f 76 65 72 72 69 64 65 20 54 79 70 65 41  l override TypeA
3a60: 66 66 69 6e 69 74 79 20 47 65 74 50 61 72 61 6d  ffinity GetParam
3a70: 56 61 6c 75 65 54 79 70 65 28 69 6e 74 20 70 74  ValueType(int pt
3a80: 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  r).    {.      r
3a90: 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69  eturn UnsafeNati
3aa0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
3ab0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 5f 69 6e 74  3_value_type_int
3ac0: 65 72 6f 70 28 70 74 72 29 3b 0a 20 20 20 20 7d  erop(ptr);.    }
3ad0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
3ae0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65 74  verride void Ret
3af0: 75 72 6e 42 6c 6f 62 28 69 6e 74 20 63 6f 6e 74  urnBlob(int cont
3b00: 65 78 74 2c 20 62 79 74 65 5b 5d 20 76 61 6c 75  ext, byte[] valu
3b10: 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55  e).    {.      U
3b20: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
3b30: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ds.sqlite3_resul
3b40: 74 5f 62 6c 6f 62 5f 69 6e 74 65 72 6f 70 28 63  t_blob_interop(c
3b50: 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65 2c 20 76  ontext, value, v
3b60: 61 6c 75 65 2e 4c 65 6e 67 74 68 2c 20 2d 31 29  alue.Length, -1)
3b70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
3b80: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76  ernal override v
3b90: 6f 69 64 20 52 65 74 75 72 6e 44 6f 75 62 6c 65  oid ReturnDouble
3ba0: 28 69 6e 74 20 63 6f 6e 74 65 78 74 2c 20 64 6f  (int context, do
3bb0: 75 62 6c 65 20 76 61 6c 75 65 29 0a 20 20 20 20  uble value).    
3bc0: 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61  {.      UnsafeNa
3bd0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3be0: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
3bf0: 65 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78  e_interop(contex
3c00: 74 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a 20  t, ref value);. 
3c10: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3c20: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
3c30: 20 52 65 74 75 72 6e 45 72 72 6f 72 28 69 6e 74   ReturnError(int
3c40: 20 63 6f 6e 74 65 78 74 2c 20 73 74 72 69 6e 67   context, string
3c50: 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20   value).    {.  
3c60: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
3c70: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
3c80: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 69 6e 74  result_error_int
3c90: 65 72 6f 70 28 63 6f 6e 74 65 78 74 2c 20 54 6f  erop(context, To
3ca0: 55 54 46 38 28 76 61 6c 75 65 29 2c 20 76 61 6c  UTF8(value), val
3cb0: 75 65 2e 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20  ue.Length);.    
3cc0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3cd0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65  override void Re
3ce0: 74 75 72 6e 49 6e 74 33 32 28 69 6e 74 20 63 6f  turnInt32(int co
3cf0: 6e 74 65 78 74 2c 20 69 6e 74 20 76 61 6c 75 65  ntext, int value
3d00: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e  ).    {.      Un
3d10: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
3d20: 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  s.sqlite3_result
3d30: 5f 69 6e 74 5f 69 6e 74 65 72 6f 70 28 63 6f 6e  _int_interop(con
3d40: 74 65 78 74 2c 20 76 61 6c 75 65 29 3b 0a 20 20  text, value);.  
3d50: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
3d60: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
3d70: 52 65 74 75 72 6e 49 6e 74 36 34 28 69 6e 74 20  ReturnInt64(int 
3d80: 63 6f 6e 74 65 78 74 2c 20 6c 6f 6e 67 20 76 61  context, long va
3d90: 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  lue).    {.     
3da0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
3db0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73  hods.sqlite3_res
3dc0: 75 6c 74 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f  ult_int64_intero
3dd0: 70 28 63 6f 6e 74 65 78 74 2c 20 72 65 66 20 76  p(context, ref v
3de0: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  alue);.    }..  
3df0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3e00: 69 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e 4e  ide void ReturnN
3e10: 75 6c 6c 28 69 6e 74 20 63 6f 6e 74 65 78 74 29  ull(int context)
3e20: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73  .    {.      Uns
3e30: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
3e40: 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
3e50: 6e 75 6c 6c 5f 69 6e 74 65 72 6f 70 28 63 6f 6e  null_interop(con
3e60: 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
3e70: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3e80: 69 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e 54  ide void ReturnT
3e90: 65 78 74 28 69 6e 74 20 63 6f 6e 74 65 78 74 2c  ext(int context,
3ea0: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 29 0a 20   string value). 
3eb0: 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66     {.      Unsaf
3ec0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3ed0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
3ee0: 78 74 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65  xt_interop(conte
3ef0: 78 74 2c 20 54 6f 55 54 46 38 28 76 61 6c 75 65  xt, ToUTF8(value
3f00: 29 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 2c  ), value.Length,
3f10: 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
3f20: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3f30: 64 65 20 69 6e 74 20 41 67 67 72 65 67 61 74 65  de int Aggregate
3f40: 43 6f 6e 74 65 78 74 28 69 6e 74 20 63 6f 6e 74  Context(int cont
3f50: 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ext).    {.     
3f60: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
3f70: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3f80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
3f90: 6e 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 63 6f  ntext_interop(co
3fa0: 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d  ntext, 1);.    }
3fb0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
3fc0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 53 65 74  verride void Set
3fd0: 52 65 61 6c 43 6f 6c 4e 61 6d 65 73 28 62 6f 6f  RealColNames(boo
3fe0: 6c 20 62 4f 6e 29 0a 20 20 20 20 7b 0a 20 20 20  l bOn).    {.   
3ff0: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
4000: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72  ethods.sqlite3_r
4010: 65 61 6c 63 6f 6c 6e 61 6d 65 73 28 5f 73 71 6c  ealcolnames(_sql
4020: 2c 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33  , Convert.ToInt3
4030: 32 28 62 4f 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  2(bOn));.    }. 
4040: 20 7d 0a 7d 0a                                    }.}.