System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b39d08bb46cf0036a7535b0094b72da321c5504a:


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 20 20  ions.Generic;.  
01a0: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 47 6c 6f  using System.Glo
01b0: 62 61 6c 69 7a 61 74 69 6f 6e 3b 0a 0a 20 20 2f  balization;..  /
01c0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f  // <summary>.  /
01d0: 2f 2f 20 54 68 69 73 20 63 6c 61 73 73 20 69 6d  // This class im
01e0: 70 6c 65 6d 65 6e 74 73 20 53 51 4c 69 74 65 42  plements SQLiteB
01f0: 61 73 65 20 63 6f 6d 70 6c 65 74 65 6c 79 2c 20  ase completely, 
0200: 61 6e 64 20 69 73 20 74 68 65 20 67 75 74 73 20  and is the guts 
0210: 6f 66 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  of the code that
0220: 20 69 6e 74 65 72 6f 70 27 73 20 53 51 4c 69 74   interop's SQLit
0230: 65 20 77 69 74 68 20 2e 4e 45 54 0a 20 20 2f 2f  e with .NET.  //
0240: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 69  / </summary>.  i
0250: 6e 74 65 72 6e 61 6c 20 63 6c 61 73 73 20 53 51  nternal class SQ
0260: 4c 69 74 65 33 20 3a 20 53 51 4c 69 74 65 42 61  Lite3 : SQLiteBa
0270: 73 65 0a 20 20 7b 0a 20 20 20 20 2f 2f 2f 20 3c  se.  {.    /// <
0280: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
0290: 20 54 68 65 20 6f 70 61 71 75 65 20 70 6f 69 6e   The opaque poin
02a0: 74 65 72 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ter returned to 
02b0: 75 73 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  us by the sqlite
02c0: 20 70 72 6f 76 69 64 65 72 0a 20 20 20 20 2f 2f   provider.    //
02d0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
02e0: 20 70 72 6f 74 65 63 74 65 64 20 49 6e 74 50 74   protected IntPt
02f0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f  r              _
0300: 73 71 6c 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  sql;.    /// <su
0310: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54  mmary>.    /// T
0320: 68 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  he user-defined 
0330: 66 75 6e 63 74 69 6f 6e 73 20 72 65 67 69 73 74  functions regist
0340: 65 72 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6e  ered on this con
0350: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2f 2f 2f 20  nection.    /// 
0360: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70  </summary>.    p
0370: 72 6f 74 65 63 74 65 64 20 53 51 4c 69 74 65 46  rotected SQLiteF
0380: 75 6e 63 74 69 6f 6e 5b 5d 20 5f 66 75 6e 63 74  unction[] _funct
0390: 69 6f 6e 73 41 72 72 61 79 3b 0a 0a 20 20 20 20  ionsArray;..    
03a0: 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 33  internal SQLite3
03b0: 28 53 51 4c 69 74 65 44 61 74 65 46 6f 72 6d 61  (SQLiteDateForma
03c0: 74 73 20 66 6d 74 29 0a 20 20 20 20 20 20 3a 20  ts fmt).      : 
03d0: 62 61 73 65 28 66 6d 74 29 0a 20 20 20 20 7b 0a  base(fmt).    {.
03e0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 74 65      }..    prote
03f0: 63 74 65 64 20 6f 76 65 72 72 69 64 65 20 76 6f  cted override vo
0400: 69 64 20 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20  id Dispose(bool 
0410: 62 44 69 73 70 6f 73 69 6e 67 29 0a 20 20 20 20  bDisposing).    
0420: 7b 0a 20 20 20 20 20 20 43 6c 6f 73 65 28 29 3b  {.      Close();
0430: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
0440: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
0450: 69 64 20 43 6c 6f 73 65 28 29 0a 20 20 20 20 7b  id Close().    {
0460: 0a 20 20 20 20 20 20 69 66 20 28 5f 73 71 6c 20  .      if (_sql 
0470: 21 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 0a  != IntPtr.Zero).
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 49 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a 20 20   IntPtr.Zero;.  
0570: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
0580: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
0590: 43 61 6e 63 65 6c 28 29 0a 20 20 20 20 7b 0a 20  Cancel().    {. 
05a0: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
05b0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
05c0: 5f 69 6e 74 65 72 72 75 70 74 5f 69 6e 74 65 72  _interrupt_inter
05d0: 6f 70 28 5f 73 71 6c 29 3b 0a 20 20 20 20 7d 0a  op(_sql);.    }.
05e0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
05f0: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 56 65  erride string Ve
0600: 72 73 69 6f 6e 0a 20 20 20 20 7b 0a 20 20 20 20  rsion.    {.    
0610: 20 20 67 65 74 0a 20 20 20 20 20 20 7b 0a 20 20    get.      {.  
0620: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
0630: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f         return To
0640: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
0650: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
0660: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 69 6e  e3_libversion_in
0670: 74 65 72 6f 70 28 6f 75 74 20 6c 65 6e 29 2c 20  terop(out len), 
0680: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  len);.      }.  
0690: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
06a0: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43  l override int C
06b0: 68 61 6e 67 65 73 0a 20 20 20 20 7b 0a 20 20 20  hanges.    {.   
06c0: 20 20 20 67 65 74 0a 20 20 20 20 20 20 7b 0a 20     get.      {. 
06d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e         return Un
06e0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
06f0: 73 2e 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  s.sqlite3_change
0700: 73 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 29 3b  s_interop(_sql);
0710: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
0720: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
0730: 72 72 69 64 65 20 76 6f 69 64 20 4f 70 65 6e 28  rride void Open(
0740: 73 74 72 69 6e 67 20 73 74 72 46 69 6c 65 6e 61  string strFilena
0750: 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  me).    {.      
0760: 69 66 20 28 5f 73 71 6c 20 21 3d 20 49 6e 74 50  if (_sql != IntP
0770: 74 72 2e 5a 65 72 6f 29 20 72 65 74 75 72 6e 3b  tr.Zero) return;
0780: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
0790: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
07a0: 64 73 2e 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  ds.sqlite3_open_
07b0: 69 6e 74 65 72 6f 70 28 54 6f 55 54 46 38 28 73  interop(ToUTF8(s
07c0: 74 72 46 69 6c 65 6e 61 6d 65 29 2c 20 6f 75 74  trFilename), out
07d0: 20 5f 73 71 6c 29 3b 0a 20 20 20 20 20 20 69 66   _sql);.      if
07e0: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
07f0: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
0800: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
0810: 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20 20 20 20  Error());..     
0820: 20 5f 66 75 6e 63 74 69 6f 6e 73 41 72 72 61 79   _functionsArray
0830: 20 3d 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f   = SQLiteFunctio
0840: 6e 2e 42 69 6e 64 46 75 6e 63 74 69 6f 6e 73 28  n.BindFunctions(
0850: 74 68 69 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  this);.    }..  
0860: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
0870: 69 64 65 20 76 6f 69 64 20 53 65 74 54 69 6d 65  ide void SetTime
0880: 6f 75 74 28 69 6e 74 20 6e 54 69 6d 65 6f 75 74  out(int nTimeout
0890: 4d 53 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  MS).    {.      
08a0: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
08b0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
08c0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
08d0: 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 6e  _interop(_sql, n
08e0: 54 69 6d 65 6f 75 74 4d 53 29 3b 0a 20 20 20 20  TimeoutMS);.    
08f0: 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72    if (n > 0) thr
0900: 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63  ow new SQLiteExc
0910: 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65  eption(n, SQLite
0920: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20  LastError());.  
0930: 20 20 7d 0a 0a 20 20 20 20 2f 2f 69 6e 74 65 72    }..    //inter
0940: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
0950: 64 20 45 78 65 63 75 74 65 28 73 74 72 69 6e 67  d Execute(string
0960: 20 73 74 72 53 71 6c 29 0a 20 20 20 20 2f 2f 7b   strSql).    //{
0970: 0a 20 20 20 20 2f 2f 20 20 49 6e 74 50 74 72 20  .    //  IntPtr 
0980: 70 3b 0a 20 20 20 20 2f 2f 20 20 73 74 72 69 6e  p;.    //  strin
0990: 67 20 73 74 72 20 3d 20 73 74 72 53 71 6c 3b 0a  g str = strSql;.
09a0: 20 20 20 20 2f 2f 20 20 69 6e 74 20 6c 65 6e 3b      //  int len;
09b0: 0a 0a 20 20 20 20 2f 2f 20 20 69 6e 74 20 6e 20  ..    //  int n 
09c0: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
09d0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 65 78  thods.sqlite3_ex
09e0: 65 63 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  ec_interop(_sql,
09f0: 20 54 6f 55 54 46 38 28 73 74 72 53 71 6c 29 2c   ToUTF8(strSql),
0a00: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 49 6e   IntPtr.Zero, In
0a10: 74 50 74 72 2e 5a 65 72 6f 2c 20 6f 75 74 20 70  tPtr.Zero, out p
0a20: 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a 20 20 20 20  , out len);.    
0a30: 2f 2f 20 20 69 66 20 28 70 20 21 3d 20 49 6e 74  //  if (p != Int
0a40: 50 74 72 2e 5a 65 72 6f 29 0a 20 20 20 20 2f 2f  Ptr.Zero).    //
0a50: 20 20 7b 0a 20 20 20 20 2f 2f 20 20 20 20 73 74    {.    //    st
0a60: 72 20 3d 20 62 61 73 65 2e 54 6f 53 74 72 69 6e  r = base.ToStrin
0a70: 67 28 70 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 2f  g(p, len);.    /
0a80: 2f 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76  /    UnsafeNativ
0a90: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
0aa0: 5f 66 72 65 65 5f 69 6e 74 65 72 6f 70 28 70 29  _free_interop(p)
0ab0: 3b 0a 20 20 20 20 2f 2f 20 20 7d 0a 20 20 20 20  ;.    //  }.    
0ac0: 2f 2f 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74  //  if (n > 0) t
0ad0: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
0ae0: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 73 74 72 29  xception(n, str)
0af0: 3b 0a 20 20 20 20 2f 2f 7d 0a 0a 20 20 20 20 69  ;.    //}..    i
0b00: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
0b10: 20 62 6f 6f 6c 20 53 74 65 70 28 53 51 4c 69 74   bool Step(SQLit
0b20: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 29  eStatement stmt)
0b30: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
0b40: 20 6e 3b 0a 20 20 20 20 20 20 6c 6f 6e 67 20 64   n;.      long d
0b50: 77 74 69 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  wtick = 0;.     
0b60: 20 52 61 6e 64 6f 6d 20 72 6e 64 20 3d 20 6e 75   Random rnd = nu
0b70: 6c 6c 3b 0a 0a 20 20 20 20 20 20 77 68 69 6c 65  ll;..      while
0b80: 20 28 74 72 75 65 29 0a 20 20 20 20 20 20 7b 0a   (true).      {.
0b90: 20 20 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61          n = Unsa
0ba0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
0bb0: 73 71 6c 69 74 65 33 5f 73 74 65 70 5f 69 6e 74  sqlite3_step_int
0bc0: 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74  erop(stmt._sqlit
0bd0: 65 5f 73 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20  e_stmt);..      
0be0: 20 20 69 66 20 28 6e 20 3d 3d 20 31 30 30 29 20    if (n == 100) 
0bf0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
0c00: 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20 31 30       if (n == 10
0c10: 31 29 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b  1) return false;
0c20: 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 20  ..        if (n 
0c30: 3e 20 30 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  > 0).        {. 
0c40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
0c50: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 41 6e  .          // An
0c60: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
0c70: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 73 65   attempt to rese
0c80: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  t the statement.
0c90: 20 20 49 66 20 74 68 65 20 72 65 73 65 74 20 77    If the reset w
0ca0: 6f 72 6b 65 64 20 62 65 63 61 75 73 65 20 74 68  orked because th
0cb0: 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73  e.          // s
0cc0: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
0cd0: 64 2c 20 72 65 2d 74 72 79 20 74 68 65 20 73 74  d, re-try the st
0ce0: 65 70 20 61 67 61 69 6e 2e 20 20 49 66 20 69 74  ep again.  If it
0cf0: 20 65 72 72 6f 72 65 64 20 6f 75 72 20 62 65 63   errored our bec
0d00: 61 75 73 65 20 74 68 65 20 64 61 74 61 62 61 73  ause the databas
0d10: 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69  e.          // i
0d20: 73 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 6b  s locked, then k
0d30: 65 65 70 20 72 65 74 72 79 69 6e 67 20 75 6e 74  eep retrying unt
0d40: 69 6c 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74  il the command t
0d50: 69 6d 65 6f 75 74 20 6f 63 63 75 72 73 2e 0a 20  imeout occurs.. 
0d60: 20 20 20 20 20 20 20 20 20 72 20 3d 20 52 65 73           r = Res
0d70: 65 74 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20 20  et(stmt);..     
0d80: 20 20 20 20 20 69 66 20 28 72 20 3d 3d 20 30 29       if (r == 0)
0d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
0da0: 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63  ow new SQLiteExc
0db0: 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65  eption(n, SQLite
0dc0: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20  LastError());.. 
0dd0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
0de0: 20 28 72 20 3d 3d 20 36 20 26 26 20 73 74 6d 74   (r == 6 && stmt
0df0: 2e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 6e 75 6c  ._command != nul
0e00: 6c 29 20 2f 2f 20 53 51 4c 49 54 45 5f 4c 4f 43  l) // SQLITE_LOC
0e10: 4b 45 44 0a 20 20 20 20 20 20 20 20 20 20 7b 0a  KED.          {.
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4b              // K
0e30: 65 65 70 20 74 72 79 69 6e 67 0a 20 20 20 20 20  eep trying.     
0e40: 20 20 20 20 20 20 20 69 66 20 28 64 77 74 69 63         if (dwtic
0e50: 6b 20 3d 3d 20 30 29 20 2f 2f 20 46 69 72 73 74  k == 0) // First
0e60: 20 74 69 6d 65 20 77 65 27 76 65 20 65 6e 63 6f   time we've enco
0e70: 75 6e 74 65 72 65 64 20 74 68 65 20 6c 6f 63 6b  untered the lock
0e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 74               dwt
0ea0: 69 63 6b 20 3d 20 44 61 74 65 54 69 6d 65 2e 4e  ick = DateTime.N
0eb0: 6f 77 2e 54 69 63 6b 73 20 2b 20 28 73 74 6d 74  ow.Ticks + (stmt
0ec0: 2e 5f 63 6f 6d 6d 61 6e 64 2e 5f 63 6f 6d 6d 61  ._command._comma
0ed0: 6e 64 54 69 6d 65 6f 75 74 20 2a 20 31 30 30 30  ndTimeout * 1000
0ee0: 30 30 30 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0000);.         
0ef0: 20 20 20 20 20 72 6e 64 20 3d 20 6e 65 77 20 52       rnd = new R
0f00: 61 6e 64 6f 6d 28 29 3b 0a 20 20 20 20 20 20 20  andom();.       
0f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0f20: 20 20 20 2f 2f 20 49 66 20 77 65 27 76 65 20 65     // If we've e
0f30: 78 63 65 65 64 65 64 20 74 68 65 20 63 6f 6d 6d  xceeded the comm
0f40: 61 6e 64 27 73 20 74 69 6d 65 6f 75 74 2c 20 67  and's timeout, g
0f50: 69 76 65 20 75 70 20 61 6e 64 20 74 68 72 6f 77  ive up and throw
0f60: 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20   an error.      
0f70: 20 20 20 20 20 20 69 66 20 28 44 61 74 65 54 69        if (DateTi
0f80: 6d 65 2e 4e 6f 77 2e 54 69 63 6b 73 20 2d 20 64  me.Now.Ticks - d
0f90: 77 74 69 63 6b 20 3e 20 30 29 0a 20 20 20 20 20  wtick > 0).     
0fa0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
0fb0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
0fc0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
0fd0: 28 72 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (r, SQLiteLastEr
0fe0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ror());.        
0ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1000: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20    else.         
1010: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
1020: 20 20 20 2f 2f 20 4f 74 68 65 72 77 69 73 65 20     // Otherwise 
1030: 73 6c 65 65 70 20 66 6f 72 20 61 20 72 61 6e 64  sleep for a rand
1040: 6f 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  om amount of tim
1050: 65 20 75 70 20 74 6f 20 32 35 30 6d 73 0a 20 20  e up to 250ms.  
1060: 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 73 61              Unsa
1070: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
1080: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 5f 69 6e  sqlite3_sleep_in
1090: 74 65 72 6f 70 28 28 75 69 6e 74 29 72 6e 64 2e  terop((uint)rnd.
10a0: 4e 65 78 74 28 31 2c 20 32 35 30 29 29 3b 0a 20  Next(1, 250));. 
10b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10c0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
10d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10e0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
10f0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 46 69  override void Fi
1100: 6e 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e 74 28  nalizeStatement(
1110: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
1120: 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  stmt).    {.    
1130: 20 20 69 66 20 28 73 74 6d 74 2e 5f 73 71 6c 69    if (stmt._sqli
1140: 74 65 5f 73 74 6d 74 20 21 3d 20 49 6e 74 50 74  te_stmt != IntPt
1150: 72 2e 5a 65 72 6f 29 0a 20 20 20 20 20 20 7b 0a  r.Zero).      {.
1160: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
1170: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1180: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 66 69 6e 61  ods.sqlite3_fina
1190: 6c 69 7a 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d  lize_interop(stm
11a0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b  t._sqlite_stmt);
11b0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3e  .        if (n >
11c0: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
11d0: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
11e0: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
11f0: 28 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ());.      }.   
1200: 20 20 20 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f     stmt._sqlite_
1210: 73 74 6d 74 20 3d 20 49 6e 74 50 74 72 2e 5a 65  stmt = IntPtr.Ze
1220: 72 6f 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ro;.    }..    i
1230: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
1240: 20 69 6e 74 20 52 65 73 65 74 28 53 51 4c 69 74   int Reset(SQLit
1250: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 29  eStatement stmt)
1260: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
1270: 20 6e 3b 0a 0a 20 20 20 20 20 20 6e 20 3d 20 55   n;..      n = U
1280: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1290: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 65 74  ds.sqlite3_reset
12a0: 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73  _interop(stmt._s
12b0: 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 0a 20 20  qlite_stmt);..  
12c0: 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20 73 63      // If the sc
12d0: 68 65 6d 61 20 63 68 61 6e 67 65 64 2c 20 74 72  hema changed, tr
12e0: 79 20 61 6e 64 20 72 65 2d 70 72 65 70 61 72 65  y and re-prepare
12f0: 20 69 74 0a 20 20 20 20 20 20 69 66 20 28 6e 20   it.      if (n 
1300: 3d 3d 20 31 37 29 20 2f 2f 20 53 51 4c 49 54 45  == 17) // SQLITE
1310: 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20 7b 0a  _SCHEMA.      {.
1320: 20 20 20 20 20 20 20 20 2f 2f 20 52 65 63 72 65          // Recre
1330: 61 74 65 20 61 20 64 75 6d 6d 79 20 73 74 61 74  ate a dummy stat
1340: 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 73 74  ement.        st
1350: 72 69 6e 67 20 73 74 72 3b 0a 20 20 20 20 20 20  ring str;.      
1360: 20 20 75 73 69 6e 67 20 28 53 51 4c 69 74 65 53    using (SQLiteS
1370: 74 61 74 65 6d 65 6e 74 20 74 6d 70 20 3d 20 50  tatement tmp = P
1380: 72 65 70 61 72 65 28 73 74 6d 74 2e 5f 73 71 6c  repare(stmt._sql
1390: 53 74 61 74 65 6d 65 6e 74 2c 20 6e 75 6c 6c 2c  Statement, null,
13a0: 20 6f 75 74 20 73 74 72 29 29 0a 20 20 20 20 20   out str)).     
13b0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
13c0: 2f 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 65  / Finalize the e
13d0: 78 69 73 74 69 6e 67 20 73 74 61 74 65 6d 65 6e  xisting statemen
13e0: 74 0a 20 20 20 20 20 20 20 20 20 20 46 69 6e 61  t.          Fina
13f0: 6c 69 7a 65 53 74 61 74 65 6d 65 6e 74 28 73 74  lizeStatement(st
1400: 6d 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  mt);..          
1410: 2f 2f 20 52 65 61 73 73 69 67 6e 20 61 20 6e 65  // Reassign a ne
1420: 77 20 73 74 61 74 65 6d 65 6e 74 20 70 6f 69 6e  w statement poin
1430: 74 65 72 20 74 6f 20 74 68 65 20 6f 6c 64 20 73  ter to the old s
1440: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 63 6c 65  tatement and cle
1450: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
1460: 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 73   one.          s
1470: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
1480: 20 3d 20 74 6d 70 2e 5f 73 71 6c 69 74 65 5f 73   = tmp._sqlite_s
1490: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  tmt;.          t
14a0: 6d 70 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 20  mp._sqlite_stmt 
14b0: 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a 0a  = IntPtr.Zero;..
14c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 61            // Rea
14d0: 70 70 6c 79 20 70 61 72 61 6d 65 74 65 72 73 0a  pply parameters.
14e0: 20 20 20 20 20 20 20 20 20 20 73 74 6d 74 2e 42            stmt.B
14f0: 69 6e 64 50 61 72 61 6d 65 74 65 72 73 28 29 3b  indParameters();
1500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1510: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 20 2f 2f     return -1; //
1520: 20 52 65 73 65 74 20 77 61 73 20 4f 4b 2c 20 77   Reset was OK, w
1530: 69 74 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ith schema chang
1540: 65 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  e.      }.      
1550: 65 6c 73 65 20 69 66 20 28 6e 20 3d 3d 20 36 29  else if (n == 6)
1560: 20 2f 2f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   // SQLITE_LOCKE
1570: 44 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  D.        return
1580: 20 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e   n;..      if (n
1590: 20 3e 20 30 29 0a 20 20 20 20 20 20 20 20 74 68   > 0).        th
15a0: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
15b0: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
15c0: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a  eLastError());..
15d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
15e0: 2f 2f 20 57 65 20 72 65 73 65 74 20 4f 4b 2c 20  // We reset OK, 
15f0: 6e 6f 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  no schema change
1600: 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  s.    }..    int
1610: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73  ernal override s
1620: 74 72 69 6e 67 20 53 51 4c 69 74 65 4c 61 73 74  tring SQLiteLast
1630: 45 72 72 6f 72 28 29 0a 20 20 20 20 7b 0a 20 20  Error().    {.  
1640: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
1650: 20 20 20 72 65 74 75 72 6e 20 54 6f 53 74 72 69     return ToStri
1660: 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  ng(UnsafeNativeM
1670: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 65  ethods.sqlite3_e
1680: 72 72 6d 73 67 5f 69 6e 74 65 72 6f 70 28 5f 73  rrmsg_interop(_s
1690: 71 6c 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65  ql, out len), le
16a0: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
16b0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
16c0: 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74   SQLiteStatement
16d0: 20 50 72 65 70 61 72 65 28 73 74 72 69 6e 67 20   Prepare(string 
16e0: 73 74 72 53 71 6c 2c 20 53 51 4c 69 74 65 53 74  strSql, SQLiteSt
16f0: 61 74 65 6d 65 6e 74 20 70 72 65 76 69 6f 75 73  atement previous
1700: 2c 20 6f 75 74 20 73 74 72 69 6e 67 20 73 74 72  , out string str
1710: 52 65 6d 61 69 6e 29 0a 20 20 20 20 7b 0a 20 20  Remain).    {.  
1720: 20 20 20 20 49 6e 74 50 74 72 20 73 74 6d 74 20      IntPtr stmt 
1730: 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a 20  = IntPtr.Zero;. 
1740: 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72 20       IntPtr ptr 
1750: 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a 20  = IntPtr.Zero;. 
1760: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30       int len = 0
1770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
1780: 31 37 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  17;.      int re
1790: 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  tries = 0;.     
17a0: 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54   byte[] b = ToUT
17b0: 46 38 28 73 74 72 53 71 6c 29 3b 0a 20 20 20 20  F8(strSql);.    
17c0: 20 20 73 74 72 69 6e 67 20 74 79 70 65 64 65 66    string typedef
17d0: 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  s = null;.      
17e0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
17f0: 63 6d 64 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  cmd = null;.    
1800: 20 20 47 43 48 61 6e 64 6c 65 20 68 61 6e 64 6c    GCHandle handl
1810: 65 20 3d 20 47 43 48 61 6e 64 6c 65 2e 41 6c 6c  e = GCHandle.All
1820: 6f 63 28 62 2c 20 47 43 48 61 6e 64 6c 65 54 79  oc(b, GCHandleTy
1830: 70 65 2e 50 69 6e 6e 65 64 29 3b 0a 20 20 20 20  pe.Pinned);.    
1840: 20 20 49 6e 74 50 74 72 20 70 73 71 6c 20 3d 20    IntPtr psql = 
1850: 68 61 6e 64 6c 65 2e 41 64 64 72 4f 66 50 69 6e  handle.AddrOfPin
1860: 6e 65 64 4f 62 6a 65 63 74 28 29 3b 0a 0a 20 20  nedObject();..  
1870: 20 20 20 20 74 72 79 0a 20 20 20 20 20 20 7b 0a      try.      {.
1880: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 6e          while (n
1890: 20 3d 3d 20 31 37 20 26 26 20 72 65 74 72 69 65   == 17 && retrie
18a0: 73 20 3c 20 33 29 0a 20 20 20 20 20 20 20 20 7b  s < 3).        {
18b0: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 55  .          n = U
18c0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
18d0: 64 73 2e 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ds.sqlite3_prepa
18e0: 72 65 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  re_interop(_sql,
18f0: 20 70 73 71 6c 2c 20 62 2e 4c 65 6e 67 74 68 20   psql, b.Length 
1900: 2d 20 31 2c 20 6f 75 74 20 73 74 6d 74 2c 20 6f  - 1, out stmt, o
1910: 75 74 20 70 74 72 2c 20 6f 75 74 20 6c 65 6e 29  ut ptr, out len)
1920: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 72  ;.          retr
1930: 69 65 73 2b 2b 3b 0a 0a 20 20 20 20 20 20 20 20  ies++;..        
1940: 20 20 69 66 20 28 6e 20 3d 3d 20 31 29 0a 20 20    if (n == 1).  
1950: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1960: 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67        if (String
1970: 2e 43 6f 6d 70 61 72 65 28 53 51 4c 69 74 65 4c  .Compare(SQLiteL
1980: 61 73 74 45 72 72 6f 72 28 29 2c 20 22 6e 65 61  astError(), "nea
1990: 72 20 5c 22 54 59 50 45 53 5c 22 3a 20 73 79 6e  r \"TYPES\": syn
19a0: 74 61 78 20 65 72 72 6f 72 22 2c 20 53 74 72 69  tax error", Stri
19b0: 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64  ngComparison.Ord
19c0: 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20  inalIgnoreCase) 
19d0: 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  == 0).          
19e0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
19f0: 20 20 69 6e 74 20 70 6f 73 20 3d 20 73 74 72 53    int pos = strS
1a00: 71 6c 2e 49 6e 64 65 78 4f 66 28 27 3b 27 29 3b  ql.IndexOf(';');
1a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a20: 66 20 28 70 6f 73 20 3d 3d 20 2d 31 29 20 70 6f  f (pos == -1) po
1a30: 73 20 3d 20 73 74 72 53 71 6c 2e 4c 65 6e 67 74  s = strSql.Lengt
1a40: 68 20 2d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  h - 1;..        
1a50: 20 20 20 20 20 20 74 79 70 65 64 65 66 73 20 3d        typedefs =
1a60: 20 73 74 72 53 71 6c 2e 53 75 62 73 74 72 69 6e   strSql.Substrin
1a70: 67 28 30 2c 20 70 6f 73 20 2b 20 31 29 3b 0a 20  g(0, pos + 1);. 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1a90: 53 71 6c 20 3d 20 73 74 72 53 71 6c 2e 53 75 62  Sql = strSql.Sub
1aa0: 73 74 72 69 6e 67 28 70 6f 73 20 2b 20 31 29 3b  string(pos + 1);
1ab0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ac0: 73 74 72 52 65 6d 61 69 6e 20 3d 20 22 22 3b 0a  strRemain = "";.
1ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
1ae0: 68 69 6c 65 20 28 63 6d 64 20 3d 3d 20 6e 75 6c  hile (cmd == nul
1af0: 6c 20 26 26 20 73 74 72 53 71 6c 2e 4c 65 6e 67  l && strSql.Leng
1b00: 74 68 20 3e 20 30 29 0a 20 20 20 20 20 20 20 20  th > 0).        
1b10: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1b20: 20 20 20 20 20 20 20 20 63 6d 64 20 3d 20 50 72          cmd = Pr
1b30: 65 70 61 72 65 28 73 74 72 53 71 6c 2c 20 70 72  epare(strSql, pr
1b40: 65 76 69 6f 75 73 2c 20 6f 75 74 20 73 74 72 52  evious, out strR
1b50: 65 6d 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  emain);.        
1b60: 20 20 20 20 20 20 20 20 73 74 72 53 71 6c 20 3d          strSql =
1b70: 20 73 74 72 52 65 6d 61 69 6e 3b 0a 20 20 20 20   strRemain;.    
1b80: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1b90: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
1ba0: 6d 64 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  md != null).    
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
1bc0: 53 65 74 54 79 70 65 73 28 74 79 70 65 64 65 66  SetTypes(typedef
1bd0: 73 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  s);..           
1be0: 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0a 20     return cmd;. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c10: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28   }..        if (
1c20: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
1c30: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
1c40: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
1c50: 72 6f 72 28 29 29 3b 0a 0a 20 20 20 20 20 20 20  ror());..       
1c60: 20 73 74 72 52 65 6d 61 69 6e 20 3d 20 55 54 46   strRemain = UTF
1c70: 38 54 6f 53 74 72 69 6e 67 28 70 74 72 2c 20 6c  8ToString(ptr, l
1c80: 65 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  en);..        if
1c90: 20 28 73 74 6d 74 20 21 3d 20 49 6e 74 50 74 72   (stmt != IntPtr
1ca0: 2e 5a 65 72 6f 29 20 63 6d 64 20 3d 20 6e 65 77  .Zero) cmd = new
1cb0: 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74   SQLiteStatement
1cc0: 28 74 68 69 73 2c 20 73 74 6d 74 2c 20 73 74 72  (this, stmt, str
1cd0: 53 71 6c 2e 53 75 62 73 74 72 69 6e 67 28 30 2c  Sql.Substring(0,
1ce0: 20 73 74 72 53 71 6c 2e 4c 65 6e 67 74 68 20 2d   strSql.Length -
1cf0: 20 73 74 72 52 65 6d 61 69 6e 2e 4c 65 6e 67 74   strRemain.Lengt
1d00: 68 29 2c 20 70 72 65 76 69 6f 75 73 29 3b 0a 0a  h), previous);..
1d10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
1d20: 6d 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  md;.      }.    
1d30: 20 20 66 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20    finally.      
1d40: 7b 0a 20 20 20 20 20 20 20 20 68 61 6e 64 6c 65  {.        handle
1d50: 2e 46 72 65 65 28 29 3b 0a 20 20 20 20 20 20 7d  .Free();.      }
1d60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
1d70: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
1d80: 69 64 20 42 69 6e 64 5f 44 6f 75 62 6c 65 28 53  id Bind_Double(S
1d90: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
1da0: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20  tmt, int index, 
1db0: 64 6f 75 62 6c 65 20 76 61 6c 75 65 29 0a 20 20  double value).  
1dc0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20    {.      int n 
1dd0: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
1de0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69  thods.sqlite3_bi
1df0: 6e 64 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f  nd_double_intero
1e00: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
1e10: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 72 65 66 20  tmt, index, ref 
1e20: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  value);.      if
1e30: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
1e40: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
1e50: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
1e60: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
1e70: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
1e80: 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64  erride void Bind
1e90: 5f 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61  _Int32(SQLiteSta
1ea0: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
1eb0: 20 69 6e 64 65 78 2c 20 69 6e 74 20 76 61 6c 75   index, int valu
1ec0: 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  e).    {.      i
1ed0: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
1ee0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
1ef0: 65 33 5f 62 69 6e 64 5f 69 6e 74 5f 69 6e 74 65  e3_bind_int_inte
1f00: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
1f10: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61  _stmt, index, va
1f20: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
1f30: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
1f40: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
1f50: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
1f60: 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ror());.    }.. 
1f70: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
1f80: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 49  ride void Bind_I
1f90: 6e 74 36 34 28 53 51 4c 69 74 65 53 74 61 74 65  nt64(SQLiteState
1fa0: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
1fb0: 6e 64 65 78 2c 20 6c 6f 6e 67 20 76 61 6c 75 65  ndex, long value
1fc0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
1fd0: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
1fe0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
1ff0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 5f 69 6e 74  3_bind_int64_int
2000: 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74  erop(stmt._sqlit
2010: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 72  e_stmt, index, r
2020: 65 66 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ef value);.     
2030: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
2040: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
2050: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
2060: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
2070: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
2080: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 42   override void B
2090: 69 6e 64 5f 54 65 78 74 28 53 51 4c 69 74 65 53  ind_Text(SQLiteS
20a0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
20b0: 6e 74 20 69 6e 64 65 78 2c 20 73 74 72 69 6e 67  nt index, string
20c0: 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20   value).    {.  
20d0: 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54      byte[] b = T
20e0: 6f 55 54 46 38 28 76 61 6c 75 65 29 3b 0a 20 20  oUTF8(value);.  
20f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
2100: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
2110: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2120: 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  t_interop(stmt._
2130: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2140: 65 78 2c 20 62 2c 20 62 2e 4c 65 6e 67 74 68 20  ex, b, b.Length 
2150: 2d 20 31 2c 20 28 49 6e 74 50 74 72 29 28 2d 31  - 1, (IntPtr)(-1
2160: 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  ));.      if (n 
2170: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
2180: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
2190: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
21a0: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r());.    }..   
21b0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
21c0: 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 44 61 74  de void Bind_Dat
21d0: 65 54 69 6d 65 28 53 51 4c 69 74 65 53 74 61 74  eTime(SQLiteStat
21e0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
21f0: 69 6e 64 65 78 2c 20 44 61 74 65 54 69 6d 65 20  index, DateTime 
2200: 64 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dt).    {.      
2210: 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46  byte[] b = ToUTF
2220: 38 28 64 74 29 3b 0a 20 20 20 20 20 20 69 6e 74  8(dt);.      int
2230: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
2240: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
2250: 5f 62 69 6e 64 5f 74 65 78 74 5f 69 6e 74 65 72  _bind_text_inter
2260: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
2270: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 62 2c 20  stmt, index, b, 
2280: 62 2e 4c 65 6e 67 74 68 20 2d 20 31 2c 20 28 49  b.Length - 1, (I
2290: 6e 74 50 74 72 29 28 2d 31 29 29 3b 0a 20 20 20  ntPtr)(-1));.   
22a0: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
22b0: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
22c0: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
22d0: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  eLastError());. 
22e0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
22f0: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
2300: 20 42 69 6e 64 5f 42 6c 6f 62 28 53 51 4c 69 74   Bind_Blob(SQLit
2310: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
2320: 20 69 6e 74 20 69 6e 64 65 78 2c 20 62 79 74 65   int index, byte
2330: 5b 5d 20 62 6c 6f 62 44 61 74 61 29 0a 20 20 20  [] blobData).   
2340: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d   {.      int n =
2350: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
2360: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e  hods.sqlite3_bin
2370: 64 5f 62 6c 6f 62 5f 69 6e 74 65 72 6f 70 28 73  d_blob_interop(s
2380: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
2390: 2c 20 69 6e 64 65 78 2c 20 62 6c 6f 62 44 61 74  , index, blobDat
23a0: 61 2c 20 62 6c 6f 62 44 61 74 61 2e 4c 65 6e 67  a, blobData.Leng
23b0: 74 68 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29  th, (IntPtr)(-1)
23c0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  );.      if (n >
23d0: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
23e0: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
23f0: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
2400: 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ());.    }..    
2410: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2420: 65 20 76 6f 69 64 20 42 69 6e 64 5f 4e 75 6c 6c  e void Bind_Null
2430: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
2440: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
2450: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
2460: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
2470: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
2480: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 5f 69 6e 74 65  3_bind_null_inte
2490: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
24a0: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20  _stmt, index);. 
24b0: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
24c0: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
24d0: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
24e0: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
24f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
2500: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e  rnal override in
2510: 74 20 42 69 6e 64 5f 50 61 72 61 6d 43 6f 75 6e  t Bind_ParamCoun
2520: 74 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  t(SQLiteStatemen
2530: 74 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20  t stmt).    {.  
2540: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
2550: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2560: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2570: 6d 65 74 65 72 5f 63 6f 75 6e 74 5f 69 6e 74 65  meter_count_inte
2580: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
2590: 5f 73 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  _stmt);.    }.. 
25a0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
25b0: 72 69 64 65 20 73 74 72 69 6e 67 20 42 69 6e 64  ride string Bind
25c0: 5f 50 61 72 61 6d 4e 61 6d 65 28 53 51 4c 69 74  _ParamName(SQLit
25d0: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
25e0: 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20   int index).    
25f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
2600: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f  .      return To
2610: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
2620: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
2630: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
2640: 72 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73  r_name_interop(s
2650: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
2660: 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e  , index, out len
2670: 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a  ), len);.    }..
2680: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
2690: 72 72 69 64 65 20 69 6e 74 20 42 69 6e 64 5f 50  rride int Bind_P
26a0: 61 72 61 6d 49 6e 64 65 78 28 53 51 4c 69 74 65  aramIndex(SQLite
26b0: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
26c0: 73 74 72 69 6e 67 20 70 61 72 61 6d 4e 61 6d 65  string paramName
26d0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65  ).    {.      re
26e0: 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76  turn UnsafeNativ
26f0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
2700: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2710: 69 6e 64 65 78 5f 69 6e 74 65 72 6f 70 28 73 74  index_interop(st
2720: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
2730: 20 54 6f 55 54 46 38 28 70 61 72 61 6d 4e 61 6d   ToUTF8(paramNam
2740: 65 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e));.    }..    
2750: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2760: 65 20 69 6e 74 20 43 6f 6c 75 6d 6e 43 6f 75 6e  e int ColumnCoun
2770: 74 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  t(SQLiteStatemen
2780: 74 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20  t stmt).    {.  
2790: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
27a0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
27b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
27c0: 75 6e 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  unt_interop(stmt
27d0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a  ._sqlite_stmt);.
27e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
27f0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
2800: 69 6e 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 53  ing ColumnName(S
2810: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
2820: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
2830: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
2840: 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72  len;.      retur
2850: 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  n ToString(Unsaf
2860: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2870: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
2880: 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  me_interop(stmt.
2890: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
28a0: 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c  dex, out len), l
28b0: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
28c0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
28d0: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 20 43  e TypeAffinity C
28e0: 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 53 51  olumnAffinity(SQ
28f0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
2900: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20  mt, int index). 
2910: 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72     {.      retur
2920: 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  n UnsafeNativeMe
2930: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
2940: 6c 75 6d 6e 5f 74 79 70 65 5f 69 6e 74 65 72 6f  lumn_type_intero
2950: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
2960: 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20  tmt, index);.   
2970: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
2980: 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67   override string
2990: 20 43 6f 6c 75 6d 6e 54 79 70 65 28 53 51 4c 69   ColumnType(SQLi
29a0: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
29b0: 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 6f 75 74  , int index, out
29c0: 20 54 79 70 65 41 66 66 69 6e 69 74 79 20 6e 41   TypeAffinity nA
29d0: 66 66 69 6e 69 74 79 29 0a 20 20 20 20 7b 0a 20  ffinity).    {. 
29e0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
29f0: 20 20 20 20 49 6e 74 50 74 72 20 70 20 3d 20 55      IntPtr p = U
2a00: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
2a10: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
2a20: 6e 5f 64 65 63 6c 74 79 70 65 5f 69 6e 74 65 72  n_decltype_inter
2a30: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
2a40: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74  stmt, index, out
2a50: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 6e 41 66   len);.      nAf
2a60: 66 69 6e 69 74 79 20 3d 20 43 6f 6c 75 6d 6e 41  finity = ColumnA
2a70: 66 66 69 6e 69 74 79 28 73 74 6d 74 2c 20 69 6e  ffinity(stmt, in
2a80: 64 65 78 29 3b 0a 0a 20 20 20 20 20 20 69 66 20  dex);..      if 
2a90: 28 70 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65 72  (p != IntPtr.Zer
2aa0: 6f 29 20 72 65 74 75 72 6e 20 62 61 73 65 2e 54  o) return base.T
2ab0: 6f 53 74 72 69 6e 67 28 70 2c 20 6c 65 6e 29 3b  oString(p, len);
2ac0: 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .      else.    
2ad0: 20 20 7b 0a 20 20 20 20 20 20 20 20 73 74 72 69    {.        stri
2ae0: 6e 67 5b 5d 20 61 72 20 3d 20 73 74 6d 74 2e 54  ng[] ar = stmt.T
2af0: 79 70 65 44 65 66 69 6e 69 74 69 6f 6e 73 3b 0a  ypeDefinitions;.
2b00: 20 20 20 20 20 20 20 20 69 66 20 28 61 72 20 21          if (ar !
2b10: 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20  = null).        
2b20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  {.          if (
2b30: 69 6e 64 65 78 20 3c 20 61 72 2e 4c 65 6e 67 74  index < ar.Lengt
2b40: 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  h).            r
2b50: 65 74 75 72 6e 20 61 72 5b 69 6e 64 65 78 5d 3b  eturn ar[index];
2b60: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2b70: 20 20 20 20 73 77 69 74 63 68 20 28 6e 41 66 66      switch (nAff
2b80: 69 6e 69 74 79 29 0a 20 20 20 20 20 20 20 20 7b  inity).        {
2b90: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
2ba0: 54 79 70 65 41 66 66 69 6e 69 74 79 2e 49 6e 74  TypeAffinity.Int
2bb0: 36 34 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  64:.            
2bc0: 72 65 74 75 72 6e 20 22 42 49 47 49 4e 54 22 3b  return "BIGINT";
2bd0: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
2be0: 54 79 70 65 41 66 66 69 6e 69 74 79 2e 44 6f 75  TypeAffinity.Dou
2bf0: 62 6c 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ble:.           
2c00: 20 72 65 74 75 72 6e 20 22 44 4f 55 42 4c 45 22   return "DOUBLE"
2c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
2c20: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c   TypeAffinity.Bl
2c30: 6f 62 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ob:.            
2c40: 72 65 74 75 72 6e 20 22 42 4c 4f 42 22 3b 0a 20  return "BLOB";. 
2c50: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
2c60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  :.            re
2c70: 74 75 72 6e 20 22 54 45 58 54 22 3b 0a 20 20 20  turn "TEXT";.   
2c80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2c90: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
2ca0: 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20  al override int 
2cb0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 53 51 4c 69  ColumnIndex(SQLi
2cc0: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
2cd0: 2c 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 4e  , string columnN
2ce0: 61 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ame).    {.     
2cf0: 20 69 6e 74 20 78 20 3d 20 43 6f 6c 75 6d 6e 43   int x = ColumnC
2d00: 6f 75 6e 74 28 73 74 6d 74 29 3b 0a 0a 20 20 20  ount(stmt);..   
2d10: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
2d20: 30 3b 20 6e 20 3c 20 78 3b 20 6e 2b 2b 29 0a 20  0; n < x; n++). 
2d30: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
2d40: 66 20 28 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72  f (String.Compar
2d50: 65 28 63 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 43 6f  e(columnName, Co
2d60: 6c 75 6d 6e 4e 61 6d 65 28 73 74 6d 74 2c 20 6e  lumnName(stmt, n
2d70: 29 2c 20 74 72 75 65 2c 20 43 75 6c 74 75 72 65  ), true, Culture
2d80: 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e 74 43 75  Info.InvariantCu
2d90: 6c 74 75 72 65 29 20 3d 3d 20 30 29 0a 20 20 20  lture) == 0).   
2da0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b         return n;
2db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2dc0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
2dd0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
2de0: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 43 6f  erride string Co
2df0: 6c 75 6d 6e 4f 72 69 67 69 6e 61 6c 4e 61 6d 65  lumnOriginalName
2e00: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
2e10: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
2e20: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
2e30: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74  t len;.      ret
2e40: 75 72 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73  urn ToString(Uns
2e50: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
2e60: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
2e70: 6f 72 69 67 69 6e 5f 6e 61 6d 65 5f 69 6e 74 65  origin_name_inte
2e80: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
2e90: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75  _stmt, index, ou
2ea0: 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20  t len), len);.  
2eb0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
2ec0: 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e  l override strin
2ed0: 67 20 43 6f 6c 75 6d 6e 44 61 74 61 62 61 73 65  g ColumnDatabase
2ee0: 4e 61 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65  Name(SQLiteState
2ef0: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
2f00: 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20  ndex).    {.    
2f10: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
2f20: 20 72 65 74 75 72 6e 20 54 6f 53 74 72 69 6e 67   return ToString
2f30: 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  (UnsafeNativeMet
2f40: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
2f50: 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
2f60: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
2f70: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2f80: 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65  ex, out len), le
2f90: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
2fa0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
2fb0: 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 54 61   string ColumnTa
2fc0: 62 6c 65 4e 61 6d 65 28 53 51 4c 69 74 65 53 74  bleName(SQLiteSt
2fd0: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
2fe0: 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20  t index).    {. 
2ff0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
3000: 20 20 20 20 72 65 74 75 72 6e 20 54 6f 53 74 72      return ToStr
3010: 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65  ing(UnsafeNative
3020: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
3030: 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
3040: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
3050: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
3060: 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65  ex, out len), le
3070: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
3080: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
3090: 20 76 6f 69 64 20 43 6f 6c 75 6d 6e 4d 65 74 61   void ColumnMeta
30a0: 44 61 74 61 28 73 74 72 69 6e 67 20 64 61 74 61  Data(string data
30b0: 42 61 73 65 2c 20 73 74 72 69 6e 67 20 74 61 62  Base, string tab
30c0: 6c 65 2c 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d  le, string colum
30d0: 6e 2c 20 6f 75 74 20 73 74 72 69 6e 67 20 64 61  n, out string da
30e0: 74 61 54 79 70 65 2c 20 6f 75 74 20 73 74 72 69  taType, out stri
30f0: 6e 67 20 63 6f 6c 6c 61 74 65 53 65 71 75 65 6e  ng collateSequen
3100: 63 65 2c 20 6f 75 74 20 62 6f 6f 6c 20 6e 6f 74  ce, out bool not
3110: 4e 75 6c 6c 2c 20 6f 75 74 20 62 6f 6f 6c 20 70  Null, out bool p
3120: 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75 74 20 62  rimaryKey, out b
3130: 6f 6f 6c 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e  ool autoIncremen
3140: 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 49  t).    {.      I
3150: 6e 74 50 74 72 20 64 61 74 61 54 79 70 65 50 74  ntPtr dataTypePt
3160: 72 3b 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20  r;.      IntPtr 
3170: 63 6f 6c 6c 53 65 71 50 74 72 3b 0a 20 20 20 20  collSeqPtr;.    
3180: 20 20 69 6e 74 20 64 74 4c 65 6e 3b 0a 20 20 20    int dtLen;.   
3190: 20 20 20 69 6e 74 20 63 73 4c 65 6e 3b 0a 20 20     int csLen;.  
31a0: 20 20 20 20 69 6e 74 20 6e 6e 6f 74 4e 75 6c 6c      int nnotNull
31b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 70 72 69  ;.      int npri
31c0: 6d 61 72 79 4b 65 79 3b 0a 20 20 20 20 20 20 69  maryKey;.      i
31d0: 6e 74 20 6e 61 75 74 6f 49 6e 63 3b 0a 20 20 20  nt nautoInc;.   
31e0: 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20     int n;..     
31f0: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
3200: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
3210: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
3220: 74 61 64 61 74 61 5f 69 6e 74 65 72 6f 70 28 5f  tadata_interop(_
3230: 73 71 6c 2c 20 54 6f 55 54 46 38 28 64 61 74 61  sql, ToUTF8(data
3240: 42 61 73 65 29 2c 20 54 6f 55 54 46 38 28 74 61  Base), ToUTF8(ta
3250: 62 6c 65 29 2c 20 54 6f 55 54 46 38 28 63 6f 6c  ble), ToUTF8(col
3260: 75 6d 6e 29 2c 20 6f 75 74 20 64 61 74 61 54 79  umn), out dataTy
3270: 70 65 50 74 72 2c 20 6f 75 74 20 63 6f 6c 6c 53  pePtr, out collS
3280: 65 71 50 74 72 2c 20 6f 75 74 20 6e 6e 6f 74 4e  eqPtr, out nnotN
3290: 75 6c 6c 2c 20 6f 75 74 20 6e 70 72 69 6d 61 72  ull, out nprimar
32a0: 79 4b 65 79 2c 20 6f 75 74 20 6e 61 75 74 6f 49  yKey, out nautoI
32b0: 6e 63 2c 20 6f 75 74 20 64 74 4c 65 6e 2c 20 6f  nc, out dtLen, o
32c0: 75 74 20 63 73 4c 65 6e 29 3b 0a 20 20 20 20 20  ut csLen);.     
32d0: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
32e0: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
32f0: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
3300: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20  astError());..  
3310: 20 20 20 20 64 61 74 61 54 79 70 65 20 3d 20 62      dataType = b
3320: 61 73 65 2e 54 6f 53 74 72 69 6e 67 28 64 61 74  ase.ToString(dat
3330: 61 54 79 70 65 50 74 72 2c 20 64 74 4c 65 6e 29  aTypePtr, dtLen)
3340: 3b 0a 20 20 20 20 20 20 63 6f 6c 6c 61 74 65 53  ;.      collateS
3350: 65 71 75 65 6e 63 65 20 3d 20 62 61 73 65 2e 54  equence = base.T
3360: 6f 53 74 72 69 6e 67 28 63 6f 6c 6c 53 65 71 50  oString(collSeqP
3370: 74 72 2c 20 63 73 4c 65 6e 29 3b 0a 0a 20 20 20  tr, csLen);..   
3380: 20 20 20 6e 6f 74 4e 75 6c 6c 20 3d 20 28 6e 6e     notNull = (nn
3390: 6f 74 4e 75 6c 6c 20 3d 3d 20 31 29 3b 0a 20 20  otNull == 1);.  
33a0: 20 20 20 20 70 72 69 6d 61 72 79 4b 65 79 20 3d      primaryKey =
33b0: 20 28 6e 70 72 69 6d 61 72 79 4b 65 79 20 3d 3d   (nprimaryKey ==
33c0: 20 31 29 3b 0a 20 20 20 20 20 20 61 75 74 6f 49   1);.      autoI
33d0: 6e 63 72 65 6d 65 6e 74 20 3d 20 28 6e 61 75 74  ncrement = (naut
33e0: 6f 49 6e 63 20 3d 3d 20 31 29 3b 0a 20 20 20 20  oInc == 1);.    
33f0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3400: 6f 76 65 72 72 69 64 65 20 64 6f 75 62 6c 65 20  override double 
3410: 47 65 74 44 6f 75 62 6c 65 28 53 51 4c 69 74 65  GetDouble(SQLite
3420: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
3430: 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b  int index).    {
3440: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 76 61  .      double va
3450: 6c 75 65 3b 0a 20 20 20 20 20 20 55 6e 73 61 66  lue;.      Unsaf
3460: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3470: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
3480: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d  uble_interop(stm
3490: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
34a0: 69 6e 64 65 78 2c 20 6f 75 74 20 76 61 6c 75 65  index, out value
34b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
34c0: 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  value;.    }..  
34d0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
34e0: 69 64 65 20 69 6e 74 20 47 65 74 49 6e 74 33 32  ide int GetInt32
34f0: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
3500: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
3510: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65  ).    {.      re
3520: 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76  turn UnsafeNativ
3530: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
3540: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 5f 69 6e 74 65  _column_int_inte
3550: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
3560: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20  _stmt, index);. 
3570: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3580: 61 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67  al override long
3590: 20 47 65 74 49 6e 74 36 34 28 53 51 4c 69 74 65   GetInt64(SQLite
35a0: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
35b0: 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b  int index).    {
35c0: 0a 20 20 20 20 20 20 6c 6f 6e 67 20 76 61 6c 75  .      long valu
35d0: 65 3b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  e;.      UnsafeN
35e0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
35f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
3600: 34 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  4_interop(stmt._
3610: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
3620: 65 78 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b 0a  ex, out value);.
3630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c        return val
3640: 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ue;.    }..    i
3650: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
3660: 20 73 74 72 69 6e 67 20 47 65 74 54 65 78 74 28   string GetText(
3670: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
3680: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29  stmt, int index)
3690: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
36a0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75   len;.      retu
36b0: 72 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  rn ToString(Unsa
36c0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
36d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
36e0: 65 78 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ext_interop(stmt
36f0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
3700: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20  ndex, out len), 
3710: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  len);.    }..   
3720: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3730: 64 65 20 44 61 74 65 54 69 6d 65 20 47 65 74 44  de DateTime GetD
3740: 61 74 65 54 69 6d 65 28 53 51 4c 69 74 65 53 74  ateTime(SQLiteSt
3750: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
3760: 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20  t index).    {. 
3770: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
3780: 20 20 20 20 72 65 74 75 72 6e 20 54 6f 44 61 74      return ToDat
3790: 65 54 69 6d 65 28 55 6e 73 61 66 65 4e 61 74 69  eTime(UnsafeNati
37a0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
37b0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 5f 69 6e  3_column_text_in
37c0: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
37d0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
37e0: 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a  out len), len);.
37f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
3800: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e  nal override lon
3810: 67 20 47 65 74 42 79 74 65 73 28 53 51 4c 69 74  g GetBytes(SQLit
3820: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
3830: 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e 74 20   int index, int 
3840: 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 62 79 74  nDataOffset, byt
3850: 65 5b 5d 20 62 44 65 73 74 2c 20 69 6e 74 20 6e  e[] bDest, int n
3860: 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c 65 6e 67  Start, int nLeng
3870: 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  th).    {.      
3880: 49 6e 74 50 74 72 20 70 74 72 3b 0a 20 20 20 20  IntPtr ptr;.    
3890: 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a 20 20 20 20    int nlen;.    
38a0: 20 20 69 6e 74 20 6e 43 6f 70 69 65 64 20 3d 20    int nCopied = 
38b0: 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 20 20  nLength;..      
38c0: 6e 6c 65 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nlen = UnsafeNat
38d0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
38e0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 5f  e3_column_bytes_
38f0: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
3900: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
3910: 29 3b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 55  );.      ptr = U
3920: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
3930: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
3940: 6e 5f 62 6c 6f 62 5f 69 6e 74 65 72 6f 70 28 73  n_blob_interop(s
3950: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
3960: 2c 20 69 6e 64 65 78 29 3b 0a 0a 20 20 20 20 20  , index);..     
3970: 20 69 66 20 28 62 44 65 73 74 20 3d 3d 20 6e 75   if (bDest == nu
3980: 6c 6c 29 20 72 65 74 75 72 6e 20 6e 6c 65 6e 3b  ll) return nlen;
3990: 0a 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70  ..      if (nCop
39a0: 69 65 64 20 2b 20 6e 53 74 61 72 74 20 3e 20 62  ied + nStart > b
39b0: 44 65 73 74 2e 4c 65 6e 67 74 68 29 20 6e 43 6f  Dest.Length) nCo
39c0: 70 69 65 64 20 3d 20 62 44 65 73 74 2e 4c 65 6e  pied = bDest.Len
39d0: 67 74 68 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20  gth - nStart;.  
39e0: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
39f0: 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 20 3e 20  + nDataOffset > 
3a00: 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64 20 3d 20  nlen) nCopied = 
3a10: 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f 66 66 73  nlen - nDataOffs
3a20: 65 74 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e  et;..      if (n
3a30: 43 6f 70 69 65 64 20 3e 20 30 29 0a 20 20 20 20  Copied > 0).    
3a40: 20 20 20 20 4d 61 72 73 68 61 6c 2e 43 6f 70 79      Marshal.Copy
3a50: 28 28 49 6e 74 50 74 72 29 28 70 74 72 2e 54 6f  ((IntPtr)(ptr.To
3a60: 49 6e 74 33 32 28 29 20 2b 20 6e 44 61 74 61 4f  Int32() + nDataO
3a70: 66 66 73 65 74 29 2c 20 62 44 65 73 74 2c 20 6e  ffset), bDest, n
3a80: 53 74 61 72 74 2c 20 6e 43 6f 70 69 65 64 29 3b  Start, nCopied);
3a90: 0a 20 20 20 20 20 20 65 6c 73 65 20 6e 43 6f 70  .      else nCop
3aa0: 69 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ied = 0;..      
3ab0: 72 65 74 75 72 6e 20 6e 43 6f 70 69 65 64 3b 0a  return nCopied;.
3ac0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
3ad0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e  nal override lon
3ae0: 67 20 47 65 74 43 68 61 72 73 28 53 51 4c 69 74  g GetChars(SQLit
3af0: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
3b00: 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e 74 20   int index, int 
3b10: 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 63 68 61  nDataOffset, cha
3b20: 72 5b 5d 20 62 44 65 73 74 2c 20 69 6e 74 20 6e  r[] bDest, int n
3b30: 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c 65 6e 67  Start, int nLeng
3b40: 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  th).    {.      
3b50: 69 6e 74 20 6e 6c 65 6e 3b 0a 20 20 20 20 20 20  int nlen;.      
3b60: 69 6e 74 20 6e 43 6f 70 69 65 64 20 3d 20 6e 4c  int nCopied = nL
3b70: 65 6e 67 74 68 3b 0a 0a 20 20 20 20 20 20 73 74  ength;..      st
3b80: 72 69 6e 67 20 73 74 72 20 3d 20 47 65 74 54 65  ring str = GetTe
3b90: 78 74 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b  xt(stmt, index);
3ba0: 0a 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20 73 74  .      nlen = st
3bb0: 72 2e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 20  r.Length;..     
3bc0: 20 69 66 20 28 62 44 65 73 74 20 3d 3d 20 6e 75   if (bDest == nu
3bd0: 6c 6c 29 20 72 65 74 75 72 6e 20 6e 6c 65 6e 3b  ll) return nlen;
3be0: 0a 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70  ..      if (nCop
3bf0: 69 65 64 20 2b 20 6e 53 74 61 72 74 20 3e 20 62  ied + nStart > b
3c00: 44 65 73 74 2e 4c 65 6e 67 74 68 29 20 6e 43 6f  Dest.Length) nCo
3c10: 70 69 65 64 20 3d 20 62 44 65 73 74 2e 4c 65 6e  pied = bDest.Len
3c20: 67 74 68 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20  gth - nStart;.  
3c30: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
3c40: 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 20 3e 20  + nDataOffset > 
3c50: 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64 20 3d 20  nlen) nCopied = 
3c60: 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f 66 66 73  nlen - nDataOffs
3c70: 65 74 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e  et;..      if (n
3c80: 43 6f 70 69 65 64 20 3e 20 30 29 0a 20 20 20 20  Copied > 0).    
3c90: 20 20 20 20 73 74 72 2e 43 6f 70 79 54 6f 28 6e      str.CopyTo(n
3ca0: 44 61 74 61 4f 66 66 73 65 74 2c 20 62 44 65 73  DataOffset, bDes
3cb0: 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70 69  t, nStart, nCopi
3cc0: 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  ed);.      else 
3cd0: 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a 20 20  nCopied = 0;..  
3ce0: 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f 70 69      return nCopi
3cf0: 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ed;.    }..    i
3d00: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
3d10: 20 62 6f 6f 6c 20 49 73 4e 75 6c 6c 28 53 51 4c   bool IsNull(SQL
3d20: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
3d30: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
3d40: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e    {.      return
3d50: 20 28 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79   (ColumnAffinity
3d60: 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 20 3d 3d  (stmt, index) ==
3d70: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 4e 75   TypeAffinity.Nu
3d80: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ll);.    }..    
3d90: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
3da0: 65 20 69 6e 74 20 41 67 67 72 65 67 61 74 65 43  e int AggregateC
3db0: 6f 75 6e 74 28 49 6e 74 50 74 72 20 63 6f 6e 74  ount(IntPtr cont
3dc0: 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ext).    {.     
3dd0: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
3de0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3df0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
3e00: 75 6e 74 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74  unt_interop(cont
3e10: 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ext);.    }..   
3e20: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3e30: 64 65 20 49 6e 74 50 74 72 20 43 72 65 61 74 65  de IntPtr Create
3e40: 46 75 6e 63 74 69 6f 6e 28 73 74 72 69 6e 67 20  Function(string 
3e50: 73 74 72 46 75 6e 63 74 69 6f 6e 2c 20 69 6e 74  strFunction, int
3e60: 20 6e 41 72 67 73 2c 20 53 51 4c 69 74 65 43 61   nArgs, SQLiteCa
3e70: 6c 6c 62 61 63 6b 20 66 75 6e 63 2c 20 53 51 4c  llback func, SQL
3e80: 69 74 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  iteCallback func
3e90: 73 74 65 70 2c 20 53 51 4c 69 74 65 43 61 6c 6c  step, SQLiteCall
3ea0: 62 61 63 6b 20 66 75 6e 63 66 69 6e 61 6c 29 0a  back funcfinal).
3eb0: 20 20 20 20 7b 0a 20 20 20 20 20 20 49 6e 74 50      {.      IntP
3ec0: 74 72 20 6e 43 6f 6f 6b 69 65 3b 0a 0a 20 20 20  tr nCookie;..   
3ed0: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
3ee0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3ef0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3f00: 6e 63 74 69 6f 6e 5f 69 6e 74 65 72 6f 70 28 5f  nction_interop(_
3f10: 73 71 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 46  sql, ToUTF8(strF
3f20: 75 6e 63 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c  unction), nArgs,
3f30: 20 31 2c 20 66 75 6e 63 2c 20 66 75 6e 63 73 74   1, func, funcst
3f40: 65 70 2c 20 66 75 6e 63 66 69 6e 61 6c 2c 20 6f  ep, funcfinal, o
3f50: 75 74 20 6e 43 6f 6f 6b 69 65 29 3b 0a 20 20 20  ut nCookie);.   
3f60: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
3f70: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
3f80: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
3f90: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a  eLastError());..
3fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f        return nCo
3fb0: 6f 6b 69 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  okie;.    }..   
3fc0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3fd0: 64 65 20 49 6e 74 50 74 72 20 43 72 65 61 74 65  de IntPtr Create
3fe0: 43 6f 6c 6c 61 74 69 6f 6e 28 73 74 72 69 6e 67  Collation(string
3ff0: 20 73 74 72 43 6f 6c 6c 61 74 69 6f 6e 2c 20 53   strCollation, S
4000: 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e 20 66  QLiteCollation f
4010: 75 6e 63 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  unc).    {.     
4020: 20 49 6e 74 50 74 72 20 6e 43 6f 6f 6b 69 65 3b   IntPtr nCookie;
4030: 0a 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ..      int n = 
4040: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
4050: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61  ods.sqlite3_crea
4060: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 69 6e 74  te_collation_int
4070: 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54 46  erop(_sql, ToUTF
4080: 38 28 73 74 72 43 6f 6c 6c 61 74 69 6f 6e 29 2c  8(strCollation),
4090: 20 31 2c 20 30 2c 20 66 75 6e 63 2c 20 6f 75 74   1, 0, func, out
40a0: 20 6e 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20   nCookie);.     
40b0: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
40c0: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
40d0: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
40e0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20  astError());..  
40f0: 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f 6f 6b      return nCook
4100: 69 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ie;.    }..    i
4110: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
4120: 20 76 6f 69 64 20 46 72 65 65 46 75 6e 63 74 69   void FreeFuncti
4130: 6f 6e 28 49 6e 74 50 74 72 20 6e 43 6f 6f 6b 69  on(IntPtr nCooki
4140: 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55  e).    {.      U
4150: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
4160: 64 73 2e 73 71 6c 69 74 65 33 5f 66 75 6e 63 74  ds.sqlite3_funct
4170: 69 6f 6e 5f 66 72 65 65 5f 63 61 6c 6c 62 61 63  ion_free_callbac
4180: 6b 63 6f 6f 6b 69 65 28 6e 43 6f 6f 6b 69 65 29  kcookie(nCookie)
4190: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
41a0: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c  ernal override l
41b0: 6f 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c 75  ong GetParamValu
41c0: 65 42 79 74 65 73 28 49 6e 74 50 74 72 20 70 2c  eBytes(IntPtr p,
41d0: 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65 74   int nDataOffset
41e0: 2c 20 62 79 74 65 5b 5d 20 62 44 65 73 74 2c 20  , byte[] bDest, 
41f0: 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74 20  int nStart, int 
4200: 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20  nLength).    {. 
4210: 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72 3b       IntPtr ptr;
4220: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b  .      int nlen;
4230: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69  .      int nCopi
4240: 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20  ed = nLength;.. 
4250: 20 20 20 20 20 6e 6c 65 6e 20 3d 20 55 6e 73 61       nlen = Unsa
4260: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
4270: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4280: 74 65 73 5f 69 6e 74 65 72 6f 70 28 70 29 3b 0a  tes_interop(p);.
4290: 20 20 20 20 20 20 70 74 72 20 3d 20 55 6e 73 61        ptr = Unsa
42a0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
42b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
42c0: 6f 62 5f 69 6e 74 65 72 6f 70 28 70 29 3b 0a 0a  ob_interop(p);..
42d0: 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74 20        if (bDest 
42e0: 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20  == null) return 
42f0: 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20  nlen;..      if 
4300: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61 72  (nCopied + nStar
4310: 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74 68  t > bDest.Length
4320: 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65 73  ) nCopied = bDes
4330: 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61 72  t.Length - nStar
4340: 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f  t;.      if (nCo
4350: 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66 73  pied + nDataOffs
4360: 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69  et > nlen) nCopi
4370: 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74  ed = nlen - nDat
4380: 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  aOffset;..      
4390: 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30 29  if (nCopied > 0)
43a0: 0a 20 20 20 20 20 20 20 20 4d 61 72 73 68 61 6c  .        Marshal
43b0: 2e 43 6f 70 79 28 28 49 6e 74 50 74 72 29 28 70  .Copy((IntPtr)(p
43c0: 74 72 2e 54 6f 49 6e 74 33 32 28 29 20 2b 20 6e  tr.ToInt32() + n
43d0: 44 61 74 61 4f 66 66 73 65 74 29 2c 20 62 44 65  DataOffset), bDe
43e0: 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70  st, nStart, nCop
43f0: 69 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  ied);.      else
4400: 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a 20   nCopied = 0;.. 
4410: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f 70       return nCop
4420: 69 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ied;.    }..    
4430: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
4440: 65 20 64 6f 75 62 6c 65 20 47 65 74 50 61 72 61  e double GetPara
4450: 6d 56 61 6c 75 65 44 6f 75 62 6c 65 28 49 6e 74  mValueDouble(Int
4460: 50 74 72 20 70 74 72 29 0a 20 20 20 20 7b 0a 20  Ptr ptr).    {. 
4470: 20 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75       double valu
4480: 65 3b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  e;.      UnsafeN
4490: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
44a0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
44b0: 65 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f  e_interop(ptr, o
44c0: 75 74 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ut value);.     
44d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20   return value;. 
44e0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
44f0: 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20  al override int 
4500: 47 65 74 50 61 72 61 6d 56 61 6c 75 65 49 6e 74  GetParamValueInt
4510: 33 32 28 49 6e 74 50 74 72 20 70 74 72 29 0a 20  32(IntPtr ptr). 
4520: 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72     {.      retur
4530: 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  n UnsafeNativeMe
4540: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61  thods.sqlite3_va
4550: 6c 75 65 5f 69 6e 74 5f 69 6e 74 65 72 6f 70 28  lue_int_interop(
4560: 70 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ptr);.    }..   
4570: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
4580: 64 65 20 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d  de long GetParam
4590: 56 61 6c 75 65 49 6e 74 36 34 28 49 6e 74 50 74  ValueInt64(IntPt
45a0: 72 20 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20  r ptr).    {.   
45b0: 20 20 20 49 6e 74 36 34 20 76 61 6c 75 65 3b 0a     Int64 value;.
45c0: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
45d0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
45e0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 5f 69 6e  3_value_int64_in
45f0: 74 65 72 6f 70 28 70 74 72 2c 20 6f 75 74 20 76  terop(ptr, out v
4600: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 72 65 74  alue);.      ret
4610: 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d  urn value;.    }
4620: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
4630: 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 47  verride string G
4640: 65 74 50 61 72 61 6d 56 61 6c 75 65 54 65 78 74  etParamValueText
4650: 28 49 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20  (IntPtr ptr).   
4660: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e   {.      int len
4670: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
4680: 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61  oString(UnsafeNa
4690: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
46a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 5f 69  te3_value_text_i
46b0: 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f 75 74 20  nterop(ptr, out 
46c0: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  len), len);.    
46d0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
46e0: 6f 76 65 72 72 69 64 65 20 54 79 70 65 41 66 66  override TypeAff
46f0: 69 6e 69 74 79 20 47 65 74 50 61 72 61 6d 56 61  inity GetParamVa
4700: 6c 75 65 54 79 70 65 28 49 6e 74 50 74 72 20 70  lueType(IntPtr p
4710: 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  tr).    {.      
4720: 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74  return UnsafeNat
4730: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
4740: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 5f 69 6e  e3_value_type_in
4750: 74 65 72 6f 70 28 70 74 72 29 3b 0a 20 20 20 20  terop(ptr);.    
4760: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
4770: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65  override void Re
4780: 74 75 72 6e 42 6c 6f 62 28 49 6e 74 50 74 72 20  turnBlob(IntPtr 
4790: 63 6f 6e 74 65 78 74 2c 20 62 79 74 65 5b 5d 20  context, byte[] 
47a0: 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20  value).    {.   
47b0: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
47c0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72  ethods.sqlite3_r
47d0: 65 73 75 6c 74 5f 62 6c 6f 62 5f 69 6e 74 65 72  esult_blob_inter
47e0: 6f 70 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c 75  op(context, valu
47f0: 65 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 2c  e, value.Length,
4800: 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b 0a   (IntPtr)(-1));.
4810: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4820: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
4830: 64 20 52 65 74 75 72 6e 44 6f 75 62 6c 65 28 49  d ReturnDouble(I
4840: 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 64  ntPtr context, d
4850: 6f 75 62 6c 65 20 76 61 6c 75 65 29 0a 20 20 20  ouble value).   
4860: 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e   {.      UnsafeN
4870: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
4880: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
4890: 6c 65 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65  le_interop(conte
48a0: 78 74 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a  xt, ref value);.
48b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
48c0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
48d0: 64 20 52 65 74 75 72 6e 45 72 72 6f 72 28 49 6e  d ReturnError(In
48e0: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 73 74  tPtr context, st
48f0: 72 69 6e 67 20 76 61 6c 75 65 29 0a 20 20 20 20  ring value).    
4900: 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61  {.      UnsafeNa
4910: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
4920: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4930: 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78 74  _interop(context
4940: 2c 20 54 6f 55 54 46 38 28 76 61 6c 75 65 29 2c  , ToUTF8(value),
4950: 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 29 3b 0a   value.Length);.
4960: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4970: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
4980: 64 20 52 65 74 75 72 6e 49 6e 74 33 32 28 49 6e  d ReturnInt32(In
4990: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 69 6e  tPtr context, in
49a0: 74 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20  t value).    {. 
49b0: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
49c0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
49d0: 5f 72 65 73 75 6c 74 5f 69 6e 74 5f 69 6e 74 65  _result_int_inte
49e0: 72 6f 70 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c  rop(context, val
49f0: 75 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ue);.    }..    
4a00: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
4a10: 65 20 76 6f 69 64 20 52 65 74 75 72 6e 49 6e 74  e void ReturnInt
4a20: 36 34 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78  64(IntPtr contex
4a30: 74 2c 20 6c 6f 6e 67 20 76 61 6c 75 65 29 0a 20  t, long value). 
4a40: 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66     {.      Unsaf
4a50: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
4a60: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
4a70: 74 36 34 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74  t64_interop(cont
4a80: 65 78 74 2c 20 72 65 66 20 76 61 6c 75 65 29 3b  ext, ref value);
4a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
4aa0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
4ab0: 69 64 20 52 65 74 75 72 6e 4e 75 6c 6c 28 49 6e  id ReturnNull(In
4ac0: 74 50 74 72 20 63 6f 6e 74 65 78 74 29 0a 20 20  tPtr context).  
4ad0: 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65    {.      Unsafe
4ae0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
4af0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
4b00: 6c 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78  l_interop(contex
4b10: 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
4b20: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
4b30: 20 76 6f 69 64 20 52 65 74 75 72 6e 54 65 78 74   void ReturnText
4b40: 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c  (IntPtr context,
4b50: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 29 0a 20   string value). 
4b60: 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66     {.      Unsaf
4b70: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
4b80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
4b90: 78 74 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65  xt_interop(conte
4ba0: 78 74 2c 20 54 6f 55 54 46 38 28 76 61 6c 75 65  xt, ToUTF8(value
4bb0: 29 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 2c  ), value.Length,
4bc0: 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b 0a   (IntPtr)(-1));.
4bd0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4be0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 49 6e 74  nal override Int
4bf0: 50 74 72 20 41 67 67 72 65 67 61 74 65 43 6f 6e  Ptr AggregateCon
4c00: 74 65 78 74 28 49 6e 74 50 74 72 20 63 6f 6e 74  text(IntPtr cont
4c10: 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ext).    {.     
4c20: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
4c30: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
4c40: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
4c50: 6e 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 63 6f  ntext_interop(co
4c60: 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d  ntext, 1);.    }
4c70: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
4c80: 76 65 72 72 69 64 65 20 76 6f 69 64 20 53 65 74  verride void Set
4c90: 50 61 73 73 77 6f 72 64 28 62 79 74 65 5b 5d 20  Password(byte[] 
4ca0: 70 61 73 73 77 6f 72 64 42 79 74 65 73 29 0a 20  passwordBytes). 
4cb0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e     {.      int n
4cc0: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
4cd0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 6b  ethods.sqlite3_k
4ce0: 65 79 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  ey_interop(_sql,
4cf0: 20 70 61 73 73 77 6f 72 64 42 79 74 65 73 2c 20   passwordBytes, 
4d00: 70 61 73 73 77 6f 72 64 42 79 74 65 73 2e 4c 65  passwordBytes.Le
4d10: 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 69 66 20  ngth);.      if 
4d20: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
4d30: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
4d40: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
4d50: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  rror());.    }..
4d60: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
4d70: 72 72 69 64 65 20 76 6f 69 64 20 43 68 61 6e 67  rride void Chang
4d80: 65 50 61 73 73 77 6f 72 64 28 62 79 74 65 5b 5d  ePassword(byte[]
4d90: 20 6e 65 77 50 61 73 73 77 6f 72 64 42 79 74 65   newPasswordByte
4da0: 73 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  s).    {.      i
4db0: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
4dc0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
4dd0: 65 33 5f 72 65 6b 65 79 5f 69 6e 74 65 72 6f 70  e3_rekey_interop
4de0: 28 5f 73 71 6c 2c 20 6e 65 77 50 61 73 73 77 6f  (_sql, newPasswo
4df0: 72 64 42 79 74 65 73 2c 20 28 6e 65 77 50 61 73  rdBytes, (newPas
4e00: 73 77 6f 72 64 42 79 74 65 73 20 3d 3d 20 6e 75  swordBytes == nu
4e10: 6c 6c 29 20 3f 20 30 20 3a 20 6e 65 77 50 61 73  ll) ? 0 : newPas
4e20: 73 77 6f 72 64 42 79 74 65 73 2e 4c 65 6e 67 74  swordBytes.Lengt
4e30: 68 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  h);.      if (n 
4e40: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
4e50: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
4e60: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
4e70: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r());.    }..   
4e80: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
4e90: 64 65 20 76 6f 69 64 20 53 65 74 55 70 64 61 74  de void SetUpdat
4ea0: 65 48 6f 6f 6b 28 53 51 4c 69 74 65 55 70 64 61  eHook(SQLiteUpda
4eb0: 74 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 29  teCallback func)
4ec0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73  .    {.      Uns
4ed0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4ee0: 2e 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  .sqlite3_update_
4ef0: 68 6f 6f 6b 5f 69 6e 74 65 72 6f 70 28 5f 73 71  hook_interop(_sq
4f00: 6c 2c 20 66 75 6e 63 29 3b 0a 20 20 20 20 7d 0a  l, func);.    }.
4f10: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
4f20: 65 72 72 69 64 65 20 76 6f 69 64 20 53 65 74 43  erride void SetC
4f30: 6f 6d 6d 69 74 48 6f 6f 6b 28 53 51 4c 69 74 65  ommitHook(SQLite
4f40: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 66  CommitCallback f
4f50: 75 6e 63 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  unc).    {.     
4f60: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
4f70: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6d  hods.sqlite3_com
4f80: 6d 69 74 5f 68 6f 6f 6b 5f 69 6e 74 65 72 6f 70  mit_hook_interop
4f90: 28 5f 73 71 6c 2c 20 66 75 6e 63 29 3b 0a 20 20  (_sql, func);.  
4fa0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
4fb0: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
4fc0: 53 65 74 52 6f 6c 6c 62 61 63 6b 48 6f 6f 6b 28  SetRollbackHook(
4fd0: 53 51 4c 69 74 65 52 6f 6c 6c 62 61 63 6b 43 61  SQLiteRollbackCa
4fe0: 6c 6c 62 61 63 6b 20 66 75 6e 63 29 0a 20 20 20  llback func).   
4ff0: 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e   {.      UnsafeN
5000: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
5010: 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
5020: 6f 6b 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  ok_interop(_sql,
5030: 20 66 75 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20   func);.    }.. 
5040: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
5050: 0a 20 20 20 20 2f 2f 2f 20 48 65 6c 70 65 72 20  .    /// Helper 
5060: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72  function to retr
5070: 69 65 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  ieve a column of
5080: 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 61 63   data from an ac
5090: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a  tive statement..
50a0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
50b0: 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  y>.    /// <para
50c0: 6d 20 6e 61 6d 65 3d 22 73 74 6d 74 22 3e 54 68  m name="stmt">Th
50d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
50e0: 67 20 73 74 65 70 28 29 27 64 20 74 68 72 6f 75  g step()'d throu
50f0: 67 68 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f  gh</param>.    /
5100: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
5110: 69 6e 64 65 78 22 3e 54 68 65 20 63 6f 6c 75 6d  index">The colum
5120: 6e 20 69 6e 64 65 78 20 74 6f 20 72 65 74 72 69  n index to retri
5130: 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20  eve</param>.    
5140: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
5150: 22 74 79 70 22 3e 54 68 65 20 74 79 70 65 20 6f  "typ">The type o
5160: 66 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 65 64  f data contained
5170: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   in the column. 
5180: 20 49 66 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65   If Uninitialize
5190: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
51a0: 20 77 69 6c 6c 20 72 65 74 72 69 65 76 65 20 74   will retrieve t
51b0: 68 65 20 64 61 74 61 74 79 70 65 20 69 6e 66 6f  he datatype info
51c0: 72 6d 61 74 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e  rmation.</param>
51d0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
51e0: 73 3e 52 65 74 75 72 6e 73 20 74 68 65 20 64 61  s>Returns the da
51f0: 74 61 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  ta in the column
5200: 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 69  </returns>.    i
5210: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
5220: 20 6f 62 6a 65 63 74 20 47 65 74 56 61 6c 75 65   object GetValue
5230: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
5240: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
5250: 2c 20 72 65 66 20 53 51 4c 69 74 65 54 79 70 65  , ref SQLiteType
5260: 20 74 79 70 29 0a 20 20 20 20 7b 0a 20 20 20 20   typ).    {.    
5270: 20 20 69 66 20 28 74 79 70 2e 41 66 66 69 6e 69    if (typ.Affini
5280: 74 79 20 3d 3d 20 30 29 20 74 79 70 20 3d 20 53  ty == 0) typ = S
5290: 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e 43 6f 6c  QLiteConvert.Col
52a0: 75 6d 6e 54 6f 54 79 70 65 28 73 74 6d 74 2c 20  umnToType(stmt, 
52b0: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 69 66  index);.      if
52c0: 20 28 49 73 4e 75 6c 6c 28 73 74 6d 74 2c 20 69   (IsNull(stmt, i
52d0: 6e 64 65 78 29 29 20 72 65 74 75 72 6e 20 44 42  ndex)) return DB
52e0: 4e 75 6c 6c 2e 56 61 6c 75 65 3b 0a 0a 20 20 20  Null.Value;..   
52f0: 20 20 20 54 79 70 65 20 74 20 3d 20 53 51 4c 69     Type t = SQLi
5300: 74 65 43 6f 6e 76 65 72 74 2e 53 51 4c 69 74 65  teConvert.SQLite
5310: 54 79 70 65 54 6f 54 79 70 65 28 74 79 70 29 3b  TypeToType(typ);
5320: 0a 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 28  ..      switch (
5330: 54 79 70 65 54 6f 41 66 66 69 6e 69 74 79 28 74  TypeToAffinity(t
5340: 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  )).      {.     
5350: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
5360: 6e 69 74 79 2e 42 6c 6f 62 3a 0a 20 20 20 20 20  nity.Blob:.     
5370: 20 20 20 20 20 69 66 20 28 74 79 70 2e 54 79 70       if (typ.Typ
5380: 65 20 3d 3d 20 44 62 54 79 70 65 2e 47 75 69 64  e == DbType.Guid
5390: 20 26 26 20 74 79 70 2e 41 66 66 69 6e 69 74 79   && typ.Affinity
53a0: 20 3d 3d 20 54 79 70 65 41 66 66 69 6e 69 74 79   == TypeAffinity
53b0: 2e 54 65 78 74 29 0a 20 20 20 20 20 20 20 20 20  .Text).         
53c0: 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 47 75     return new Gu
53d0: 69 64 28 47 65 74 54 65 78 74 28 73 74 6d 74 2c  id(GetText(stmt,
53e0: 20 69 6e 64 65 78 29 29 3b 0a 0a 20 20 20 20 20   index));..     
53f0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
5400: 74 29 47 65 74 42 79 74 65 73 28 73 74 6d 74 2c  t)GetBytes(stmt,
5410: 20 69 6e 64 65 78 2c 20 30 2c 20 6e 75 6c 6c 2c   index, 0, null,
5420: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
5430: 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77    byte[] b = new
5440: 20 62 79 74 65 5b 6e 5d 3b 0a 20 20 20 20 20 20   byte[n];.      
5450: 20 20 20 20 47 65 74 42 79 74 65 73 28 73 74 6d      GetBytes(stm
5460: 74 2c 20 69 6e 64 65 78 2c 20 30 2c 20 62 2c 20  t, index, 0, b, 
5470: 30 2c 20 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20  0, n);..        
5480: 20 20 69 66 20 28 74 79 70 2e 54 79 70 65 20 3d    if (typ.Type =
5490: 3d 20 44 62 54 79 70 65 2e 47 75 69 64 20 26 26  = DbType.Guid &&
54a0: 20 6e 20 3d 3d 20 31 36 29 0a 20 20 20 20 20 20   n == 16).      
54b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77        return new
54c0: 20 47 75 69 64 28 62 29 3b 0a 0a 20 20 20 20 20   Guid(b);..     
54d0: 20 20 20 20 20 72 65 74 75 72 6e 20 62 3b 0a 20       return b;. 
54e0: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
54f0: 41 66 66 69 6e 69 74 79 2e 44 61 74 65 54 69 6d  Affinity.DateTim
5500: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e:.          ret
5510: 75 72 6e 20 47 65 74 44 61 74 65 54 69 6d 65 28  urn GetDateTime(
5520: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20  stmt, index);.  
5530: 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41        case TypeA
5540: 66 66 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a  ffinity.Double:.
5550: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5560: 20 43 6f 6e 76 65 72 74 2e 43 68 61 6e 67 65 54   Convert.ChangeT
5570: 79 70 65 28 47 65 74 44 6f 75 62 6c 65 28 73 74  ype(GetDouble(st
5580: 6d 74 2c 20 69 6e 64 65 78 29 2c 20 74 2c 20 6e  mt, index), t, n
5590: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 63 61  ull);.        ca
55a0: 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  se TypeAffinity.
55b0: 49 6e 74 36 34 3a 0a 20 20 20 20 20 20 20 20 20  Int64:.         
55c0: 20 72 65 74 75 72 6e 20 43 6f 6e 76 65 72 74 2e   return Convert.
55d0: 43 68 61 6e 67 65 54 79 70 65 28 47 65 74 49 6e  ChangeType(GetIn
55e0: 74 36 34 28 73 74 6d 74 2c 20 69 6e 64 65 78 29  t64(stmt, index)
55f0: 2c 20 74 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  , t, null);.    
5600: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
5610: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 47 65         return Ge
5620: 74 54 65 78 74 28 73 74 6d 74 2c 20 69 6e 64 65  tText(stmt, inde
5630: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
5640: 7d 0a 20 20 7d 0a 7d 0a                          }.  }.}.