System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a1650d4741123a214265bd5aa7759f947fbf0293:


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 53 51 4c 69 74   protected SQLit
02f0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 48 61 6e 64 6c  eConnectionHandl
0300: 65 20 5f 73 71 6c 3b 0a 20 20 20 20 70 72 6f 74  e _sql;.    prot
0310: 65 63 74 65 64 20 73 74 72 69 6e 67 20 5f 66 69  ected string _fi
0320: 6c 65 4e 61 6d 65 3b 0a 20 20 20 20 70 72 6f 74  leName;.    prot
0330: 65 63 74 65 64 20 62 6f 6f 6c 20 5f 75 73 65 50  ected bool _useP
0340: 6f 6f 6c 3b 0a 20 20 20 20 70 72 6f 74 65 63 74  ool;.    protect
0350: 65 64 20 69 6e 74 20 5f 70 6f 6f 6c 56 65 72 73  ed int _poolVers
0360: 69 6f 6e 20 3d 20 30 3b 0a 0a 23 69 66 20 21 50  ion = 0;..#if !P
0370: 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
0380: 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 70 72 69  RAMEWORK.    pri
0390: 76 61 74 65 20 62 6f 6f 6c 20 5f 62 75 69 6c 64  vate bool _build
03a0: 69 6e 67 53 63 68 65 6d 61 20 3d 20 66 61 6c 73  ingSchema = fals
03b0: 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2f  e;.#endif.    //
03c0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
03d0: 2f 2f 2f 20 54 68 65 20 75 73 65 72 2d 64 65 66  /// The user-def
03e0: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 72  ined functions r
03f0: 65 67 69 73 74 65 72 65 64 20 6f 6e 20 74 68 69  egistered on thi
0400: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  s connection.   
0410: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
0420: 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 53 51      protected SQ
0430: 4c 69 74 65 46 75 6e 63 74 69 6f 6e 5b 5d 20 5f  LiteFunction[] _
0440: 66 75 6e 63 74 69 6f 6e 73 41 72 72 61 79 3b 0a  functionsArray;.
0450: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 51  .    internal SQ
0460: 4c 69 74 65 33 28 53 51 4c 69 74 65 44 61 74 65  Lite3(SQLiteDate
0470: 46 6f 72 6d 61 74 73 20 66 6d 74 29 0a 20 20 20  Formats fmt).   
0480: 20 20 20 3a 20 62 61 73 65 28 66 6d 74 29 0a 20     : base(fmt). 
0490: 20 20 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20     {.    }..    
04a0: 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72 72 69  protected overri
04b0: 64 65 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28  de void Dispose(
04c0: 62 6f 6f 6c 20 62 44 69 73 70 6f 73 69 6e 67 29  bool bDisposing)
04d0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20  .    {.      if 
04e0: 28 62 44 69 73 70 6f 73 69 6e 67 29 0a 20 20 20  (bDisposing).   
04f0: 20 20 20 20 20 43 6c 6f 73 65 28 29 3b 0a 20 20       Close();.  
0500: 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 49 74 20 69    }..    // It i
0510: 73 6e 27 74 20 6e 65 63 65 73 73 61 72 79 20 74  sn't necessary t
0520: 6f 20 63 6c 65 61 6e 75 70 20 61 6e 79 20 66 75  o cleanup any fu
0530: 6e 63 74 69 6f 6e 73 20 77 65 27 76 65 20 72 65  nctions we've re
0540: 67 69 73 74 65 72 65 64 2e 20 20 49 66 20 74 68  gistered.  If th
0550: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  e connection.   
0560: 20 2f 2f 20 67 6f 65 73 20 74 6f 20 74 68 65 20   // goes to the 
0570: 70 6f 6f 6c 20 61 6e 64 20 69 73 20 72 65 73 75  pool and is resu
0580: 72 72 65 63 74 65 64 20 6c 61 74 65 72 2c 20 72  rrected later, r
0590: 65 2d 72 65 67 69 73 74 65 72 65 64 20 66 75 6e  e-registered fun
05a0: 63 74 69 6f 6e 73 20 77 69 6c 6c 20 6f 76 65 72  ctions will over
05b0: 77 72 69 74 65 20 74 68 65 0a 20 20 20 20 2f 2f  write the.    //
05c0: 20 70 72 65 76 69 6f 75 73 20 66 75 6e 63 74 69   previous functi
05d0: 6f 6e 73 2e 20 20 54 68 65 20 53 51 4c 69 74 65  ons.  The SQLite
05e0: 46 75 6e 63 74 69 6f 6e 43 6f 6f 6b 69 65 48 61  FunctionCookieHa
05f0: 6e 64 6c 65 20 77 69 6c 6c 20 74 61 6b 65 20 63  ndle will take c
0600: 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 75  are of freeing u
0610: 6e 6d 61 6e 61 67 65 64 0a 20 20 20 20 2f 2f 20  nmanaged.    // 
0620: 72 65 73 6f 75 72 63 65 73 20 62 65 6c 6f 6e 67  resources belong
0630: 69 6e 67 20 74 6f 20 74 68 65 20 70 72 65 76 69  ing to the previ
0640: 6f 75 73 6c 79 2d 72 65 67 69 73 74 65 72 65 64  ously-registered
0650: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20   functions..    
0660: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
0670: 65 20 76 6f 69 64 20 43 6c 6f 73 65 28 29 0a 20  e void Close(). 
0680: 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f     {.      if (_
0690: 73 71 6c 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20  sql != null).   
06a0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20     {.        if 
06b0: 28 5f 75 73 65 50 6f 6f 6c 29 0a 20 20 20 20 20  (_usePool).     
06c0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 53     {.          S
06d0: 51 4c 69 74 65 42 61 73 65 2e 52 65 73 65 74 43  QLiteBase.ResetC
06e0: 6f 6e 6e 65 63 74 69 6f 6e 28 5f 73 71 6c 29 3b  onnection(_sql);
06f0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74  .          SQLit
0700: 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 2e  eConnectionPool.
0710: 41 64 64 28 5f 66 69 6c 65 4e 61 6d 65 2c 20 5f  Add(_fileName, _
0720: 73 71 6c 2c 20 5f 70 6f 6f 6c 56 65 72 73 69 6f  sql, _poolVersio
0730: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
0740: 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20        else.     
0750: 20 20 20 20 20 5f 73 71 6c 2e 44 69 73 70 6f 73       _sql.Dispos
0760: 65 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e();.      }..  
0770: 20 20 20 20 5f 73 71 6c 20 3d 20 6e 75 6c 6c 3b      _sql = null;
0780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
0790: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
07a0: 69 64 20 43 61 6e 63 65 6c 28 29 0a 20 20 20 20  id Cancel().    
07b0: 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61  {.      UnsafeNa
07c0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
07d0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 5f 73  te3_interrupt(_s
07e0: 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ql);.    }..    
07f0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
0800: 65 20 73 74 72 69 6e 67 20 56 65 72 73 69 6f 6e  e string Version
0810: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74  .    {.      get
0820: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
0830: 20 72 65 74 75 72 6e 20 53 51 4c 69 74 65 33 2e   return SQLite3.
0840: 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 3b 0a 20  SQLiteVersion;. 
0850: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
0860: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
0870: 63 20 73 74 72 69 6e 67 20 53 51 4c 69 74 65 56  c string SQLiteV
0880: 65 72 73 69 6f 6e 0a 20 20 20 20 7b 0a 20 20 20  ersion.    {.   
0890: 20 20 20 67 65 74 0a 20 20 20 20 20 20 7b 0a 20     get.      {. 
08a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54         return UT
08b0: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
08c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
08d0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
08e0: 6e 28 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  n(), -1);.      
08f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  }.    }..    int
0900: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 62  ernal override b
0910: 6f 6f 6c 20 41 75 74 6f 43 6f 6d 6d 69 74 0a 20  ool AutoCommit. 
0920: 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74 0a 20     {.      get. 
0930: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
0940: 65 74 75 72 6e 20 49 73 41 75 74 6f 63 6f 6d 6d  eturn IsAutocomm
0950: 69 74 28 5f 73 71 6c 29 3b 0a 20 20 20 20 20 20  it(_sql);.      
0960: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  }.    }..    int
0970: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69  ernal override i
0980: 6e 74 20 43 68 61 6e 67 65 73 0a 20 20 20 20 7b  nt Changes.    {
0990: 0a 20 20 20 20 20 20 67 65 74 0a 20 20 20 20 20  .      get.     
09a0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
09b0: 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  n UnsafeNativeMe
09c0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 68  thods.sqlite3_ch
09d0: 61 6e 67 65 73 28 5f 73 71 6c 29 3b 0a 20 20 20  anges(_sql);.   
09e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
09f0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
0a00: 65 20 76 6f 69 64 20 4f 70 65 6e 28 73 74 72 69  e void Open(stri
0a10: 6e 67 20 73 74 72 46 69 6c 65 6e 61 6d 65 2c 20  ng strFilename, 
0a20: 53 51 4c 69 74 65 4f 70 65 6e 46 6c 61 67 73 45  SQLiteOpenFlagsE
0a30: 6e 75 6d 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d  num flags, int m
0a40: 61 78 50 6f 6f 6c 53 69 7a 65 2c 20 62 6f 6f 6c  axPoolSize, bool
0a50: 20 75 73 65 50 6f 6f 6c 29 0a 20 20 20 20 7b 0a   usePool).    {.
0a60: 20 20 20 20 20 20 69 66 20 28 5f 73 71 6c 20 21        if (_sql !
0a70: 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 3b 0a  = null) return;.
0a80: 0a 20 20 20 20 20 20 5f 75 73 65 50 6f 6f 6c 20  .      _usePool 
0a90: 3d 20 75 73 65 50 6f 6f 6c 3b 0a 20 20 20 20 20  = usePool;.     
0aa0: 20 69 66 20 28 75 73 65 50 6f 6f 6c 29 0a 20 20   if (usePool).  
0ab0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 5f 66      {.        _f
0ac0: 69 6c 65 4e 61 6d 65 20 3d 20 73 74 72 46 69 6c  ileName = strFil
0ad0: 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 5f  ename;.        _
0ae0: 73 71 6c 20 3d 20 53 51 4c 69 74 65 43 6f 6e 6e  sql = SQLiteConn
0af0: 65 63 74 69 6f 6e 50 6f 6f 6c 2e 52 65 6d 6f 76  ectionPool.Remov
0b00: 65 28 73 74 72 46 69 6c 65 6e 61 6d 65 2c 20 6d  e(strFilename, m
0b10: 61 78 50 6f 6f 6c 53 69 7a 65 2c 20 6f 75 74 20  axPoolSize, out 
0b20: 5f 70 6f 6f 6c 56 65 72 73 69 6f 6e 29 3b 0a 20  _poolVersion);. 
0b30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
0b40: 20 28 5f 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 0a   (_sql == null).
0b50: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0b60: 49 6e 74 50 74 72 20 64 62 3b 0a 0a 23 69 66 20  IntPtr db;..#if 
0b70: 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44  !SQLITE_STANDARD
0b80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
0b90: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
0ba0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 6f 70 65  hods.sqlite3_ope
0bb0: 6e 5f 69 6e 74 65 72 6f 70 28 54 6f 55 54 46 38  n_interop(ToUTF8
0bc0: 28 73 74 72 46 69 6c 65 6e 61 6d 65 29 2c 20 28  (strFilename), (
0bd0: 69 6e 74 29 66 6c 61 67 73 2c 20 6f 75 74 20 64  int)flags, out d
0be0: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  b);.#else.      
0bf0: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
0c00: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
0c10: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 54 6f  lite3_open_v2(To
0c20: 55 54 46 38 28 73 74 72 46 69 6c 65 6e 61 6d 65  UTF8(strFilename
0c30: 29 2c 20 6f 75 74 20 64 62 2c 20 28 69 6e 74 29  ), out db, (int)
0c40: 66 6c 61 67 73 2c 20 49 6e 74 50 74 72 2e 5a 65  flags, IntPtr.Ze
0c50: 72 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ro);.#endif.    
0c60: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
0c70: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
0c80: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 6e 75 6c 6c  xception(n, null
0c90: 29 3b 0a 0a 20 20 20 20 20 20 20 20 5f 73 71 6c  );..        _sql
0ca0: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
0cb0: 20 20 20 20 20 2f 2f 20 42 69 6e 64 20 66 75 6e       // Bind fun
0cc0: 63 74 69 6f 6e 73 20 74 6f 20 74 68 69 73 20 63  ctions to this c
0cd0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 61  onnection.  If a
0ce0: 6e 79 20 70 72 65 76 69 6f 75 73 20 66 75 6e 63  ny previous func
0cf0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d  tions of the sam
0d00: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2f 2f 20  e name.      // 
0d10: 77 65 72 65 20 61 6c 72 65 61 64 79 20 62 6f 75  were already bou
0d20: 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 77  nd, then the new
0d30: 20 62 69 6e 64 69 6e 67 73 20 72 65 70 6c 61 63   bindings replac
0d40: 65 20 74 68 65 20 6f 6c 64 2e 0a 20 20 20 20 20  e the old..     
0d50: 20 5f 66 75 6e 63 74 69 6f 6e 73 41 72 72 61 79   _functionsArray
0d60: 20 3d 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f   = SQLiteFunctio
0d70: 6e 2e 42 69 6e 64 46 75 6e 63 74 69 6f 6e 73 28  n.BindFunctions(
0d80: 74 68 69 73 29 3b 0a 20 20 20 20 20 20 53 65 74  this);.      Set
0d90: 54 69 6d 65 6f 75 74 28 30 29 3b 0a 20 20 20 20  Timeout(0);.    
0da0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
0db0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 43 6c  override void Cl
0dc0: 65 61 72 50 6f 6f 6c 28 29 0a 20 20 20 20 7b 0a  earPool().    {.
0dd0: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
0de0: 65 63 74 69 6f 6e 50 6f 6f 6c 2e 43 6c 65 61 72  ectionPool.Clear
0df0: 50 6f 6f 6c 28 5f 66 69 6c 65 4e 61 6d 65 29 3b  Pool(_fileName);
0e00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
0e10: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
0e20: 69 64 20 53 65 74 54 69 6d 65 6f 75 74 28 69 6e  id SetTimeout(in
0e30: 74 20 6e 54 69 6d 65 6f 75 74 4d 53 29 0a 20 20  t nTimeoutMS).  
0e40: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20    {.      int n 
0e50: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
0e60: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 75  thods.sqlite3_bu
0e70: 73 79 5f 74 69 6d 65 6f 75 74 28 5f 73 71 6c 2c  sy_timeout(_sql,
0e80: 20 6e 54 69 6d 65 6f 75 74 4d 53 29 3b 0a 20 20   nTimeoutMS);.  
0e90: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
0ea0: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
0eb0: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
0ec0: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  teLastError());.
0ed0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
0ee0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  nal override boo
0ef0: 6c 20 53 74 65 70 28 53 51 4c 69 74 65 53 74 61  l Step(SQLiteSta
0f00: 74 65 6d 65 6e 74 20 73 74 6d 74 29 0a 20 20 20  tement stmt).   
0f10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
0f20: 20 20 20 20 20 20 52 61 6e 64 6f 6d 20 72 6e 64        Random rnd
0f30: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 75   = null;.      u
0f40: 69 6e 74 20 73 74 61 72 74 74 69 63 6b 20 3d 20  int starttick = 
0f50: 28 75 69 6e 74 29 45 6e 76 69 72 6f 6e 6d 65 6e  (uint)Environmen
0f60: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20  t.TickCount;.   
0f70: 20 20 20 75 69 6e 74 20 74 69 6d 65 6f 75 74 20     uint timeout 
0f80: 3d 20 28 75 69 6e 74 29 28 73 74 6d 74 2e 5f 63  = (uint)(stmt._c
0f90: 6f 6d 6d 61 6e 64 2e 5f 63 6f 6d 6d 61 6e 64 54  ommand._commandT
0fa0: 69 6d 65 6f 75 74 20 2a 20 31 30 30 30 29 3b 0a  imeout * 1000);.
0fb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 74 72  .      while (tr
0fc0: 75 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ue).      {.    
0fd0: 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61      n = UnsafeNa
0fe0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
0ff0: 74 65 33 5f 73 74 65 70 28 73 74 6d 74 2e 5f 73  te3_step(stmt._s
1000: 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 0a 20 20  qlite_stmt);..  
1010: 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20 31        if (n == 1
1020: 30 30 29 20 72 65 74 75 72 6e 20 74 72 75 65 3b  00) return true;
1030: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d  .        if (n =
1040: 3d 20 31 30 31 29 20 72 65 74 75 72 6e 20 66 61  = 101) return fa
1050: 6c 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  lse;..        if
1060: 20 28 6e 20 3e 20 30 29 0a 20 20 20 20 20 20 20   (n > 0).       
1070: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
1080: 20 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   r;..          /
1090: 2f 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  / An error occur
10a0: 72 65 64 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  red, attempt to 
10b0: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 6d  reset the statem
10c0: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65 73  ent.  If the res
10d0: 65 74 20 77 6f 72 6b 65 64 20 62 65 63 61 75 73  et worked becaus
10e0: 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
10f0: 2f 2f 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  // schema has ch
1100: 61 6e 67 65 64 2c 20 72 65 2d 74 72 79 20 74 68  anged, re-try th
1110: 65 20 73 74 65 70 20 61 67 61 69 6e 2e 20 20 49  e step again.  I
1120: 66 20 69 74 20 65 72 72 6f 72 65 64 20 6f 75 72  f it errored our
1130: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 61 74   because the dat
1140: 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  abase.          
1150: 2f 2f 20 69 73 20 6c 6f 63 6b 65 64 2c 20 74 68  // is locked, th
1160: 65 6e 20 6b 65 65 70 20 72 65 74 72 79 69 6e 67  en keep retrying
1170: 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6d 6d 61   until the comma
1180: 6e 64 20 74 69 6d 65 6f 75 74 20 6f 63 63 75 72  nd timeout occur
1190: 73 2e 0a 20 20 20 20 20 20 20 20 20 20 72 20 3d  s..          r =
11a0: 20 52 65 73 65 74 28 73 74 6d 74 29 3b 0a 0a 20   Reset(stmt);.. 
11b0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 20 3d           if (r =
11c0: 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  = 0).           
11d0: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
11e0: 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51  eException(n, SQ
11f0: 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29  LiteLastError())
1200: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  ;..          els
1210: 65 20 69 66 20 28 28 72 20 3d 3d 20 36 20 7c 7c  e if ((r == 6 ||
1220: 20 72 20 3d 3d 20 35 29 20 26 26 20 73 74 6d 74   r == 5) && stmt
1230: 2e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 6e 75 6c  ._command != nul
1240: 6c 29 20 2f 2f 20 53 51 4c 49 54 45 5f 4c 4f 43  l) // SQLITE_LOC
1250: 4b 45 44 20 7c 7c 20 53 51 4c 49 54 45 5f 42 55  KED || SQLITE_BU
1260: 53 59 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20  SY.          {. 
1270: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4b 65             // Ke
1280: 65 70 20 74 72 79 69 6e 67 0a 20 20 20 20 20 20  ep trying.      
1290: 20 20 20 20 20 20 69 66 20 28 72 6e 64 20 3d 3d        if (rnd ==
12a0: 20 6e 75 6c 6c 29 20 2f 2f 20 46 69 72 73 74 20   null) // First 
12b0: 74 69 6d 65 20 77 65 27 76 65 20 65 6e 63 6f 75  time we've encou
12c0: 6e 74 65 72 65 64 20 74 68 65 20 6c 6f 63 6b 0a  ntered the lock.
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6e                rn
12e0: 64 20 3d 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29  d = new Random()
12f0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
1300: 2f 20 49 66 20 77 65 27 76 65 20 65 78 63 65 65  / If we've excee
1310: 64 65 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 27  ded the command'
1320: 73 20 74 69 6d 65 6f 75 74 2c 20 67 69 76 65 20  s timeout, give 
1330: 75 70 20 61 6e 64 20 74 68 72 6f 77 20 61 6e 20  up and throw an 
1340: 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1350: 20 20 69 66 20 28 28 75 69 6e 74 29 45 6e 76 69    if ((uint)Envi
1360: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
1370: 74 20 2d 20 73 74 61 72 74 74 69 63 6b 20 3e 20  t - starttick > 
1380: 74 69 6d 65 6f 75 74 29 0a 20 20 20 20 20 20 20  timeout).       
1390: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
13a0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53       throw new S
13b0: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 72  QLiteException(r
13c0: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
13d0: 72 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r());.          
13e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13f0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
1400: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1410: 20 2f 2f 20 4f 74 68 65 72 77 69 73 65 20 73 6c   // Otherwise sl
1420: 65 65 70 20 66 6f 72 20 61 20 72 61 6e 64 6f 6d  eep for a random
1430: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
1440: 75 70 20 74 6f 20 31 35 30 6d 73 0a 20 20 20 20  up to 150ms.    
1450: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1460: 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61  .Threading.Threa
1470: 64 2e 53 6c 65 65 70 28 72 6e 64 2e 4e 65 78 74  d.Sleep(rnd.Next
1480: 28 31 2c 20 31 35 30 29 29 3b 0a 20 20 20 20 20  (1, 150));.     
1490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
14c0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
14d0: 69 64 65 20 69 6e 74 20 52 65 73 65 74 28 53 51  ide int Reset(SQ
14e0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
14f0: 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  mt).    {.      
1500: 69 6e 74 20 6e 3b 0a 0a 23 69 66 20 21 53 51 4c  int n;..#if !SQL
1510: 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20  ITE_STANDARD.   
1520: 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74     n = UnsafeNat
1530: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
1540: 65 33 5f 72 65 73 65 74 5f 69 6e 74 65 72 6f 70  e3_reset_interop
1550: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
1560: 6d 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  mt);.#else.     
1570: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
1580: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
1590: 5f 72 65 73 65 74 28 73 74 6d 74 2e 5f 73 71 6c  _reset(stmt._sql
15a0: 69 74 65 5f 73 74 6d 74 29 3b 0a 23 65 6e 64 69  ite_stmt);.#endi
15b0: 66 0a 0a 20 20 20 20 20 20 2f 2f 20 49 66 20 74  f..      // If t
15c0: 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  he schema change
15d0: 64 2c 20 74 72 79 20 61 6e 64 20 72 65 2d 70 72  d, try and re-pr
15e0: 65 70 61 72 65 20 69 74 0a 20 20 20 20 20 20 69  epare it.      i
15f0: 66 20 28 6e 20 3d 3d 20 31 37 29 20 2f 2f 20 53  f (n == 17) // S
1600: 51 4c 49 54 45 5f 53 43 48 45 4d 41 0a 20 20 20  QLITE_SCHEMA.   
1610: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20     {.        // 
1620: 52 65 63 72 65 61 74 65 20 61 20 64 75 6d 6d 79  Recreate a dummy
1630: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
1640: 20 20 20 73 74 72 69 6e 67 20 73 74 72 3b 0a 20     string str;. 
1650: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51         using (SQ
1660: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 74 6d  LiteStatement tm
1670: 70 20 3d 20 50 72 65 70 61 72 65 28 6e 75 6c 6c  p = Prepare(null
1680: 2c 20 73 74 6d 74 2e 5f 73 71 6c 53 74 61 74 65  , stmt._sqlState
1690: 6d 65 6e 74 2c 20 6e 75 6c 6c 2c 20 28 75 69 6e  ment, null, (uin
16a0: 74 29 28 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64  t)(stmt._command
16b0: 2e 5f 63 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74  ._commandTimeout
16c0: 20 2a 20 31 30 30 30 29 2c 20 6f 75 74 20 73 74   * 1000), out st
16d0: 72 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  r)).        {.  
16e0: 20 20 20 20 20 20 20 20 2f 2f 20 46 69 6e 61 6c          // Final
16f0: 69 7a 65 20 74 68 65 20 65 78 69 73 74 69 6e 67  ize the existing
1700: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
1710: 20 20 20 20 20 73 74 6d 74 2e 5f 73 71 6c 69 74       stmt._sqlit
1720: 65 5f 73 74 6d 74 2e 44 69 73 70 6f 73 65 28 29  e_stmt.Dispose()
1730: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52  ;.          // R
1740: 65 61 73 73 69 67 6e 20 61 20 6e 65 77 20 73 74  eassign a new st
1750: 61 74 65 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20  atement pointer 
1760: 74 6f 20 74 68 65 20 6f 6c 64 20 73 74 61 74 65  to the old state
1770: 6d 65 6e 74 20 61 6e 64 20 63 6c 65 61 72 20 74  ment and clear t
1780: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 6f 6e 65  he temporary one
1790: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6d 74 2e  .          stmt.
17a0: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 20 3d 20 74  _sqlite_stmt = t
17b0: 6d 70 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 3b  mp._sqlite_stmt;
17c0: 0a 20 20 20 20 20 20 20 20 20 20 74 6d 70 2e 5f  .          tmp._
17d0: 73 71 6c 69 74 65 5f 73 74 6d 74 20 3d 20 6e 75  sqlite_stmt = nu
17e0: 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ll;..          /
17f0: 2f 20 52 65 61 70 70 6c 79 20 70 61 72 61 6d 65  / Reapply parame
1800: 74 65 72 73 0a 20 20 20 20 20 20 20 20 20 20 73  ters.          s
1810: 74 6d 74 2e 42 69 6e 64 50 61 72 61 6d 65 74 65  tmt.BindParamete
1820: 72 73 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rs();.        }.
1830: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1840: 31 3b 20 2f 2f 20 52 65 73 65 74 20 77 61 73 20  1; // Reset was 
1850: 4f 4b 2c 20 77 69 74 68 20 73 63 68 65 6d 61 20  OK, with schema 
1860: 63 68 61 6e 67 65 0a 20 20 20 20 20 20 7d 0a 20  change.      }. 
1870: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e 20       else if (n 
1880: 3d 3d 20 36 20 7c 7c 20 6e 20 3d 3d 20 35 29 20  == 6 || n == 5) 
1890: 2f 2f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  // SQLITE_LOCKED
18a0: 20 7c 7c 20 53 51 4c 49 54 45 5f 42 55 53 59 0a   || SQLITE_BUSY.
18b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
18c0: 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  ;..      if (n >
18d0: 20 30 29 0a 20 20 20 20 20 20 20 20 74 68 72 6f   0).        thro
18e0: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
18f0: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
1900: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20  astError());..  
1910: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2f      return 0; //
1920: 20 57 65 20 72 65 73 65 74 20 4f 4b 2c 20 6e 6f   We reset OK, no
1930: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 0a   schema changes.
1940: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
1950: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
1960: 69 6e 67 20 53 51 4c 69 74 65 4c 61 73 74 45 72  ing SQLiteLastEr
1970: 72 6f 72 28 29 0a 20 20 20 20 7b 0a 20 20 20 20  ror().    {.    
1980: 20 20 72 65 74 75 72 6e 20 53 51 4c 69 74 65 42    return SQLiteB
1990: 61 73 65 2e 53 51 4c 69 74 65 4c 61 73 74 45 72  ase.SQLiteLastEr
19a0: 72 6f 72 28 5f 73 71 6c 29 3b 0a 20 20 20 20 7d  ror(_sql);.    }
19b0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
19c0: 76 65 72 72 69 64 65 20 53 51 4c 69 74 65 53 74  verride SQLiteSt
19d0: 61 74 65 6d 65 6e 74 20 50 72 65 70 61 72 65 28  atement Prepare(
19e0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
19f0: 20 63 6e 6e 2c 20 73 74 72 69 6e 67 20 73 74 72   cnn, string str
1a00: 53 71 6c 2c 20 53 51 4c 69 74 65 53 74 61 74 65  Sql, SQLiteState
1a10: 6d 65 6e 74 20 70 72 65 76 69 6f 75 73 2c 20 75  ment previous, u
1a20: 69 6e 74 20 74 69 6d 65 6f 75 74 4d 53 2c 20 6f  int timeoutMS, o
1a30: 75 74 20 73 74 72 69 6e 67 20 73 74 72 52 65 6d  ut string strRem
1a40: 61 69 6e 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ain).    {.     
1a50: 20 49 6e 74 50 74 72 20 73 74 6d 74 20 3d 20 49   IntPtr stmt = I
1a60: 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a 20 20 20 20  ntPtr.Zero;.    
1a70: 20 20 49 6e 74 50 74 72 20 70 74 72 20 3d 20 49    IntPtr ptr = I
1a80: 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a 20 20 20 20  ntPtr.Zero;.    
1a90: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20    int len = 0;. 
1aa0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 31 37 3b       int n = 17;
1ab0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 72 69  .      int retri
1ac0: 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 79  es = 0;.      by
1ad0: 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46 38 28  te[] b = ToUTF8(
1ae0: 73 74 72 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  strSql);.      s
1af0: 74 72 69 6e 67 20 74 79 70 65 64 65 66 73 20 3d  tring typedefs =
1b00: 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 53 51 4c   null;.      SQL
1b10: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 63 6d 64  iteStatement cmd
1b20: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 52   = null;.      R
1b30: 61 6e 64 6f 6d 20 72 6e 64 20 3d 20 6e 75 6c 6c  andom rnd = null
1b40: 3b 0a 20 20 20 20 20 20 75 69 6e 74 20 73 74 61  ;.      uint sta
1b50: 72 74 74 69 63 6b 20 3d 20 28 75 69 6e 74 29 45  rttick = (uint)E
1b60: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
1b70: 6f 75 6e 74 3b 0a 0a 20 20 20 20 20 20 47 43 48  ount;..      GCH
1b80: 61 6e 64 6c 65 20 68 61 6e 64 6c 65 20 3d 20 47  andle handle = G
1b90: 43 48 61 6e 64 6c 65 2e 41 6c 6c 6f 63 28 62 2c  CHandle.Alloc(b,
1ba0: 20 47 43 48 61 6e 64 6c 65 54 79 70 65 2e 50 69   GCHandleType.Pi
1bb0: 6e 6e 65 64 29 3b 0a 20 20 20 20 20 20 49 6e 74  nned);.      Int
1bc0: 50 74 72 20 70 73 71 6c 20 3d 20 68 61 6e 64 6c  Ptr psql = handl
1bd0: 65 2e 41 64 64 72 4f 66 50 69 6e 6e 65 64 4f 62  e.AddrOfPinnedOb
1be0: 6a 65 63 74 28 29 3b 0a 20 20 20 20 20 20 74 72  ject();.      tr
1bf0: 79 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  y.      {.      
1c00: 20 20 77 68 69 6c 65 20 28 28 6e 20 3d 3d 20 31    while ((n == 1
1c10: 37 20 7c 7c 20 6e 20 3d 3d 20 36 20 7c 7c 20 6e  7 || n == 6 || n
1c20: 20 3d 3d 20 35 29 20 26 26 20 72 65 74 72 69 65   == 5) && retrie
1c30: 73 20 3c 20 33 29 0a 20 20 20 20 20 20 20 20 7b  s < 3).        {
1c40: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41  .#if !SQLITE_STA
1c50: 4e 44 41 52 44 0a 20 20 20 20 20 20 20 20 20 20  NDARD.          
1c60: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
1c70: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
1c80: 70 72 65 70 61 72 65 5f 69 6e 74 65 72 6f 70 28  prepare_interop(
1c90: 5f 73 71 6c 2c 20 70 73 71 6c 2c 20 62 2e 4c 65  _sql, psql, b.Le
1ca0: 6e 67 74 68 20 2d 20 31 2c 20 6f 75 74 20 73 74  ngth - 1, out st
1cb0: 6d 74 2c 20 6f 75 74 20 70 74 72 2c 20 6f 75 74  mt, out ptr, out
1cc0: 20 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20   len);.#else.   
1cd0: 20 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66         n = Unsaf
1ce0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
1cf0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 5f  qlite3_prepare(_
1d00: 73 71 6c 2c 20 70 73 71 6c 2c 20 62 2e 4c 65 6e  sql, psql, b.Len
1d10: 67 74 68 20 2d 20 31 2c 20 6f 75 74 20 73 74 6d  gth - 1, out stm
1d20: 74 2c 20 6f 75 74 20 70 74 72 29 3b 0a 20 20 20  t, out ptr);.   
1d30: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 2d 31 3b         len = -1;
1d40: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
1d50: 20 20 20 69 66 20 28 6e 20 3d 3d 20 31 37 29 0a     if (n == 17).
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
1d70: 69 65 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ies++;.         
1d80: 20 65 6c 73 65 20 69 66 20 28 6e 20 3d 3d 20 31   else if (n == 1
1d90: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
1da0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 53 74            if (St
1db0: 72 69 6e 67 2e 43 6f 6d 70 61 72 65 28 53 51 4c  ring.Compare(SQL
1dc0: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  iteLastError(), 
1dd0: 22 6e 65 61 72 20 5c 22 54 59 50 45 53 5c 22 3a  "near \"TYPES\":
1de0: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20   syntax error", 
1df0: 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e  StringComparison
1e00: 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61  .OrdinalIgnoreCa
1e10: 73 65 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  se) == 0).      
1e20: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1e30: 20 20 20 20 20 20 69 6e 74 20 70 6f 73 20 3d 20        int pos = 
1e40: 73 74 72 53 71 6c 2e 49 6e 64 65 78 4f 66 28 27  strSql.IndexOf('
1e50: 3b 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ;');.           
1e60: 20 20 20 69 66 20 28 70 6f 73 20 3d 3d 20 2d 31     if (pos == -1
1e70: 29 20 70 6f 73 20 3d 20 73 74 72 53 71 6c 2e 4c  ) pos = strSql.L
1e80: 65 6e 67 74 68 20 2d 20 31 3b 0a 0a 20 20 20 20  ength - 1;..    
1e90: 20 20 20 20 20 20 20 20 20 20 74 79 70 65 64 65            typede
1ea0: 66 73 20 3d 20 73 74 72 53 71 6c 2e 53 75 62 73  fs = strSql.Subs
1eb0: 74 72 69 6e 67 28 30 2c 20 70 6f 73 20 2b 20 31  tring(0, pos + 1
1ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ed0: 20 73 74 72 53 71 6c 20 3d 20 73 74 72 53 71 6c   strSql = strSql
1ee0: 2e 53 75 62 73 74 72 69 6e 67 28 70 6f 73 20 2b  .Substring(pos +
1ef0: 20 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20   1);..          
1f00: 20 20 20 20 73 74 72 52 65 6d 61 69 6e 20 3d 20      strRemain = 
1f10: 22 22 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  "";..           
1f20: 20 20 20 77 68 69 6c 65 20 28 63 6d 64 20 3d 3d     while (cmd ==
1f30: 20 6e 75 6c 6c 20 26 26 20 73 74 72 53 71 6c 2e   null && strSql.
1f40: 4c 65 6e 67 74 68 20 3e 20 30 29 0a 20 20 20 20  Length > 0).    
1f50: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 20              cmd 
1f70: 3d 20 50 72 65 70 61 72 65 28 63 6e 6e 2c 20 73  = Prepare(cnn, s
1f80: 74 72 53 71 6c 2c 20 70 72 65 76 69 6f 75 73 2c  trSql, previous,
1f90: 20 74 69 6d 65 6f 75 74 4d 53 2c 20 6f 75 74 20   timeoutMS, out 
1fa0: 73 74 72 52 65 6d 61 69 6e 29 3b 0a 20 20 20 20  strRemain);.    
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 53              strS
1fc0: 71 6c 20 3d 20 73 74 72 52 65 6d 61 69 6e 3b 0a  ql = strRemain;.
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1ff0: 66 20 28 63 6d 64 20 21 3d 20 6e 75 6c 6c 29 0a  f (cmd != null).
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 63 6d 64 2e 53 65 74 54 79 70 65 73 28 74 79 70  cmd.SetTypes(typ
2020: 65 64 65 66 73 29 3b 0a 0a 20 20 20 20 20 20 20  edefs);..       
2030: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6d         return cm
2040: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  d;.            }
2050: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
2060: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a  OMPACTFRAMEWORK.
2070: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2080: 20 69 66 20 28 5f 62 75 69 6c 64 69 6e 67 53 63   if (_buildingSc
2090: 68 65 6d 61 20 3d 3d 20 66 61 6c 73 65 20 26 26  hema == false &&
20a0: 20 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65 28   String.Compare(
20b0: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
20c0: 29 2c 20 30 2c 20 22 6e 6f 20 73 75 63 68 20 74  ), 0, "no such t
20d0: 61 62 6c 65 3a 20 54 45 4d 50 2e 53 43 48 45 4d  able: TEMP.SCHEM
20e0: 41 22 2c 20 30 2c 20 32 36 2c 20 53 74 72 69 6e  A", 0, 26, Strin
20f0: 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69  gComparison.Ordi
2100: 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d  nalIgnoreCase) =
2110: 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  = 0).           
2120: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2130: 20 73 74 72 52 65 6d 61 69 6e 20 3d 20 22 22 3b   strRemain = "";
2140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f  .              _
2150: 62 75 69 6c 64 69 6e 67 53 63 68 65 6d 61 20 3d  buildingSchema =
2160: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
2170: 20 20 20 20 20 74 72 79 0a 20 20 20 20 20 20 20       try.       
2180: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2190: 20 20 20 20 20 20 20 20 20 49 53 51 4c 69 74 65           ISQLite
21a0: 53 63 68 65 6d 61 45 78 74 65 6e 73 69 6f 6e 73  SchemaExtensions
21b0: 20 65 78 74 20 3d 20 28 28 49 53 65 72 76 69 63   ext = ((IServic
21c0: 65 50 72 6f 76 69 64 65 72 29 53 51 4c 69 74 65  eProvider)SQLite
21d0: 46 61 63 74 6f 72 79 2e 49 6e 73 74 61 6e 63 65  Factory.Instance
21e0: 29 2e 47 65 74 53 65 72 76 69 63 65 28 74 79 70  ).GetService(typ
21f0: 65 6f 66 28 49 53 51 4c 69 74 65 53 63 68 65 6d  eof(ISQLiteSchem
2200: 61 45 78 74 65 6e 73 69 6f 6e 73 29 29 20 61 73  aExtensions)) as
2210: 20 49 53 51 4c 69 74 65 53 63 68 65 6d 61 45 78   ISQLiteSchemaEx
2220: 74 65 6e 73 69 6f 6e 73 3b 0a 0a 20 20 20 20 20  tensions;..     
2230: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65             if (e
2240: 78 74 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  xt != null).    
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2260: 74 2e 42 75 69 6c 64 54 65 6d 70 53 63 68 65 6d  t.BuildTempSchem
2270: 61 28 63 6e 6e 29 3b 0a 0a 20 20 20 20 20 20 20  a(cnn);..       
2280: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28           while (
2290: 63 6d 64 20 3d 3d 20 6e 75 6c 6c 20 26 26 20 73  cmd == null && s
22a0: 74 72 53 71 6c 2e 4c 65 6e 67 74 68 20 3e 20 30  trSql.Length > 0
22b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
22c0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
22d0: 20 20 20 20 20 20 63 6d 64 20 3d 20 50 72 65 70        cmd = Prep
22e0: 61 72 65 28 63 6e 6e 2c 20 73 74 72 53 71 6c 2c  are(cnn, strSql,
22f0: 20 70 72 65 76 69 6f 75 73 2c 20 74 69 6d 65 6f   previous, timeo
2300: 75 74 4d 53 2c 20 6f 75 74 20 73 74 72 52 65 6d  utMS, out strRem
2310: 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
2320: 20 20 20 20 20 20 20 20 73 74 72 53 71 6c 20 3d          strSql =
2330: 20 73 74 72 52 65 6d 61 69 6e 3b 0a 20 20 20 20   strRemain;.    
2340: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2360: 65 74 75 72 6e 20 63 6d 64 3b 0a 20 20 20 20 20  eturn cmd;.     
2370: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2380: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79           finally
2390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
23a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b0: 20 5f 62 75 69 6c 64 69 6e 67 53 63 68 65 6d 61   _buildingSchema
23c0: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
23d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23e0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
23f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2400: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e 20       else if (n 
2410: 3d 3d 20 36 20 7c 7c 20 6e 20 3d 3d 20 35 29 20  == 6 || n == 5) 
2420: 2f 2f 20 4c 6f 63 6b 65 64 20 2d 2d 20 64 65 6c  // Locked -- del
2430: 61 79 20 61 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e  ay a small amoun
2440: 74 20 62 65 66 6f 72 65 20 72 65 74 72 79 69 6e  t before retryin
2450: 67 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  g.          {.  
2460: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4b 65 65            // Kee
2470: 70 20 74 72 79 69 6e 67 0a 20 20 20 20 20 20 20  p trying.       
2480: 20 20 20 20 20 69 66 20 28 72 6e 64 20 3d 3d 20       if (rnd == 
2490: 6e 75 6c 6c 29 20 2f 2f 20 46 69 72 73 74 20 74  null) // First t
24a0: 69 6d 65 20 77 65 27 76 65 20 65 6e 63 6f 75 6e  ime we've encoun
24b0: 74 65 72 65 64 20 74 68 65 20 6c 6f 63 6b 0a 20  tered the lock. 
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6e 64               rnd
24d0: 20 3d 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29 3b   = new Random();
24e0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
24f0: 20 49 66 20 77 65 27 76 65 20 65 78 63 65 65 64   If we've exceed
2500: 65 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 27 73  ed the command's
2510: 20 74 69 6d 65 6f 75 74 2c 20 67 69 76 65 20 75   timeout, give u
2520: 70 20 61 6e 64 20 74 68 72 6f 77 20 61 6e 20 65  p and throw an e
2530: 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  rror.           
2540: 20 69 66 20 28 28 75 69 6e 74 29 45 6e 76 69 72   if ((uint)Envir
2550: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
2560: 20 2d 20 73 74 61 72 74 74 69 63 6b 20 3e 20 74   - starttick > t
2570: 69 6d 65 6f 75 74 4d 53 29 0a 20 20 20 20 20 20  imeoutMS).      
2580: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2590: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
25a0: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
25b0: 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  n, SQLiteLastErr
25c0: 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  or());.         
25d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
25e0: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20   else.          
25f0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
2600: 20 20 2f 2f 20 4f 74 68 65 72 77 69 73 65 20 73    // Otherwise s
2610: 6c 65 65 70 20 66 6f 72 20 61 20 72 61 6e 64 6f  leep for a rando
2620: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  m amount of time
2630: 20 75 70 20 74 6f 20 31 35 30 6d 73 0a 20 20 20   up to 150ms.   
2640: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
2650: 6d 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65  m.Threading.Thre
2660: 61 64 2e 53 6c 65 65 70 28 72 6e 64 2e 4e 65 78  ad.Sleep(rnd.Nex
2670: 74 28 31 2c 20 31 35 30 29 29 3b 0a 20 20 20 20  t(1, 150));.    
2680: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2690: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26a0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3e  .        if (n >
26b0: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
26c0: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
26d0: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
26e0: 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 74  ());..        st
26f0: 72 52 65 6d 61 69 6e 20 3d 20 55 54 46 38 54 6f  rRemain = UTF8To
2700: 53 74 72 69 6e 67 28 70 74 72 2c 20 6c 65 6e 29  String(ptr, len)
2710: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  ;..        if (s
2720: 74 6d 74 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65  tmt != IntPtr.Ze
2730: 72 6f 29 20 63 6d 64 20 3d 20 6e 65 77 20 53 51  ro) cmd = new SQ
2740: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 28 74 68  LiteStatement(th
2750: 69 73 2c 20 73 74 6d 74 2c 20 73 74 72 53 71 6c  is, stmt, strSql
2760: 2e 53 75 62 73 74 72 69 6e 67 28 30 2c 20 73 74  .Substring(0, st
2770: 72 53 71 6c 2e 4c 65 6e 67 74 68 20 2d 20 73 74  rSql.Length - st
2780: 72 52 65 6d 61 69 6e 2e 4c 65 6e 67 74 68 29 2c  rRemain.Length),
2790: 20 70 72 65 76 69 6f 75 73 29 3b 0a 0a 20 20 20   previous);..   
27a0: 20 20 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b       return cmd;
27b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
27c0: 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 7b 0a 20  inally.      {. 
27d0: 20 20 20 20 20 20 20 68 61 6e 64 6c 65 2e 46 72         handle.Fr
27e0: 65 65 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ee();.      }.  
27f0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
2800: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
2810: 42 69 6e 64 5f 44 6f 75 62 6c 65 28 53 51 4c 69  Bind_Double(SQLi
2820: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
2830: 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 64 6f 75  , int index, dou
2840: 62 6c 65 20 76 61 6c 75 65 29 0a 20 20 20 20 7b  ble value).    {
2850: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
2860: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a  OMPACTFRAMEWORK.
2870: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e        int n = Un
2880: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
2890: 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  s.sqlite3_bind_d
28a0: 6f 75 62 6c 65 28 73 74 6d 74 2e 5f 73 71 6c 69  ouble(stmt._sqli
28b0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
28c0: 76 61 6c 75 65 29 3b 0a 23 65 6c 73 65 0a 20 20  value);.#else.  
28d0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
28e0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
28f0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
2900: 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ble_interop(stmt
2910: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
2920: 6e 64 65 78 2c 20 72 65 66 20 76 61 6c 75 65 29  ndex, ref value)
2930: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
2940: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
2950: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
2960: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
2970: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
2980: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
2990: 76 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e  verride void Bin
29a0: 64 5f 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74  d_Int32(SQLiteSt
29b0: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
29c0: 74 20 69 6e 64 65 78 2c 20 69 6e 74 20 76 61 6c  t index, int val
29d0: 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ue).    {.      
29e0: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
29f0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
2a00: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 73 74 6d  te3_bind_int(stm
2a10: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
2a20: 69 6e 64 65 78 2c 20 76 61 6c 75 65 29 3b 0a 20  index, value);. 
2a30: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
2a40: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
2a50: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
2a60: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
2a70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
2a80: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
2a90: 69 64 20 42 69 6e 64 5f 49 6e 74 36 34 28 53 51  id Bind_Int64(SQ
2aa0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
2ab0: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 6c  mt, int index, l
2ac0: 6f 6e 67 20 76 61 6c 75 65 29 0a 20 20 20 20 7b  ong value).    {
2ad0: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
2ae0: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a  OMPACTFRAMEWORK.
2af0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e        int n = Un
2b00: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
2b10: 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  s.sqlite3_bind_i
2b20: 6e 74 36 34 28 73 74 6d 74 2e 5f 73 71 6c 69 74  nt64(stmt._sqlit
2b30: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76  e_stmt, index, v
2b40: 61 6c 75 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  alue);.#else.   
2b50: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
2b60: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2b70: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
2b80: 34 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  4_interop(stmt._
2b90: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2ba0: 65 78 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a  ex, ref value);.
2bb0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
2bc0: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
2bd0: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
2be0: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
2bf0: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  rror());.    }..
2c00: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
2c10: 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f  rride void Bind_
2c20: 54 65 78 74 28 53 51 4c 69 74 65 53 74 61 74 65  Text(SQLiteState
2c30: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
2c40: 6e 64 65 78 2c 20 73 74 72 69 6e 67 20 76 61 6c  ndex, string val
2c50: 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ue).    {.      
2c60: 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46  byte[] b = ToUTF
2c70: 38 28 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  8(value);.      
2c80: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
2c90: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
2ca0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 73 74  te3_bind_text(st
2cb0: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
2cc0: 20 69 6e 64 65 78 2c 20 62 2c 20 62 2e 4c 65 6e   index, b, b.Len
2cd0: 67 74 68 20 2d 20 31 2c 20 28 49 6e 74 50 74 72  gth - 1, (IntPtr
2ce0: 29 28 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66  )(-1));.      if
2cf0: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
2d00: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
2d10: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
2d20: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
2d30: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
2d40: 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64  erride void Bind
2d50: 5f 44 61 74 65 54 69 6d 65 28 53 51 4c 69 74 65  _DateTime(SQLite
2d60: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
2d70: 69 6e 74 20 69 6e 64 65 78 2c 20 44 61 74 65 54  int index, DateT
2d80: 69 6d 65 20 64 74 29 0a 20 20 20 20 7b 0a 20 20  ime dt).    {.  
2d90: 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54      byte[] b = T
2da0: 6f 55 54 46 38 28 64 74 29 3b 0a 20 20 20 20 20  oUTF8(dt);.     
2db0: 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e   int n = UnsafeN
2dc0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
2dd0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 73  ite3_bind_text(s
2de0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
2df0: 2c 20 69 6e 64 65 78 2c 20 62 2c 20 62 2e 4c 65  , index, b, b.Le
2e00: 6e 67 74 68 20 2d 20 31 2c 20 28 49 6e 74 50 74  ngth - 1, (IntPt
2e10: 72 29 28 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  r)(-1));.      i
2e20: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
2e30: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
2e40: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
2e50: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
2e60: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
2e70: 76 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e  verride void Bin
2e80: 64 5f 42 6c 6f 62 28 53 51 4c 69 74 65 53 74 61  d_Blob(SQLiteSta
2e90: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
2ea0: 20 69 6e 64 65 78 2c 20 62 79 74 65 5b 5d 20 62   index, byte[] b
2eb0: 6c 6f 62 44 61 74 61 29 0a 20 20 20 20 7b 0a 20  lobData).    {. 
2ec0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73       int n = Uns
2ed0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
2ee0: 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c  .sqlite3_bind_bl
2ef0: 6f 62 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  ob(stmt._sqlite_
2f00: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 62 6c 6f  stmt, index, blo
2f10: 62 44 61 74 61 2c 20 62 6c 6f 62 44 61 74 61 2e  bData, blobData.
2f20: 4c 65 6e 67 74 68 2c 20 28 49 6e 74 50 74 72 29  Length, (IntPtr)
2f30: 28 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 20  (-1));.      if 
2f40: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
2f50: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
2f60: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
2f70: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  rror());.    }..
2f80: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
2f90: 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f  rride void Bind_
2fa0: 4e 75 6c 6c 28 53 51 4c 69 74 65 53 74 61 74 65  Null(SQLiteState
2fb0: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
2fc0: 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20  ndex).    {.    
2fd0: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
2fe0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
2ff0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
3000: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3010: 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  t, index);.     
3020: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
3030: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
3040: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
3050: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
3060: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
3070: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 42 69   override int Bi
3080: 6e 64 5f 50 61 72 61 6d 43 6f 75 6e 74 28 53 51  nd_ParamCount(SQ
3090: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
30a0: 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  mt).    {.      
30b0: 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74  return UnsafeNat
30c0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
30d0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
30e0: 72 5f 63 6f 75 6e 74 28 73 74 6d 74 2e 5f 73 71  r_count(stmt._sq
30f0: 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 20 20 20 20  lite_stmt);.    
3100: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3110: 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20  override string 
3120: 42 69 6e 64 5f 50 61 72 61 6d 4e 61 6d 65 28 53  Bind_ParamName(S
3130: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
3140: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
3150: 20 20 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54      {.#if !SQLIT
3160: 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20  E_STANDARD.     
3170: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
3180: 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72  return UTF8ToStr
3190: 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65  ing(UnsafeNative
31a0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
31b0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
31c0: 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ame_interop(stmt
31d0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
31e0: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20  ndex, out len), 
31f0: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  len);.#else.    
3200: 20 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53    return UTF8ToS
3210: 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69  tring(UnsafeNati
3220: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
3230: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
3240: 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f 73 71 6c 69  _name(stmt._sqli
3250: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c  te_stmt, index),
3260: 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20   -1);.#endif.   
3270: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
3280: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 42 69   override int Bi
3290: 6e 64 5f 50 61 72 61 6d 49 6e 64 65 78 28 53 51  nd_ParamIndex(SQ
32a0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
32b0: 6d 74 2c 20 73 74 72 69 6e 67 20 70 61 72 61 6d  mt, string param
32c0: 4e 61 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20 20  Name).    {.    
32d0: 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e    return UnsafeN
32e0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
32f0: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
3300: 74 65 72 5f 69 6e 64 65 78 28 73 74 6d 74 2e 5f  ter_index(stmt._
3310: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 54 6f 55  sqlite_stmt, ToU
3320: 54 46 38 28 70 61 72 61 6d 4e 61 6d 65 29 29 3b  TF8(paramName));
3330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
3340: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e  rnal override in
3350: 74 20 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 53 51  t ColumnCount(SQ
3360: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
3370: 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  mt).    {.      
3380: 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74  return UnsafeNat
3390: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
33a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
33b0: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
33c0: 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
33d0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
33e0: 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 4e 61   string ColumnNa
33f0: 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  me(SQLiteStateme
3400: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
3410: 65 78 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53  ex).    {.#if !S
3420: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20  QLITE_STANDARD. 
3430: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
3440: 20 20 20 20 72 65 74 75 72 6e 20 55 54 46 38 54      return UTF8T
3450: 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61  oString(UnsafeNa
3460: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3470: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5f  te3_column_name_
3480: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
3490: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
34a0: 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29  , out len), len)
34b0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65  ;.#else.      re
34c0: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
34d0: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
34e0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
34f0: 6c 75 6d 6e 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f  lumn_name(stmt._
3500: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
3510: 65 78 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ex), -1);.#endif
3520: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
3530: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 54 79  rnal override Ty
3540: 70 65 41 66 66 69 6e 69 74 79 20 43 6f 6c 75 6d  peAffinity Colum
3550: 6e 41 66 66 69 6e 69 74 79 28 53 51 4c 69 74 65  nAffinity(SQLite
3560: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
3570: 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b  int index).    {
3580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e  .      return Un
3590: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
35a0: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
35b0: 5f 74 79 70 65 28 73 74 6d 74 2e 5f 73 71 6c 69  _type(stmt._sqli
35c0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b  te_stmt, index);
35d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
35e0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74  rnal override st
35f0: 72 69 6e 67 20 43 6f 6c 75 6d 6e 54 79 70 65 28  ring ColumnType(
3600: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
3610: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c  stmt, int index,
3620: 20 6f 75 74 20 54 79 70 65 41 66 66 69 6e 69 74   out TypeAffinit
3630: 79 20 6e 41 66 66 69 6e 69 74 79 29 0a 20 20 20  y nAffinity).   
3640: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e   {.      int len
3650: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54  ;.#if !SQLITE_ST
3660: 41 4e 44 41 52 44 0a 20 20 20 20 20 20 49 6e 74  ANDARD.      Int
3670: 50 74 72 20 70 20 3d 20 55 6e 73 61 66 65 4e 61  Ptr p = UnsafeNa
3680: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3690: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
36a0: 79 70 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ype_interop(stmt
36b0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
36c0: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a  ndex, out len);.
36d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 6c 65 6e 20  #else.      len 
36e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 6e 74 50  = -1;.      IntP
36f0: 74 72 20 70 20 3d 20 55 6e 73 61 66 65 4e 61 74  tr p = UnsafeNat
3700: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
3710: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
3720: 70 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  pe(stmt._sqlite_
3730: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 23 65  stmt, index);.#e
3740: 6e 64 69 66 0a 20 20 20 20 20 20 6e 41 66 66 69  ndif.      nAffi
3750: 6e 69 74 79 20 3d 20 43 6f 6c 75 6d 6e 41 66 66  nity = ColumnAff
3760: 69 6e 69 74 79 28 73 74 6d 74 2c 20 69 6e 64 65  inity(stmt, inde
3770: 78 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 70  x);..      if (p
3780: 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29   != IntPtr.Zero)
3790: 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74   return UTF8ToSt
37a0: 72 69 6e 67 28 70 2c 20 6c 65 6e 29 3b 0a 20 20  ring(p, len);.  
37b0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
37c0: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b  .        string[
37d0: 5d 20 61 72 20 3d 20 73 74 6d 74 2e 54 79 70 65  ] ar = stmt.Type
37e0: 44 65 66 69 6e 69 74 69 6f 6e 73 3b 0a 20 20 20  Definitions;.   
37f0: 20 20 20 20 20 69 66 20 28 61 72 20 21 3d 20 6e       if (ar != n
3800: 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  ull).        {. 
3810: 20 20 20 20 20 20 20 20 20 69 66 20 28 69 6e 64           if (ind
3820: 65 78 20 3c 20 61 72 2e 4c 65 6e 67 74 68 20 26  ex < ar.Length &
3830: 26 20 61 72 5b 69 6e 64 65 78 5d 20 21 3d 20 6e  & ar[index] != n
3840: 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20  ull).           
3850: 20 72 65 74 75 72 6e 20 61 72 5b 69 6e 64 65 78   return ar[index
3860: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
3870: 20 20 20 20 20 72 65 74 75 72 6e 20 53 74 72 69       return Stri
3880: 6e 67 2e 45 6d 70 74 79 3b 0a 0a 20 20 20 20 20  ng.Empty;..     
3890: 20 20 20 2f 2f 73 77 69 74 63 68 20 28 6e 41 66     //switch (nAf
38a0: 66 69 6e 69 74 79 29 0a 20 20 20 20 20 20 20 20  finity).        
38b0: 2f 2f 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 20  //{.        //  
38c0: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
38d0: 79 2e 49 6e 74 36 34 3a 0a 20 20 20 20 20 20 20  y.Int64:.       
38e0: 20 2f 2f 20 20 20 20 72 65 74 75 72 6e 20 22 42   //    return "B
38f0: 49 47 49 4e 54 22 3b 0a 20 20 20 20 20 20 20 20  IGINT";.        
3900: 2f 2f 20 20 63 61 73 65 20 54 79 70 65 41 66 66  //  case TypeAff
3910: 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a 20 20  inity.Double:.  
3920: 20 20 20 20 20 20 2f 2f 20 20 20 20 72 65 74 75        //    retu
3930: 72 6e 20 22 44 4f 55 42 4c 45 22 3b 0a 20 20 20  rn "DOUBLE";.   
3940: 20 20 20 20 20 2f 2f 20 20 63 61 73 65 20 54 79       //  case Ty
3950: 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62 3a  peAffinity.Blob:
3960: 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 72  .        //    r
3970: 65 74 75 72 6e 20 22 42 4c 4f 42 22 3b 0a 20 20  eturn "BLOB";.  
3980: 20 20 20 20 20 20 2f 2f 20 20 64 65 66 61 75 6c        //  defaul
3990: 74 3a 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20  t:.        //   
39a0: 20 72 65 74 75 72 6e 20 22 54 45 58 54 22 3b 0a   return "TEXT";.
39b0: 20 20 20 20 20 20 20 20 2f 2f 7d 0a 20 20 20 20          //}.    
39c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
39d0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
39e0: 20 69 6e 74 20 43 6f 6c 75 6d 6e 49 6e 64 65 78   int ColumnIndex
39f0: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
3a00: 20 73 74 6d 74 2c 20 73 74 72 69 6e 67 20 63 6f   stmt, string co
3a10: 6c 75 6d 6e 4e 61 6d 65 29 0a 20 20 20 20 7b 0a  lumnName).    {.
3a20: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 43 6f        int x = Co
3a30: 6c 75 6d 6e 43 6f 75 6e 74 28 73 74 6d 74 29 3b  lumnCount(stmt);
3a40: 0a 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74  ..      for (int
3a50: 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 78 3b 20 6e   n = 0; n < x; n
3a60: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ++).      {.    
3a70: 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 43      if (String.C
3a80: 6f 6d 70 61 72 65 28 63 6f 6c 75 6d 6e 4e 61 6d  ompare(columnNam
3a90: 65 2c 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 74  e, ColumnName(st
3aa0: 6d 74 2c 20 6e 29 2c 20 74 72 75 65 2c 20 43 75  mt, n), true, Cu
3ab0: 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69  ltureInfo.Invari
3ac0: 61 6e 74 43 75 6c 74 75 72 65 29 20 3d 3d 20 30  antCulture) == 0
3ad0: 29 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ).          retu
3ae0: 72 6e 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn n;.      }.  
3af0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
3b00: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3b10: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
3b20: 6e 67 20 43 6f 6c 75 6d 6e 4f 72 69 67 69 6e 61  ng ColumnOrigina
3b30: 6c 4e 61 6d 65 28 53 51 4c 69 74 65 53 74 61 74  lName(SQLiteStat
3b40: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
3b50: 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 23 69 66  index).    {.#if
3b60: 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52   !SQLITE_STANDAR
3b70: 44 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  D.      int len;
3b80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54  .      return UT
3b90: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
3ba0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3bb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
3bc0: 69 67 69 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  igin_name_intero
3bd0: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
3be0: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
3bf0: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73  len), len);.#els
3c00: 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  e.      return U
3c10: 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  TF8ToString(Unsa
3c20: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3c30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
3c40: 72 69 67 69 6e 5f 6e 61 6d 65 28 73 74 6d 74 2e  rigin_name(stmt.
3c50: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
3c60: 64 65 78 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  dex), -1);.#endi
3c70: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  f.    }..    int
3c80: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73  ernal override s
3c90: 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 44 61 74 61  tring ColumnData
3ca0: 62 61 73 65 4e 61 6d 65 28 53 51 4c 69 74 65 53  baseName(SQLiteS
3cb0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
3cc0: 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a  nt index).    {.
3cd0: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
3ce0: 44 41 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c  DARD.      int l
3cf0: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
3d00: 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e   UTF8ToString(Un
3d10: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
3d20: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
3d30: 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 5f 69  _database_name_i
3d40: 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c  nterop(stmt._sql
3d50: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c  ite_stmt, index,
3d60: 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b   out len), len);
3d70: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74  .#else.      ret
3d80: 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67  urn UTF8ToString
3d90: 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  (UnsafeNativeMet
3da0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
3db0: 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
3dc0: 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  e(stmt._sqlite_s
3dd0: 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29  tmt, index), -1)
3de0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
3df0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
3e00: 72 72 69 64 65 20 73 74 72 69 6e 67 20 43 6f 6c  rride string Col
3e10: 75 6d 6e 54 61 62 6c 65 4e 61 6d 65 28 53 51 4c  umnTableName(SQL
3e20: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
3e30: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
3e40: 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    {.#if !SQLITE_
3e50: 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 69  STANDARD.      i
3e60: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65  nt len;.      re
3e70: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
3e80: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
3e90: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
3ea0: 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 5f  lumn_table_name_
3eb0: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
3ec0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
3ed0: 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29  , out len), len)
3ee0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65  ;.#else.      re
3ef0: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
3f00: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
3f10: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
3f20: 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28  lumn_table_name(
3f30: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3f40: 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0a  t, index), -1);.
3f50: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
3f60: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3f70: 69 64 65 20 76 6f 69 64 20 43 6f 6c 75 6d 6e 4d  ide void ColumnM
3f80: 65 74 61 44 61 74 61 28 73 74 72 69 6e 67 20 64  etaData(string d
3f90: 61 74 61 42 61 73 65 2c 20 73 74 72 69 6e 67 20  ataBase, string 
3fa0: 74 61 62 6c 65 2c 20 73 74 72 69 6e 67 20 63 6f  table, string co
3fb0: 6c 75 6d 6e 2c 20 6f 75 74 20 73 74 72 69 6e 67  lumn, out string
3fc0: 20 64 61 74 61 54 79 70 65 2c 20 6f 75 74 20 73   dataType, out s
3fd0: 74 72 69 6e 67 20 63 6f 6c 6c 61 74 65 53 65 71  tring collateSeq
3fe0: 75 65 6e 63 65 2c 20 6f 75 74 20 62 6f 6f 6c 20  uence, out bool 
3ff0: 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74 20 62 6f 6f  notNull, out boo
4000: 6c 20 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75  l primaryKey, ou
4010: 74 20 62 6f 6f 6c 20 61 75 74 6f 49 6e 63 72 65  t bool autoIncre
4020: 6d 65 6e 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  ment).    {.    
4030: 20 20 49 6e 74 50 74 72 20 64 61 74 61 54 79 70    IntPtr dataTyp
4040: 65 50 74 72 3b 0a 20 20 20 20 20 20 49 6e 74 50  ePtr;.      IntP
4050: 74 72 20 63 6f 6c 6c 53 65 71 50 74 72 3b 0a 20  tr collSeqPtr;. 
4060: 20 20 20 20 20 69 6e 74 20 6e 6e 6f 74 4e 75 6c       int nnotNul
4070: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 70 72  l;.      int npr
4080: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 20 20 20 20  imaryKey;.      
4090: 69 6e 74 20 6e 61 75 74 6f 49 6e 63 3b 0a 20 20  int nautoInc;.  
40a0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
40b0: 20 69 6e 74 20 64 74 4c 65 6e 3b 0a 20 20 20 20   int dtLen;.    
40c0: 20 20 69 6e 74 20 63 73 4c 65 6e 3b 0a 0a 23 69    int csLen;..#i
40d0: 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  f !SQLITE_STANDA
40e0: 52 44 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73  RD.      n = Uns
40f0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4100: 2e 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  .sqlite3_table_c
4110: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 5f 69  olumn_metadata_i
4120: 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55  nterop(_sql, ToU
4130: 54 46 38 28 64 61 74 61 42 61 73 65 29 2c 20 54  TF8(dataBase), T
4140: 6f 55 54 46 38 28 74 61 62 6c 65 29 2c 20 54 6f  oUTF8(table), To
4150: 55 54 46 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75  UTF8(column), ou
4160: 74 20 64 61 74 61 54 79 70 65 50 74 72 2c 20 6f  t dataTypePtr, o
4170: 75 74 20 63 6f 6c 6c 53 65 71 50 74 72 2c 20 6f  ut collSeqPtr, o
4180: 75 74 20 6e 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74  ut nnotNull, out
4190: 20 6e 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75   nprimaryKey, ou
41a0: 74 20 6e 61 75 74 6f 49 6e 63 2c 20 6f 75 74 20  t nautoInc, out 
41b0: 64 74 4c 65 6e 2c 20 6f 75 74 20 63 73 4c 65 6e  dtLen, out csLen
41c0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 64  );.#else.      d
41d0: 74 4c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  tLen = -1;.     
41e0: 20 63 73 4c 65 6e 20 3d 20 2d 31 3b 0a 0a 20 20   csLen = -1;..  
41f0: 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61      n = UnsafeNa
4200: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
4210: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
4220: 5f 6d 65 74 61 64 61 74 61 28 5f 73 71 6c 2c 20  _metadata(_sql, 
4230: 54 6f 55 54 46 38 28 64 61 74 61 42 61 73 65 29  ToUTF8(dataBase)
4240: 2c 20 54 6f 55 54 46 38 28 74 61 62 6c 65 29 2c  , ToUTF8(table),
4250: 20 54 6f 55 54 46 38 28 63 6f 6c 75 6d 6e 29 2c   ToUTF8(column),
4260: 20 6f 75 74 20 64 61 74 61 54 79 70 65 50 74 72   out dataTypePtr
4270: 2c 20 6f 75 74 20 63 6f 6c 6c 53 65 71 50 74 72  , out collSeqPtr
4280: 2c 20 6f 75 74 20 6e 6e 6f 74 4e 75 6c 6c 2c 20  , out nnotNull, 
4290: 6f 75 74 20 6e 70 72 69 6d 61 72 79 4b 65 79 2c  out nprimaryKey,
42a0: 20 6f 75 74 20 6e 61 75 74 6f 49 6e 63 29 3b 0a   out nautoInc);.
42b0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
42c0: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
42d0: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
42e0: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
42f0: 72 72 6f 72 28 29 29 3b 0a 0a 20 20 20 20 20 20  rror());..      
4300: 64 61 74 61 54 79 70 65 20 3d 20 55 54 46 38 54  dataType = UTF8T
4310: 6f 53 74 72 69 6e 67 28 64 61 74 61 54 79 70 65  oString(dataType
4320: 50 74 72 2c 20 64 74 4c 65 6e 29 3b 0a 20 20 20  Ptr, dtLen);.   
4330: 20 20 20 63 6f 6c 6c 61 74 65 53 65 71 75 65 6e     collateSequen
4340: 63 65 20 3d 20 55 54 46 38 54 6f 53 74 72 69 6e  ce = UTF8ToStrin
4350: 67 28 63 6f 6c 6c 53 65 71 50 74 72 2c 20 63 73  g(collSeqPtr, cs
4360: 4c 65 6e 29 3b 0a 0a 20 20 20 20 20 20 6e 6f 74  Len);..      not
4370: 4e 75 6c 6c 20 3d 20 28 6e 6e 6f 74 4e 75 6c 6c  Null = (nnotNull
4380: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 72   == 1);.      pr
4390: 69 6d 61 72 79 4b 65 79 20 3d 20 28 6e 70 72 69  imaryKey = (npri
43a0: 6d 61 72 79 4b 65 79 20 3d 3d 20 31 29 3b 0a 20  maryKey == 1);. 
43b0: 20 20 20 20 20 61 75 74 6f 49 6e 63 72 65 6d 65       autoIncreme
43c0: 6e 74 20 3d 20 28 6e 61 75 74 6f 49 6e 63 20 3d  nt = (nautoInc =
43d0: 3d 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = 1);.    }..   
43e0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
43f0: 64 65 20 64 6f 75 62 6c 65 20 47 65 74 44 6f 75  de double GetDou
4400: 62 6c 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ble(SQLiteStatem
4410: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
4420: 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  dex).    {.     
4430: 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 23   double value;.#
4440: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
4450: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20  PACTFRAMEWORK.  
4460: 20 20 20 20 76 61 6c 75 65 20 3d 20 55 6e 73 61      value = Unsa
4470: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
4480: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
4490: 6f 75 62 6c 65 28 73 74 6d 74 2e 5f 73 71 6c 69  ouble(stmt._sqli
44a0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b  te_stmt, index);
44b0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 55 6e 73  .#else.      Uns
44c0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
44d0: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
44e0: 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73  double_interop(s
44f0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
4500: 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 76 61 6c  , index, out val
4510: 75 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ue);.#endif.    
4520: 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a    return value;.
4530: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4540: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74  nal override int
4550: 20 47 65 74 49 6e 74 33 32 28 53 51 4c 69 74 65   GetInt32(SQLite
4560: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
4570: 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b  int index).    {
4580: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e  .      return Un
4590: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
45a0: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
45b0: 5f 69 6e 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74  _int(stmt._sqlit
45c0: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a  e_stmt, index);.
45d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
45e0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e  nal override lon
45f0: 67 20 47 65 74 49 6e 74 36 34 28 53 51 4c 69 74  g GetInt64(SQLit
4600: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
4610: 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20   int index).    
4620: 7b 0a 20 20 20 20 20 20 6c 6f 6e 67 20 76 61 6c  {.      long val
4630: 75 65 3b 0a 23 69 66 20 21 50 4c 41 54 46 4f 52  ue;.#if !PLATFOR
4640: 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f  M_COMPACTFRAMEWO
4650: 52 4b 0a 20 20 20 20 20 20 76 61 6c 75 65 20 3d  RK.      value =
4660: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
4670: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
4680: 75 6d 6e 5f 69 6e 74 36 34 28 73 74 6d 74 2e 5f  umn_int64(stmt._
4690: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
46a0: 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ex);.#else.     
46b0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
46c0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
46d0: 75 6d 6e 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f  umn_int64_intero
46e0: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
46f0: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
4700: 76 61 6c 75 65 29 3b 0a 23 65 6e 64 69 66 0a 20  value);.#endif. 
4710: 20 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c 75       return valu
4720: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  e;.    }..    in
4730: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
4740: 73 74 72 69 6e 67 20 47 65 74 54 65 78 74 28 53  string GetText(S
4750: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
4760: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
4770: 20 20 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54      {.#if !SQLIT
4780: 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20  E_STANDARD.     
4790: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
47a0: 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72  return UTF8ToStr
47b0: 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65  ing(UnsafeNative
47c0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
47d0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65  column_text_inte
47e0: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
47f0: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75  _stmt, index, ou
4800: 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65  t len), len);.#e
4810: 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lse.      return
4820: 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e   UTF8ToString(Un
4830: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
4840: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
4850: 5f 74 65 78 74 28 73 74 6d 74 2e 5f 73 71 6c 69  _text(stmt._sqli
4860: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c  te_stmt, index),
4870: 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20   -1);.#endif.   
4880: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
4890: 20 6f 76 65 72 72 69 64 65 20 44 61 74 65 54 69   override DateTi
48a0: 6d 65 20 47 65 74 44 61 74 65 54 69 6d 65 28 53  me GetDateTime(S
48b0: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
48c0: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
48d0: 20 20 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54      {.#if !SQLIT
48e0: 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20  E_STANDARD.     
48f0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20   int len;.      
4900: 72 65 74 75 72 6e 20 54 6f 44 61 74 65 54 69 6d  return ToDateTim
4910: 65 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e(UnsafeNativeMe
4920: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
4930: 6c 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65 72 6f  lumn_text_intero
4940: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
4950: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
4960: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73  len), len);.#els
4970: 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  e.      return T
4980: 6f 44 61 74 65 54 69 6d 65 28 55 6e 73 61 66 65  oDateTime(Unsafe
4990: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
49a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
49b0: 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  t(stmt._sqlite_s
49c0: 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29  tmt, index), -1)
49d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
49e0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
49f0: 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 42 79  rride long GetBy
4a00: 74 65 73 28 53 51 4c 69 74 65 53 74 61 74 65 6d  tes(SQLiteStatem
4a10: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
4a20: 64 65 78 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66  dex, int nDataOf
4a30: 66 73 65 74 2c 20 62 79 74 65 5b 5d 20 62 44 65  fset, byte[] bDe
4a40: 73 74 2c 20 69 6e 74 20 6e 53 74 61 72 74 2c 20  st, int nStart, 
4a50: 69 6e 74 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20  int nLength).   
4a60: 20 7b 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20   {.      IntPtr 
4a70: 70 74 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ptr;.      int n
4a80: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  len;.      int n
4a90: 43 6f 70 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68  Copied = nLength
4aa0: 3b 0a 0a 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20  ;..      nlen = 
4ab0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
4ac0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
4ad0: 6d 6e 5f 62 79 74 65 73 28 73 74 6d 74 2e 5f 73  mn_bytes(stmt._s
4ae0: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
4af0: 78 29 3b 0a 20 20 20 20 20 20 70 74 72 20 3d 20  x);.      ptr = 
4b00: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
4b10: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
4b20: 6d 6e 5f 62 6c 6f 62 28 73 74 6d 74 2e 5f 73 71  mn_blob(stmt._sq
4b30: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
4b40: 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 62 44  );..      if (bD
4b50: 65 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74  est == null) ret
4b60: 75 72 6e 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20  urn nlen;..     
4b70: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e   if (nCopied + n
4b80: 53 74 61 72 74 20 3e 20 62 44 65 73 74 2e 4c 65  Start > bDest.Le
4b90: 6e 67 74 68 29 20 6e 43 6f 70 69 65 64 20 3d 20  ngth) nCopied = 
4ba0: 62 44 65 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e  bDest.Length - n
4bb0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 20  Start;.      if 
4bc0: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 44 61 74 61  (nCopied + nData
4bd0: 4f 66 66 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e  Offset > nlen) n
4be0: 43 6f 70 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20  Copied = nlen - 
4bf0: 6e 44 61 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20  nDataOffset;..  
4c00: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
4c10: 3e 20 30 29 0a 20 20 20 20 20 20 20 20 4d 61 72  > 0).        Mar
4c20: 73 68 61 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74  shal.Copy((IntPt
4c30: 72 29 28 70 74 72 2e 54 6f 49 6e 74 36 34 28 29  r)(ptr.ToInt64()
4c40: 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 29 2c   + nDataOffset),
4c50: 20 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c 20   bDest, nStart, 
4c60: 6e 43 6f 70 69 65 64 29 3b 0a 20 20 20 20 20 20  nCopied);.      
4c70: 65 6c 73 65 20 6e 43 6f 70 69 65 64 20 3d 20 30  else nCopied = 0
4c80: 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
4c90: 6e 43 6f 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a  nCopied;.    }..
4ca0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
4cb0: 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 43 68  rride long GetCh
4cc0: 61 72 73 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ars(SQLiteStatem
4cd0: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
4ce0: 64 65 78 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66  dex, int nDataOf
4cf0: 66 73 65 74 2c 20 63 68 61 72 5b 5d 20 62 44 65  fset, char[] bDe
4d00: 73 74 2c 20 69 6e 74 20 6e 53 74 61 72 74 2c 20  st, int nStart, 
4d10: 69 6e 74 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20  int nLength).   
4d20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65   {.      int nle
4d30: 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  n;.      int nCo
4d40: 70 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a  pied = nLength;.
4d50: 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 74  .      string st
4d60: 72 20 3d 20 47 65 74 54 65 78 74 28 73 74 6d 74  r = GetText(stmt
4d70: 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  , index);.      
4d80: 6e 6c 65 6e 20 3d 20 73 74 72 2e 4c 65 6e 67 74  nlen = str.Lengt
4d90: 68 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 62 44  h;..      if (bD
4da0: 65 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74  est == null) ret
4db0: 75 72 6e 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20  urn nlen;..     
4dc0: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e   if (nCopied + n
4dd0: 53 74 61 72 74 20 3e 20 62 44 65 73 74 2e 4c 65  Start > bDest.Le
4de0: 6e 67 74 68 29 20 6e 43 6f 70 69 65 64 20 3d 20  ngth) nCopied = 
4df0: 62 44 65 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e  bDest.Length - n
4e00: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 20  Start;.      if 
4e10: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 44 61 74 61  (nCopied + nData
4e20: 4f 66 66 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e  Offset > nlen) n
4e30: 43 6f 70 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20  Copied = nlen - 
4e40: 6e 44 61 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20  nDataOffset;..  
4e50: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
4e60: 3e 20 30 29 0a 20 20 20 20 20 20 20 20 73 74 72  > 0).        str
4e70: 2e 43 6f 70 79 54 6f 28 6e 44 61 74 61 4f 66 66  .CopyTo(nDataOff
4e80: 73 65 74 2c 20 62 44 65 73 74 2c 20 6e 53 74 61  set, bDest, nSta
4e90: 72 74 2c 20 6e 43 6f 70 69 65 64 29 3b 0a 20 20  rt, nCopied);.  
4ea0: 20 20 20 20 65 6c 73 65 20 6e 43 6f 70 69 65 64      else nCopied
4eb0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 65 74   = 0;..      ret
4ec0: 75 72 6e 20 6e 43 6f 70 69 65 64 3b 0a 20 20 20  urn nCopied;.   
4ed0: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
4ee0: 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 49   override bool I
4ef0: 73 4e 75 6c 6c 28 53 51 4c 69 74 65 53 74 61 74  sNull(SQLiteStat
4f00: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
4f10: 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20  index).    {.   
4f20: 20 20 20 72 65 74 75 72 6e 20 28 43 6f 6c 75 6d     return (Colum
4f30: 6e 41 66 66 69 6e 69 74 79 28 73 74 6d 74 2c 20  nAffinity(stmt, 
4f40: 69 6e 64 65 78 29 20 3d 3d 20 54 79 70 65 41 66  index) == TypeAf
4f50: 66 69 6e 69 74 79 2e 4e 75 6c 6c 29 3b 0a 20 20  finity.Null);.  
4f60: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
4f70: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 41  l override int A
4f80: 67 67 72 65 67 61 74 65 43 6f 75 6e 74 28 49 6e  ggregateCount(In
4f90: 74 50 74 72 20 63 6f 6e 74 65 78 74 29 0a 20 20  tPtr context).  
4fa0: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e    {.      return
4fb0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
4fc0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 61 67 67  hods.sqlite3_agg
4fd0: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
4fe0: 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  text);.    }..  
4ff0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
5000: 69 64 65 20 76 6f 69 64 20 43 72 65 61 74 65 46  ide void CreateF
5010: 75 6e 63 74 69 6f 6e 28 73 74 72 69 6e 67 20 73  unction(string s
5020: 74 72 46 75 6e 63 74 69 6f 6e 2c 20 69 6e 74 20  trFunction, int 
5030: 6e 41 72 67 73 2c 20 62 6f 6f 6c 20 6e 65 65 64  nArgs, bool need
5040: 43 6f 6c 6c 53 65 71 2c 20 53 51 4c 69 74 65 43  CollSeq, SQLiteC
5050: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 2c 20 53 51  allback func, SQ
5060: 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e  LiteCallback fun
5070: 63 73 74 65 70 2c 20 53 51 4c 69 74 65 46 69 6e  cstep, SQLiteFin
5080: 61 6c 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 66  alCallback funcf
5090: 69 6e 61 6c 29 0a 20 20 20 20 7b 0a 20 20 20 20  inal).    {.    
50a0: 20 20 69 6e 74 20 6e 3b 0a 0a 23 69 66 20 21 53    int n;..#if !S
50b0: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20  QLITE_STANDARD. 
50c0: 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e       n = UnsafeN
50d0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
50e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
50f0: 74 69 6f 6e 5f 69 6e 74 65 72 6f 70 28 5f 73 71  tion_interop(_sq
5100: 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 46 75 6e  l, ToUTF8(strFun
5110: 63 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 34  ction), nArgs, 4
5120: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66  , IntPtr.Zero, f
5130: 75 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66  unc, funcstep, f
5140: 75 6e 63 66 69 6e 61 6c 2c 20 28 6e 65 65 64 43  uncfinal, (needC
5150: 6f 6c 6c 53 65 71 20 3d 3d 20 74 72 75 65 29 20  ollSeq == true) 
5160: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
5170: 69 66 20 28 6e 20 3d 3d 20 30 29 20 6e 20 3d 20  if (n == 0) n = 
5180: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
5190: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61  ods.sqlite3_crea
51a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 69 6e 74 65  te_function_inte
51b0: 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38  rop(_sql, ToUTF8
51c0: 28 73 74 72 46 75 6e 63 74 69 6f 6e 29 2c 20 6e  (strFunction), n
51d0: 41 72 67 73 2c 20 31 2c 20 49 6e 74 50 74 72 2e  Args, 1, IntPtr.
51e0: 5a 65 72 6f 2c 20 66 75 6e 63 2c 20 66 75 6e 63  Zero, func, func
51f0: 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61 6c 2c  step, funcfinal,
5200: 20 28 6e 65 65 64 43 6f 6c 6c 53 65 71 20 3d 3d   (needCollSeq ==
5210: 20 74 72 75 65 29 20 3f 20 31 20 3a 20 30 29 3b   true) ? 1 : 0);
5220: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 6e 20 3d  .#else.      n =
5230: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
5240: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65  hods.sqlite3_cre
5250: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 5f 73 71  ate_function(_sq
5260: 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 46 75 6e  l, ToUTF8(strFun
5270: 63 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 34  ction), nArgs, 4
5280: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66  , IntPtr.Zero, f
5290: 75 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66  unc, funcstep, f
52a0: 75 6e 63 66 69 6e 61 6c 29 3b 0a 20 20 20 20 20  uncfinal);.     
52b0: 20 69 66 20 28 6e 20 3d 3d 20 30 29 20 6e 20 3d   if (n == 0) n =
52c0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
52d0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65  hods.sqlite3_cre
52e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 5f 73 71  ate_function(_sq
52f0: 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 46 75 6e  l, ToUTF8(strFun
5300: 63 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 31  ction), nArgs, 1
5310: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66  , IntPtr.Zero, f
5320: 75 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66  unc, funcstep, f
5330: 75 6e 63 66 69 6e 61 6c 29 3b 0a 23 65 6e 64 69  uncfinal);.#endi
5340: 66 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20  f.      if (n > 
5350: 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c  0) throw new SQL
5360: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
5370: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
5380: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
5390: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
53a0: 20 76 6f 69 64 20 43 72 65 61 74 65 43 6f 6c 6c   void CreateColl
53b0: 61 74 69 6f 6e 28 73 74 72 69 6e 67 20 73 74 72  ation(string str
53c0: 43 6f 6c 6c 61 74 69 6f 6e 2c 20 53 51 4c 69 74  Collation, SQLit
53d0: 65 43 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 2c  eCollation func,
53e0: 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e   SQLiteCollation
53f0: 20 66 75 6e 63 31 36 29 0a 20 20 20 20 7b 0a 20   func16).    {. 
5400: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73       int n = Uns
5410: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
5420: 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  .sqlite3_create_
5430: 63 6f 6c 6c 61 74 69 6f 6e 28 5f 73 71 6c 2c 20  collation(_sql, 
5440: 54 6f 55 54 46 38 28 73 74 72 43 6f 6c 6c 61 74  ToUTF8(strCollat
5450: 69 6f 6e 29 2c 20 32 2c 20 49 6e 74 50 74 72 2e  ion), 2, IntPtr.
5460: 5a 65 72 6f 2c 20 66 75 6e 63 31 36 29 3b 0a 20  Zero, func16);. 
5470: 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20 30 29       if (n == 0)
5480: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
5490: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65  hods.sqlite3_cre
54a0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 5f 73  ate_collation(_s
54b0: 71 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 43 6f  ql, ToUTF8(strCo
54c0: 6c 6c 61 74 69 6f 6e 29 2c 20 31 2c 20 49 6e 74  llation), 1, Int
54d0: 50 74 72 2e 5a 65 72 6f 2c 20 66 75 6e 63 29 3b  Ptr.Zero, func);
54e0: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
54f0: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
5500: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
5510: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
5520: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
5530: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
5540: 69 6e 74 20 43 6f 6e 74 65 78 74 43 6f 6c 6c 61  int ContextColla
5550: 74 65 43 6f 6d 70 61 72 65 28 43 6f 6c 6c 61 74  teCompare(Collat
5560: 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 20  ionEncodingEnum 
5570: 65 6e 63 2c 20 49 6e 74 50 74 72 20 63 6f 6e 74  enc, IntPtr cont
5580: 65 78 74 2c 20 73 74 72 69 6e 67 20 73 31 2c 20  ext, string s1, 
5590: 73 74 72 69 6e 67 20 73 32 29 0a 20 20 20 20 7b  string s2).    {
55a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41  .#if !SQLITE_STA
55b0: 4e 44 41 52 44 0a 20 20 20 20 20 20 62 79 74 65  NDARD.      byte
55c0: 5b 5d 20 62 31 3b 0a 20 20 20 20 20 20 62 79 74  [] b1;.      byt
55d0: 65 5b 5d 20 62 32 3b 0a 20 20 20 20 20 20 53 79  e[] b2;.      Sy
55e0: 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69  stem.Text.Encodi
55f0: 6e 67 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 6e  ng converter = n
5600: 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 73 77 69 74  ull;..      swit
5610: 63 68 20 28 65 6e 63 29 0a 20 20 20 20 20 20 7b  ch (enc).      {
5620: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 43 6f  .        case Co
5630: 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45  llationEncodingE
5640: 6e 75 6d 2e 55 54 46 38 3a 0a 20 20 20 20 20 20  num.UTF8:.      
5650: 20 20 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20      converter = 
5660: 53 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f  System.Text.Enco
5670: 64 69 6e 67 2e 55 54 46 38 3b 0a 20 20 20 20 20  ding.UTF8;.     
5680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5690: 20 20 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69      case Collati
56a0: 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55  onEncodingEnum.U
56b0: 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 20 20  TF16LE:.        
56c0: 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79    converter = Sy
56d0: 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69  stem.Text.Encodi
56e0: 6e 67 2e 55 6e 69 63 6f 64 65 3b 0a 20 20 20 20  ng.Unicode;.    
56f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5700: 20 20 20 20 20 63 61 73 65 20 43 6f 6c 6c 61 74       case Collat
5710: 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e  ionEncodingEnum.
5720: 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 20  UTF16BE:.       
5730: 20 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53     converter = S
5740: 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64  ystem.Text.Encod
5750: 69 6e 67 2e 42 69 67 45 6e 64 69 61 6e 55 6e 69  ing.BigEndianUni
5760: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  code;.          
5770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
5780: 20 20 20 20 20 20 62 31 20 3d 20 63 6f 6e 76 65        b1 = conve
5790: 72 74 65 72 2e 47 65 74 42 79 74 65 73 28 73 31  rter.GetBytes(s1
57a0: 29 3b 0a 20 20 20 20 20 20 62 32 20 3d 20 63 6f  );.      b2 = co
57b0: 6e 76 65 72 74 65 72 2e 47 65 74 42 79 74 65 73  nverter.GetBytes
57c0: 28 73 32 29 3b 0a 0a 20 20 20 20 20 20 72 65 74  (s2);..      ret
57d0: 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65  urn UnsafeNative
57e0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
57f0: 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c 63 6f 6d 70  context_collcomp
5800: 61 72 65 28 63 6f 6e 74 65 78 74 2c 20 62 31 2c  are(context, b1,
5810: 20 62 31 2e 4c 65 6e 67 74 68 2c 20 62 32 2c 20   b1.Length, b2, 
5820: 62 32 2e 4c 65 6e 67 74 68 29 3b 0a 23 65 6c 73  b2.Length);.#els
5830: 65 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65  e.      throw ne
5840: 77 20 4e 6f 74 49 6d 70 6c 65 6d 65 6e 74 65 64  w NotImplemented
5850: 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 23 65 6e  Exception();.#en
5860: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  dif.    }..    i
5870: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
5880: 20 69 6e 74 20 43 6f 6e 74 65 78 74 43 6f 6c 6c   int ContextColl
5890: 61 74 65 43 6f 6d 70 61 72 65 28 43 6f 6c 6c 61  ateCompare(Colla
58a0: 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d  tionEncodingEnum
58b0: 20 65 6e 63 2c 20 49 6e 74 50 74 72 20 63 6f 6e   enc, IntPtr con
58c0: 74 65 78 74 2c 20 63 68 61 72 5b 5d 20 63 31 2c  text, char[] c1,
58d0: 20 63 68 61 72 5b 5d 20 63 32 29 0a 20 20 20 20   char[] c2).    
58e0: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54  {.#if !SQLITE_ST
58f0: 41 4e 44 41 52 44 0a 20 20 20 20 20 20 62 79 74  ANDARD.      byt
5900: 65 5b 5d 20 62 31 3b 0a 20 20 20 20 20 20 62 79  e[] b1;.      by
5910: 74 65 5b 5d 20 62 32 3b 0a 20 20 20 20 20 20 53  te[] b2;.      S
5920: 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64  ystem.Text.Encod
5930: 69 6e 67 20 63 6f 6e 76 65 72 74 65 72 20 3d 20  ing converter = 
5940: 6e 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 73 77 69  null;..      swi
5950: 74 63 68 20 28 65 6e 63 29 0a 20 20 20 20 20 20  tch (enc).      
5960: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 43  {.        case C
5970: 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67  ollationEncoding
5980: 45 6e 75 6d 2e 55 54 46 38 3a 0a 20 20 20 20 20  Enum.UTF8:.     
5990: 20 20 20 20 20 63 6f 6e 76 65 72 74 65 72 20 3d       converter =
59a0: 20 53 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63   System.Text.Enc
59b0: 6f 64 69 6e 67 2e 55 54 46 38 3b 0a 20 20 20 20  oding.UTF8;.    
59c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
59d0: 20 20 20 20 20 63 61 73 65 20 43 6f 6c 6c 61 74       case Collat
59e0: 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e  ionEncodingEnum.
59f0: 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 20  UTF16LE:.       
5a00: 20 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53     converter = S
5a10: 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64  ystem.Text.Encod
5a20: 69 6e 67 2e 55 6e 69 63 6f 64 65 3b 0a 20 20 20  ing.Unicode;.   
5a30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a40: 20 20 20 20 20 20 63 61 73 65 20 43 6f 6c 6c 61        case Colla
5a50: 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d  tionEncodingEnum
5a60: 2e 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20  .UTF16BE:.      
5a70: 20 20 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20      converter = 
5a80: 53 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f  System.Text.Enco
5a90: 64 69 6e 67 2e 42 69 67 45 6e 64 69 61 6e 55 6e  ding.BigEndianUn
5aa0: 69 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  icode;.         
5ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5ac0: 0a 20 20 20 20 20 20 62 31 20 3d 20 63 6f 6e 76  .      b1 = conv
5ad0: 65 72 74 65 72 2e 47 65 74 42 79 74 65 73 28 63  erter.GetBytes(c
5ae0: 31 29 3b 0a 20 20 20 20 20 20 62 32 20 3d 20 63  1);.      b2 = c
5af0: 6f 6e 76 65 72 74 65 72 2e 47 65 74 42 79 74 65  onverter.GetByte
5b00: 73 28 63 32 29 3b 0a 0a 20 20 20 20 20 20 72 65  s(c2);..      re
5b10: 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76  turn UnsafeNativ
5b20: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
5b30: 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c 63 6f 6d  _context_collcom
5b40: 70 61 72 65 28 63 6f 6e 74 65 78 74 2c 20 62 31  pare(context, b1
5b50: 2c 20 62 31 2e 4c 65 6e 67 74 68 2c 20 62 32 2c  , b1.Length, b2,
5b60: 20 62 32 2e 4c 65 6e 67 74 68 29 3b 0a 23 65 6c   b2.Length);.#el
5b70: 73 65 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e  se.      throw n
5b80: 65 77 20 4e 6f 74 49 6d 70 6c 65 6d 65 6e 74 65  ew NotImplemente
5b90: 64 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 23 65  dException();.#e
5ba0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
5bb0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
5bc0: 65 20 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65  e CollationSeque
5bd0: 6e 63 65 20 47 65 74 43 6f 6c 6c 61 74 69 6f 6e  nce GetCollation
5be0: 53 65 71 75 65 6e 63 65 28 53 51 4c 69 74 65 46  Sequence(SQLiteF
5bf0: 75 6e 63 74 69 6f 6e 20 66 75 6e 63 2c 20 49 6e  unction func, In
5c00: 74 50 74 72 20 63 6f 6e 74 65 78 74 29 0a 20 20  tPtr context).  
5c10: 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    {.#if !SQLITE_
5c20: 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 43  STANDARD.      C
5c30: 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65  ollationSequence
5c40: 20 73 65 71 20 3d 20 6e 65 77 20 43 6f 6c 6c 61   seq = new Colla
5c50: 74 69 6f 6e 53 65 71 75 65 6e 63 65 28 29 3b 0a  tionSequence();.
5c60: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
5c70: 20 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0a 20       int type;. 
5c80: 20 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20       int enc;.  
5c90: 20 20 20 20 49 6e 74 50 74 72 20 70 20 3d 20 55      IntPtr p = U
5ca0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
5cb0: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ds.sqlite3_conte
5cc0: 78 74 5f 63 6f 6c 6c 73 65 71 28 63 6f 6e 74 65  xt_collseq(conte
5cd0: 78 74 2c 20 6f 75 74 20 74 79 70 65 2c 20 6f 75  xt, out type, ou
5ce0: 74 20 65 6e 63 2c 20 6f 75 74 20 6c 65 6e 29 3b  t enc, out len);
5cf0: 0a 0a 20 20 20 20 20 20 69 66 20 28 70 20 21 3d  ..      if (p !=
5d00: 20 6e 75 6c 6c 29 20 73 65 71 2e 4e 61 6d 65 20   null) seq.Name 
5d10: 3d 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 70  = UTF8ToString(p
5d20: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 73 65  , len);.      se
5d30: 71 2e 54 79 70 65 20 3d 20 28 43 6f 6c 6c 61 74  q.Type = (Collat
5d40: 69 6f 6e 54 79 70 65 45 6e 75 6d 29 74 79 70 65  ionTypeEnum)type
5d50: 3b 0a 20 20 20 20 20 20 73 65 71 2e 5f 66 75 6e  ;.      seq._fun
5d60: 63 20 3d 20 66 75 6e 63 3b 0a 20 20 20 20 20 20  c = func;.      
5d70: 73 65 71 2e 45 6e 63 6f 64 69 6e 67 20 3d 20 28  seq.Encoding = (
5d80: 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e  CollationEncodin
5d90: 67 45 6e 75 6d 29 65 6e 63 3b 0a 0a 20 20 20 20  gEnum)enc;..    
5da0: 20 20 72 65 74 75 72 6e 20 73 65 71 3b 0a 23 65    return seq;.#e
5db0: 6c 73 65 0a 20 20 20 20 20 20 74 68 72 6f 77 20  lse.      throw 
5dc0: 6e 65 77 20 4e 6f 74 49 6d 70 6c 65 6d 65 6e 74  new NotImplement
5dd0: 65 64 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 23  edException();.#
5de0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
5df0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
5e00: 64 65 20 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d  de long GetParam
5e10: 56 61 6c 75 65 42 79 74 65 73 28 49 6e 74 50 74  ValueBytes(IntPt
5e20: 72 20 70 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66  r p, int nDataOf
5e30: 66 73 65 74 2c 20 62 79 74 65 5b 5d 20 62 44 65  fset, byte[] bDe
5e40: 73 74 2c 20 69 6e 74 20 6e 53 74 61 72 74 2c 20  st, int nStart, 
5e50: 69 6e 74 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20  int nLength).   
5e60: 20 7b 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20   {.      IntPtr 
5e70: 70 74 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ptr;.      int n
5e80: 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  len;.      int n
5e90: 43 6f 70 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68  Copied = nLength
5ea0: 3b 0a 0a 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20  ;..      nlen = 
5eb0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
5ec0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75  ods.sqlite3_valu
5ed0: 65 5f 62 79 74 65 73 28 70 29 3b 0a 20 20 20 20  e_bytes(p);.    
5ee0: 20 20 70 74 72 20 3d 20 55 6e 73 61 66 65 4e 61    ptr = UnsafeNa
5ef0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
5f00: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
5f10: 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 62 44  );..      if (bD
5f20: 65 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74  est == null) ret
5f30: 75 72 6e 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20  urn nlen;..     
5f40: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e   if (nCopied + n
5f50: 53 74 61 72 74 20 3e 20 62 44 65 73 74 2e 4c 65  Start > bDest.Le
5f60: 6e 67 74 68 29 20 6e 43 6f 70 69 65 64 20 3d 20  ngth) nCopied = 
5f70: 62 44 65 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e  bDest.Length - n
5f80: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 20  Start;.      if 
5f90: 28 6e 43 6f 70 69 65 64 20 2b 20 6e 44 61 74 61  (nCopied + nData
5fa0: 4f 66 66 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e  Offset > nlen) n
5fb0: 43 6f 70 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20  Copied = nlen - 
5fc0: 6e 44 61 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20  nDataOffset;..  
5fd0: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
5fe0: 3e 20 30 29 0a 20 20 20 20 20 20 20 20 4d 61 72  > 0).        Mar
5ff0: 73 68 61 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74  shal.Copy((IntPt
6000: 72 29 28 70 74 72 2e 54 6f 49 6e 74 33 32 28 29  r)(ptr.ToInt32()
6010: 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 29 2c   + nDataOffset),
6020: 20 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c 20   bDest, nStart, 
6030: 6e 43 6f 70 69 65 64 29 3b 0a 20 20 20 20 20 20  nCopied);.      
6040: 65 6c 73 65 20 6e 43 6f 70 69 65 64 20 3d 20 30  else nCopied = 0
6050: 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
6060: 6e 43 6f 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a  nCopied;.    }..
6070: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
6080: 72 72 69 64 65 20 64 6f 75 62 6c 65 20 47 65 74  rride double Get
6090: 50 61 72 61 6d 56 61 6c 75 65 44 6f 75 62 6c 65  ParamValueDouble
60a0: 28 49 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20  (IntPtr ptr).   
60b0: 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20   {.      double 
60c0: 76 61 6c 75 65 3b 0a 23 69 66 20 21 50 4c 41 54  value;.#if !PLAT
60d0: 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d  FORM_COMPACTFRAM
60e0: 45 57 4f 52 4b 0a 20 20 20 20 20 20 76 61 6c 75  EWORK.      valu
60f0: 65 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  e = UnsafeNative
6100: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6110: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 74 72  value_double(ptr
6120: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 55  );.#else.      U
6130: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6140: 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ds.sqlite3_value
6150: 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28  _double_interop(
6160: 70 74 72 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b  ptr, out value);
6170: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
6180: 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20  turn value;.    
6190: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
61a0: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47 65 74  override int Get
61b0: 50 61 72 61 6d 56 61 6c 75 65 49 6e 74 33 32 28  ParamValueInt32(
61c0: 49 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20 20  IntPtr ptr).    
61d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  {.      return U
61e0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
61f0: 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ds.sqlite3_value
6200: 5f 69 6e 74 28 70 74 72 29 3b 0a 20 20 20 20 7d  _int(ptr);.    }
6210: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
6220: 76 65 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74  verride long Get
6230: 50 61 72 61 6d 56 61 6c 75 65 49 6e 74 36 34 28  ParamValueInt64(
6240: 49 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20 20  IntPtr ptr).    
6250: 7b 0a 20 20 20 20 20 20 49 6e 74 36 34 20 76 61  {.      Int64 va
6260: 6c 75 65 3b 0a 23 69 66 20 21 50 4c 41 54 46 4f  lue;.#if !PLATFO
6270: 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
6280: 4f 52 4b 0a 20 20 20 20 20 20 76 61 6c 75 65 20  ORK.      value 
6290: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
62a0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61  thods.sqlite3_va
62b0: 6c 75 65 5f 69 6e 74 36 34 28 70 74 72 29 3b 0a  lue_int64(ptr);.
62c0: 23 65 6c 73 65 0a 20 20 20 20 20 20 55 6e 73 61  #else.      Unsa
62d0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
62e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
62f0: 74 36 34 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c  t64_interop(ptr,
6300: 20 6f 75 74 20 76 61 6c 75 65 29 3b 0a 23 65 6e   out value);.#en
6310: 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e  dif.      return
6320: 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a 20   value;.    }.. 
6330: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6340: 72 69 64 65 20 73 74 72 69 6e 67 20 47 65 74 50  ride string GetP
6350: 61 72 61 6d 56 61 6c 75 65 54 65 78 74 28 49 6e  aramValueText(In
6360: 74 50 74 72 20 70 74 72 29 0a 20 20 20 20 7b 0a  tPtr ptr).    {.
6370: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
6380: 44 41 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c  DARD.      int l
6390: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
63a0: 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e   UTF8ToString(Un
63b0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
63c0: 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  s.sqlite3_value_
63d0: 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 70 74 72  text_interop(ptr
63e0: 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29  , out len), len)
63f0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65  ;.#else.      re
6400: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
6410: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
6420: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61  thods.sqlite3_va
6430: 6c 75 65 5f 74 65 78 74 28 70 74 72 29 2c 20 2d  lue_text(ptr), -
6440: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
6450: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
6460: 76 65 72 72 69 64 65 20 54 79 70 65 41 66 66 69  verride TypeAffi
6470: 6e 69 74 79 20 47 65 74 50 61 72 61 6d 56 61 6c  nity GetParamVal
6480: 75 65 54 79 70 65 28 49 6e 74 50 74 72 20 70 74  ueType(IntPtr pt
6490: 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  r).    {.      r
64a0: 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69  eturn UnsafeNati
64b0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
64c0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 74 72  3_value_type(ptr
64d0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
64e0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
64f0: 76 6f 69 64 20 52 65 74 75 72 6e 42 6c 6f 62 28  void ReturnBlob(
6500: 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20  IntPtr context, 
6510: 62 79 74 65 5b 5d 20 76 61 6c 75 65 29 0a 20 20  byte[] value).  
6520: 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65    {.      Unsafe
6530: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
6540: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
6550: 62 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65  b(context, value
6560: 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 2c 20  , value.Length, 
6570: 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b 0a 20  (IntPtr)(-1));. 
6580: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
6590: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
65a0: 20 52 65 74 75 72 6e 44 6f 75 62 6c 65 28 49 6e   ReturnDouble(In
65b0: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 64 6f  tPtr context, do
65c0: 75 62 6c 65 20 76 61 6c 75 65 29 0a 20 20 20 20  uble value).    
65d0: 7b 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f  {.#if !PLATFORM_
65e0: 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b  COMPACTFRAMEWORK
65f0: 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74  .      UnsafeNat
6600: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
6610: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6620: 28 63 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65 29  (context, value)
6630: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 55 6e  ;.#else.      Un
6640: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
6650: 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  s.sqlite3_result
6660: 5f 64 6f 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28  _double_interop(
6670: 63 6f 6e 74 65 78 74 2c 20 72 65 66 20 76 61 6c  context, ref val
6680: 75 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ue);.#endif.    
6690: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
66a0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65  override void Re
66b0: 74 75 72 6e 45 72 72 6f 72 28 49 6e 74 50 74 72  turnError(IntPtr
66c0: 20 63 6f 6e 74 65 78 74 2c 20 73 74 72 69 6e 67   context, string
66d0: 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20   value).    {.  
66e0: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
66f0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6700: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
6710: 74 65 78 74 2c 20 54 6f 55 54 46 38 28 76 61 6c  text, ToUTF8(val
6720: 75 65 29 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74  ue), value.Lengt
6730: 68 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  h);.    }..    i
6740: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
6750: 20 76 6f 69 64 20 52 65 74 75 72 6e 49 6e 74 33   void ReturnInt3
6760: 32 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  2(IntPtr context
6770: 2c 20 69 6e 74 20 76 61 6c 75 65 29 0a 20 20 20  , int value).   
6780: 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e   {.      UnsafeN
6790: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
67a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
67b0: 63 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65 29 3b  context, value);
67c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
67d0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
67e0: 69 64 20 52 65 74 75 72 6e 49 6e 74 36 34 28 49  id ReturnInt64(I
67f0: 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 6c  ntPtr context, l
6800: 6f 6e 67 20 76 61 6c 75 65 29 0a 20 20 20 20 7b  ong value).    {
6810: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
6820: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a  OMPACTFRAMEWORK.
6830: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
6840: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
6850: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
6860: 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65 29 3b 0a  ontext, value);.
6870: 23 65 6c 73 65 0a 20 20 20 20 20 20 55 6e 73 61  #else.      Unsa
6880: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6890: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
68a0: 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 63 6f 6e  nt64_interop(con
68b0: 74 65 78 74 2c 20 72 65 66 20 76 61 6c 75 65 29  text, ref value)
68c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
68d0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
68e0: 72 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72  rride void Retur
68f0: 6e 4e 75 6c 6c 28 49 6e 74 50 74 72 20 63 6f 6e  nNull(IntPtr con
6900: 74 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  text).    {.    
6910: 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65    UnsafeNativeMe
6920: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65  thods.sqlite3_re
6930: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
6940: 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
6950: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
6960: 20 76 6f 69 64 20 52 65 74 75 72 6e 54 65 78 74   void ReturnText
6970: 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c  (IntPtr context,
6980: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 29 0a 20   string value). 
6990: 20 20 20 7b 0a 20 20 20 20 20 20 62 79 74 65 5b     {.      byte[
69a0: 5d 20 62 20 3d 20 54 6f 55 54 46 38 28 76 61 6c  ] b = ToUTF8(val
69b0: 75 65 29 3b 0a 20 20 20 20 20 20 55 6e 73 61 66  ue);.      Unsaf
69c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
69d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
69e0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 54 6f 55 54  xt(context, ToUT
69f0: 46 38 28 76 61 6c 75 65 29 2c 20 62 2e 4c 65 6e  F8(value), b.Len
6a00: 67 74 68 20 2d 20 31 2c 20 28 49 6e 74 50 74 72  gth - 1, (IntPtr
6a10: 29 28 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  )(-1));.    }.. 
6a20: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6a30: 72 69 64 65 20 49 6e 74 50 74 72 20 41 67 67 72  ride IntPtr Aggr
6a40: 65 67 61 74 65 43 6f 6e 74 65 78 74 28 49 6e 74  egateContext(Int
6a50: 50 74 72 20 63 6f 6e 74 65 78 74 29 0a 20 20 20  Ptr context).   
6a60: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
6a70: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
6a80: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 61 67 67 72  ods.sqlite3_aggr
6a90: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
6aa0: 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d  ntext, 1);.    }
6ab0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
6ac0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 53 65 74  verride void Set
6ad0: 50 61 73 73 77 6f 72 64 28 62 79 74 65 5b 5d 20  Password(byte[] 
6ae0: 70 61 73 73 77 6f 72 64 42 79 74 65 73 29 0a 20  passwordBytes). 
6af0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e     {.      int n
6b00: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
6b10: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 6b  ethods.sqlite3_k
6b20: 65 79 28 5f 73 71 6c 2c 20 70 61 73 73 77 6f 72  ey(_sql, passwor
6b30: 64 42 79 74 65 73 2c 20 70 61 73 73 77 6f 72 64  dBytes, password
6b40: 42 79 74 65 73 2e 4c 65 6e 67 74 68 29 3b 0a 20  Bytes.Length);. 
6b50: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
6b60: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
6b70: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
6b80: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
6b90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
6ba0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
6bb0: 69 64 20 43 68 61 6e 67 65 50 61 73 73 77 6f 72  id ChangePasswor
6bc0: 64 28 62 79 74 65 5b 5d 20 6e 65 77 50 61 73 73  d(byte[] newPass
6bd0: 77 6f 72 64 42 79 74 65 73 29 0a 20 20 20 20 7b  wordBytes).    {
6be0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
6bf0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6c00: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  ds.sqlite3_rekey
6c10: 28 5f 73 71 6c 2c 20 6e 65 77 50 61 73 73 77 6f  (_sql, newPasswo
6c20: 72 64 42 79 74 65 73 2c 20 28 6e 65 77 50 61 73  rdBytes, (newPas
6c30: 73 77 6f 72 64 42 79 74 65 73 20 3d 3d 20 6e 75  swordBytes == nu
6c40: 6c 6c 29 20 3f 20 30 20 3a 20 6e 65 77 50 61 73  ll) ? 0 : newPas
6c50: 73 77 6f 72 64 42 79 74 65 73 2e 4c 65 6e 67 74  swordBytes.Lengt
6c60: 68 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  h);.      if (n 
6c70: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
6c80: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
6c90: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
6ca0: 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r());.    }..   
6cb0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
6cc0: 64 65 20 76 6f 69 64 20 53 65 74 55 70 64 61 74  de void SetUpdat
6cd0: 65 48 6f 6f 6b 28 53 51 4c 69 74 65 55 70 64 61  eHook(SQLiteUpda
6ce0: 74 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 29  teCallback func)
6cf0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73  .    {.      Uns
6d00: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
6d10: 2e 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  .sqlite3_update_
6d20: 68 6f 6f 6b 28 5f 73 71 6c 2c 20 66 75 6e 63 2c  hook(_sql, func,
6d30: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 3b 0a 20   IntPtr.Zero);. 
6d40: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
6d50: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
6d60: 20 53 65 74 43 6f 6d 6d 69 74 48 6f 6f 6b 28 53   SetCommitHook(S
6d70: 51 4c 69 74 65 43 6f 6d 6d 69 74 43 61 6c 6c 62  QLiteCommitCallb
6d80: 61 63 6b 20 66 75 6e 63 29 0a 20 20 20 20 7b 0a  ack func).    {.
6d90: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
6da0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
6db0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 5f 73  3_commit_hook(_s
6dc0: 71 6c 2c 20 66 75 6e 63 2c 20 49 6e 74 50 74 72  ql, func, IntPtr
6dd0: 2e 5a 65 72 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  .Zero);.    }.. 
6de0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6df0: 72 69 64 65 20 76 6f 69 64 20 53 65 74 52 6f 6c  ride void SetRol
6e00: 6c 62 61 63 6b 48 6f 6f 6b 28 53 51 4c 69 74 65  lbackHook(SQLite
6e10: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
6e20: 20 66 75 6e 63 29 0a 20 20 20 20 7b 0a 20 20 20   func).    {.   
6e30: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
6e40: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72  ethods.sqlite3_r
6e50: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 5f 73 71  ollback_hook(_sq
6e60: 6c 2c 20 66 75 6e 63 2c 20 49 6e 74 50 74 72 2e  l, func, IntPtr.
6e70: 5a 65 72 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Zero);.    }..  
6e80: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
6e90: 20 20 20 20 2f 2f 2f 20 48 65 6c 70 65 72 20 66      /// Helper f
6ea0: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 69  unction to retri
6eb0: 65 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20  eve a column of 
6ec0: 64 61 74 61 20 66 72 6f 6d 20 61 6e 20 61 63 74  data from an act
6ed0: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ive statement.. 
6ee0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
6ef0: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  >.    /// <param
6f00: 20 6e 61 6d 65 3d 22 73 74 6d 74 22 3e 54 68 65   name="stmt">The
6f10: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
6f20: 20 73 74 65 70 28 29 27 64 20 74 68 72 6f 75 67   step()'d throug
6f30: 68 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f  h</param>.    //
6f40: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
6f50: 6e 64 65 78 22 3e 54 68 65 20 63 6f 6c 75 6d 6e  ndex">The column
6f60: 20 69 6e 64 65 78 20 74 6f 20 72 65 74 72 69 65   index to retrie
6f70: 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f  ve</param>.    /
6f80: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
6f90: 74 79 70 22 3e 54 68 65 20 74 79 70 65 20 6f 66  typ">The type of
6fa0: 20 64 61 74 61 20 63 6f 6e 74 61 69 6e 65 64 20   data contained 
6fb0: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  in the column.  
6fc0: 49 66 20 55 6e 69 6e 69 74 69 61 6c 69 7a 65 64  If Uninitialized
6fd0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
6fe0: 77 69 6c 6c 20 72 65 74 72 69 65 76 65 20 74 68  will retrieve th
6ff0: 65 20 64 61 74 61 74 79 70 65 20 69 6e 66 6f 72  e datatype infor
7000: 6d 61 74 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0a  mation.</param>.
7010: 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73      /// <returns
7020: 3e 52 65 74 75 72 6e 73 20 74 68 65 20 64 61 74  >Returns the dat
7030: 61 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 3c  a in the column<
7040: 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 69 6e  /returns>.    in
7050: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
7060: 6f 62 6a 65 63 74 20 47 65 74 56 61 6c 75 65 28  object GetValue(
7070: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
7080: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c  stmt, int index,
7090: 20 53 51 4c 69 74 65 54 79 70 65 20 74 79 70 29   SQLiteType typ)
70a0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 66 20  .    {.      if 
70b0: 28 49 73 4e 75 6c 6c 28 73 74 6d 74 2c 20 69 6e  (IsNull(stmt, in
70c0: 64 65 78 29 29 20 72 65 74 75 72 6e 20 44 42 4e  dex)) return DBN
70d0: 75 6c 6c 2e 56 61 6c 75 65 3b 0a 20 20 20 20 20  ull.Value;.     
70e0: 20 54 79 70 65 41 66 66 69 6e 69 74 79 20 61 66   TypeAffinity af
70f0: 66 20 3d 20 74 79 70 2e 41 66 66 69 6e 69 74 79  f = typ.Affinity
7100: 3b 0a 20 20 20 20 20 20 54 79 70 65 20 74 20 3d  ;.      Type t =
7110: 20 6e 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66   null;..      if
7120: 20 28 74 79 70 2e 54 79 70 65 20 21 3d 20 44 62   (typ.Type != Db
7130: 54 79 70 65 2e 4f 62 6a 65 63 74 29 0a 20 20 20  Type.Object).   
7140: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 74 20 3d     {.        t =
7150: 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e 53   SQLiteConvert.S
7160: 51 4c 69 74 65 54 79 70 65 54 6f 54 79 70 65 28  QLiteTypeToType(
7170: 74 79 70 29 3b 0a 20 20 20 20 20 20 20 20 61 66  typ);.        af
7180: 66 20 3d 20 54 79 70 65 54 6f 41 66 66 69 6e 69  f = TypeToAffini
7190: 74 79 28 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ty(t);.      }..
71a0: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 61 66        switch (af
71b0: 66 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  f).      {.     
71c0: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
71d0: 6e 69 74 79 2e 42 6c 6f 62 3a 0a 20 20 20 20 20  nity.Blob:.     
71e0: 20 20 20 20 20 69 66 20 28 74 79 70 2e 54 79 70       if (typ.Typ
71f0: 65 20 3d 3d 20 44 62 54 79 70 65 2e 47 75 69 64  e == DbType.Guid
7200: 20 26 26 20 74 79 70 2e 41 66 66 69 6e 69 74 79   && typ.Affinity
7210: 20 3d 3d 20 54 79 70 65 41 66 66 69 6e 69 74 79   == TypeAffinity
7220: 2e 54 65 78 74 29 0a 20 20 20 20 20 20 20 20 20  .Text).         
7230: 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 47 75     return new Gu
7240: 69 64 28 47 65 74 54 65 78 74 28 73 74 6d 74 2c  id(GetText(stmt,
7250: 20 69 6e 64 65 78 29 29 3b 0a 0a 20 20 20 20 20   index));..     
7260: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
7270: 74 29 47 65 74 42 79 74 65 73 28 73 74 6d 74 2c  t)GetBytes(stmt,
7280: 20 69 6e 64 65 78 2c 20 30 2c 20 6e 75 6c 6c 2c   index, 0, null,
7290: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
72a0: 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77    byte[] b = new
72b0: 20 62 79 74 65 5b 6e 5d 3b 0a 20 20 20 20 20 20   byte[n];.      
72c0: 20 20 20 20 47 65 74 42 79 74 65 73 28 73 74 6d      GetBytes(stm
72d0: 74 2c 20 69 6e 64 65 78 2c 20 30 2c 20 62 2c 20  t, index, 0, b, 
72e0: 30 2c 20 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20  0, n);..        
72f0: 20 20 69 66 20 28 74 79 70 2e 54 79 70 65 20 3d    if (typ.Type =
7300: 3d 20 44 62 54 79 70 65 2e 47 75 69 64 20 26 26  = DbType.Guid &&
7310: 20 6e 20 3d 3d 20 31 36 29 0a 20 20 20 20 20 20   n == 16).      
7320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77        return new
7330: 20 47 75 69 64 28 62 29 3b 0a 0a 20 20 20 20 20   Guid(b);..     
7340: 20 20 20 20 20 72 65 74 75 72 6e 20 62 3b 0a 20       return b;. 
7350: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
7360: 41 66 66 69 6e 69 74 79 2e 44 61 74 65 54 69 6d  Affinity.DateTim
7370: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e:.          ret
7380: 75 72 6e 20 47 65 74 44 61 74 65 54 69 6d 65 28  urn GetDateTime(
7390: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20  stmt, index);.  
73a0: 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65 41        case TypeA
73b0: 66 66 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a  ffinity.Double:.
73c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 20            if (t 
73d0: 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20  == null) return 
73e0: 47 65 74 44 6f 75 62 6c 65 28 73 74 6d 74 2c 20  GetDouble(stmt, 
73f0: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
7400: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20    else.         
7410: 20 20 20 72 65 74 75 72 6e 20 43 6f 6e 76 65 72     return Conver
7420: 74 2e 43 68 61 6e 67 65 54 79 70 65 28 47 65 74  t.ChangeType(Get
7430: 44 6f 75 62 6c 65 28 73 74 6d 74 2c 20 69 6e 64  Double(stmt, ind
7440: 65 78 29 2c 20 74 2c 20 6e 75 6c 6c 29 3b 0a 20  ex), t, null);. 
7450: 20 20 20 20 20 20 20 63 61 73 65 20 54 79 70 65         case Type
7460: 41 66 66 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0a  Affinity.Int64:.
7470: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 20            if (t 
7480: 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20  == null) return 
7490: 47 65 74 49 6e 74 36 34 28 73 74 6d 74 2c 20 69  GetInt64(stmt, i
74a0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
74b0: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20   else.          
74c0: 20 20 72 65 74 75 72 6e 20 43 6f 6e 76 65 72 74    return Convert
74d0: 2e 43 68 61 6e 67 65 54 79 70 65 28 47 65 74 49  .ChangeType(GetI
74e0: 6e 74 36 34 28 73 74 6d 74 2c 20 69 6e 64 65 78  nt64(stmt, index
74f0: 29 2c 20 74 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  ), t, null);.   
7500: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
7510: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 47          return G
7520: 65 74 54 65 78 74 28 73 74 6d 74 2c 20 69 6e 64  etText(stmt, ind
7530: 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ex);.      }.   
7540: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
7550: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47 65   override int Ge
7560: 74 43 75 72 73 6f 72 46 6f 72 54 61 62 6c 65 28  tCursorForTable(
7570: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
7580: 73 74 6d 74 2c 20 69 6e 74 20 64 62 2c 20 69 6e  stmt, int db, in
7590: 74 20 72 6f 6f 74 50 61 67 65 29 0a 20 20 20 20  t rootPage).    
75a0: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54  {.#if !SQLITE_ST
75b0: 41 4e 44 41 52 44 0a 20 20 20 20 20 20 72 65 74  ANDARD.      ret
75c0: 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65  urn UnsafeNative
75d0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
75e0: 74 61 62 6c 65 5f 63 75 72 73 6f 72 28 73 74 6d  table_cursor(stm
75f0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
7600: 64 62 2c 20 72 6f 6f 74 50 61 67 65 29 3b 0a 23  db, rootPage);.#
7610: 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75 72  else.      retur
7620: 6e 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20  n -1;.#endif.   
7630: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
7640: 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67 20 47   override long G
7650: 65 74 52 6f 77 49 64 46 6f 72 43 75 72 73 6f 72  etRowIdForCursor
7660: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
7670: 20 73 74 6d 74 2c 20 69 6e 74 20 63 75 72 73 6f   stmt, int curso
7680: 72 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53 51  r).    {.#if !SQ
7690: 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20  LITE_STANDARD.  
76a0: 20 20 20 20 6c 6f 6e 67 20 72 6f 77 69 64 3b 0a      long rowid;.
76b0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 55        int rc = U
76c0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
76d0: 64 73 2e 73 71 6c 69 74 65 33 5f 63 75 72 73 6f  ds.sqlite3_curso
76e0: 72 5f 72 6f 77 69 64 28 73 74 6d 74 2e 5f 73 71  r_rowid(stmt._sq
76f0: 6c 69 74 65 5f 73 74 6d 74 2c 20 63 75 72 73 6f  lite_stmt, curso
7700: 72 2c 20 6f 75 74 20 72 6f 77 69 64 29 3b 0a 20  r, out rowid);. 
7710: 20 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 30       if (rc == 0
7720: 29 20 72 65 74 75 72 6e 20 72 6f 77 69 64 3b 0a  ) return rowid;.
7730: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7740: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74  .#else.      ret
7750: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
7760: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
7770: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
7780: 47 65 74 49 6e 64 65 78 43 6f 6c 75 6d 6e 45 78  GetIndexColumnEx
7790: 74 65 6e 64 65 64 49 6e 66 6f 28 73 74 72 69 6e  tendedInfo(strin
77a0: 67 20 64 61 74 61 62 61 73 65 2c 20 73 74 72 69  g database, stri
77b0: 6e 67 20 69 6e 64 65 78 2c 20 73 74 72 69 6e 67  ng index, string
77c0: 20 63 6f 6c 75 6d 6e 2c 20 6f 75 74 20 69 6e 74   column, out int
77d0: 20 73 6f 72 74 4d 6f 64 65 2c 20 6f 75 74 20 69   sortMode, out i
77e0: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 6f 75 74 20  nt onError, out 
77f0: 73 74 72 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  string collation
7800: 53 65 71 75 65 6e 63 65 29 0a 20 20 20 20 7b 0a  Sequence).    {.
7810: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
7820: 44 41 52 44 0a 20 20 20 20 20 20 49 6e 74 50 74  DARD.      IntPt
7830: 72 20 63 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e  r coll;.      in
7840: 74 20 63 6f 6c 6c 6c 65 6e 3b 0a 20 20 20 20 20  t colllen;.     
7850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
7860: 72 63 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76  rc = UnsafeNativ
7870: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
7880: 5f 69 6e 64 65 78 5f 63 6f 6c 75 6d 6e 5f 69 6e  _index_column_in
7890: 66 6f 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c  fo_interop(_sql,
78a0: 20 54 6f 55 54 46 38 28 64 61 74 61 62 61 73 65   ToUTF8(database
78b0: 29 2c 20 54 6f 55 54 46 38 28 69 6e 64 65 78 29  ), ToUTF8(index)
78c0: 2c 20 54 6f 55 54 46 38 28 63 6f 6c 75 6d 6e 29  , ToUTF8(column)
78d0: 2c 20 6f 75 74 20 73 6f 72 74 4d 6f 64 65 2c 20  , out sortMode, 
78e0: 6f 75 74 20 6f 6e 45 72 72 6f 72 2c 20 6f 75 74  out onError, out
78f0: 20 63 6f 6c 6c 2c 20 6f 75 74 20 63 6f 6c 6c 6c   coll, out colll
7900: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 72  en);.      if (r
7910: 63 20 21 3d 20 30 29 20 74 68 72 6f 77 20 6e 65  c != 0) throw ne
7920: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
7930: 6e 28 72 63 2c 20 22 22 29 3b 0a 0a 20 20 20 20  n(rc, "");..    
7940: 20 20 63 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65    collationSeque
7950: 6e 63 65 20 3d 20 55 54 46 38 54 6f 53 74 72 69  nce = UTF8ToStri
7960: 6e 67 28 63 6f 6c 6c 2c 20 63 6f 6c 6c 6c 65 6e  ng(coll, colllen
7970: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73  );.#else.      s
7980: 6f 72 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ortMode = 0;.   
7990: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 32 3b 0a     onError = 2;.
79a0: 20 20 20 20 20 20 63 6f 6c 6c 61 74 69 6f 6e 53        collationS
79b0: 65 71 75 65 6e 63 65 20 3d 20 22 42 49 4e 41 52  equence = "BINAR
79c0: 59 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  Y";.#endif.    }
79d0: 0a 20 20 7d 0a 7d 0a                             .  }.}.