System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact d0ca99b7a0e5830f0624dbe4e773c3a53bd98cf0:


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 69 6e 74 65 72 6e 61    }..    interna
0940: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
0950: 45 78 65 63 75 74 65 28 73 74 72 69 6e 67 20 73  Execute(string s
0960: 74 72 53 71 6c 29 0a 20 20 20 20 7b 0a 20 20 20  trSql).    {.   
0970: 20 20 20 49 6e 74 50 74 72 20 70 3b 0a 20 20 20     IntPtr p;.   
0980: 20 20 20 73 74 72 69 6e 67 20 73 74 72 20 3d 20     string str = 
0990: 73 74 72 53 71 6c 3b 0a 20 20 20 20 20 20 69 6e  strSql;.      in
09a0: 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 6e  t len;..      in
09b0: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
09c0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
09d0: 33 5f 65 78 65 63 5f 69 6e 74 65 72 6f 70 28 5f  3_exec_interop(_
09e0: 73 71 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 53  sql, ToUTF8(strS
09f0: 71 6c 29 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f  ql), IntPtr.Zero
0a00: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 6f  , IntPtr.Zero, o
0a10: 75 74 20 70 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a  ut p, out len);.
0a20: 20 20 20 20 20 20 69 66 20 28 70 20 21 3d 20 49        if (p != I
0a30: 6e 74 50 74 72 2e 5a 65 72 6f 29 0a 20 20 20 20  ntPtr.Zero).    
0a40: 20 20 7b 0a 20 20 20 20 20 20 20 20 73 74 72 20    {.        str 
0a50: 3d 20 62 61 73 65 2e 54 6f 53 74 72 69 6e 67 28  = base.ToString(
0a60: 70 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  p, len);.       
0a70: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
0a80: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 66 72 65  hods.sqlite3_fre
0a90: 65 5f 69 6e 74 65 72 6f 70 28 70 29 3b 0a 20 20  e_interop(p);.  
0aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
0ab0: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
0ac0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
0ad0: 28 6e 2c 20 73 74 72 29 3b 0a 20 20 20 20 7d 0a  (n, str);.    }.
0ae0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
0af0: 65 72 72 69 64 65 20 62 6f 6f 6c 20 53 74 65 70  erride bool Step
0b00: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
0b10: 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20   stmt).    {.   
0b20: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
0b30: 6c 6f 6e 67 20 64 77 74 69 63 6b 20 3d 20 30 3b  long dwtick = 0;
0b40: 0a 20 20 20 20 20 20 52 61 6e 64 6f 6d 20 72 6e  .      Random rn
0b50: 64 20 3d 20 6e 75 6c 6c 3b 0a 0a 20 20 20 20 20  d = null;..     
0b60: 20 77 68 69 6c 65 20 28 74 72 75 65 29 0a 20 20   while (true).  
0b70: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6e 20      {.        n 
0b80: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
0b90: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 73 74  thods.sqlite3_st
0ba0: 65 70 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  ep_interop(stmt.
0bb0: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 0a  _sqlite_stmt);..
0bc0: 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d          if (n ==
0bd0: 20 31 30 30 29 20 72 65 74 75 72 6e 20 74 72 75   100) return tru
0be0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e  e;.        if (n
0bf0: 20 3d 3d 20 31 30 31 29 20 72 65 74 75 72 6e 20   == 101) return 
0c00: 66 61 6c 73 65 3b 0a 0a 20 20 20 20 20 20 20 20  false;..        
0c10: 69 66 20 28 6e 20 3e 20 30 29 0a 20 20 20 20 20  if (n > 0).     
0c20: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
0c30: 6e 74 20 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  nt r;..         
0c40: 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   // An error occ
0c50: 75 72 72 65 64 2c 20 61 74 74 65 6d 70 74 20 74  urred, attempt t
0c60: 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
0c70: 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72  ement.  If the r
0c80: 65 73 65 74 20 77 6f 72 6b 65 64 20 62 65 63 61  eset worked beca
0c90: 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
0ca0: 20 20 2f 2f 20 73 63 68 65 6d 61 20 68 61 73 20    // schema has 
0cb0: 63 68 61 6e 67 65 64 2c 20 72 65 2d 74 72 79 20  changed, re-try 
0cc0: 74 68 65 20 73 74 65 70 20 61 67 61 69 6e 2e 20  the step again. 
0cd0: 20 49 66 20 69 74 20 65 72 72 6f 72 65 64 20 6f   If it errored o
0ce0: 75 72 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ur because the d
0cf0: 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
0d00: 20 20 2f 2f 20 69 73 20 6c 6f 63 6b 65 64 2c 20    // is locked, 
0d10: 74 68 65 6e 20 6b 65 65 70 20 72 65 74 72 79 69  then keep retryi
0d20: 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6d  ng until the com
0d30: 6d 61 6e 64 20 74 69 6d 65 6f 75 74 20 6f 63 63  mand timeout occ
0d40: 75 72 73 2e 0a 20 20 20 20 20 20 20 20 20 20 72  urs..          r
0d50: 20 3d 20 52 65 73 65 74 28 73 74 6d 74 29 3b 0a   = Reset(stmt);.
0d60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72  .          if (r
0d70: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20   == 0).         
0d80: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c     throw new SQL
0d90: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
0da0: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
0db0: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 65  ));..          e
0dc0: 6c 73 65 20 69 66 20 28 72 20 3d 3d 20 36 20 26  lse if (r == 6 &
0dd0: 26 20 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64 20  & stmt._command 
0de0: 21 3d 20 6e 75 6c 6c 29 20 2f 2f 20 53 51 4c 49  != null) // SQLI
0df0: 54 45 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  TE_LOCKED.      
0e00: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
0e10: 20 20 2f 2f 20 4b 65 65 70 20 74 72 79 69 6e 67    // Keep trying
0e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0e30: 28 64 77 74 69 63 6b 20 3d 3d 20 30 29 20 2f 2f  (dwtick == 0) //
0e40: 20 46 69 72 73 74 20 74 69 6d 65 20 77 65 27 76   First time we'v
0e50: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 74 68  e encountered th
0e60: 65 20 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 20  e lock.         
0e70: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
0e80: 20 20 20 64 77 74 69 63 6b 20 3d 20 44 61 74 65     dwtick = Date
0e90: 54 69 6d 65 2e 4e 6f 77 2e 54 69 63 6b 73 20 2b  Time.Now.Ticks +
0ea0: 20 28 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64 2e   (stmt._command.
0eb0: 5f 63 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74 20  _commandTimeout 
0ec0: 2a 20 31 30 30 30 30 30 30 30 29 3b 0a 20 20 20  * 10000000);.   
0ed0: 20 20 20 20 20 20 20 20 20 20 20 72 6e 64 20 3d             rnd =
0ee0: 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29 3b 0a 20   new Random();. 
0ef0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0f00: 20 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 77           // If w
0f10: 65 27 76 65 20 65 78 63 65 65 64 65 64 20 74 68  e've exceeded th
0f20: 65 20 63 6f 6d 6d 61 6e 64 27 73 20 74 69 6d 65  e command's time
0f30: 6f 75 74 2c 20 67 69 76 65 20 75 70 20 61 6e 64  out, give up and
0f40: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 0a   throw an error.
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0f60: 44 61 74 65 54 69 6d 65 2e 4e 6f 77 2e 54 69 63  DateTime.Now.Tic
0f70: 6b 73 20 2d 20 64 77 74 69 63 6b 20 3e 20 30 29  ks - dwtick > 0)
0f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0fa0: 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63  ow new SQLiteExc
0fb0: 65 70 74 69 6f 6e 28 72 2c 20 53 51 4c 69 74 65  eption(r, SQLite
0fc0: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20  LastError());.  
0fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0fe0: 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20          else.   
0ff0: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1000: 20 20 20 20 20 20 20 20 20 2f 2f 20 4f 74 68 65           // Othe
1010: 72 77 69 73 65 20 73 6c 65 65 70 20 66 6f 72 20  rwise sleep for 
1020: 61 20 72 61 6e 64 6f 6d 20 61 6d 6f 75 6e 74 20  a random amount 
1030: 6f 66 20 74 69 6d 65 20 75 70 20 74 6f 20 32 35  of time up to 25
1040: 30 6d 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  0ms.            
1050: 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65    UnsafeNativeMe
1060: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 73 6c  thods.sqlite3_sl
1070: 65 65 70 5f 69 6e 74 65 72 6f 70 28 28 75 69 6e  eep_interop((uin
1080: 74 29 72 6e 64 2e 4e 65 78 74 28 31 2c 20 32 35  t)rnd.Next(1, 25
1090: 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0));.           
10a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
10b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  }.    }..    int
10d0: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76  ernal override v
10e0: 6f 69 64 20 46 69 6e 61 6c 69 7a 65 53 74 61 74  oid FinalizeStat
10f0: 65 6d 65 6e 74 28 53 51 4c 69 74 65 53 74 61 74  ement(SQLiteStat
1100: 65 6d 65 6e 74 20 73 74 6d 74 29 0a 20 20 20 20  ement stmt).    
1110: 7b 0a 20 20 20 20 20 20 69 66 20 28 73 74 6d 74  {.      if (stmt
1120: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 20 21 3d  ._sqlite_stmt !=
1130: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 0a 20 20   IntPtr.Zero).  
1140: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
1150: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
1160: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
1170: 33 5f 66 69 6e 61 6c 69 7a 65 5f 69 6e 74 65 72  3_finalize_inter
1180: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
1190: 73 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  stmt);.        i
11a0: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
11b0: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
11c0: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
11d0: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 20  tError());.     
11e0: 20 7d 0a 20 20 20 20 20 20 73 74 6d 74 2e 5f 73   }.      stmt._s
11f0: 71 6c 69 74 65 5f 73 74 6d 74 20 3d 20 49 6e 74  qlite_stmt = Int
1200: 50 74 72 2e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a  Ptr.Zero;.    }.
1210: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
1220: 65 72 72 69 64 65 20 69 6e 74 20 52 65 73 65 74  erride int Reset
1230: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
1240: 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20   stmt).    {.   
1250: 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20     int n;..     
1260: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
1270: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
1280: 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70 28 73  _reset_interop(s
1290: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
12a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 49 66 20  );..      // If 
12b0: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
12c0: 65 64 2c 20 74 72 79 20 61 6e 64 20 72 65 2d 70  ed, try and re-p
12d0: 72 65 70 61 72 65 20 69 74 0a 20 20 20 20 20 20  repare it.      
12e0: 69 66 20 28 6e 20 3d 3d 20 31 37 29 20 2f 2f 20  if (n == 17) // 
12f0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20  SQLITE_SCHEMA.  
1300: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f      {.        //
1310: 20 52 65 63 72 65 61 74 65 20 61 20 64 75 6d 6d   Recreate a dumm
1320: 79 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  y statement.    
1330: 20 20 20 20 73 74 72 69 6e 67 20 73 74 72 3b 0a      string str;.
1340: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53          using (S
1350: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 74  QLiteStatement t
1360: 6d 70 20 3d 20 50 72 65 70 61 72 65 28 73 74 6d  mp = Prepare(stm
1370: 74 2e 5f 73 71 6c 53 74 61 74 65 6d 65 6e 74 2c  t._sqlStatement,
1380: 20 6e 75 6c 6c 2c 20 6f 75 74 20 73 74 72 29 29   null, out str))
1390: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
13a0: 20 20 20 20 20 2f 2f 20 46 69 6e 61 6c 69 7a 65       // Finalize
13b0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 73 74   the existing st
13c0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
13d0: 20 20 46 69 6e 61 6c 69 7a 65 53 74 61 74 65 6d    FinalizeStatem
13e0: 65 6e 74 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20  ent(stmt);..    
13f0: 20 20 20 20 20 20 2f 2f 20 52 65 61 73 73 69 67        // Reassig
1400: 6e 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  n a new statemen
1410: 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t pointer to the
1420: 20 6f 6c 64 20 73 74 61 74 65 6d 65 6e 74 20 61   old statement a
1430: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 74 65 6d  nd clear the tem
1440: 70 6f 72 61 72 79 20 6f 6e 65 0a 20 20 20 20 20  porary one.     
1450: 20 20 20 20 20 73 74 6d 74 2e 5f 73 71 6c 69 74       stmt._sqlit
1460: 65 5f 73 74 6d 74 20 3d 20 74 6d 70 2e 5f 73 71  e_stmt = tmp._sq
1470: 6c 69 74 65 5f 73 74 6d 74 3b 0a 20 20 20 20 20  lite_stmt;.     
1480: 20 20 20 20 20 74 6d 70 2e 5f 73 71 6c 69 74 65       tmp._sqlite
1490: 5f 73 74 6d 74 20 3d 20 49 6e 74 50 74 72 2e 5a  _stmt = IntPtr.Z
14a0: 65 72 6f 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ero;..          
14b0: 2f 2f 20 52 65 61 70 70 6c 79 20 70 61 72 61 6d  // Reapply param
14c0: 65 74 65 72 73 0a 20 20 20 20 20 20 20 20 20 20  eters.          
14d0: 73 74 6d 74 2e 42 69 6e 64 50 61 72 61 6d 65 74  stmt.BindParamet
14e0: 65 72 73 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers();.        }
14f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1500: 2d 31 3b 20 2f 2f 20 52 65 73 65 74 20 77 61 73  -1; // Reset was
1510: 20 4f 4b 2c 20 77 69 74 68 20 73 63 68 65 6d 61   OK, with schema
1520: 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 7d 0a   change.      }.
1530: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e        else if (n
1540: 20 3d 3d 20 36 29 20 2f 2f 20 53 51 4c 49 54 45   == 6) // SQLITE
1550: 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 20  _LOCKED.        
1560: 72 65 74 75 72 6e 20 6e 3b 0a 0a 20 20 20 20 20  return n;..     
1570: 20 69 66 20 28 6e 20 3e 20 30 29 0a 20 20 20 20   if (n > 0).    
1580: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53 51      throw new SQ
1590: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
15a0: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
15b0: 28 29 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75  ());..      retu
15c0: 72 6e 20 30 3b 20 2f 2f 20 57 65 20 72 65 73 65  rn 0; // We rese
15d0: 74 20 4f 4b 2c 20 6e 6f 20 73 63 68 65 6d 61 20  t OK, no schema 
15e0: 63 68 61 6e 67 65 73 0a 20 20 20 20 7d 0a 0a 20  changes.    }.. 
15f0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
1600: 72 69 64 65 20 73 74 72 69 6e 67 20 53 51 4c 69  ride string SQLi
1610: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 0a 20 20  teLastError().  
1620: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65    {.      int le
1630: 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  n;.      return 
1640: 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e  ToString(UnsafeN
1650: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
1660: 69 74 65 33 5f 65 72 72 6d 73 67 5f 69 6e 74 65  ite3_errmsg_inte
1670: 72 6f 70 28 5f 73 71 6c 2c 20 6f 75 74 20 6c 65  rop(_sql, out le
1680: 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  n), len);.    }.
1690: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
16a0: 65 72 72 69 64 65 20 53 51 4c 69 74 65 53 74 61  erride SQLiteSta
16b0: 74 65 6d 65 6e 74 20 50 72 65 70 61 72 65 28 73  tement Prepare(s
16c0: 74 72 69 6e 67 20 73 74 72 53 71 6c 2c 20 53 51  tring strSql, SQ
16d0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 70 72  LiteStatement pr
16e0: 65 76 69 6f 75 73 2c 20 6f 75 74 20 73 74 72 69  evious, out stri
16f0: 6e 67 20 73 74 72 52 65 6d 61 69 6e 29 0a 20 20  ng strRemain).  
1700: 20 20 7b 0a 20 20 20 20 20 20 49 6e 74 50 74 72    {.      IntPtr
1710: 20 73 74 6d 74 3b 0a 20 20 20 20 20 20 49 6e 74   stmt;.      Int
1720: 50 74 72 20 70 74 72 3b 0a 20 20 20 20 20 20 69  Ptr ptr;.      i
1730: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 62  nt len;..      b
1740: 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46 38  yte[] b = ToUTF8
1750: 28 73 74 72 53 71 6c 29 3b 0a 0a 20 20 20 20 20  (strSql);..     
1760: 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e   int n = UnsafeN
1770: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
1780: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 69 6e 74  ite3_prepare_int
1790: 65 72 6f 70 28 5f 73 71 6c 2c 20 62 2c 20 62 2e  erop(_sql, b, b.
17a0: 4c 65 6e 67 74 68 20 2d 20 31 2c 20 6f 75 74 20  Length - 1, out 
17b0: 73 74 6d 74 2c 20 6f 75 74 20 70 74 72 2c 20 6f  stmt, out ptr, o
17c0: 75 74 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  ut len);.      i
17d0: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
17e0: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
17f0: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
1800: 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20 20 20  tError());..    
1810: 20 20 73 74 72 52 65 6d 61 69 6e 20 3d 20 54 6f    strRemain = To
1820: 53 74 72 69 6e 67 28 70 74 72 2c 20 6c 65 6e 29  String(ptr, len)
1830: 3b 0a 0a 20 20 20 20 20 20 53 51 4c 69 74 65 53  ;..      SQLiteS
1840: 74 61 74 65 6d 65 6e 74 20 63 6d 64 20 3d 20 6e  tatement cmd = n
1850: 75 6c 6c 3b 0a 20 20 20 20 20 20 69 66 20 28 73  ull;.      if (s
1860: 74 6d 74 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65  tmt != IntPtr.Ze
1870: 72 6f 29 20 63 6d 64 20 3d 20 6e 65 77 20 53 51  ro) cmd = new SQ
1880: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 28 74 68  LiteStatement(th
1890: 69 73 2c 20 73 74 6d 74 2c 20 73 74 72 53 71 6c  is, stmt, strSql
18a0: 2e 53 75 62 73 74 72 69 6e 67 28 30 2c 20 73 74  .Substring(0, st
18b0: 72 53 71 6c 2e 4c 65 6e 67 74 68 20 2d 20 73 74  rSql.Length - st
18c0: 72 52 65 6d 61 69 6e 2e 4c 65 6e 67 74 68 29 2c  rRemain.Length),
18d0: 20 70 72 65 76 69 6f 75 73 29 3b 0a 0a 20 20 20   previous);..   
18e0: 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0a 20     return cmd;. 
18f0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
1900: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
1910: 20 42 69 6e 64 5f 44 6f 75 62 6c 65 28 53 51 4c   Bind_Double(SQL
1920: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
1930: 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 64 6f  t, int index, do
1940: 75 62 6c 65 20 76 61 6c 75 65 29 0a 20 20 20 20  uble value).    
1950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
1960: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1970: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64  ods.sqlite3_bind
1980: 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28  _double_interop(
1990: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
19a0: 74 2c 20 69 6e 64 65 78 2c 20 72 65 66 20 76 61  t, index, ref va
19b0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
19c0: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
19d0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
19e0: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
19f0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ror());.    }.. 
1a00: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
1a10: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 49  ride void Bind_I
1a20: 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61 74 65  nt32(SQLiteState
1a30: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
1a40: 6e 64 65 78 2c 20 69 6e 74 20 76 61 6c 75 65 29  ndex, int value)
1a50: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
1a60: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
1a70: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
1a80: 5f 62 69 6e 64 5f 69 6e 74 5f 69 6e 74 65 72 6f  _bind_int_intero
1a90: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
1aa0: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75  tmt, index, valu
1ab0: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  e);.      if (n 
1ac0: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
1ad0: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
1ae0: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
1af0: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r());.    }..   
1b00: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
1b10: 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 49 6e 74  de void Bind_Int
1b20: 36 34 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  64(SQLiteStateme
1b30: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
1b40: 65 78 2c 20 6c 6f 6e 67 20 76 61 6c 75 65 29 0a  ex, long value).
1b50: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
1b60: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
1b70: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
1b80: 62 69 6e 64 5f 69 6e 74 36 34 5f 69 6e 74 65 72  bind_int64_inter
1b90: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
1ba0: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 72 65 66  stmt, index, ref
1bb0: 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69   value);.      i
1bc0: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
1bd0: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
1be0: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
1bf0: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
1c00: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
1c10: 76 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e  verride void Bin
1c20: 64 5f 54 65 78 74 28 53 51 4c 69 74 65 53 74 61  d_Text(SQLiteSta
1c30: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
1c40: 20 69 6e 64 65 78 2c 20 73 74 72 69 6e 67 20 76   index, string v
1c50: 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20  alue).    {.    
1c60: 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55    byte[] b = ToU
1c70: 54 46 38 28 76 61 6c 75 65 29 3b 0a 20 20 20 20  TF8(value);.    
1c80: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
1c90: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
1ca0: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 5f  lite3_bind_text_
1cb0: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
1cc0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
1cd0: 2c 20 62 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20  , b, b.Length - 
1ce0: 31 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29  1, (IntPtr)(-1))
1cf0: 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20  ;.      if (n > 
1d00: 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c  0) throw new SQL
1d10: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
1d20: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
1d30: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
1d40: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
1d50: 20 76 6f 69 64 20 42 69 6e 64 5f 44 61 74 65 54   void Bind_DateT
1d60: 69 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ime(SQLiteStatem
1d70: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
1d80: 64 65 78 2c 20 44 61 74 65 54 69 6d 65 20 64 74  dex, DateTime dt
1d90: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 62 79  ).    {.      by
1da0: 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46 38 28  te[] b = ToUTF8(
1db0: 64 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  dt);.      int n
1dc0: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
1dd0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62  ethods.sqlite3_b
1de0: 69 6e 64 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70  ind_text_interop
1df0: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
1e00: 6d 74 2c 20 69 6e 64 65 78 2c 20 62 2c 20 62 2e  mt, index, b, b.
1e10: 4c 65 6e 67 74 68 20 2d 20 31 2c 20 28 49 6e 74  Length - 1, (Int
1e20: 50 74 72 29 28 2d 31 29 29 3b 0a 20 20 20 20 20  Ptr)(-1));.     
1e30: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
1e40: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
1e50: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
1e60: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
1e70: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
1e80: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 42   override void B
1e90: 69 6e 64 5f 42 6c 6f 62 28 53 51 4c 69 74 65 53  ind_Blob(SQLiteS
1ea0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
1eb0: 6e 74 20 69 6e 64 65 78 2c 20 62 79 74 65 5b 5d  nt index, byte[]
1ec0: 20 62 6c 6f 62 44 61 74 61 29 0a 20 20 20 20 7b   blobData).    {
1ed0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
1ee0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1ef0: 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ds.sqlite3_bind_
1f00: 62 6c 6f 62 5f 69 6e 74 65 72 6f 70 28 73 74 6d  blob_interop(stm
1f10: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
1f20: 69 6e 64 65 78 2c 20 62 6c 6f 62 44 61 74 61 2c  index, blobData,
1f30: 20 62 6c 6f 62 44 61 74 61 2e 4c 65 6e 67 74 68   blobData.Length
1f40: 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b  , (IntPtr)(-1));
1f50: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
1f60: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
1f70: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
1f80: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
1f90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
1fa0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
1fb0: 76 6f 69 64 20 42 69 6e 64 5f 4e 75 6c 6c 28 53  void Bind_Null(S
1fc0: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
1fd0: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
1fe0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
1ff0: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
2000: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
2010: 62 69 6e 64 5f 6e 75 6c 6c 5f 69 6e 74 65 72 6f  bind_null_intero
2020: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
2030: 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20  tmt, index);.   
2040: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
2050: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
2060: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
2070: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  eLastError());. 
2080: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
2090: 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20  al override int 
20a0: 42 69 6e 64 5f 50 61 72 61 6d 43 6f 75 6e 74 28  Bind_ParamCount(
20b0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
20c0: 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  stmt).    {.    
20d0: 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e    return UnsafeN
20e0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
20f0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
2100: 74 65 72 5f 63 6f 75 6e 74 5f 69 6e 74 65 72 6f  ter_count_intero
2110: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
2120: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tmt);.    }..   
2130: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
2140: 64 65 20 73 74 72 69 6e 67 20 42 69 6e 64 5f 50  de string Bind_P
2150: 61 72 61 6d 4e 61 6d 65 28 53 51 4c 69 74 65 53  aramName(SQLiteS
2160: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
2170: 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a  nt index).    {.
2180: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
2190: 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f 53 74       return ToSt
21a0: 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76  ring(UnsafeNativ
21b0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
21c0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
21d0: 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d  name_interop(stm
21e0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
21f0: 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c  index, out len),
2200: 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   len);.    }..  
2210: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
2220: 69 64 65 20 69 6e 74 20 42 69 6e 64 5f 50 61 72  ide int Bind_Par
2230: 61 6d 49 6e 64 65 78 28 53 51 4c 69 74 65 53 74  amIndex(SQLiteSt
2240: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 73 74  atement stmt, st
2250: 72 69 6e 67 20 70 61 72 61 6d 4e 61 6d 65 29 0a  ring paramName).
2260: 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75      {.      retu
2270: 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  rn UnsafeNativeM
2280: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62  ethods.sqlite3_b
2290: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
22a0: 64 65 78 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  dex_interop(stmt
22b0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 54  ._sqlite_stmt, T
22c0: 6f 55 54 46 38 28 70 61 72 61 6d 4e 61 6d 65 29  oUTF8(paramName)
22d0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
22e0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
22f0: 69 6e 74 20 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  int ColumnCount(
2300: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
2310: 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  stmt).    {.    
2320: 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e    return UnsafeN
2330: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
2340: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
2350: 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  t_interop(stmt._
2360: 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 20 20  sqlite_stmt);.  
2370: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
2380: 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e  l override strin
2390: 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 53 51 4c  g ColumnName(SQL
23a0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
23b0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
23c0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65    {.      int le
23d0: 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  n;.      return 
23e0: 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e  ToString(UnsafeN
23f0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
2400: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2410: 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73  _interop(stmt._s
2420: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
2430: 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e  x, out len), len
2440: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
2450: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
2460: 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 54 79 70  string ColumnTyp
2470: 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  e(SQLiteStatemen
2480: 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65  t stmt, int inde
2490: 78 2c 20 6f 75 74 20 54 79 70 65 41 66 66 69 6e  x, out TypeAffin
24a0: 69 74 79 20 6e 41 66 66 69 6e 69 74 79 29 0a 20  ity nAffinity). 
24b0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c     {.      int l
24c0: 65 6e 3b 0a 20 20 20 20 20 20 49 6e 74 50 74 72  en;.      IntPtr
24d0: 20 70 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   p = UnsafeNativ
24e0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
24f0: 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2500: 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73  _interop(stmt._s
2510: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
2520: 78 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a 20 20 20  x, out len);.   
2530: 20 20 20 6e 41 66 66 69 6e 69 74 79 20 3d 20 55     nAffinity = U
2540: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
2550: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
2560: 6e 5f 74 79 70 65 5f 69 6e 74 65 72 6f 70 28 73  n_type_interop(s
2570: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
2580: 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  , index);.      
2590: 69 66 20 28 70 20 21 3d 20 49 6e 74 50 74 72 2e  if (p != IntPtr.
25a0: 5a 65 72 6f 29 20 72 65 74 75 72 6e 20 54 6f 53  Zero) return ToS
25b0: 74 72 69 6e 67 28 70 2c 20 6c 65 6e 29 3b 0a 20  tring(p, len);. 
25c0: 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20       else.      
25d0: 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
25e0: 20 28 6e 41 66 66 69 6e 69 74 79 29 0a 20 20 20   (nAffinity).   
25f0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2600: 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69   case TypeAffini
2610: 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20 20 20 20  ty.Int64:.      
2620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 42 49        return "BI
2630: 47 49 4e 54 22 3b 0a 20 20 20 20 20 20 20 20 20  GINT";.         
2640: 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69   case TypeAffini
2650: 74 79 2e 44 6f 75 62 6c 65 3a 0a 20 20 20 20 20  ty.Double:.     
2660: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 44         return "D
2670: 4f 55 42 4c 45 22 3b 0a 20 20 20 20 20 20 20 20  OUBLE";.        
2680: 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e    case TypeAffin
2690: 69 74 79 2e 42 6c 6f 62 3a 0a 20 20 20 20 20 20  ity.Blob:.      
26a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 42 4c        return "BL
26b0: 4f 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20 64  OB";.          d
26c0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
26d0: 20 20 20 20 72 65 74 75 72 6e 20 22 54 45 58 54      return "TEXT
26e0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
26f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2700: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2710: 65 20 69 6e 74 20 43 6f 6c 75 6d 6e 49 6e 64 65  e int ColumnInde
2720: 78 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  x(SQLiteStatemen
2730: 74 20 73 74 6d 74 2c 20 73 74 72 69 6e 67 20 63  t stmt, string c
2740: 6f 6c 75 6d 6e 4e 61 6d 65 29 0a 20 20 20 20 7b  olumnName).    {
2750: 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 43  .      int x = C
2760: 6f 6c 75 6d 6e 43 6f 75 6e 74 28 73 74 6d 74 29  olumnCount(stmt)
2770: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e  ;..      for (in
2780: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 78 3b 20  t n = 0; n < x; 
2790: 6e 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  n++).      {.   
27a0: 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
27b0: 43 6f 6d 70 61 72 65 28 63 6f 6c 75 6d 6e 4e 61  Compare(columnNa
27c0: 6d 65 2c 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73  me, ColumnName(s
27d0: 74 6d 74 2c 20 6e 29 2c 20 74 72 75 65 2c 20 43  tmt, n), true, C
27e0: 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72  ultureInfo.Invar
27f0: 69 61 6e 74 43 75 6c 74 75 72 65 29 20 3d 3d 20  iantCulture) == 
2800: 30 29 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  0).          ret
2810: 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  urn n;.      }. 
2820: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
2830: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
2840: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
2850: 69 6e 67 20 43 6f 6c 75 6d 6e 4f 72 69 67 69 6e  ing ColumnOrigin
2860: 61 6c 4e 61 6d 65 28 53 51 4c 69 74 65 53 74 61  alName(SQLiteSta
2870: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
2880: 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20   index).    {.  
2890: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
28a0: 20 20 20 72 65 74 75 72 6e 20 54 6f 53 74 72 69     return ToStri
28b0: 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  ng(UnsafeNativeM
28c0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63  ethods.sqlite3_c
28d0: 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
28e0: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
28f0: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2900: 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65  ex, out len), le
2910: 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n);.    }..    i
2920: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
2930: 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 44 61   string ColumnDa
2940: 74 61 62 61 73 65 4e 61 6d 65 28 53 51 4c 69 74  tabaseName(SQLit
2950: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
2960: 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20   int index).    
2970: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  {.      int len;
2980: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f  .      return To
2990: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
29a0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
29b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
29c0: 73 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28  se_name_interop(
29d0: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
29e0: 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65  t, index, out le
29f0: 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  n), len);.    }.
2a00: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
2a10: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 43 6f  erride string Co
2a20: 6c 75 6d 6e 54 61 62 6c 65 4e 61 6d 65 28 53 51  lumnTableName(SQ
2a30: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
2a40: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20  mt, int index). 
2a50: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c     {.      int l
2a60: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
2a70: 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65   ToString(Unsafe
2a80: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
2a90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
2aa0: 6c 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28  le_name_interop(
2ab0: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
2ac0: 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65  t, index, out le
2ad0: 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  n), len);.    }.
2ae0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
2af0: 65 72 72 69 64 65 20 76 6f 69 64 20 43 6f 6c 75  erride void Colu
2b00: 6d 6e 4d 65 74 61 44 61 74 61 28 73 74 72 69 6e  mnMetaData(strin
2b10: 67 20 64 61 74 61 42 61 73 65 2c 20 73 74 72 69  g dataBase, stri
2b20: 6e 67 20 74 61 62 6c 65 2c 20 73 74 72 69 6e 67  ng table, string
2b30: 20 63 6f 6c 75 6d 6e 2c 20 6f 75 74 20 73 74 72   column, out str
2b40: 69 6e 67 20 64 61 74 61 54 79 70 65 2c 20 6f 75  ing dataType, ou
2b50: 74 20 73 74 72 69 6e 67 20 63 6f 6c 6c 61 74 65  t string collate
2b60: 53 65 71 75 65 6e 63 65 2c 20 6f 75 74 20 62 6f  Sequence, out bo
2b70: 6f 6c 20 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74 20  ol notNull, out 
2b80: 62 6f 6f 6c 20 70 72 69 6d 61 72 79 4b 65 79 2c  bool primaryKey,
2b90: 20 6f 75 74 20 62 6f 6f 6c 20 61 75 74 6f 49 6e   out bool autoIn
2ba0: 63 72 65 6d 65 6e 74 29 0a 20 20 20 20 7b 0a 20  crement).    {. 
2bb0: 20 20 20 20 20 49 6e 74 50 74 72 20 64 61 74 61       IntPtr data
2bc0: 54 79 70 65 50 74 72 3b 0a 20 20 20 20 20 20 49  TypePtr;.      I
2bd0: 6e 74 50 74 72 20 63 6f 6c 6c 53 65 71 50 74 72  ntPtr collSeqPtr
2be0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 74 4c 65  ;.      int dtLe
2bf0: 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 73 4c  n;.      int csL
2c00: 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6e  en;.      int nn
2c10: 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 69 6e  otNull;.      in
2c20: 74 20 6e 70 72 69 6d 61 72 79 4b 65 79 3b 0a 20  t nprimaryKey;. 
2c30: 20 20 20 20 20 69 6e 74 20 6e 61 75 74 6f 49 6e       int nautoIn
2c40: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  c;.      int n;.
2c50: 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66  .      n = Unsaf
2c60: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2c70: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
2c80: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 5f 69 6e 74  umn_metadata_int
2c90: 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54 46  erop(_sql, ToUTF
2ca0: 38 28 64 61 74 61 42 61 73 65 29 2c 20 54 6f 55  8(dataBase), ToU
2cb0: 54 46 38 28 74 61 62 6c 65 29 2c 20 54 6f 55 54  TF8(table), ToUT
2cc0: 46 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75 74 20  F8(column), out 
2cd0: 64 61 74 61 54 79 70 65 50 74 72 2c 20 6f 75 74  dataTypePtr, out
2ce0: 20 63 6f 6c 6c 53 65 71 50 74 72 2c 20 6f 75 74   collSeqPtr, out
2cf0: 20 6e 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74 20 6e   nnotNull, out n
2d00: 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75 74 20  primaryKey, out 
2d10: 6e 61 75 74 6f 49 6e 63 2c 20 6f 75 74 20 64 74  nautoInc, out dt
2d20: 4c 65 6e 2c 20 6f 75 74 20 63 73 4c 65 6e 29 3b  Len, out csLen);
2d30: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
2d40: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
2d50: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
2d60: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
2d70: 29 3b 0a 0a 20 20 20 20 20 20 64 61 74 61 54 79  );..      dataTy
2d80: 70 65 20 3d 20 62 61 73 65 2e 54 6f 53 74 72 69  pe = base.ToStri
2d90: 6e 67 28 64 61 74 61 54 79 70 65 50 74 72 2c 20  ng(dataTypePtr, 
2da0: 64 74 4c 65 6e 29 3b 0a 20 20 20 20 20 20 63 6f  dtLen);.      co
2db0: 6c 6c 61 74 65 53 65 71 75 65 6e 63 65 20 3d 20  llateSequence = 
2dc0: 62 61 73 65 2e 54 6f 53 74 72 69 6e 67 28 63 6f  base.ToString(co
2dd0: 6c 6c 53 65 71 50 74 72 2c 20 63 73 4c 65 6e 29  llSeqPtr, csLen)
2de0: 3b 0a 0a 20 20 20 20 20 20 6e 6f 74 4e 75 6c 6c  ;..      notNull
2df0: 20 3d 20 28 6e 6e 6f 74 4e 75 6c 6c 20 3d 3d 20   = (nnotNull == 
2e00: 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6d 61 72  1);.      primar
2e10: 79 4b 65 79 20 3d 20 28 6e 70 72 69 6d 61 72 79  yKey = (nprimary
2e20: 4b 65 79 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Key == 1);.     
2e30: 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74 20 3d   autoIncrement =
2e40: 20 28 6e 61 75 74 6f 49 6e 63 20 3d 3d 20 31 29   (nautoInc == 1)
2e50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
2e60: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 64  ernal override d
2e70: 6f 75 62 6c 65 20 47 65 74 44 6f 75 62 6c 65 28  ouble GetDouble(
2e80: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
2e90: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29  stmt, int index)
2ea0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 64 6f 75  .    {.      dou
2eb0: 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 20  ble value;.     
2ec0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
2ed0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
2ee0: 75 6d 6e 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72  umn_double_inter
2ef0: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
2f00: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74  stmt, index, out
2f10: 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 72   value);.      r
2f20: 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20  eturn value;.   
2f30: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
2f40: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47 65   override int Ge
2f50: 74 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61  tInt32(SQLiteSta
2f60: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
2f70: 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20   index).    {.  
2f80: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
2f90: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2fa0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2fb0: 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  t_interop(stmt._
2fc0: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2fd0: 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2fe0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2ff0: 65 20 6c 6f 6e 67 20 47 65 74 49 6e 74 36 34 28  e long GetInt64(
3000: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
3010: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29  stmt, int index)
3020: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6c 6f 6e  .    {.      lon
3030: 67 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 55  g value;.      U
3040: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
3050: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
3060: 6e 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28  n_int64_interop(
3070: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3080: 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 76 61  t, index, out va
3090: 6c 75 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  lue);.      retu
30a0: 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a  rn value;.    }.
30b0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
30c0: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 47 65  erride string Ge
30d0: 74 54 65 78 74 28 53 51 4c 69 74 65 53 74 61 74  tText(SQLiteStat
30e0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
30f0: 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20  index).    {.   
3100: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
3110: 20 20 72 65 74 75 72 6e 20 54 6f 53 74 72 69 6e    return ToStrin
3120: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
3130: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
3140: 6c 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65 72 6f  lumn_text_intero
3150: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
3160: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
3170: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  len), len);.    
3180: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3190: 6f 76 65 72 72 69 64 65 20 44 61 74 65 54 69 6d  override DateTim
31a0: 65 20 47 65 74 44 61 74 65 54 69 6d 65 28 53 51  e GetDateTime(SQ
31b0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
31c0: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20  mt, int index). 
31d0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c     {.      int l
31e0: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
31f0: 20 54 6f 44 61 74 65 54 69 6d 65 28 55 6e 73 61   ToDateTime(Unsa
3200: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3210: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3220: 65 78 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ext_interop(stmt
3230: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
3240: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20  ndex, out len), 
3250: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  len);.    }..   
3260: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3270: 64 65 20 6c 6f 6e 67 20 47 65 74 42 79 74 65 73  de long GetBytes
3280: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
3290: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
32a0: 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65  , int nDataOffse
32b0: 74 2c 20 62 79 74 65 5b 5d 20 62 44 65 73 74 2c  t, byte[] bDest,
32c0: 20 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74   int nStart, int
32d0: 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a   nLength).    {.
32e0: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72        IntPtr ptr
32f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e  ;.      int nlen
3300: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  ;.      int nCop
3310: 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a  ied = nLength;..
3320: 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20 55 6e 73        nlen = Uns
3330: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
3340: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
3350: 62 79 74 65 73 5f 69 6e 74 65 72 6f 70 28 73 74  bytes_interop(st
3360: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
3370: 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70   index);.      p
3380: 74 72 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76  tr = UnsafeNativ
3390: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
33a0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 5f 69 6e 74  _column_blob_int
33b0: 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74  erop(stmt._sqlit
33c0: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a  e_stmt, index);.
33d0: 0a 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74  .      if (bDest
33e0: 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   == null) return
33f0: 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66   nlen;..      if
3400: 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61   (nCopied + nSta
3410: 72 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74  rt > bDest.Lengt
3420: 68 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65  h) nCopied = bDe
3430: 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61  st.Length - nSta
3440: 72 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43  rt;.      if (nC
3450: 6f 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66  opied + nDataOff
3460: 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70  set > nlen) nCop
3470: 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61  ied = nlen - nDa
3480: 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20  taOffset;..     
3490: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30   if (nCopied > 0
34a0: 29 0a 20 20 20 20 20 20 20 20 4d 61 72 73 68 61  ).        Marsha
34b0: 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74 72 29 28  l.Copy((IntPtr)(
34c0: 70 74 72 2e 54 6f 49 6e 74 33 32 28 29 20 2b 20  ptr.ToInt32() + 
34d0: 6e 44 61 74 61 4f 66 66 73 65 74 29 2c 20 62 44  nDataOffset), bD
34e0: 65 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f  est, nStart, nCo
34f0: 70 69 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73  pied);.      els
3500: 65 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a  e nCopied = 0;..
3510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f        return nCo
3520: 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pied;.    }..   
3530: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3540: 64 65 20 6c 6f 6e 67 20 47 65 74 43 68 61 72 73  de long GetChars
3550: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
3560: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
3570: 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65  , int nDataOffse
3580: 74 2c 20 63 68 61 72 5b 5d 20 62 44 65 73 74 2c  t, char[] bDest,
3590: 20 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74   int nStart, int
35a0: 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a   nLength).    {.
35b0: 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a        int nlen;.
35c0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65        int nCopie
35d0: 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20  d = nLength;..  
35e0: 20 20 20 20 73 74 72 69 6e 67 20 73 74 72 20 3d      string str =
35f0: 20 47 65 74 54 65 78 74 28 73 74 6d 74 2c 20 69   GetText(stmt, i
3600: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 6e 6c 65  ndex);.      nle
3610: 6e 20 3d 20 73 74 72 2e 4c 65 6e 67 74 68 3b 0a  n = str.Length;.
3620: 0a 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74  .      if (bDest
3630: 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   == null) return
3640: 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66   nlen;..      if
3650: 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61   (nCopied + nSta
3660: 72 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74  rt > bDest.Lengt
3670: 68 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65  h) nCopied = bDe
3680: 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61  st.Length - nSta
3690: 72 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43  rt;.      if (nC
36a0: 6f 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66  opied + nDataOff
36b0: 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70  set > nlen) nCop
36c0: 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61  ied = nlen - nDa
36d0: 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20  taOffset;..     
36e0: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30   if (nCopied > 0
36f0: 29 0a 20 20 20 20 20 20 20 20 73 74 72 2e 43 6f  ).        str.Co
3700: 70 79 54 6f 28 6e 44 61 74 61 4f 66 66 73 65 74  pyTo(nDataOffset
3710: 2c 20 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c  , bDest, nStart,
3720: 20 6e 43 6f 70 69 65 64 29 3b 0a 20 20 20 20 20   nCopied);.     
3730: 20 65 6c 73 65 20 6e 43 6f 70 69 65 64 20 3d 20   else nCopied = 
3740: 30 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0;..      return
3750: 20 6e 43 6f 70 69 65 64 3b 0a 20 20 20 20 7d 0a   nCopied;.    }.
3760: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
3770: 65 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 4e 75  erride bool IsNu
3780: 6c 6c 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  ll(SQLiteStateme
3790: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
37a0: 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ex).    {.      
37b0: 72 65 74 75 72 6e 20 28 55 6e 73 61 66 65 4e 61  return (UnsafeNa
37c0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
37d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 5f  te3_column_type_
37e0: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
37f0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
3800: 29 20 3d 3d 20 54 79 70 65 41 66 66 69 6e 69 74  ) == TypeAffinit
3810: 79 2e 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a  y.Null);.    }..
3820: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
3830: 72 72 69 64 65 20 69 6e 74 20 41 67 67 72 65 67  rride int Aggreg
3840: 61 74 65 43 6f 75 6e 74 28 49 6e 74 50 74 72 20  ateCount(IntPtr 
3850: 63 6f 6e 74 65 78 74 29 0a 20 20 20 20 7b 0a 20  context).    {. 
3860: 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61       return Unsa
3870: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3880: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3890: 65 5f 63 6f 75 6e 74 5f 69 6e 74 65 72 6f 70 28  e_count_interop(
38a0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a  context);.    }.
38b0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
38c0: 65 72 72 69 64 65 20 49 6e 74 50 74 72 20 43 72  erride IntPtr Cr
38d0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 28 73 74 72  eateFunction(str
38e0: 69 6e 67 20 73 74 72 46 75 6e 63 74 69 6f 6e 2c  ing strFunction,
38f0: 20 69 6e 74 20 6e 41 72 67 73 2c 20 53 51 4c 69   int nArgs, SQLi
3900: 74 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 2c  teCallback func,
3910: 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20   SQLiteCallback 
3920: 66 75 6e 63 73 74 65 70 2c 20 53 51 4c 69 74 65  funcstep, SQLite
3930: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 66 69 6e  Callback funcfin
3940: 61 6c 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  al).    {.      
3950: 49 6e 74 50 74 72 20 6e 43 6f 6f 6b 69 65 3b 0a  IntPtr nCookie;.
3960: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
3970: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
3980: 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ds.sqlite3_creat
3990: 65 5f 66 75 6e 63 74 69 6f 6e 5f 69 6e 74 65 72  e_function_inter
39a0: 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28  op(_sql, ToUTF8(
39b0: 73 74 72 46 75 6e 63 74 69 6f 6e 29 2c 20 6e 41  strFunction), nA
39c0: 72 67 73 2c 20 31 2c 20 66 75 6e 63 2c 20 66 75  rgs, 1, func, fu
39d0: 6e 63 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61  ncstep, funcfina
39e0: 6c 2c 20 6f 75 74 20 6e 43 6f 6f 6b 69 65 29 3b  l, out nCookie);
39f0: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
3a00: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
3a10: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
3a20: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
3a30: 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
3a40: 20 6e 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 7d 0a   nCookie;.    }.
3a50: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
3a60: 65 72 72 69 64 65 20 49 6e 74 50 74 72 20 43 72  erride IntPtr Cr
3a70: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 73 74  eateCollation(st
3a80: 72 69 6e 67 20 73 74 72 43 6f 6c 6c 61 74 69 6f  ring strCollatio
3a90: 6e 2c 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69  n, SQLiteCollati
3aa0: 6f 6e 20 66 75 6e 63 29 0a 20 20 20 20 7b 0a 20  on func).    {. 
3ab0: 20 20 20 20 20 49 6e 74 50 74 72 20 6e 43 6f 6f       IntPtr nCoo
3ac0: 6b 69 65 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20  kie;..      int 
3ad0: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
3ae0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
3af0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
3b00: 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54  _interop(_sql, T
3b10: 6f 55 54 46 38 28 73 74 72 43 6f 6c 6c 61 74 69  oUTF8(strCollati
3b20: 6f 6e 29 2c 20 31 2c 20 30 2c 20 66 75 6e 63 2c  on), 1, 0, func,
3b30: 20 6f 75 74 20 6e 43 6f 6f 6b 69 65 29 3b 0a 20   out nCookie);. 
3b40: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
3b50: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
3b60: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
3b70: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
3b80: 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ..      return n
3b90: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 7d 0a 0a 20  Cookie;.    }.. 
3ba0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
3bb0: 72 69 64 65 20 76 6f 69 64 20 46 72 65 65 46 75  ride void FreeFu
3bc0: 6e 63 74 69 6f 6e 28 49 6e 74 50 74 72 20 6e 43  nction(IntPtr nC
3bd0: 6f 6f 6b 69 65 29 0a 20 20 20 20 7b 0a 20 20 20  ookie).    {.   
3be0: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
3bf0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 66  ethods.sqlite3_f
3c00: 75 6e 63 74 69 6f 6e 5f 66 72 65 65 5f 63 61 6c  unction_free_cal
3c10: 6c 62 61 63 6b 63 6f 6f 6b 69 65 28 6e 43 6f 6f  lbackcookie(nCoo
3c20: 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  kie);.    }..   
3c30: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
3c40: 64 65 20 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d  de long GetParam
3c50: 56 61 6c 75 65 42 79 74 65 73 28 49 6e 74 50 74  ValueBytes(IntPt
3c60: 72 20 70 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66  r p, int nDataOf
3c70: 66 73 65 74 2c 20 62 79 74 65 5b 5d 20 62 44 65  fset, byte[] bDe
3c80: 73 74 2c 20 69 6e 74 20 6e 53 74 61 72 74 2c 20  st, int nStart, 
3c90: 69 6e 74 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20  int nLength).   
3ca0: 20 7b 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20   {.      IntPtr 
3cb0: 70 74 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ptr;.      int n
3cc0: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  len;.      int n
3cd0: 43 6f 70 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68  Copied = nLength
3ce0: 3b 0a 0a 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20  ;..      nlen = 
3cf0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
3d00: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75  ods.sqlite3_valu
3d10: 65 5f 62 79 74 65 73 5f 69 6e 74 65 72 6f 70 28  e_bytes_interop(
3d20: 70 29 3b 0a 20 20 20 20 20 20 70 74 72 20 3d 20  p);.      ptr = 
3d30: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
3d40: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75  ods.sqlite3_valu
3d50: 65 5f 62 6c 6f 62 5f 69 6e 74 65 72 6f 70 28 70  e_blob_interop(p
3d60: 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 62 44  );..      if (bD
3d70: 65 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74  est == null) ret
3d80: 75 72 6e 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20  urn nlen;..     
3d90: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e   if (nCopied + n
3da0: 53 74 61 72 74 20 3e 20 62 44 65 73 74 2e 4c 65  Start > bDest.Le
3db0: 6e 67 74 68 29 20 6e 43 6f 70 69 65 64 20 3d 20  ngth) nCopied = 
3dc0: 62 44 65 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e  bDest.Length - n
3dd0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 20  Start;.      if 
3de0: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 44 61 74 61  (nCopied + nData
3df0: 4f 66 66 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e  Offset > nlen) n
3e00: 43 6f 70 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20  Copied = nlen - 
3e10: 6e 44 61 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20  nDataOffset;..  
3e20: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
3e30: 3e 20 30 29 0a 20 20 20 20 20 20 20 20 4d 61 72  > 0).        Mar
3e40: 73 68 61 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74  shal.Copy((IntPt
3e50: 72 29 28 70 74 72 2e 54 6f 49 6e 74 33 32 28 29  r)(ptr.ToInt32()
3e60: 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 29 2c   + nDataOffset),
3e70: 20 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c 20   bDest, nStart, 
3e80: 6e 43 6f 70 69 65 64 29 3b 0a 20 20 20 20 20 20  nCopied);.      
3e90: 65 6c 73 65 20 6e 43 6f 70 69 65 64 20 3d 20 30  else nCopied = 0
3ea0: 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
3eb0: 6e 43 6f 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a  nCopied;.    }..
3ec0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
3ed0: 72 72 69 64 65 20 64 6f 75 62 6c 65 20 47 65 74  rride double Get
3ee0: 50 61 72 61 6d 56 61 6c 75 65 44 6f 75 62 6c 65  ParamValueDouble
3ef0: 28 49 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20  (IntPtr ptr).   
3f00: 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20   {.      double 
3f10: 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 55 6e 73  value;.      Uns
3f20: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
3f30: 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64  .sqlite3_value_d
3f40: 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 70 74  ouble_interop(pt
3f50: 72 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b 0a 20  r, out value);. 
3f60: 20 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c 75       return valu
3f70: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  e;.    }..    in
3f80: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
3f90: 69 6e 74 20 47 65 74 50 61 72 61 6d 56 61 6c 75  int GetParamValu
3fa0: 65 49 6e 74 33 32 28 49 6e 74 50 74 72 20 70 74  eInt32(IntPtr pt
3fb0: 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  r).    {.      r
3fc0: 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69  eturn UnsafeNati
3fd0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
3fe0: 33 5f 76 61 6c 75 65 5f 69 6e 74 5f 69 6e 74 65  3_value_int_inte
3ff0: 72 6f 70 28 70 74 72 29 3b 0a 20 20 20 20 7d 0a  rop(ptr);.    }.
4000: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
4010: 65 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 50  erride long GetP
4020: 61 72 61 6d 56 61 6c 75 65 49 6e 74 36 34 28 49  aramValueInt64(I
4030: 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20 20 7b  ntPtr ptr).    {
4040: 0a 20 20 20 20 20 20 49 6e 74 36 34 20 76 61 6c  .      Int64 val
4050: 75 65 3b 0a 20 20 20 20 20 20 55 6e 73 61 66 65  ue;.      Unsafe
4060: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
4070: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
4080: 34 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f  4_interop(ptr, o
4090: 75 74 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  ut value);.     
40a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20   return value;. 
40b0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
40c0: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
40d0: 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c 75 65  ng GetParamValue
40e0: 54 65 78 74 28 49 6e 74 50 74 72 20 70 74 72 29  Text(IntPtr ptr)
40f0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
4100: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75   len;.      retu
4110: 72 6e 20 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  rn ToString(Unsa
4120: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
4130: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4140: 78 74 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20  xt_interop(ptr, 
4150: 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a  out len), len);.
4160: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4170: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 54 79 70  nal override Typ
4180: 65 41 66 66 69 6e 69 74 79 20 47 65 74 50 61 72  eAffinity GetPar
4190: 61 6d 56 61 6c 75 65 54 79 70 65 28 49 6e 74 50  amValueType(IntP
41a0: 74 72 20 70 74 72 29 0a 20 20 20 20 7b 0a 20 20  tr ptr).    {.  
41b0: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
41c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
41d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
41e0: 65 5f 69 6e 74 65 72 6f 70 28 70 74 72 29 3b 0a  e_interop(ptr);.
41f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4200: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
4210: 64 20 52 65 74 75 72 6e 42 6c 6f 62 28 49 6e 74  d ReturnBlob(Int
4220: 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 62 79 74  Ptr context, byt
4230: 65 5b 5d 20 76 61 6c 75 65 29 0a 20 20 20 20 7b  e[] value).    {
4240: 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74  .      UnsafeNat
4250: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
4260: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 5f 69  e3_result_blob_i
4270: 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78 74 2c 20  nterop(context, 
4280: 76 61 6c 75 65 2c 20 76 61 6c 75 65 2e 4c 65 6e  value, value.Len
4290: 67 74 68 2c 20 28 49 6e 74 50 74 72 29 28 2d 31  gth, (IntPtr)(-1
42a0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
42b0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
42c0: 20 76 6f 69 64 20 52 65 74 75 72 6e 44 6f 75 62   void ReturnDoub
42d0: 6c 65 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78  le(IntPtr contex
42e0: 74 2c 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 29  t, double value)
42f0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73  .    {.      Uns
4300: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4310: 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
4320: 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 63  double_interop(c
4330: 6f 6e 74 65 78 74 2c 20 72 65 66 20 76 61 6c 75  ontext, ref valu
4340: 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
4350: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
4360: 20 76 6f 69 64 20 52 65 74 75 72 6e 45 72 72 6f   void ReturnErro
4370: 72 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  r(IntPtr context
4380: 2c 20 73 74 72 69 6e 67 20 76 61 6c 75 65 29 0a  , string value).
4390: 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61      {.      Unsa
43a0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
43b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
43c0: 72 72 6f 72 5f 69 6e 74 65 72 6f 70 28 63 6f 6e  rror_interop(con
43d0: 74 65 78 74 2c 20 54 6f 55 54 46 38 28 76 61 6c  text, ToUTF8(val
43e0: 75 65 29 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74  ue), value.Lengt
43f0: 68 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  h);.    }..    i
4400: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
4410: 20 76 6f 69 64 20 52 65 74 75 72 6e 49 6e 74 33   void ReturnInt3
4420: 32 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  2(IntPtr context
4430: 2c 20 69 6e 74 20 76 61 6c 75 65 29 0a 20 20 20  , int value).   
4440: 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e   {.      UnsafeN
4450: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
4460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 5f  ite3_result_int_
4470: 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78 74 2c  interop(context,
4480: 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 0a   value);.    }..
4490: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
44a0: 72 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72  rride void Retur
44b0: 6e 49 6e 74 36 34 28 49 6e 74 50 74 72 20 63 6f  nInt64(IntPtr co
44c0: 6e 74 65 78 74 2c 20 6c 6f 6e 67 20 76 61 6c 75  ntext, long valu
44d0: 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55  e).    {.      U
44e0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
44f0: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ds.sqlite3_resul
4500: 74 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28  t_int64_interop(
4510: 63 6f 6e 74 65 78 74 2c 20 72 65 66 20 76 61 6c  context, ref val
4520: 75 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ue);.    }..    
4530: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
4540: 65 20 76 6f 69 64 20 52 65 74 75 72 6e 4e 75 6c  e void ReturnNul
4550: 6c 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  l(IntPtr context
4560: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e  ).    {.      Un
4570: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
4580: 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  s.sqlite3_result
4590: 5f 6e 75 6c 6c 5f 69 6e 74 65 72 6f 70 28 63 6f  _null_interop(co
45a0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
45b0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
45c0: 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e  ride void Return
45d0: 54 65 78 74 28 49 6e 74 50 74 72 20 63 6f 6e 74  Text(IntPtr cont
45e0: 65 78 74 2c 20 73 74 72 69 6e 67 20 76 61 6c 75  ext, string valu
45f0: 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55  e).    {.      U
4600: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
4610: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ds.sqlite3_resul
4620: 74 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 63  t_text_interop(c
4630: 6f 6e 74 65 78 74 2c 20 54 6f 55 54 46 38 28 76  ontext, ToUTF8(v
4640: 61 6c 75 65 29 2c 20 76 61 6c 75 65 2e 4c 65 6e  alue), value.Len
4650: 67 74 68 2c 20 28 49 6e 74 50 74 72 29 28 2d 31  gth, (IntPtr)(-1
4660: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
4670: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
4680: 20 49 6e 74 50 74 72 20 41 67 67 72 65 67 61 74   IntPtr Aggregat
4690: 65 43 6f 6e 74 65 78 74 28 49 6e 74 50 74 72 20  eContext(IntPtr 
46a0: 63 6f 6e 74 65 78 74 29 0a 20 20 20 20 7b 0a 20  context).    {. 
46b0: 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61       return Unsa
46c0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
46d0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
46e0: 65 5f 63 6f 6e 74 65 78 74 5f 69 6e 74 65 72 6f  e_context_intero
46f0: 70 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20  p(context, 1);. 
4700: 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 69 6e 74 65     }..    //inte
4710: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
4720: 69 64 20 53 65 74 52 65 61 6c 43 6f 6c 4e 61 6d  id SetRealColNam
4730: 65 73 28 62 6f 6f 6c 20 62 4f 6e 29 0a 20 20 20  es(bool bOn).   
4740: 20 2f 2f 7b 0a 20 20 20 20 2f 2f 20 20 55 6e 73   //{.    //  Uns
4750: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4760: 2e 73 71 6c 69 74 65 33 5f 72 65 61 6c 63 6f 6c  .sqlite3_realcol
4770: 6e 61 6d 65 73 28 5f 73 71 6c 2c 20 43 6f 6e 76  names(_sql, Conv
4780: 65 72 74 2e 54 6f 49 6e 74 33 32 28 62 4f 6e 29  ert.ToInt32(bOn)
4790: 29 3b 0a 20 20 20 20 2f 2f 7d 0a 0a 20 20 20 20  );.    //}..    
47a0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
47b0: 65 20 76 6f 69 64 20 53 65 74 50 61 73 73 77 6f  e void SetPasswo
47c0: 72 64 28 62 79 74 65 5b 5d 20 70 61 73 73 77 6f  rd(byte[] passwo
47d0: 72 64 42 79 74 65 73 29 0a 20 20 20 20 7b 0a 20  rdBytes).    {. 
47e0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73       int n = Uns
47f0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4800: 2e 73 71 6c 69 74 65 33 5f 6b 65 79 5f 69 6e 74  .sqlite3_key_int
4810: 65 72 6f 70 28 5f 73 71 6c 2c 20 70 61 73 73 77  erop(_sql, passw
4820: 6f 72 64 42 79 74 65 73 2c 20 70 61 73 73 77 6f  ordBytes, passwo
4830: 72 64 42 79 74 65 73 2e 4c 65 6e 67 74 68 29 3b  rdBytes.Length);
4840: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
4850: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
4860: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
4870: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
4880: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
4890: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
48a0: 76 6f 69 64 20 43 68 61 6e 67 65 50 61 73 73 77  void ChangePassw
48b0: 6f 72 64 28 62 79 74 65 5b 5d 20 6e 65 77 50 61  ord(byte[] newPa
48c0: 73 73 77 6f 72 64 42 79 74 65 73 29 0a 20 20 20  sswordBytes).   
48d0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d   {.      int n =
48e0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
48f0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 6b  hods.sqlite3_rek
4900: 65 79 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  ey_interop(_sql,
4910: 20 6e 65 77 50 61 73 73 77 6f 72 64 42 79 74 65   newPasswordByte
4920: 73 2c 20 28 6e 65 77 50 61 73 73 77 6f 72 64 42  s, (newPasswordB
4930: 79 74 65 73 20 3d 3d 20 6e 75 6c 6c 29 20 3f 20  ytes == null) ? 
4940: 30 20 3a 20 6e 65 77 50 61 73 73 77 6f 72 64 42  0 : newPasswordB
4950: 79 74 65 73 2e 4c 65 6e 67 74 68 29 3b 0a 20 20  ytes.Length);.  
4960: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
4970: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
4980: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
4990: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  teLastError());.
49a0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a                  }.  }.}.