System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact e32aa2a7737d0c8ce833b74d58c486849fa27093:


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 69  ernal override i
0910: 6e 74 20 43 68 61 6e 67 65 73 0a 20 20 20 20 7b  nt Changes.    {
0920: 0a 20 20 20 20 20 20 67 65 74 0a 20 20 20 20 20  .      get.     
0930: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
0940: 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  n UnsafeNativeMe
0950: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 68  thods.sqlite3_ch
0960: 61 6e 67 65 73 28 5f 73 71 6c 29 3b 0a 20 20 20  anges(_sql);.   
0970: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
0980: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
0990: 65 20 76 6f 69 64 20 4f 70 65 6e 28 73 74 72 69  e void Open(stri
09a0: 6e 67 20 73 74 72 46 69 6c 65 6e 61 6d 65 2c 20  ng strFilename, 
09b0: 53 51 4c 69 74 65 4f 70 65 6e 46 6c 61 67 73 45  SQLiteOpenFlagsE
09c0: 6e 75 6d 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d  num flags, int m
09d0: 61 78 50 6f 6f 6c 53 69 7a 65 2c 20 62 6f 6f 6c  axPoolSize, bool
09e0: 20 75 73 65 50 6f 6f 6c 29 0a 20 20 20 20 7b 0a   usePool).    {.
09f0: 20 20 20 20 20 20 69 66 20 28 5f 73 71 6c 20 21        if (_sql !
0a00: 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 3b 0a  = null) return;.
0a10: 0a 20 20 20 20 20 20 5f 75 73 65 50 6f 6f 6c 20  .      _usePool 
0a20: 3d 20 75 73 65 50 6f 6f 6c 3b 0a 20 20 20 20 20  = usePool;.     
0a30: 20 69 66 20 28 75 73 65 50 6f 6f 6c 29 0a 20 20   if (usePool).  
0a40: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 5f 66      {.        _f
0a50: 69 6c 65 4e 61 6d 65 20 3d 20 73 74 72 46 69 6c  ileName = strFil
0a60: 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 5f  ename;.        _
0a70: 73 71 6c 20 3d 20 53 51 4c 69 74 65 43 6f 6e 6e  sql = SQLiteConn
0a80: 65 63 74 69 6f 6e 50 6f 6f 6c 2e 52 65 6d 6f 76  ectionPool.Remov
0a90: 65 28 73 74 72 46 69 6c 65 6e 61 6d 65 2c 20 6d  e(strFilename, m
0aa0: 61 78 50 6f 6f 6c 53 69 7a 65 2c 20 6f 75 74 20  axPoolSize, out 
0ab0: 5f 70 6f 6f 6c 56 65 72 73 69 6f 6e 29 3b 0a 20  _poolVersion);. 
0ac0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
0ad0: 20 28 5f 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 0a   (_sql == null).
0ae0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0af0: 49 6e 74 50 74 72 20 64 62 3b 0a 0a 23 69 66 20  IntPtr db;..#if 
0b00: 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44  !SQLITE_STANDARD
0b10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
0b20: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
0b30: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 6f 70 65  hods.sqlite3_ope
0b40: 6e 5f 69 6e 74 65 72 6f 70 28 54 6f 55 54 46 38  n_interop(ToUTF8
0b50: 28 73 74 72 46 69 6c 65 6e 61 6d 65 29 2c 20 28  (strFilename), (
0b60: 69 6e 74 29 66 6c 61 67 73 2c 20 6f 75 74 20 64  int)flags, out d
0b70: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  b);.#else.      
0b80: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
0b90: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
0ba0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 54 6f  lite3_open_v2(To
0bb0: 55 54 46 38 28 73 74 72 46 69 6c 65 6e 61 6d 65  UTF8(strFilename
0bc0: 29 2c 20 6f 75 74 20 64 62 2c 20 28 69 6e 74 29  ), out db, (int)
0bd0: 66 6c 61 67 73 2c 20 49 6e 74 50 74 72 2e 5a 65  flags, IntPtr.Ze
0be0: 72 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ro);.#endif.    
0bf0: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
0c00: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
0c10: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 6e 75 6c 6c  xception(n, null
0c20: 29 3b 0a 0a 20 20 20 20 20 20 20 20 5f 73 71 6c  );..        _sql
0c30: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
0c40: 20 20 20 20 20 2f 2f 20 42 69 6e 64 20 66 75 6e       // Bind fun
0c50: 63 74 69 6f 6e 73 20 74 6f 20 74 68 69 73 20 63  ctions to this c
0c60: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20 61  onnection.  If a
0c70: 6e 79 20 70 72 65 76 69 6f 75 73 20 66 75 6e 63  ny previous func
0c80: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d  tions of the sam
0c90: 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2f 2f 20  e name.      // 
0ca0: 77 65 72 65 20 61 6c 72 65 61 64 79 20 62 6f 75  were already bou
0cb0: 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 77  nd, then the new
0cc0: 20 62 69 6e 64 69 6e 67 73 20 72 65 70 6c 61 63   bindings replac
0cd0: 65 20 74 68 65 20 6f 6c 64 2e 0a 20 20 20 20 20  e the old..     
0ce0: 20 5f 66 75 6e 63 74 69 6f 6e 73 41 72 72 61 79   _functionsArray
0cf0: 20 3d 20 53 51 4c 69 74 65 46 75 6e 63 74 69 6f   = SQLiteFunctio
0d00: 6e 2e 42 69 6e 64 46 75 6e 63 74 69 6f 6e 73 28  n.BindFunctions(
0d10: 74 68 69 73 29 3b 0a 20 20 20 20 20 20 53 65 74  this);.      Set
0d20: 54 69 6d 65 6f 75 74 28 30 29 3b 0a 20 20 20 20  Timeout(0);.    
0d30: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
0d40: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 43 6c  override void Cl
0d50: 65 61 72 50 6f 6f 6c 28 29 0a 20 20 20 20 7b 0a  earPool().    {.
0d60: 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
0d70: 65 63 74 69 6f 6e 50 6f 6f 6c 2e 43 6c 65 61 72  ectionPool.Clear
0d80: 50 6f 6f 6c 28 5f 66 69 6c 65 4e 61 6d 65 29 3b  Pool(_fileName);
0d90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
0da0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
0db0: 69 64 20 53 65 74 54 69 6d 65 6f 75 74 28 69 6e  id SetTimeout(in
0dc0: 74 20 6e 54 69 6d 65 6f 75 74 4d 53 29 0a 20 20  t nTimeoutMS).  
0dd0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20    {.      int n 
0de0: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
0df0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 75  thods.sqlite3_bu
0e00: 73 79 5f 74 69 6d 65 6f 75 74 28 5f 73 71 6c 2c  sy_timeout(_sql,
0e10: 20 6e 54 69 6d 65 6f 75 74 4d 53 29 3b 0a 20 20   nTimeoutMS);.  
0e20: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
0e30: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
0e40: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
0e50: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  teLastError());.
0e60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
0e70: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  nal override boo
0e80: 6c 20 53 74 65 70 28 53 51 4c 69 74 65 53 74 61  l Step(SQLiteSta
0e90: 74 65 6d 65 6e 74 20 73 74 6d 74 29 0a 20 20 20  tement stmt).   
0ea0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
0eb0: 20 20 20 20 20 20 52 61 6e 64 6f 6d 20 72 6e 64        Random rnd
0ec0: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 75   = null;.      u
0ed0: 69 6e 74 20 73 74 61 72 74 74 69 63 6b 20 3d 20  int starttick = 
0ee0: 28 75 69 6e 74 29 45 6e 76 69 72 6f 6e 6d 65 6e  (uint)Environmen
0ef0: 74 2e 54 69 63 6b 43 6f 75 6e 74 3b 0a 20 20 20  t.TickCount;.   
0f00: 20 20 20 75 69 6e 74 20 74 69 6d 65 6f 75 74 20     uint timeout 
0f10: 3d 20 28 75 69 6e 74 29 28 73 74 6d 74 2e 5f 63  = (uint)(stmt._c
0f20: 6f 6d 6d 61 6e 64 2e 5f 63 6f 6d 6d 61 6e 64 54  ommand._commandT
0f30: 69 6d 65 6f 75 74 20 2a 20 31 30 30 30 29 3b 0a  imeout * 1000);.
0f40: 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 74 72  .      while (tr
0f50: 75 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ue).      {.    
0f60: 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61      n = UnsafeNa
0f70: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
0f80: 74 65 33 5f 73 74 65 70 28 73 74 6d 74 2e 5f 73  te3_step(stmt._s
0f90: 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 0a 20 20  qlite_stmt);..  
0fa0: 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20 31        if (n == 1
0fb0: 30 30 29 20 72 65 74 75 72 6e 20 74 72 75 65 3b  00) return true;
0fc0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d  .        if (n =
0fd0: 3d 20 31 30 31 29 20 72 65 74 75 72 6e 20 66 61  = 101) return fa
0fe0: 6c 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  lse;..        if
0ff0: 20 28 6e 20 3e 20 30 29 0a 20 20 20 20 20 20 20   (n > 0).       
1000: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
1010: 20 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   r;..          /
1020: 2f 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  / An error occur
1030: 72 65 64 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  red, attempt to 
1040: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 6d  reset the statem
1050: 65 6e 74 2e 20 20 49 66 20 74 68 65 20 72 65 73  ent.  If the res
1060: 65 74 20 77 6f 72 6b 65 64 20 62 65 63 61 75 73  et worked becaus
1070: 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
1080: 2f 2f 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  // schema has ch
1090: 61 6e 67 65 64 2c 20 72 65 2d 74 72 79 20 74 68  anged, re-try th
10a0: 65 20 73 74 65 70 20 61 67 61 69 6e 2e 20 20 49  e step again.  I
10b0: 66 20 69 74 20 65 72 72 6f 72 65 64 20 6f 75 72  f it errored our
10c0: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 61 74   because the dat
10d0: 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  abase.          
10e0: 2f 2f 20 69 73 20 6c 6f 63 6b 65 64 2c 20 74 68  // is locked, th
10f0: 65 6e 20 6b 65 65 70 20 72 65 74 72 79 69 6e 67  en keep retrying
1100: 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6d 6d 61   until the comma
1110: 6e 64 20 74 69 6d 65 6f 75 74 20 6f 63 63 75 72  nd timeout occur
1120: 73 2e 0a 20 20 20 20 20 20 20 20 20 20 72 20 3d  s..          r =
1130: 20 52 65 73 65 74 28 73 74 6d 74 29 3b 0a 0a 20   Reset(stmt);.. 
1140: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 20 3d           if (r =
1150: 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  = 0).           
1160: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
1170: 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51  eException(n, SQ
1180: 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29  LiteLastError())
1190: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  ;..          els
11a0: 65 20 69 66 20 28 28 72 20 3d 3d 20 36 20 7c 7c  e if ((r == 6 ||
11b0: 20 72 20 3d 3d 20 35 29 20 26 26 20 73 74 6d 74   r == 5) && stmt
11c0: 2e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 6e 75 6c  ._command != nul
11d0: 6c 29 20 2f 2f 20 53 51 4c 49 54 45 5f 4c 4f 43  l) // SQLITE_LOC
11e0: 4b 45 44 20 7c 7c 20 53 51 4c 49 54 45 5f 42 55  KED || SQLITE_BU
11f0: 53 59 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20  SY.          {. 
1200: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4b 65             // Ke
1210: 65 70 20 74 72 79 69 6e 67 0a 20 20 20 20 20 20  ep trying.      
1220: 20 20 20 20 20 20 69 66 20 28 72 6e 64 20 3d 3d        if (rnd ==
1230: 20 6e 75 6c 6c 29 20 2f 2f 20 46 69 72 73 74 20   null) // First 
1240: 74 69 6d 65 20 77 65 27 76 65 20 65 6e 63 6f 75  time we've encou
1250: 6e 74 65 72 65 64 20 74 68 65 20 6c 6f 63 6b 0a  ntered the lock.
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6e                rn
1270: 64 20 3d 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29  d = new Random()
1280: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
1290: 2f 20 49 66 20 77 65 27 76 65 20 65 78 63 65 65  / If we've excee
12a0: 64 65 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 27  ded the command'
12b0: 73 20 74 69 6d 65 6f 75 74 2c 20 67 69 76 65 20  s timeout, give 
12c0: 75 70 20 61 6e 64 20 74 68 72 6f 77 20 61 6e 20  up and throw an 
12d0: 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
12e0: 20 20 69 66 20 28 28 75 69 6e 74 29 45 6e 76 69    if ((uint)Envi
12f0: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
1300: 74 20 2d 20 73 74 61 72 74 74 69 63 6b 20 3e 20  t - starttick > 
1310: 74 69 6d 65 6f 75 74 29 0a 20 20 20 20 20 20 20  timeout).       
1320: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1330: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53       throw new S
1340: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 72  QLiteException(r
1350: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
1360: 72 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r());.          
1370: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1380: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
1390: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
13a0: 20 2f 2f 20 4f 74 68 65 72 77 69 73 65 20 73 6c   // Otherwise sl
13b0: 65 65 70 20 66 6f 72 20 61 20 72 61 6e 64 6f 6d  eep for a random
13c0: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
13d0: 75 70 20 74 6f 20 32 35 30 6d 73 0a 20 20 20 20  up to 250ms.    
13e0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
13f0: 2e 54 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61  .Threading.Threa
1400: 64 2e 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e  d.CurrentThread.
1410: 4a 6f 69 6e 28 72 6e 64 2e 4e 65 78 74 28 31 2c  Join(rnd.Next(1,
1420: 20 32 35 30 29 29 3b 0a 20 20 20 20 20 20 20 20   250));.        
1430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1440: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1450: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1460: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
1470: 20 69 6e 74 20 52 65 73 65 74 28 53 51 4c 69 74   int Reset(SQLit
1480: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 29  eStatement stmt)
1490: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
14a0: 20 6e 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   n;..#if !SQLITE
14b0: 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20  _STANDARD.      
14c0: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
14d0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
14e0: 72 65 73 65 74 5f 69 6e 74 65 72 6f 70 28 73 74  reset_interop(st
14f0: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29  mt._sqlite_stmt)
1500: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 6e 20  ;.#else.      n 
1510: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
1520: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65  thods.sqlite3_re
1530: 73 65 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  set(stmt._sqlite
1540: 5f 73 74 6d 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  _stmt);.#endif..
1550: 20 20 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20        // If the 
1560: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 64 2c 20  schema changed, 
1570: 74 72 79 20 61 6e 64 20 72 65 2d 70 72 65 70 61  try and re-prepa
1580: 72 65 20 69 74 0a 20 20 20 20 20 20 69 66 20 28  re it.      if (
1590: 6e 20 3d 3d 20 31 37 29 20 2f 2f 20 53 51 4c 49  n == 17) // SQLI
15a0: 54 45 5f 53 43 48 45 4d 41 0a 20 20 20 20 20 20  TE_SCHEMA.      
15b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 52 65 63  {.        // Rec
15c0: 72 65 61 74 65 20 61 20 64 75 6d 6d 79 20 73 74  reate a dummy st
15d0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
15e0: 73 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 20 20  string str;.    
15f0: 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69 74      using (SQLit
1600: 65 53 74 61 74 65 6d 65 6e 74 20 74 6d 70 20 3d  eStatement tmp =
1610: 20 50 72 65 70 61 72 65 28 6e 75 6c 6c 2c 20 73   Prepare(null, s
1620: 74 6d 74 2e 5f 73 71 6c 53 74 61 74 65 6d 65 6e  tmt._sqlStatemen
1630: 74 2c 20 6e 75 6c 6c 2c 20 28 75 69 6e 74 29 28  t, null, (uint)(
1640: 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64 2e 5f 63  stmt._command._c
1650: 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74 20 2a 20  ommandTimeout * 
1660: 31 30 30 30 29 2c 20 6f 75 74 20 73 74 72 29 29  1000), out str))
1670: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1680: 20 20 20 20 20 2f 2f 20 46 69 6e 61 6c 69 7a 65       // Finalize
1690: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 73 74   the existing st
16a0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
16b0: 20 20 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73    stmt._sqlite_s
16c0: 74 6d 74 2e 44 69 73 70 6f 73 65 28 29 3b 0a 20  tmt.Dispose();. 
16d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 61 73           // Reas
16e0: 73 69 67 6e 20 61 20 6e 65 77 20 73 74 61 74 65  sign a new state
16f0: 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  ment pointer to 
1700: 74 68 65 20 6f 6c 64 20 73 74 61 74 65 6d 65 6e  the old statemen
1710: 74 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  t and clear the 
1720: 74 65 6d 70 6f 72 61 72 79 20 6f 6e 65 0a 20 20  temporary one.  
1730: 20 20 20 20 20 20 20 20 73 74 6d 74 2e 5f 73 71          stmt._sq
1740: 6c 69 74 65 5f 73 74 6d 74 20 3d 20 74 6d 70 2e  lite_stmt = tmp.
1750: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 3b 0a 20 20  _sqlite_stmt;.  
1760: 20 20 20 20 20 20 20 20 74 6d 70 2e 5f 73 71 6c          tmp._sql
1770: 69 74 65 5f 73 74 6d 74 20 3d 20 6e 75 6c 6c 3b  ite_stmt = null;
1780: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52  ..          // R
1790: 65 61 70 70 6c 79 20 70 61 72 61 6d 65 74 65 72  eapply parameter
17a0: 73 0a 20 20 20 20 20 20 20 20 20 20 73 74 6d 74  s.          stmt
17b0: 2e 42 69 6e 64 50 61 72 61 6d 65 74 65 72 73 28  .BindParameters(
17c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17d0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 20       return -1; 
17e0: 2f 2f 20 52 65 73 65 74 20 77 61 73 20 4f 4b 2c  // Reset was OK,
17f0: 20 77 69 74 68 20 73 63 68 65 6d 61 20 63 68 61   with schema cha
1800: 6e 67 65 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nge.      }.    
1810: 20 20 65 6c 73 65 20 69 66 20 28 6e 20 3d 3d 20    else if (n == 
1820: 36 20 7c 7c 20 6e 20 3d 3d 20 35 29 20 2f 2f 20  6 || n == 5) // 
1830: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 7c 7c  SQLITE_LOCKED ||
1840: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20   SQLITE_BUSY.   
1850: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 0a       return n;..
1860: 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29        if (n > 0)
1870: 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e  .        throw n
1880: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
1890: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
18a0: 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20 20 20 20  Error());..     
18b0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2f 20 57 65   return 0; // We
18c0: 20 72 65 73 65 74 20 4f 4b 2c 20 6e 6f 20 73 63   reset OK, no sc
18d0: 68 65 6d 61 20 63 68 61 6e 67 65 73 0a 20 20 20  hema changes.   
18e0: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
18f0: 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67   override string
1900: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
1910: 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  ().    {.      r
1920: 65 74 75 72 6e 20 53 51 4c 69 74 65 42 61 73 65  eturn SQLiteBase
1930: 2e 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72  .SQLiteLastError
1940: 28 5f 73 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  (_sql);.    }.. 
1950: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
1960: 72 69 64 65 20 53 51 4c 69 74 65 53 74 61 74 65  ride SQLiteState
1970: 6d 65 6e 74 20 50 72 65 70 61 72 65 28 53 51 4c  ment Prepare(SQL
1980: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e  iteConnection cn
1990: 6e 2c 20 73 74 72 69 6e 67 20 73 74 72 53 71 6c  n, string strSql
19a0: 2c 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  , SQLiteStatemen
19b0: 74 20 70 72 65 76 69 6f 75 73 2c 20 75 69 6e 74  t previous, uint
19c0: 20 74 69 6d 65 6f 75 74 4d 53 2c 20 6f 75 74 20   timeoutMS, out 
19d0: 73 74 72 69 6e 67 20 73 74 72 52 65 6d 61 69 6e  string strRemain
19e0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 49 6e  ).    {.      In
19f0: 74 50 74 72 20 73 74 6d 74 20 3d 20 49 6e 74 50  tPtr stmt = IntP
1a00: 74 72 2e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 49  tr.Zero;.      I
1a10: 6e 74 50 74 72 20 70 74 72 20 3d 20 49 6e 74 50  ntPtr ptr = IntP
1a20: 74 72 2e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 69  tr.Zero;.      i
1a30: 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nt len = 0;.    
1a40: 20 20 69 6e 74 20 6e 20 3d 20 31 37 3b 0a 20 20    int n = 17;.  
1a50: 20 20 20 20 69 6e 74 20 72 65 74 72 69 65 73 20      int retries 
1a60: 3d 20 30 3b 0a 20 20 20 20 20 20 62 79 74 65 5b  = 0;.      byte[
1a70: 5d 20 62 20 3d 20 54 6f 55 54 46 38 28 73 74 72  ] b = ToUTF8(str
1a80: 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 74 72 69  Sql);.      stri
1a90: 6e 67 20 74 79 70 65 64 65 66 73 20 3d 20 6e 75  ng typedefs = nu
1aa0: 6c 6c 3b 0a 20 20 20 20 20 20 53 51 4c 69 74 65  ll;.      SQLite
1ab0: 53 74 61 74 65 6d 65 6e 74 20 63 6d 64 20 3d 20  Statement cmd = 
1ac0: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 52 61 6e 64  null;.      Rand
1ad0: 6f 6d 20 72 6e 64 20 3d 20 6e 75 6c 6c 3b 0a 20  om rnd = null;. 
1ae0: 20 20 20 20 20 75 69 6e 74 20 73 74 61 72 74 74       uint startt
1af0: 69 63 6b 20 3d 20 28 75 69 6e 74 29 45 6e 76 69  ick = (uint)Envi
1b00: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
1b10: 74 3b 0a 0a 20 20 20 20 20 20 47 43 48 61 6e 64  t;..      GCHand
1b20: 6c 65 20 68 61 6e 64 6c 65 20 3d 20 47 43 48 61  le handle = GCHa
1b30: 6e 64 6c 65 2e 41 6c 6c 6f 63 28 62 2c 20 47 43  ndle.Alloc(b, GC
1b40: 48 61 6e 64 6c 65 54 79 70 65 2e 50 69 6e 6e 65  HandleType.Pinne
1b50: 64 29 3b 0a 20 20 20 20 20 20 49 6e 74 50 74 72  d);.      IntPtr
1b60: 20 70 73 71 6c 20 3d 20 68 61 6e 64 6c 65 2e 41   psql = handle.A
1b70: 64 64 72 4f 66 50 69 6e 6e 65 64 4f 62 6a 65 63  ddrOfPinnedObjec
1b80: 74 28 29 3b 0a 20 20 20 20 20 20 74 72 79 0a 20  t();.      try. 
1b90: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 77       {.        w
1ba0: 68 69 6c 65 20 28 28 6e 20 3d 3d 20 31 37 20 7c  hile ((n == 17 |
1bb0: 7c 20 6e 20 3d 3d 20 36 20 7c 7c 20 6e 20 3d 3d  | n == 6 || n ==
1bc0: 20 35 29 20 26 26 20 72 65 74 72 69 65 73 20 3c   5) && retries <
1bd0: 20 33 29 0a 20 20 20 20 20 20 20 20 7b 0a 23 69   3).        {.#i
1be0: 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  f !SQLITE_STANDA
1bf0: 52 44 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  RD.          n =
1c00: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
1c10: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 70 72 65  hods.sqlite3_pre
1c20: 70 61 72 65 5f 69 6e 74 65 72 6f 70 28 5f 73 71  pare_interop(_sq
1c30: 6c 2c 20 70 73 71 6c 2c 20 62 2e 4c 65 6e 67 74  l, psql, b.Lengt
1c40: 68 20 2d 20 31 2c 20 6f 75 74 20 73 74 6d 74 2c  h - 1, out stmt,
1c50: 20 6f 75 74 20 70 74 72 2c 20 6f 75 74 20 6c 65   out ptr, out le
1c60: 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  n);.#else.      
1c70: 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61      n = UnsafeNa
1c80: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
1c90: 74 65 33 5f 70 72 65 70 61 72 65 28 5f 73 71 6c  te3_prepare(_sql
1ca0: 2c 20 70 73 71 6c 2c 20 62 2e 4c 65 6e 67 74 68  , psql, b.Length
1cb0: 20 2d 20 31 2c 20 6f 75 74 20 73 74 6d 74 2c 20   - 1, out stmt, 
1cc0: 6f 75 74 20 70 74 72 29 3b 0a 20 20 20 20 20 20  out ptr);.      
1cd0: 20 20 20 20 6c 65 6e 20 3d 20 2d 31 3b 0a 23 65      len = -1;.#e
1ce0: 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 20 20  ndif..          
1cf0: 69 66 20 28 6e 20 3d 3d 20 31 37 29 0a 20 20 20  if (n == 17).   
1d00: 20 20 20 20 20 20 20 20 20 72 65 74 72 69 65 73           retries
1d10: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c  ++;.          el
1d20: 73 65 20 69 66 20 28 6e 20 3d 3d 20 31 29 0a 20  se if (n == 1). 
1d30: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1d40: 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e         if (Strin
1d50: 67 2e 43 6f 6d 70 61 72 65 28 53 51 4c 69 74 65  g.Compare(SQLite
1d60: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 22 6e 65  LastError(), "ne
1d70: 61 72 20 5c 22 54 59 50 45 53 5c 22 3a 20 73 79  ar \"TYPES\": sy
1d80: 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 53 74 72  ntax error", Str
1d90: 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72  ingComparison.Or
1da0: 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29  dinalIgnoreCase)
1db0: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20   == 0).         
1dc0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
1dd0: 20 20 20 69 6e 74 20 70 6f 73 20 3d 20 73 74 72     int pos = str
1de0: 53 71 6c 2e 49 6e 64 65 78 4f 66 28 27 3b 27 29  Sql.IndexOf(';')
1df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e00: 69 66 20 28 70 6f 73 20 3d 3d 20 2d 31 29 20 70  if (pos == -1) p
1e10: 6f 73 20 3d 20 73 74 72 53 71 6c 2e 4c 65 6e 67  os = strSql.Leng
1e20: 74 68 20 2d 20 31 3b 0a 0a 20 20 20 20 20 20 20  th - 1;..       
1e30: 20 20 20 20 20 20 20 74 79 70 65 64 65 66 73 20         typedefs 
1e40: 3d 20 73 74 72 53 71 6c 2e 53 75 62 73 74 72 69  = strSql.Substri
1e50: 6e 67 28 30 2c 20 70 6f 73 20 2b 20 31 29 3b 0a  ng(0, pos + 1);.
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1e70: 72 53 71 6c 20 3d 20 73 74 72 53 71 6c 2e 53 75  rSql = strSql.Su
1e80: 62 73 74 72 69 6e 67 28 70 6f 73 20 2b 20 31 29  bstring(pos + 1)
1e90: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1ea0: 20 73 74 72 52 65 6d 61 69 6e 20 3d 20 22 22 3b   strRemain = "";
1eb0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec0: 77 68 69 6c 65 20 28 63 6d 64 20 3d 3d 20 6e 75  while (cmd == nu
1ed0: 6c 6c 20 26 26 20 73 74 72 53 71 6c 2e 4c 65 6e  ll && strSql.Len
1ee0: 67 74 68 20 3e 20 30 29 0a 20 20 20 20 20 20 20  gth > 0).       
1ef0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1f00: 20 20 20 20 20 20 20 20 20 63 6d 64 20 3d 20 50           cmd = P
1f10: 72 65 70 61 72 65 28 63 6e 6e 2c 20 73 74 72 53  repare(cnn, strS
1f20: 71 6c 2c 20 70 72 65 76 69 6f 75 73 2c 20 74 69  ql, previous, ti
1f30: 6d 65 6f 75 74 4d 53 2c 20 6f 75 74 20 73 74 72  meoutMS, out str
1f40: 52 65 6d 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  Remain);.       
1f50: 20 20 20 20 20 20 20 20 20 73 74 72 53 71 6c 20           strSql 
1f60: 3d 20 73 74 72 52 65 6d 61 69 6e 3b 0a 20 20 20  = strRemain;.   
1f70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1f90: 63 6d 64 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20  cmd != null).   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64               cmd
1fb0: 2e 53 65 74 54 79 70 65 73 28 74 79 70 65 64 65  .SetTypes(typede
1fc0: 66 73 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  fs);..          
1fd0: 20 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0a      return cmd;.
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 69              }.#i
1ff0: 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  f !PLATFORM_COMP
2000: 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20  ACTFRAMEWORK.   
2010: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
2020: 20 28 5f 62 75 69 6c 64 69 6e 67 53 63 68 65 6d   (_buildingSchem
2030: 61 20 3d 3d 20 66 61 6c 73 65 20 26 26 20 53 74  a == false && St
2040: 72 69 6e 67 2e 43 6f 6d 70 61 72 65 28 53 51 4c  ring.Compare(SQL
2050: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  iteLastError(), 
2060: 30 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  0, "no such tabl
2070: 65 3a 20 54 45 4d 50 2e 53 43 48 45 4d 41 22 2c  e: TEMP.SCHEMA",
2080: 20 30 2c 20 32 36 2c 20 53 74 72 69 6e 67 43 6f   0, 26, StringCo
2090: 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c  mparison.Ordinal
20a0: 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20 30  IgnoreCase) == 0
20b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a  ).            {.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
20d0: 72 52 65 6d 61 69 6e 20 3d 20 22 22 3b 0a 20 20  rRemain = "";.  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 62 75 69              _bui
20f0: 6c 64 69 6e 67 53 63 68 65 6d 61 20 3d 20 74 72  ldingSchema = tr
2100: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2110: 20 20 74 72 79 0a 20 20 20 20 20 20 20 20 20 20    try.          
2120: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2130: 20 20 20 20 20 20 49 53 51 4c 69 74 65 53 63 68        ISQLiteSch
2140: 65 6d 61 45 78 74 65 6e 73 69 6f 6e 73 20 65 78  emaExtensions ex
2150: 74 20 3d 20 28 28 49 53 65 72 76 69 63 65 50 72  t = ((IServicePr
2160: 6f 76 69 64 65 72 29 53 51 4c 69 74 65 46 61 63  ovider)SQLiteFac
2170: 74 6f 72 79 2e 49 6e 73 74 61 6e 63 65 29 2e 47  tory.Instance).G
2180: 65 74 53 65 72 76 69 63 65 28 74 79 70 65 6f 66  etService(typeof
2190: 28 49 53 51 4c 69 74 65 53 63 68 65 6d 61 45 78  (ISQLiteSchemaEx
21a0: 74 65 6e 73 69 6f 6e 73 29 29 20 61 73 20 49 53  tensions)) as IS
21b0: 51 4c 69 74 65 53 63 68 65 6d 61 45 78 74 65 6e  QLiteSchemaExten
21c0: 73 69 6f 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  sions;..        
21d0: 20 20 20 20 20 20 20 20 69 66 20 28 65 78 74 20          if (ext 
21e0: 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20  != null).       
21f0: 20 20 20 20 20 20 20 20 20 20 20 65 78 74 2e 42             ext.B
2200: 75 69 6c 64 54 65 6d 70 53 63 68 65 6d 61 28 63  uildTempSchema(c
2210: 6e 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  nn);..          
2220: 20 20 20 20 20 20 77 68 69 6c 65 20 28 63 6d 64        while (cmd
2230: 20 3d 3d 20 6e 75 6c 6c 20 26 26 20 73 74 72 53   == null && strS
2240: 71 6c 2e 4c 65 6e 67 74 68 20 3e 20 30 29 0a 20  ql.Length > 0). 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2270: 20 20 20 63 6d 64 20 3d 20 50 72 65 70 61 72 65     cmd = Prepare
2280: 28 63 6e 6e 2c 20 73 74 72 53 71 6c 2c 20 70 72  (cnn, strSql, pr
2290: 65 76 69 6f 75 73 2c 20 74 69 6d 65 6f 75 74 4d  evious, timeoutM
22a0: 53 2c 20 6f 75 74 20 73 74 72 52 65 6d 61 69 6e  S, out strRemain
22b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
22c0: 20 20 20 20 20 73 74 72 53 71 6c 20 3d 20 73 74       strSql = st
22d0: 72 52 65 6d 61 69 6e 3b 0a 20 20 20 20 20 20 20  rRemain;.       
22e0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2300: 72 6e 20 63 6d 64 3b 0a 20 20 20 20 20 20 20 20  rn cmd;.        
2310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2320: 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0a 20 20        finally.  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 62                _b
2350: 75 69 6c 64 69 6e 67 53 63 68 65 6d 61 20 3d 20  uildingSchema = 
2360: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20  false;.         
2370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2380: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23a0: 20 20 65 6c 73 65 20 69 66 20 28 6e 20 3d 3d 20    else if (n == 
23b0: 36 20 7c 7c 20 6e 20 3d 3d 20 35 29 20 2f 2f 20  6 || n == 5) // 
23c0: 4c 6f 63 6b 65 64 20 2d 2d 20 64 65 6c 61 79 20  Locked -- delay 
23d0: 61 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 62  a small amount b
23e0: 65 66 6f 72 65 20 72 65 74 72 79 69 6e 67 0a 20  efore retrying. 
23f0: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
2400: 20 20 20 20 20 20 20 2f 2f 20 4b 65 65 70 20 74         // Keep t
2410: 72 79 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rying.          
2420: 20 20 69 66 20 28 72 6e 64 20 3d 3d 20 6e 75 6c    if (rnd == nul
2430: 6c 29 20 2f 2f 20 46 69 72 73 74 20 74 69 6d 65  l) // First time
2440: 20 77 65 27 76 65 20 65 6e 63 6f 75 6e 74 65 72   we've encounter
2450: 65 64 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20 20  ed the lock.    
2460: 20 20 20 20 20 20 20 20 20 20 72 6e 64 20 3d 20            rnd = 
2470: 6e 65 77 20 52 61 6e 64 6f 6d 28 29 3b 0a 0a 20  new Random();.. 
2480: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 66             // If
2490: 20 77 65 27 76 65 20 65 78 63 65 65 64 65 64 20   we've exceeded 
24a0: 74 68 65 20 63 6f 6d 6d 61 6e 64 27 73 20 74 69  the command's ti
24b0: 6d 65 6f 75 74 2c 20 67 69 76 65 20 75 70 20 61  meout, give up a
24c0: 6e 64 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  nd throw an erro
24d0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  r.            if
24e0: 20 28 28 75 69 6e 74 29 45 6e 76 69 72 6f 6e 6d   ((uint)Environm
24f0: 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20  ent.TickCount - 
2500: 73 74 61 72 74 74 69 63 6b 20 3e 20 74 69 6d 65  starttick > time
2510: 6f 75 74 4d 53 29 0a 20 20 20 20 20 20 20 20 20  outMS).         
2520: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
2530: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c     throw new SQL
2540: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
2550: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
2560: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2570: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  }.            el
2580: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  se.            {
2590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
25a0: 2f 20 4f 74 68 65 72 77 69 73 65 20 73 6c 65 65  / Otherwise slee
25b0: 70 20 66 6f 72 20 61 20 72 61 6e 64 6f 6d 20 61  p for a random a
25c0: 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 75 70  mount of time up
25d0: 20 74 6f 20 32 35 30 6d 73 0a 20 20 20 20 20 20   to 250ms.      
25e0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54          System.T
25f0: 68 72 65 61 64 69 6e 67 2e 54 68 72 65 61 64 2e  hreading.Thread.
2600: 43 75 72 72 65 6e 74 54 68 72 65 61 64 2e 4a 6f  CurrentThread.Jo
2610: 69 6e 28 72 6e 64 2e 4e 65 78 74 28 31 2c 20 32  in(rnd.Next(1, 2
2620: 35 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  50));.          
2630: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2640: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2650: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
2660: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
2670: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
2680: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a  eLastError());..
2690: 20 20 20 20 20 20 20 20 73 74 72 52 65 6d 61 69          strRemai
26a0: 6e 20 3d 20 55 54 46 38 54 6f 53 74 72 69 6e 67  n = UTF8ToString
26b0: 28 70 74 72 2c 20 6c 65 6e 29 3b 0a 0a 20 20 20  (ptr, len);..   
26c0: 20 20 20 20 20 69 66 20 28 73 74 6d 74 20 21 3d       if (stmt !=
26d0: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 20 63 6d   IntPtr.Zero) cm
26e0: 64 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 53 74  d = new SQLiteSt
26f0: 61 74 65 6d 65 6e 74 28 74 68 69 73 2c 20 73 74  atement(this, st
2700: 6d 74 2c 20 73 74 72 53 71 6c 2e 53 75 62 73 74  mt, strSql.Subst
2710: 72 69 6e 67 28 30 2c 20 73 74 72 53 71 6c 2e 4c  ring(0, strSql.L
2720: 65 6e 67 74 68 20 2d 20 73 74 72 52 65 6d 61 69  ength - strRemai
2730: 6e 2e 4c 65 6e 67 74 68 29 2c 20 70 72 65 76 69  n.Length), previ
2740: 6f 75 73 29 3b 0a 0a 20 20 20 20 20 20 20 20 72  ous);..        r
2750: 65 74 75 72 6e 20 63 6d 64 3b 0a 20 20 20 20 20  eturn cmd;.     
2760: 20 7d 0a 20 20 20 20 20 20 66 69 6e 61 6c 6c 79   }.      finally
2770: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2780: 20 68 61 6e 64 6c 65 2e 46 72 65 65 28 29 3b 0a   handle.Free();.
2790: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
27a0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
27b0: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 44  ride void Bind_D
27c0: 6f 75 62 6c 65 28 53 51 4c 69 74 65 53 74 61 74  ouble(SQLiteStat
27d0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
27e0: 69 6e 64 65 78 2c 20 64 6f 75 62 6c 65 20 76 61  index, double va
27f0: 6c 75 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 21  lue).    {.#if !
2800: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
2810: 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 20 20  FRAMEWORK.      
2820: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
2830: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
2840: 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
2850: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
2860: 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75 65 29  t, index, value)
2870: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 6e  ;.#else.      in
2880: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
2890: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
28a0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 5f 69 6e  3_bind_double_in
28b0: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
28c0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
28d0: 72 65 66 20 76 61 6c 75 65 29 3b 0a 23 65 6e 64  ref value);.#end
28e0: 69 66 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  if.      if (n >
28f0: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
2900: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
2910: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
2920: 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ());.    }..    
2930: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2940: 65 20 76 6f 69 64 20 42 69 6e 64 5f 49 6e 74 33  e void Bind_Int3
2950: 32 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  2(SQLiteStatemen
2960: 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65  t stmt, int inde
2970: 78 2c 20 69 6e 74 20 76 61 6c 75 65 29 0a 20 20  x, int value).  
2980: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20    {.      int n 
2990: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
29a0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69  thods.sqlite3_bi
29b0: 6e 64 5f 69 6e 74 28 73 74 6d 74 2e 5f 73 71 6c  nd_int(stmt._sql
29c0: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c  ite_stmt, index,
29d0: 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69   value);.      i
29e0: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
29f0: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
2a00: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
2a10: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
2a20: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
2a30: 76 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e  verride void Bin
2a40: 64 5f 49 6e 74 36 34 28 53 51 4c 69 74 65 53 74  d_Int64(SQLiteSt
2a50: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
2a60: 74 20 69 6e 64 65 78 2c 20 6c 6f 6e 67 20 76 61  t index, long va
2a70: 6c 75 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 21  lue).    {.#if !
2a80: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
2a90: 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 20 20  FRAMEWORK.      
2aa0: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
2ab0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
2ac0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 73  te3_bind_int64(s
2ad0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
2ae0: 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75 65 29 3b  , index, value);
2af0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 6e 74  .#else.      int
2b00: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
2b10: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
2b20: 5f 62 69 6e 64 5f 69 6e 74 36 34 5f 69 6e 74 65  _bind_int64_inte
2b30: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
2b40: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 72 65  _stmt, index, re
2b50: 66 20 76 61 6c 75 65 29 3b 0a 23 65 6e 64 69 66  f value);.#endif
2b60: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
2b70: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
2b80: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
2b90: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
2ba0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
2bb0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
2bc0: 76 6f 69 64 20 42 69 6e 64 5f 54 65 78 74 28 53  void Bind_Text(S
2bd0: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
2be0: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20  tmt, int index, 
2bf0: 73 74 72 69 6e 67 20 76 61 6c 75 65 29 0a 20 20  string value).  
2c00: 20 20 7b 0a 20 20 20 20 20 20 62 79 74 65 5b 5d    {.      byte[]
2c10: 20 62 20 3d 20 54 6f 55 54 46 38 28 76 61 6c 75   b = ToUTF8(valu
2c20: 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  e);.      int n 
2c30: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
2c40: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69  thods.sqlite3_bi
2c50: 6e 64 5f 74 65 78 74 28 73 74 6d 74 2e 5f 73 71  nd_text(stmt._sq
2c60: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
2c70: 2c 20 62 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20  , b, b.Length - 
2c80: 31 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29  1, (IntPtr)(-1))
2c90: 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20  ;.      if (n > 
2ca0: 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c  0) throw new SQL
2cb0: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
2cc0: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
2cd0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ));.    }..    i
2ce0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
2cf0: 20 76 6f 69 64 20 42 69 6e 64 5f 44 61 74 65 54   void Bind_DateT
2d00: 69 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ime(SQLiteStatem
2d10: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
2d20: 64 65 78 2c 20 44 61 74 65 54 69 6d 65 20 64 74  dex, DateTime dt
2d30: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 62 79  ).    {.      by
2d40: 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46 38 28  te[] b = ToUTF8(
2d50: 64 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  dt);.      int n
2d60: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
2d70: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62  ethods.sqlite3_b
2d80: 69 6e 64 5f 74 65 78 74 28 73 74 6d 74 2e 5f 73  ind_text(stmt._s
2d90: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
2da0: 78 2c 20 62 2c 20 62 2e 4c 65 6e 67 74 68 20 2d  x, b, b.Length -
2db0: 20 31 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29   1, (IntPtr)(-1)
2dc0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  );.      if (n >
2dd0: 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51   0) throw new SQ
2de0: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c  LiteException(n,
2df0: 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72   SQLiteLastError
2e00: 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ());.    }..    
2e10: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
2e20: 65 20 76 6f 69 64 20 42 69 6e 64 5f 42 6c 6f 62  e void Bind_Blob
2e30: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
2e40: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
2e50: 2c 20 62 79 74 65 5b 5d 20 62 6c 6f 62 44 61 74  , byte[] blobDat
2e60: 61 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  a).    {.      i
2e70: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
2e80: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
2e90: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 73 74 6d  e3_bind_blob(stm
2ea0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
2eb0: 69 6e 64 65 78 2c 20 62 6c 6f 62 44 61 74 61 2c  index, blobData,
2ec0: 20 62 6c 6f 62 44 61 74 61 2e 4c 65 6e 67 74 68   blobData.Length
2ed0: 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b  , (IntPtr)(-1));
2ee0: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
2ef0: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
2f00: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
2f10: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
2f20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
2f30: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
2f40: 76 6f 69 64 20 42 69 6e 64 5f 4e 75 6c 6c 28 53  void Bind_Null(S
2f50: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
2f60: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
2f70: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
2f80: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
2f90: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
2fa0: 62 69 6e 64 5f 6e 75 6c 6c 28 73 74 6d 74 2e 5f  bind_null(stmt._
2fb0: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2fc0: 65 78 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e  ex);.      if (n
2fd0: 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20   > 0) throw new 
2fe0: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
2ff0: 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  n, SQLiteLastErr
3000: 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  or());.    }..  
3010: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3020: 69 64 65 20 69 6e 74 20 42 69 6e 64 5f 50 61 72  ide int Bind_Par
3030: 61 6d 43 6f 75 6e 74 28 53 51 4c 69 74 65 53 74  amCount(SQLiteSt
3040: 61 74 65 6d 65 6e 74 20 73 74 6d 74 29 0a 20 20  atement stmt).  
3050: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e    {.      return
3060: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
3070: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e  hods.sqlite3_bin
3080: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
3090: 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  t(stmt._sqlite_s
30a0: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tmt);.    }..   
30b0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
30c0: 64 65 20 73 74 72 69 6e 67 20 42 69 6e 64 5f 50  de string Bind_P
30d0: 61 72 61 6d 4e 61 6d 65 28 53 51 4c 69 74 65 53  aramName(SQLiteS
30e0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
30f0: 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a  nt index).    {.
3100: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
3110: 44 41 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c  DARD.      int l
3120: 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  en;.      return
3130: 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e   UTF8ToString(Un
3140: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
3150: 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  s.sqlite3_bind_p
3160: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 5f 69 6e  arameter_name_in
3170: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
3180: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
3190: 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a  out len), len);.
31a0: 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75  #else.      retu
31b0: 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rn UTF8ToString(
31c0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
31d0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64  ods.sqlite3_bind
31e0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
31f0: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3200: 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0a  t, index), -1);.
3210: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
3220: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3230: 69 64 65 20 69 6e 74 20 42 69 6e 64 5f 50 61 72  ide int Bind_Par
3240: 61 6d 49 6e 64 65 78 28 53 51 4c 69 74 65 53 74  amIndex(SQLiteSt
3250: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 73 74  atement stmt, st
3260: 72 69 6e 67 20 70 61 72 61 6d 4e 61 6d 65 29 0a  ring paramName).
3270: 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75      {.      retu
3280: 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  rn UnsafeNativeM
3290: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62  ethods.sqlite3_b
32a0: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
32b0: 64 65 78 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  dex(stmt._sqlite
32c0: 5f 73 74 6d 74 2c 20 54 6f 55 54 46 38 28 70 61  _stmt, ToUTF8(pa
32d0: 72 61 6d 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ramName));.    }
32e0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
32f0: 76 65 72 72 69 64 65 20 69 6e 74 20 43 6f 6c 75  verride int Colu
3300: 6d 6e 43 6f 75 6e 74 28 53 51 4c 69 74 65 53 74  mnCount(SQLiteSt
3310: 61 74 65 6d 65 6e 74 20 73 74 6d 74 29 0a 20 20  atement stmt).  
3320: 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e    {.      return
3330: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
3340: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
3350: 75 6d 6e 5f 63 6f 75 6e 74 28 73 74 6d 74 2e 5f  umn_count(stmt._
3360: 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 20 20  sqlite_stmt);.  
3370: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
3380: 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e  l override strin
3390: 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 53 51 4c  g ColumnName(SQL
33a0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
33b0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
33c0: 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    {.#if !SQLITE_
33d0: 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 69  STANDARD.      i
33e0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65  nt len;.      re
33f0: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
3400: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
3410: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
3420: 6c 75 6d 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  lumn_name_intero
3430: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
3440: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
3450: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73  len), len);.#els
3460: 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  e.      return U
3470: 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  TF8ToString(Unsa
3480: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3490: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
34a0: 61 6d 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  ame(stmt._sqlite
34b0: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 2d  _stmt, index), -
34c0: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
34d0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
34e0: 76 65 72 72 69 64 65 20 54 79 70 65 41 66 66 69  verride TypeAffi
34f0: 6e 69 74 79 20 43 6f 6c 75 6d 6e 41 66 66 69 6e  nity ColumnAffin
3500: 69 74 79 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ity(SQLiteStatem
3510: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
3520: 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  dex).    {.     
3530: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
3540: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3550: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
3560: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3570: 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 7d  t, index);.    }
3580: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
3590: 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 43  verride string C
35a0: 6f 6c 75 6d 6e 54 79 70 65 28 53 51 4c 69 74 65  olumnType(SQLite
35b0: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
35c0: 69 6e 74 20 69 6e 64 65 78 2c 20 6f 75 74 20 54  int index, out T
35d0: 79 70 65 41 66 66 69 6e 69 74 79 20 6e 41 66 66  ypeAffinity nAff
35e0: 69 6e 69 74 79 29 0a 20 20 20 20 7b 0a 20 20 20  inity).    {.   
35f0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 23 69 66 20     int len;.#if 
3600: 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44  !SQLITE_STANDARD
3610: 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 20  .      IntPtr p 
3620: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
3630: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
3640: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 5f 69 6e  lumn_decltype_in
3650: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
3660: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
3670: 6f 75 74 20 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  out len);.#else.
3680: 20 20 20 20 20 20 6c 65 6e 20 3d 20 2d 31 3b 0a        len = -1;.
3690: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 20 3d        IntPtr p =
36a0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
36b0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
36c0: 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28 73 74 6d  umn_decltype(stm
36d0: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
36e0: 69 6e 64 65 78 29 3b 0a 23 65 6e 64 69 66 0a 20  index);.#endif. 
36f0: 20 20 20 20 20 6e 41 66 66 69 6e 69 74 79 20 3d       nAffinity =
3700: 20 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28   ColumnAffinity(
3710: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 0a 20  stmt, index);.. 
3720: 20 20 20 20 20 69 66 20 28 70 20 21 3d 20 49 6e       if (p != In
3730: 74 50 74 72 2e 5a 65 72 6f 29 20 72 65 74 75 72  tPtr.Zero) retur
3740: 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 70  n UTF8ToString(p
3750: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 65 6c  , len);.      el
3760: 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  se.      {.     
3770: 20 20 20 73 74 72 69 6e 67 5b 5d 20 61 72 20 3d     string[] ar =
3780: 20 73 74 6d 74 2e 54 79 70 65 44 65 66 69 6e 69   stmt.TypeDefini
3790: 74 69 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 69  tions;.        i
37a0: 66 20 28 61 72 20 21 3d 20 6e 75 6c 6c 29 0a 20  f (ar != null). 
37b0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
37c0: 20 20 20 69 66 20 28 69 6e 64 65 78 20 3c 20 61     if (index < a
37d0: 72 2e 4c 65 6e 67 74 68 20 26 26 20 61 72 5b 69  r.Length && ar[i
37e0: 6e 64 65 78 5d 20 21 3d 20 6e 75 6c 6c 29 0a 20  ndex] != null). 
37f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3800: 6e 20 61 72 5b 69 6e 64 65 78 5d 3b 0a 20 20 20  n ar[index];.   
3810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
3820: 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 45 6d 70  eturn String.Emp
3830: 74 79 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 73  ty;..        //s
3840: 77 69 74 63 68 20 28 6e 41 66 66 69 6e 69 74 79  witch (nAffinity
3850: 29 0a 20 20 20 20 20 20 20 20 2f 2f 7b 0a 20 20  ).        //{.  
3860: 20 20 20 20 20 20 2f 2f 20 20 63 61 73 65 20 54        //  case T
3870: 79 70 65 41 66 66 69 6e 69 74 79 2e 49 6e 74 36  ypeAffinity.Int6
3880: 34 3a 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20  4:.        //   
3890: 20 72 65 74 75 72 6e 20 22 42 49 47 49 4e 54 22   return "BIGINT"
38a0: 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 63 61  ;.        //  ca
38b0: 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  se TypeAffinity.
38c0: 44 6f 75 62 6c 65 3a 0a 20 20 20 20 20 20 20 20  Double:.        
38d0: 2f 2f 20 20 20 20 72 65 74 75 72 6e 20 22 44 4f  //    return "DO
38e0: 55 42 4c 45 22 3b 0a 20 20 20 20 20 20 20 20 2f  UBLE";.        /
38f0: 2f 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69  /  case TypeAffi
3900: 6e 69 74 79 2e 42 6c 6f 62 3a 0a 20 20 20 20 20  nity.Blob:.     
3910: 20 20 20 2f 2f 20 20 20 20 72 65 74 75 72 6e 20     //    return 
3920: 22 42 4c 4f 42 22 3b 0a 20 20 20 20 20 20 20 20  "BLOB";.        
3930: 2f 2f 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20  //  default:.   
3940: 20 20 20 20 20 2f 2f 20 20 20 20 72 65 74 75 72       //    retur
3950: 6e 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20  n "TEXT";.      
3960: 20 20 2f 2f 7d 0a 20 20 20 20 20 20 7d 0a 20 20    //}.      }.  
3970: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
3980: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43  l override int C
3990: 6f 6c 75 6d 6e 49 6e 64 65 78 28 53 51 4c 69 74  olumnIndex(SQLit
39a0: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
39b0: 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 4e 61   string columnNa
39c0: 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  me).    {.      
39d0: 69 6e 74 20 78 20 3d 20 43 6f 6c 75 6d 6e 43 6f  int x = ColumnCo
39e0: 75 6e 74 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20  unt(stmt);..    
39f0: 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30    for (int n = 0
3a00: 3b 20 6e 20 3c 20 78 3b 20 6e 2b 2b 29 0a 20 20  ; n < x; n++).  
3a10: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66      {.        if
3a20: 20 28 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65   (String.Compare
3a30: 28 63 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 43 6f 6c  (columnName, Col
3a40: 75 6d 6e 4e 61 6d 65 28 73 74 6d 74 2c 20 6e 29  umnName(stmt, n)
3a50: 2c 20 74 72 75 65 2c 20 43 75 6c 74 75 72 65 49  , true, CultureI
3a60: 6e 66 6f 2e 49 6e 76 61 72 69 61 6e 74 43 75 6c  nfo.InvariantCul
3a70: 74 75 72 65 29 20 3d 3d 20 30 29 0a 20 20 20 20  ture) == 0).    
3a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a        return n;.
3a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
3aa0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
3ab0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
3ac0: 72 72 69 64 65 20 73 74 72 69 6e 67 20 43 6f 6c  rride string Col
3ad0: 75 6d 6e 4f 72 69 67 69 6e 61 6c 4e 61 6d 65 28  umnOriginalName(
3ae0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
3af0: 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29  stmt, int index)
3b00: 0a 20 20 20 20 7b 0a 23 69 66 20 21 53 51 4c 49  .    {.#if !SQLI
3b10: 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20  TE_STANDARD.    
3b20: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20    int len;.     
3b30: 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74   return UTF8ToSt
3b40: 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76  ring(UnsafeNativ
3b50: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
3b60: 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
3b70: 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ame_interop(stmt
3b80: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
3b90: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20  ndex, out len), 
3ba0: 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  len);.#else.    
3bb0: 20 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53    return UTF8ToS
3bc0: 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69  tring(UnsafeNati
3bd0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
3be0: 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
3bf0: 6e 61 6d 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74  name(stmt._sqlit
3c00: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20  e_stmt, index), 
3c10: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
3c20: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3c30: 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20  override string 
3c40: 43 6f 6c 75 6d 6e 44 61 74 61 62 61 73 65 4e 61  ColumnDatabaseNa
3c50: 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  me(SQLiteStateme
3c60: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
3c70: 65 78 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53  ex).    {.#if !S
3c80: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20  QLITE_STANDARD. 
3c90: 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20       int len;.  
3ca0: 20 20 20 20 72 65 74 75 72 6e 20 55 54 46 38 54      return UTF8T
3cb0: 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61  oString(UnsafeNa
3cc0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
3cd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
3ce0: 61 73 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70  ase_name_interop
3cf0: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
3d00: 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c  mt, index, out l
3d10: 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73 65  en), len);.#else
3d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54  .      return UT
3d30: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
3d40: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3d50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
3d60: 74 61 62 61 73 65 5f 6e 61 6d 65 28 73 74 6d 74  tabase_name(stmt
3d70: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
3d80: 6e 64 65 78 29 2c 20 2d 31 29 3b 0a 23 65 6e 64  ndex), -1);.#end
3d90: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  if.    }..    in
3da0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
3db0: 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 54 61 62  string ColumnTab
3dc0: 6c 65 4e 61 6d 65 28 53 51 4c 69 74 65 53 74 61  leName(SQLiteSta
3dd0: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
3de0: 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 23 69   index).    {.#i
3df0: 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  f !SQLITE_STANDA
3e00: 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  RD.      int len
3e10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  ;.      return U
3e20: 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  TF8ToString(Unsa
3e30: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3e40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3e50: 61 62 6c 65 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f  able_name_intero
3e60: 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  p(stmt._sqlite_s
3e70: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20  tmt, index, out 
3e80: 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73  len), len);.#els
3e90: 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  e.      return U
3ea0: 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  TF8ToString(Unsa
3eb0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3ec0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3ed0: 61 62 6c 65 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f  able_name(stmt._
3ee0: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
3ef0: 65 78 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ex), -1);.#endif
3f00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
3f10: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
3f20: 69 64 20 43 6f 6c 75 6d 6e 4d 65 74 61 44 61 74  id ColumnMetaDat
3f30: 61 28 73 74 72 69 6e 67 20 64 61 74 61 42 61 73  a(string dataBas
3f40: 65 2c 20 73 74 72 69 6e 67 20 74 61 62 6c 65 2c  e, string table,
3f50: 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20   string column, 
3f60: 6f 75 74 20 73 74 72 69 6e 67 20 64 61 74 61 54  out string dataT
3f70: 79 70 65 2c 20 6f 75 74 20 73 74 72 69 6e 67 20  ype, out string 
3f80: 63 6f 6c 6c 61 74 65 53 65 71 75 65 6e 63 65 2c  collateSequence,
3f90: 20 6f 75 74 20 62 6f 6f 6c 20 6e 6f 74 4e 75 6c   out bool notNul
3fa0: 6c 2c 20 6f 75 74 20 62 6f 6f 6c 20 70 72 69 6d  l, out bool prim
3fb0: 61 72 79 4b 65 79 2c 20 6f 75 74 20 62 6f 6f 6c  aryKey, out bool
3fc0: 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74 29 0a   autoIncrement).
3fd0: 20 20 20 20 7b 0a 20 20 20 20 20 20 49 6e 74 50      {.      IntP
3fe0: 74 72 20 64 61 74 61 54 79 70 65 50 74 72 3b 0a  tr dataTypePtr;.
3ff0: 20 20 20 20 20 20 49 6e 74 50 74 72 20 63 6f 6c        IntPtr col
4000: 6c 53 65 71 50 74 72 3b 0a 20 20 20 20 20 20 69  lSeqPtr;.      i
4010: 6e 74 20 6e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20  nt nnotNull;.   
4020: 20 20 20 69 6e 74 20 6e 70 72 69 6d 61 72 79 4b     int nprimaryK
4030: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 61  ey;.      int na
4040: 75 74 6f 49 6e 63 3b 0a 20 20 20 20 20 20 69 6e  utoInc;.      in
4050: 74 20 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  t n;.      int d
4060: 74 4c 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  tLen;.      int 
4070: 63 73 4c 65 6e 3b 0a 0a 23 69 66 20 21 53 51 4c  csLen;..#if !SQL
4080: 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20  ITE_STANDARD.   
4090: 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74     n = UnsafeNat
40a0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
40b0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
40c0: 6d 65 74 61 64 61 74 61 5f 69 6e 74 65 72 6f 70  metadata_interop
40d0: 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28 64 61  (_sql, ToUTF8(da
40e0: 74 61 42 61 73 65 29 2c 20 54 6f 55 54 46 38 28  taBase), ToUTF8(
40f0: 74 61 62 6c 65 29 2c 20 54 6f 55 54 46 38 28 63  table), ToUTF8(c
4100: 6f 6c 75 6d 6e 29 2c 20 6f 75 74 20 64 61 74 61  olumn), out data
4110: 54 79 70 65 50 74 72 2c 20 6f 75 74 20 63 6f 6c  TypePtr, out col
4120: 6c 53 65 71 50 74 72 2c 20 6f 75 74 20 6e 6e 6f  lSeqPtr, out nno
4130: 74 4e 75 6c 6c 2c 20 6f 75 74 20 6e 70 72 69 6d  tNull, out nprim
4140: 61 72 79 4b 65 79 2c 20 6f 75 74 20 6e 61 75 74  aryKey, out naut
4150: 6f 49 6e 63 2c 20 6f 75 74 20 64 74 4c 65 6e 2c  oInc, out dtLen,
4160: 20 6f 75 74 20 63 73 4c 65 6e 29 3b 0a 23 65 6c   out csLen);.#el
4170: 73 65 0a 20 20 20 20 20 20 64 74 4c 65 6e 20 3d  se.      dtLen =
4180: 20 2d 31 3b 0a 20 20 20 20 20 20 63 73 4c 65 6e   -1;.      csLen
4190: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 20 3d   = -1;.      n =
41a0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
41b0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 74 61 62  hods.sqlite3_tab
41c0: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
41d0: 74 61 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28  ta(_sql, ToUTF8(
41e0: 64 61 74 61 42 61 73 65 29 2c 20 54 6f 55 54 46  dataBase), ToUTF
41f0: 38 28 74 61 62 6c 65 29 2c 20 54 6f 55 54 46 38  8(table), ToUTF8
4200: 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75 74 20 64 61  (column), out da
4210: 74 61 54 79 70 65 50 74 72 2c 20 6f 75 74 20 63  taTypePtr, out c
4220: 6f 6c 6c 53 65 71 50 74 72 2c 20 6f 75 74 20 6e  ollSeqPtr, out n
4230: 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74 20 6e 70 72  notNull, out npr
4240: 69 6d 61 72 79 4b 65 79 2c 20 6f 75 74 20 6e 61  imaryKey, out na
4250: 75 74 6f 49 6e 63 29 3b 0a 23 65 6e 64 69 66 0a  utoInc);.#endif.
4260: 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29        if (n > 0)
4270: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
4280: 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51  eException(n, SQ
4290: 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29  LiteLastError())
42a0: 3b 0a 0a 20 20 20 20 20 20 64 61 74 61 54 79 70  ;..      dataTyp
42b0: 65 20 3d 20 55 54 46 38 54 6f 53 74 72 69 6e 67  e = UTF8ToString
42c0: 28 64 61 74 61 54 79 70 65 50 74 72 2c 20 64 74  (dataTypePtr, dt
42d0: 4c 65 6e 29 3b 0a 20 20 20 20 20 20 63 6f 6c 6c  Len);.      coll
42e0: 61 74 65 53 65 71 75 65 6e 63 65 20 3d 20 55 54  ateSequence = UT
42f0: 46 38 54 6f 53 74 72 69 6e 67 28 63 6f 6c 6c 53  F8ToString(collS
4300: 65 71 50 74 72 2c 20 63 73 4c 65 6e 29 3b 0a 0a  eqPtr, csLen);..
4310: 20 20 20 20 20 20 6e 6f 74 4e 75 6c 6c 20 3d 20        notNull = 
4320: 28 6e 6e 6f 74 4e 75 6c 6c 20 3d 3d 20 31 29 3b  (nnotNull == 1);
4330: 0a 20 20 20 20 20 20 70 72 69 6d 61 72 79 4b 65  .      primaryKe
4340: 79 20 3d 20 28 6e 70 72 69 6d 61 72 79 4b 65 79  y = (nprimaryKey
4350: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 61 75   == 1);.      au
4360: 74 6f 49 6e 63 72 65 6d 65 6e 74 20 3d 20 28 6e  toIncrement = (n
4370: 61 75 74 6f 49 6e 63 20 3d 3d 20 31 29 3b 0a 20  autoInc == 1);. 
4380: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
4390: 61 6c 20 6f 76 65 72 72 69 64 65 20 64 6f 75 62  al override doub
43a0: 6c 65 20 47 65 74 44 6f 75 62 6c 65 28 53 51 4c  le GetDouble(SQL
43b0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
43c0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
43d0: 20 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65    {.      double
43e0: 20 76 61 6c 75 65 3b 0a 23 69 66 20 21 50 4c 41   value;.#if !PLA
43f0: 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
4400: 4d 45 57 4f 52 4b 0a 20 20 20 20 20 20 76 61 6c  MEWORK.      val
4410: 75 65 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76  ue = UnsafeNativ
4420: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
4430: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 73  _column_double(s
4440: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
4450: 2c 20 69 6e 64 65 78 29 3b 0a 23 65 6c 73 65 0a  , index);.#else.
4460: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
4470: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
4480: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 5f  3_column_double_
4490: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
44a0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
44b0: 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b 0a 23 65  , out value);.#e
44c0: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
44d0: 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a  n value;.    }..
44e0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
44f0: 72 72 69 64 65 20 69 6e 74 20 47 65 74 49 6e 74  rride int GetInt
4500: 33 32 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  32(SQLiteStateme
4510: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
4520: 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ex).    {.      
4530: 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74  return UnsafeNat
4540: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
4550: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 73 74  e3_column_int(st
4560: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
4570: 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a   index);.    }..
4580: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
4590: 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 49 6e  rride long GetIn
45a0: 74 36 34 28 53 51 4c 69 74 65 53 74 61 74 65 6d  t64(SQLiteStatem
45b0: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
45c0: 64 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  dex).    {.     
45d0: 20 6c 6f 6e 67 20 76 61 6c 75 65 3b 0a 23 69 66   long value;.#if
45e0: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41   !PLATFORM_COMPA
45f0: 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20  CTFRAMEWORK.    
4600: 20 20 76 61 6c 75 65 20 3d 20 55 6e 73 61 66 65    value = Unsafe
4610: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
4620: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
4630: 36 34 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  64(stmt._sqlite_
4640: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 23 65  stmt, index);.#e
4650: 6c 73 65 0a 20 20 20 20 20 20 55 6e 73 61 66 65  lse.      Unsafe
4660: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
4670: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
4680: 36 34 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  64_interop(stmt.
4690: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
46a0: 64 65 78 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b  dex, out value);
46b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
46c0: 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20  turn value;.    
46d0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
46e0: 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20  override string 
46f0: 47 65 74 54 65 78 74 28 53 51 4c 69 74 65 53 74  GetText(SQLiteSt
4700: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
4710: 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 23  t index).    {.#
4720: 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44  if !SQLITE_STAND
4730: 41 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ARD.      int le
4740: 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  n;.      return 
4750: 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73  UTF8ToString(Uns
4760: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4770: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
4780: 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d  text_interop(stm
4790: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
47a0: 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c  index, out len),
47b0: 20 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20   len);.#else.   
47c0: 20 20 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f     return UTF8To
47d0: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
47e0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
47f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 73  e3_column_text(s
4800: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
4810: 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0a 23  , index), -1);.#
4820: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
4830: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
4840: 64 65 20 44 61 74 65 54 69 6d 65 20 47 65 74 44  de DateTime GetD
4850: 61 74 65 54 69 6d 65 28 53 51 4c 69 74 65 53 74  ateTime(SQLiteSt
4860: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
4870: 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 23  t index).    {.#
4880: 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44  if !SQLITE_STAND
4890: 41 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  ARD.      int le
48a0: 6e 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  n;.      return 
48b0: 54 6f 44 61 74 65 54 69 6d 65 28 55 6e 73 61 66  ToDateTime(Unsaf
48c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
48d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
48e0: 78 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  xt_interop(stmt.
48f0: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
4900: 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c  dex, out len), l
4910: 65 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  en);.#else.     
4920: 20 72 65 74 75 72 6e 20 54 6f 44 61 74 65 54 69   return ToDateTi
4930: 6d 65 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  me(UnsafeNativeM
4940: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63  ethods.sqlite3_c
4950: 6f 6c 75 6d 6e 5f 74 65 78 74 28 73 74 6d 74 2e  olumn_text(stmt.
4960: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
4970: 64 65 78 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  dex), -1);.#endi
4980: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  f.    }..    int
4990: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c  ernal override l
49a0: 6f 6e 67 20 47 65 74 42 79 74 65 73 28 53 51 4c  ong GetBytes(SQL
49b0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
49c0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e  t, int index, in
49d0: 74 20 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 62  t nDataOffset, b
49e0: 79 74 65 5b 5d 20 62 44 65 73 74 2c 20 69 6e 74  yte[] bDest, int
49f0: 20 6e 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c 65   nStart, int nLe
4a00: 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20  ngth).    {.    
4a10: 20 20 49 6e 74 50 74 72 20 70 74 72 3b 0a 20 20    IntPtr ptr;.  
4a20: 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a 20 20      int nlen;.  
4a30: 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65 64 20      int nCopied 
4a40: 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20  = nLength;..    
4a50: 20 20 6e 6c 65 6e 20 3d 20 55 6e 73 61 66 65 4e    nlen = UnsafeN
4a60: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
4a70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
4a80: 73 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  s(stmt._sqlite_s
4a90: 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20  tmt, index);.   
4aa0: 20 20 20 70 74 72 20 3d 20 55 6e 73 61 66 65 4e     ptr = UnsafeN
4ab0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
4ac0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
4ad0: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
4ae0: 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 0a 20 20 20  mt, index);..   
4af0: 20 20 20 69 66 20 28 62 44 65 73 74 20 3d 3d 20     if (bDest == 
4b00: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 6e 6c 65  null) return nle
4b10: 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e 43  n;..      if (nC
4b20: 6f 70 69 65 64 20 2b 20 6e 53 74 61 72 74 20 3e  opied + nStart >
4b30: 20 62 44 65 73 74 2e 4c 65 6e 67 74 68 29 20 6e   bDest.Length) n
4b40: 43 6f 70 69 65 64 20 3d 20 62 44 65 73 74 2e 4c  Copied = bDest.L
4b50: 65 6e 67 74 68 20 2d 20 6e 53 74 61 72 74 3b 0a  ength - nStart;.
4b60: 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65        if (nCopie
4b70: 64 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 20  d + nDataOffset 
4b80: 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64 20  > nlen) nCopied 
4b90: 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f 66  = nlen - nDataOf
4ba0: 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 69 66 20  fset;..      if 
4bb0: 28 6e 43 6f 70 69 65 64 20 3e 20 30 29 0a 20 20  (nCopied > 0).  
4bc0: 20 20 20 20 20 20 4d 61 72 73 68 61 6c 2e 43 6f        Marshal.Co
4bd0: 70 79 28 28 49 6e 74 50 74 72 29 28 70 74 72 2e  py((IntPtr)(ptr.
4be0: 54 6f 49 6e 74 33 32 28 29 20 2b 20 6e 44 61 74  ToInt32() + nDat
4bf0: 61 4f 66 66 73 65 74 29 2c 20 62 44 65 73 74 2c  aOffset), bDest,
4c00: 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70 69 65 64   nStart, nCopied
4c10: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 6e 43  );.      else nC
4c20: 6f 70 69 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20  opied = 0;..    
4c30: 20 20 72 65 74 75 72 6e 20 6e 43 6f 70 69 65 64    return nCopied
4c40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
4c50: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c  ernal override l
4c60: 6f 6e 67 20 47 65 74 43 68 61 72 73 28 53 51 4c  ong GetChars(SQL
4c70: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
4c80: 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e  t, int index, in
4c90: 74 20 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 63  t nDataOffset, c
4ca0: 68 61 72 5b 5d 20 62 44 65 73 74 2c 20 69 6e 74  har[] bDest, int
4cb0: 20 6e 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c 65   nStart, int nLe
4cc0: 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20  ngth).    {.    
4cd0: 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a 20 20 20 20    int nlen;.    
4ce0: 20 20 69 6e 74 20 6e 43 6f 70 69 65 64 20 3d 20    int nCopied = 
4cf0: 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 20 20  nLength;..      
4d00: 73 74 72 69 6e 67 20 73 74 72 20 3d 20 47 65 74  string str = Get
4d10: 54 65 78 74 28 73 74 6d 74 2c 20 69 6e 64 65 78  Text(stmt, index
4d20: 29 3b 0a 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20  );.      nlen = 
4d30: 73 74 72 2e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20  str.Length;..   
4d40: 20 20 20 69 66 20 28 62 44 65 73 74 20 3d 3d 20     if (bDest == 
4d50: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 6e 6c 65  null) return nle
4d60: 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e 43  n;..      if (nC
4d70: 6f 70 69 65 64 20 2b 20 6e 53 74 61 72 74 20 3e  opied + nStart >
4d80: 20 62 44 65 73 74 2e 4c 65 6e 67 74 68 29 20 6e   bDest.Length) n
4d90: 43 6f 70 69 65 64 20 3d 20 62 44 65 73 74 2e 4c  Copied = bDest.L
4da0: 65 6e 67 74 68 20 2d 20 6e 53 74 61 72 74 3b 0a  ength - nStart;.
4db0: 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65        if (nCopie
4dc0: 64 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 20  d + nDataOffset 
4dd0: 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64 20  > nlen) nCopied 
4de0: 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f 66  = nlen - nDataOf
4df0: 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 69 66 20  fset;..      if 
4e00: 28 6e 43 6f 70 69 65 64 20 3e 20 30 29 0a 20 20  (nCopied > 0).  
4e10: 20 20 20 20 20 20 73 74 72 2e 43 6f 70 79 54 6f        str.CopyTo
4e20: 28 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 62 44  (nDataOffset, bD
4e30: 65 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f  est, nStart, nCo
4e40: 70 69 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73  pied);.      els
4e50: 65 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a  e nCopied = 0;..
4e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f        return nCo
4e70: 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pied;.    }..   
4e80: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
4e90: 64 65 20 62 6f 6f 6c 20 49 73 4e 75 6c 6c 28 53  de bool IsNull(S
4ea0: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
4eb0: 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a  tmt, int index).
4ec0: 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75      {.      retu
4ed0: 72 6e 20 28 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  rn (ColumnAffini
4ee0: 74 79 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 20  ty(stmt, index) 
4ef0: 3d 3d 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  == TypeAffinity.
4f00: 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Null);.    }..  
4f10: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
4f20: 69 64 65 20 69 6e 74 20 41 67 67 72 65 67 61 74  ide int Aggregat
4f30: 65 43 6f 75 6e 74 28 49 6e 74 50 74 72 20 63 6f  eCount(IntPtr co
4f40: 6e 74 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20  ntext).    {.   
4f50: 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65     return Unsafe
4f60: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
4f70: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
4f80: 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 3b 0a  count(context);.
4f90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4fa0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
4fb0: 64 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  d CreateFunction
4fc0: 28 73 74 72 69 6e 67 20 73 74 72 46 75 6e 63 74  (string strFunct
4fd0: 69 6f 6e 2c 20 69 6e 74 20 6e 41 72 67 73 2c 20  ion, int nArgs, 
4fe0: 62 6f 6f 6c 20 6e 65 65 64 43 6f 6c 6c 53 65 71  bool needCollSeq
4ff0: 2c 20 53 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b  , SQLiteCallback
5000: 20 66 75 6e 63 2c 20 53 51 4c 69 74 65 43 61 6c   func, SQLiteCal
5010: 6c 62 61 63 6b 20 66 75 6e 63 73 74 65 70 2c 20  lback funcstep, 
5020: 53 51 4c 69 74 65 46 69 6e 61 6c 43 61 6c 6c 62  SQLiteFinalCallb
5030: 61 63 6b 20 66 75 6e 63 66 69 6e 61 6c 29 0a 20  ack funcfinal). 
5040: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e     {.      int n
5050: 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53  ;..#if !SQLITE_S
5060: 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 6e 20  TANDARD.      n 
5070: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
5080: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72  thods.sqlite3_cr
5090: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 69 6e  eate_function_in
50a0: 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54  terop(_sql, ToUT
50b0: 46 38 28 73 74 72 46 75 6e 63 74 69 6f 6e 29 2c  F8(strFunction),
50c0: 20 6e 41 72 67 73 2c 20 34 2c 20 49 6e 74 50 74   nArgs, 4, IntPt
50d0: 72 2e 5a 65 72 6f 2c 20 66 75 6e 63 2c 20 66 75  r.Zero, func, fu
50e0: 6e 63 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61  ncstep, funcfina
50f0: 6c 2c 20 28 6e 65 65 64 43 6f 6c 6c 53 65 71 20  l, (needCollSeq 
5100: 3d 3d 20 74 72 75 65 29 20 3f 20 31 20 3a 20 30  == true) ? 1 : 0
5110: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3d  );.      if (n =
5120: 3d 20 30 29 20 6e 20 3d 20 55 6e 73 61 66 65 4e  = 0) n = UnsafeN
5130: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
5140: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5150: 74 69 6f 6e 5f 69 6e 74 65 72 6f 70 28 5f 73 71  tion_interop(_sq
5160: 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 46 75 6e  l, ToUTF8(strFun
5170: 63 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 31  ction), nArgs, 1
5180: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66  , IntPtr.Zero, f
5190: 75 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66  unc, funcstep, f
51a0: 75 6e 63 66 69 6e 61 6c 2c 20 28 6e 65 65 64 43  uncfinal, (needC
51b0: 6f 6c 6c 53 65 71 20 3d 3d 20 74 72 75 65 29 20  ollSeq == true) 
51c0: 3f 20 31 20 3a 20 30 29 3b 0a 23 65 6c 73 65 0a  ? 1 : 0);.#else.
51d0: 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65        n = Unsafe
51e0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
51f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
5200: 63 74 69 6f 6e 28 5f 73 71 6c 2c 20 54 6f 55 54  ction(_sql, ToUT
5210: 46 38 28 73 74 72 46 75 6e 63 74 69 6f 6e 29 2c  F8(strFunction),
5220: 20 6e 41 72 67 73 2c 20 34 2c 20 49 6e 74 50 74   nArgs, 4, IntPt
5230: 72 2e 5a 65 72 6f 2c 20 66 75 6e 63 2c 20 66 75  r.Zero, func, fu
5240: 6e 63 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61  ncstep, funcfina
5250: 6c 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 20  l);.      if (n 
5260: 3d 3d 20 30 29 20 6e 20 3d 20 55 6e 73 61 66 65  == 0) n = Unsafe
5270: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
5280: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
5290: 63 74 69 6f 6e 28 5f 73 71 6c 2c 20 54 6f 55 54  ction(_sql, ToUT
52a0: 46 38 28 73 74 72 46 75 6e 63 74 69 6f 6e 29 2c  F8(strFunction),
52b0: 20 6e 41 72 67 73 2c 20 31 2c 20 49 6e 74 50 74   nArgs, 1, IntPt
52c0: 72 2e 5a 65 72 6f 2c 20 66 75 6e 63 2c 20 66 75  r.Zero, func, fu
52d0: 6e 63 73 74 65 70 2c 20 66 75 6e 63 66 69 6e 61  ncstep, funcfina
52e0: 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  l);.#endif.     
52f0: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
5300: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
5310: 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c  ption(n, SQLiteL
5320: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
5330: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
5340: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 43   override void C
5350: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 73  reateCollation(s
5360: 74 72 69 6e 67 20 73 74 72 43 6f 6c 6c 61 74 69  tring strCollati
5370: 6f 6e 2c 20 53 51 4c 69 74 65 43 6f 6c 6c 61 74  on, SQLiteCollat
5380: 69 6f 6e 20 66 75 6e 63 2c 20 53 51 4c 69 74 65  ion func, SQLite
5390: 43 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 31 36  Collation func16
53a0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
53b0: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
53c0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
53d0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
53e0: 6f 6e 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28  on(_sql, ToUTF8(
53f0: 73 74 72 43 6f 6c 6c 61 74 69 6f 6e 29 2c 20 32  strCollation), 2
5400: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66  , IntPtr.Zero, f
5410: 75 6e 63 31 36 29 3b 0a 20 20 20 20 20 20 69 66  unc16);.      if
5420: 20 28 6e 20 3d 3d 20 30 29 20 55 6e 73 61 66 65   (n == 0) Unsafe
5430: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
5440: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
5450: 6c 61 74 69 6f 6e 28 5f 73 71 6c 2c 20 54 6f 55  lation(_sql, ToU
5460: 54 46 38 28 73 74 72 43 6f 6c 6c 61 74 69 6f 6e  TF8(strCollation
5470: 29 2c 20 31 2c 20 49 6e 74 50 74 72 2e 5a 65 72  ), 1, IntPtr.Zer
5480: 6f 2c 20 66 75 6e 63 29 3b 0a 20 20 20 20 20 20  o, func);.      
5490: 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77  if (n > 0) throw
54a0: 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70   new SQLiteExcep
54b0: 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61  tion(n, SQLiteLa
54c0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
54d0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
54e0: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43 6f 6e  override int Con
54f0: 74 65 78 74 43 6f 6c 6c 61 74 65 43 6f 6d 70 61  textCollateCompa
5500: 72 65 28 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f  re(CollationEnco
5510: 64 69 6e 67 45 6e 75 6d 20 65 6e 63 2c 20 49 6e  dingEnum enc, In
5520: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 73 74  tPtr context, st
5530: 72 69 6e 67 20 73 31 2c 20 73 74 72 69 6e 67 20  ring s1, string 
5540: 73 32 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53  s2).    {.#if !S
5550: 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20  QLITE_STANDARD. 
5560: 20 20 20 20 20 62 79 74 65 5b 5d 20 62 31 3b 0a       byte[] b1;.
5570: 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 32 3b        byte[] b2;
5580: 0a 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54 65  .      System.Te
5590: 78 74 2e 45 6e 63 6f 64 69 6e 67 20 63 6f 6e 76  xt.Encoding conv
55a0: 65 72 74 65 72 20 3d 20 6e 75 6c 6c 3b 0a 0a 20  erter = null;.. 
55b0: 20 20 20 20 20 73 77 69 74 63 68 20 28 65 6e 63       switch (enc
55c0: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
55d0: 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e    case Collation
55e0: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46  EncodingEnum.UTF
55f0: 38 3a 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  8:.          con
5600: 76 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e  verter = System.
5610: 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55 54  Text.Encoding.UT
5620: 46 38 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  F8;.          br
5630: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
5640: 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f 64  e CollationEncod
5650: 69 6e 67 45 6e 75 6d 2e 55 54 46 31 36 4c 45 3a  ingEnum.UTF16LE:
5660: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 76 65  .          conve
5670: 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e 54 65  rter = System.Te
5680: 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55 6e 69 63  xt.Encoding.Unic
5690: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ode;.          b
56a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
56b0: 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f  se CollationEnco
56c0: 64 69 6e 67 45 6e 75 6d 2e 55 54 46 31 36 42 45  dingEnum.UTF16BE
56d0: 3a 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 76  :.          conv
56e0: 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e 54  erter = System.T
56f0: 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 42 69 67  ext.Encoding.Big
5700: 45 6e 64 69 61 6e 55 6e 69 63 6f 64 65 3b 0a 20  EndianUnicode;. 
5710: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5720: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
5730: 31 20 3d 20 63 6f 6e 76 65 72 74 65 72 2e 47 65  1 = converter.Ge
5740: 74 42 79 74 65 73 28 73 31 29 3b 0a 20 20 20 20  tBytes(s1);.    
5750: 20 20 62 32 20 3d 20 63 6f 6e 76 65 72 74 65 72    b2 = converter
5760: 2e 47 65 74 42 79 74 65 73 28 73 32 29 3b 0a 0a  .GetBytes(s2);..
5770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73        return Uns
5780: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
5790: 2e 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  .sqlite3_context
57a0: 5f 63 6f 6c 6c 63 6f 6d 70 61 72 65 28 63 6f 6e  _collcompare(con
57b0: 74 65 78 74 2c 20 62 31 2c 20 62 31 2e 4c 65 6e  text, b1, b1.Len
57c0: 67 74 68 2c 20 62 32 2c 20 62 32 2e 4c 65 6e 67  gth, b2, b2.Leng
57d0: 74 68 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  th);.#else.     
57e0: 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74 49 6d   throw new NotIm
57f0: 70 6c 65 6d 65 6e 74 65 64 45 78 63 65 70 74 69  plementedExcepti
5800: 6f 6e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  on();.#endif.   
5810: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
5820: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43 6f   override int Co
5830: 6e 74 65 78 74 43 6f 6c 6c 61 74 65 43 6f 6d 70  ntextCollateComp
5840: 61 72 65 28 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63  are(CollationEnc
5850: 6f 64 69 6e 67 45 6e 75 6d 20 65 6e 63 2c 20 49  odingEnum enc, I
5860: 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 63  ntPtr context, c
5870: 68 61 72 5b 5d 20 63 31 2c 20 63 68 61 72 5b 5d  har[] c1, char[]
5880: 20 63 32 29 0a 20 20 20 20 7b 0a 23 69 66 20 21   c2).    {.#if !
5890: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a  SQLITE_STANDARD.
58a0: 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 31 3b        byte[] b1;
58b0: 0a 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 32  .      byte[] b2
58c0: 3b 0a 20 20 20 20 20 20 53 79 73 74 65 6d 2e 54  ;.      System.T
58d0: 65 78 74 2e 45 6e 63 6f 64 69 6e 67 20 63 6f 6e  ext.Encoding con
58e0: 76 65 72 74 65 72 20 3d 20 6e 75 6c 6c 3b 0a 0a  verter = null;..
58f0: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 65 6e        switch (en
5900: 63 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  c).      {.     
5910: 20 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f     case Collatio
5920: 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54  nEncodingEnum.UT
5930: 46 38 3a 0a 20 20 20 20 20 20 20 20 20 20 63 6f  F8:.          co
5940: 6e 76 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d  nverter = System
5950: 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55  .Text.Encoding.U
5960: 54 46 38 3b 0a 20 20 20 20 20 20 20 20 20 20 62  TF8;.          b
5970: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
5980: 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f  se CollationEnco
5990: 64 69 6e 67 45 6e 75 6d 2e 55 54 46 31 36 4c 45  dingEnum.UTF16LE
59a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 76  :.          conv
59b0: 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e 54  erter = System.T
59c0: 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55 6e 69  ext.Encoding.Uni
59d0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  code;.          
59e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
59f0: 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63  ase CollationEnc
5a00: 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46 31 36 42  odingEnum.UTF16B
5a10: 45 3a 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  E:.          con
5a20: 76 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e  verter = System.
5a30: 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 42 69  Text.Encoding.Bi
5a40: 67 45 6e 64 69 61 6e 55 6e 69 63 6f 64 65 3b 0a  gEndianUnicode;.
5a50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5a60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5a70: 62 31 20 3d 20 63 6f 6e 76 65 72 74 65 72 2e 47  b1 = converter.G
5a80: 65 74 42 79 74 65 73 28 63 31 29 3b 0a 20 20 20  etBytes(c1);.   
5a90: 20 20 20 62 32 20 3d 20 63 6f 6e 76 65 72 74 65     b2 = converte
5aa0: 72 2e 47 65 74 42 79 74 65 73 28 63 32 29 3b 0a  r.GetBytes(c2);.
5ab0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e  .      return Un
5ac0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
5ad0: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  s.sqlite3_contex
5ae0: 74 5f 63 6f 6c 6c 63 6f 6d 70 61 72 65 28 63 6f  t_collcompare(co
5af0: 6e 74 65 78 74 2c 20 62 31 2c 20 62 31 2e 4c 65  ntext, b1, b1.Le
5b00: 6e 67 74 68 2c 20 62 32 2c 20 62 32 2e 4c 65 6e  ngth, b2, b2.Len
5b10: 67 74 68 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  gth);.#else.    
5b20: 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74 49    throw new NotI
5b30: 6d 70 6c 65 6d 65 6e 74 65 64 45 78 63 65 70 74  mplementedExcept
5b40: 69 6f 6e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ion();.#endif.  
5b50: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
5b60: 6c 20 6f 76 65 72 72 69 64 65 20 43 6f 6c 6c 61  l override Colla
5b70: 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 47 65 74  tionSequence Get
5b80: 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63  CollationSequenc
5b90: 65 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f 6e  e(SQLiteFunction
5ba0: 20 66 75 6e 63 2c 20 49 6e 74 50 74 72 20 63 6f   func, IntPtr co
5bb0: 6e 74 65 78 74 29 0a 20 20 20 20 7b 0a 23 69 66  ntext).    {.#if
5bc0: 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52   !SQLITE_STANDAR
5bd0: 44 0a 20 20 20 20 20 20 43 6f 6c 6c 61 74 69 6f  D.      Collatio
5be0: 6e 53 65 71 75 65 6e 63 65 20 73 65 71 20 3d 20  nSequence seq = 
5bf0: 6e 65 77 20 43 6f 6c 6c 61 74 69 6f 6e 53 65 71  new CollationSeq
5c00: 75 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 69  uence();.      i
5c10: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
5c20: 74 20 74 79 70 65 3b 0a 20 20 20 20 20 20 69 6e  t type;.      in
5c30: 74 20 65 6e 63 3b 0a 20 20 20 20 20 20 49 6e 74  t enc;.      Int
5c40: 50 74 72 20 70 20 3d 20 55 6e 73 61 66 65 4e 61  Ptr p = UnsafeNa
5c50: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
5c60: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c 6c  te3_context_coll
5c70: 73 65 71 28 63 6f 6e 74 65 78 74 2c 20 6f 75 74  seq(context, out
5c80: 20 74 79 70 65 2c 20 6f 75 74 20 65 6e 63 2c 20   type, out enc, 
5c90: 6f 75 74 20 6c 65 6e 29 3b 0a 0a 20 20 20 20 20  out len);..     
5ca0: 20 69 66 20 28 70 20 21 3d 20 6e 75 6c 6c 29 20   if (p != null) 
5cb0: 73 65 71 2e 4e 61 6d 65 20 3d 20 55 54 46 38 54  seq.Name = UTF8T
5cc0: 6f 53 74 72 69 6e 67 28 70 2c 20 6c 65 6e 29 3b  oString(p, len);
5cd0: 0a 20 20 20 20 20 20 73 65 71 2e 54 79 70 65 20  .      seq.Type 
5ce0: 3d 20 28 43 6f 6c 6c 61 74 69 6f 6e 54 79 70 65  = (CollationType
5cf0: 45 6e 75 6d 29 74 79 70 65 3b 0a 20 20 20 20 20  Enum)type;.     
5d00: 20 73 65 71 2e 5f 66 75 6e 63 20 3d 20 66 75 6e   seq._func = fun
5d10: 63 3b 0a 20 20 20 20 20 20 73 65 71 2e 45 6e 63  c;.      seq.Enc
5d20: 6f 64 69 6e 67 20 3d 20 28 43 6f 6c 6c 61 74 69  oding = (Collati
5d30: 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 29 65  onEncodingEnum)e
5d40: 6e 63 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72  nc;..      retur
5d50: 6e 20 73 65 71 3b 0a 23 65 6c 73 65 0a 20 20 20  n seq;.#else.   
5d60: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74     throw new Not
5d70: 49 6d 70 6c 65 6d 65 6e 74 65 64 45 78 63 65 70  ImplementedExcep
5d80: 74 69 6f 6e 28 29 3b 0a 23 65 6e 64 69 66 0a 20  tion();.#endif. 
5d90: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
5da0: 61 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67  al override long
5db0: 20 47 65 74 50 61 72 61 6d 56 61 6c 75 65 42 79   GetParamValueBy
5dc0: 74 65 73 28 49 6e 74 50 74 72 20 70 2c 20 69 6e  tes(IntPtr p, in
5dd0: 74 20 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 62  t nDataOffset, b
5de0: 79 74 65 5b 5d 20 62 44 65 73 74 2c 20 69 6e 74  yte[] bDest, int
5df0: 20 6e 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c 65   nStart, int nLe
5e00: 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20 20 20 20  ngth).    {.    
5e10: 20 20 49 6e 74 50 74 72 20 70 74 72 3b 0a 20 20    IntPtr ptr;.  
5e20: 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a 20 20      int nlen;.  
5e30: 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65 64 20      int nCopied 
5e40: 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20  = nLength;..    
5e50: 20 20 6e 6c 65 6e 20 3d 20 55 6e 73 61 66 65 4e    nlen = UnsafeN
5e60: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
5e70: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
5e80: 28 70 29 3b 0a 20 20 20 20 20 20 70 74 72 20 3d  (p);.      ptr =
5e90: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
5ea0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c  hods.sqlite3_val
5eb0: 75 65 5f 62 6c 6f 62 28 70 29 3b 0a 0a 20 20 20  ue_blob(p);..   
5ec0: 20 20 20 69 66 20 28 62 44 65 73 74 20 3d 3d 20     if (bDest == 
5ed0: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 6e 6c 65  null) return nle
5ee0: 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 6e 43  n;..      if (nC
5ef0: 6f 70 69 65 64 20 2b 20 6e 53 74 61 72 74 20 3e  opied + nStart >
5f00: 20 62 44 65 73 74 2e 4c 65 6e 67 74 68 29 20 6e   bDest.Length) n
5f10: 43 6f 70 69 65 64 20 3d 20 62 44 65 73 74 2e 4c  Copied = bDest.L
5f20: 65 6e 67 74 68 20 2d 20 6e 53 74 61 72 74 3b 0a  ength - nStart;.
5f30: 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65        if (nCopie
5f40: 64 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 20  d + nDataOffset 
5f50: 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64 20  > nlen) nCopied 
5f60: 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f 66  = nlen - nDataOf
5f70: 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 69 66 20  fset;..      if 
5f80: 28 6e 43 6f 70 69 65 64 20 3e 20 30 29 0a 20 20  (nCopied > 0).  
5f90: 20 20 20 20 20 20 4d 61 72 73 68 61 6c 2e 43 6f        Marshal.Co
5fa0: 70 79 28 28 49 6e 74 50 74 72 29 28 70 74 72 2e  py((IntPtr)(ptr.
5fb0: 54 6f 49 6e 74 33 32 28 29 20 2b 20 6e 44 61 74  ToInt32() + nDat
5fc0: 61 4f 66 66 73 65 74 29 2c 20 62 44 65 73 74 2c  aOffset), bDest,
5fd0: 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70 69 65 64   nStart, nCopied
5fe0: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 6e 43  );.      else nC
5ff0: 6f 70 69 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20  opied = 0;..    
6000: 20 20 72 65 74 75 72 6e 20 6e 43 6f 70 69 65 64    return nCopied
6010: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
6020: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 64  ernal override d
6030: 6f 75 62 6c 65 20 47 65 74 50 61 72 61 6d 56 61  ouble GetParamVa
6040: 6c 75 65 44 6f 75 62 6c 65 28 49 6e 74 50 74 72  lueDouble(IntPtr
6050: 20 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20   ptr).    {.    
6060: 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
6070: 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f  #if !PLATFORM_CO
6080: 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20  MPACTFRAMEWORK. 
6090: 20 20 20 20 20 76 61 6c 75 65 20 3d 20 55 6e 73       value = Uns
60a0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
60b0: 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64  .sqlite3_value_d
60c0: 6f 75 62 6c 65 28 70 74 72 29 3b 0a 23 65 6c 73  ouble(ptr);.#els
60d0: 65 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61  e.      UnsafeNa
60e0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
60f0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
6100: 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f 75  _interop(ptr, ou
6110: 74 20 76 61 6c 75 65 29 3b 0a 23 65 6e 64 69 66  t value);.#endif
6120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 61  .      return va
6130: 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  lue;.    }..    
6140: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
6150: 65 20 69 6e 74 20 47 65 74 50 61 72 61 6d 56 61  e int GetParamVa
6160: 6c 75 65 49 6e 74 33 32 28 49 6e 74 50 74 72 20  lueInt32(IntPtr 
6170: 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ptr).    {.     
6180: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
6190: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
61a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 74  te3_value_int(pt
61b0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
61c0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
61d0: 20 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d 56 61   long GetParamVa
61e0: 6c 75 65 49 6e 74 36 34 28 49 6e 74 50 74 72 20  lueInt64(IntPtr 
61f0: 70 74 72 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ptr).    {.     
6200: 20 49 6e 74 36 34 20 76 61 6c 75 65 3b 0a 23 69   Int64 value;.#i
6210: 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  f !PLATFORM_COMP
6220: 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20  ACTFRAMEWORK.   
6230: 20 20 20 76 61 6c 75 65 20 3d 20 55 6e 73 61 66     value = Unsaf
6240: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
6250: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
6260: 36 34 28 70 74 72 29 3b 0a 23 65 6c 73 65 0a 20  64(ptr);.#else. 
6270: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
6280: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
6290: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 5f 69 6e 74  _value_int64_int
62a0: 65 72 6f 70 28 70 74 72 2c 20 6f 75 74 20 76 61  erop(ptr, out va
62b0: 6c 75 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  lue);.#endif.   
62c0: 20 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b     return value;
62d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
62e0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74  rnal override st
62f0: 72 69 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c  ring GetParamVal
6300: 75 65 54 65 78 74 28 49 6e 74 50 74 72 20 70 74  ueText(IntPtr pt
6310: 72 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53 51  r).    {.#if !SQ
6320: 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20  LITE_STANDARD.  
6330: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
6340: 20 20 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f     return UTF8To
6350: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
6360: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
6370: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 5f 69 6e  e3_value_text_in
6380: 74 65 72 6f 70 28 70 74 72 2c 20 6f 75 74 20 6c  terop(ptr, out l
6390: 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73 65  en), len);.#else
63a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54  .      return UT
63b0: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
63c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
63d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
63e0: 74 28 70 74 72 29 2c 20 2d 31 29 3b 0a 23 65 6e  t(ptr), -1);.#en
63f0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  dif.    }..    i
6400: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
6410: 20 54 79 70 65 41 66 66 69 6e 69 74 79 20 47 65   TypeAffinity Ge
6420: 74 50 61 72 61 6d 56 61 6c 75 65 54 79 70 65 28  tParamValueType(
6430: 49 6e 74 50 74 72 20 70 74 72 29 0a 20 20 20 20  IntPtr ptr).    
6440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  {.      return U
6450: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6460: 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ds.sqlite3_value
6470: 5f 74 79 70 65 28 70 74 72 29 3b 0a 20 20 20 20  _type(ptr);.    
6480: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
6490: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65  override void Re
64a0: 74 75 72 6e 42 6c 6f 62 28 49 6e 74 50 74 72 20  turnBlob(IntPtr 
64b0: 63 6f 6e 74 65 78 74 2c 20 62 79 74 65 5b 5d 20  context, byte[] 
64c0: 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20  value).    {.   
64d0: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
64e0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72  ethods.sqlite3_r
64f0: 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65  esult_blob(conte
6500: 78 74 2c 20 76 61 6c 75 65 2c 20 76 61 6c 75 65  xt, value, value
6510: 2e 4c 65 6e 67 74 68 2c 20 28 49 6e 74 50 74 72  .Length, (IntPtr
6520: 29 28 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  )(-1));.    }.. 
6530: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6540: 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e  ride void Return
6550: 44 6f 75 62 6c 65 28 49 6e 74 50 74 72 20 63 6f  Double(IntPtr co
6560: 6e 74 65 78 74 2c 20 64 6f 75 62 6c 65 20 76 61  ntext, double va
6570: 6c 75 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 21  lue).    {.#if !
6580: 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54  PLATFORM_COMPACT
6590: 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 20 20  FRAMEWORK.      
65a0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
65b0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75  ods.sqlite3_resu
65c0: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
65d0: 74 2c 20 76 61 6c 75 65 29 3b 0a 23 65 6c 73 65  t, value);.#else
65e0: 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74  .      UnsafeNat
65f0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
6600: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
6610: 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78 74  _interop(context
6620: 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a 23 65  , ref value);.#e
6630: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
6640: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
6650: 65 20 76 6f 69 64 20 52 65 74 75 72 6e 45 72 72  e void ReturnErr
6660: 6f 72 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78  or(IntPtr contex
6670: 74 2c 20 73 74 72 69 6e 67 20 76 61 6c 75 65 29  t, string value)
6680: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73  .    {.      Uns
6690: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
66a0: 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
66b0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 54  error(context, T
66c0: 6f 55 54 46 38 28 76 61 6c 75 65 29 2c 20 76 61  oUTF8(value), va
66d0: 6c 75 65 2e 4c 65 6e 67 74 68 29 3b 0a 20 20 20  lue.Length);.   
66e0: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
66f0: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52   override void R
6700: 65 74 75 72 6e 49 6e 74 33 32 28 49 6e 74 50 74  eturnInt32(IntPt
6710: 72 20 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 76  r context, int v
6720: 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20  alue).    {.    
6730: 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65    UnsafeNativeMe
6740: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65  thods.sqlite3_re
6750: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
6760: 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a  , value);.    }.
6770: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
6780: 65 72 72 69 64 65 20 76 6f 69 64 20 52 65 74 75  erride void Retu
6790: 72 6e 49 6e 74 36 34 28 49 6e 74 50 74 72 20 63  rnInt64(IntPtr c
67a0: 6f 6e 74 65 78 74 2c 20 6c 6f 6e 67 20 76 61 6c  ontext, long val
67b0: 75 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 50  ue).    {.#if !P
67c0: 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
67d0: 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 20 20 55  RAMEWORK.      U
67e0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
67f0: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ds.sqlite3_resul
6800: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
6810: 20 76 61 6c 75 65 29 3b 0a 23 65 6c 73 65 0a 20   value);.#else. 
6820: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
6830: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
6840: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 5f 69 6e  _result_int64_in
6850: 74 65 72 6f 70 28 63 6f 6e 74 65 78 74 2c 20 72  terop(context, r
6860: 65 66 20 76 61 6c 75 65 29 3b 0a 23 65 6e 64 69  ef value);.#endi
6870: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  f.    }..    int
6880: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76  ernal override v
6890: 6f 69 64 20 52 65 74 75 72 6e 4e 75 6c 6c 28 49  oid ReturnNull(I
68a0: 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 29 0a 20  ntPtr context). 
68b0: 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66     {.      Unsaf
68c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
68d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
68e0: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
68f0: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
6900: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52   override void R
6910: 65 74 75 72 6e 54 65 78 74 28 49 6e 74 50 74 72  eturnText(IntPtr
6920: 20 63 6f 6e 74 65 78 74 2c 20 73 74 72 69 6e 67   context, string
6930: 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20   value).    {.  
6940: 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54      byte[] b = T
6950: 6f 55 54 46 38 28 76 61 6c 75 65 29 3b 0a 20 20  oUTF8(value);.  
6960: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
6970: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6980: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6990: 65 78 74 2c 20 54 6f 55 54 46 38 28 76 61 6c 75  ext, ToUTF8(valu
69a0: 65 29 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20 31  e), b.Length - 1
69b0: 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b  , (IntPtr)(-1));
69c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
69d0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 49 6e  rnal override In
69e0: 74 50 74 72 20 41 67 67 72 65 67 61 74 65 43 6f  tPtr AggregateCo
69f0: 6e 74 65 78 74 28 49 6e 74 50 74 72 20 63 6f 6e  ntext(IntPtr con
6a00: 74 65 78 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  text).    {.    
6a10: 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e    return UnsafeN
6a20: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
6a30: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
6a40: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
6a50: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  1);.    }..    i
6a60: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
6a70: 20 76 6f 69 64 20 53 65 74 50 61 73 73 77 6f 72   void SetPasswor
6a80: 64 28 62 79 74 65 5b 5d 20 70 61 73 73 77 6f 72  d(byte[] passwor
6a90: 64 42 79 74 65 73 29 0a 20 20 20 20 7b 0a 20 20  dBytes).    {.  
6aa0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
6ab0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6ac0: 73 71 6c 69 74 65 33 5f 6b 65 79 28 5f 73 71 6c  sqlite3_key(_sql
6ad0: 2c 20 70 61 73 73 77 6f 72 64 42 79 74 65 73 2c  , passwordBytes,
6ae0: 20 70 61 73 73 77 6f 72 64 42 79 74 65 73 2e 4c   passwordBytes.L
6af0: 65 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 69 66  ength);.      if
6b00: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
6b10: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
6b20: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
6b30: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
6b40: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
6b50: 65 72 72 69 64 65 20 76 6f 69 64 20 43 68 61 6e  erride void Chan
6b60: 67 65 50 61 73 73 77 6f 72 64 28 62 79 74 65 5b  gePassword(byte[
6b70: 5d 20 6e 65 77 50 61 73 73 77 6f 72 64 42 79 74  ] newPasswordByt
6b80: 65 73 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  es).    {.      
6b90: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
6ba0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
6bb0: 74 65 33 5f 72 65 6b 65 79 28 5f 73 71 6c 2c 20  te3_rekey(_sql, 
6bc0: 6e 65 77 50 61 73 73 77 6f 72 64 42 79 74 65 73  newPasswordBytes
6bd0: 2c 20 28 6e 65 77 50 61 73 73 77 6f 72 64 42 79  , (newPasswordBy
6be0: 74 65 73 20 3d 3d 20 6e 75 6c 6c 29 20 3f 20 30  tes == null) ? 0
6bf0: 20 3a 20 6e 65 77 50 61 73 73 77 6f 72 64 42 79   : newPasswordBy
6c00: 74 65 73 2e 4c 65 6e 67 74 68 29 3b 0a 20 20 20  tes.Length);.   
6c10: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
6c20: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
6c30: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
6c40: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  eLastError());. 
6c50: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
6c60: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
6c70: 20 53 65 74 55 70 64 61 74 65 48 6f 6f 6b 28 53   SetUpdateHook(S
6c80: 51 4c 69 74 65 55 70 64 61 74 65 43 61 6c 6c 62  QLiteUpdateCallb
6c90: 61 63 6b 20 66 75 6e 63 29 0a 20 20 20 20 7b 0a  ack func).    {.
6ca0: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
6cb0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
6cc0: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 5f 73  3_update_hook(_s
6cd0: 71 6c 2c 20 66 75 6e 63 2c 20 49 6e 74 50 74 72  ql, func, IntPtr
6ce0: 2e 5a 65 72 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  .Zero);.    }.. 
6cf0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6d00: 72 69 64 65 20 76 6f 69 64 20 53 65 74 43 6f 6d  ride void SetCom
6d10: 6d 69 74 48 6f 6f 6b 28 53 51 4c 69 74 65 43 6f  mitHook(SQLiteCo
6d20: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 66 75 6e  mmitCallback fun
6d30: 63 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55  c).    {.      U
6d40: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6d50: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  ds.sqlite3_commi
6d60: 74 5f 68 6f 6f 6b 28 5f 73 71 6c 2c 20 66 75 6e  t_hook(_sql, fun
6d70: 63 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 3b  c, IntPtr.Zero);
6d80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
6d90: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
6da0: 69 64 20 53 65 74 52 6f 6c 6c 62 61 63 6b 48 6f  id SetRollbackHo
6db0: 6f 6b 28 53 51 4c 69 74 65 52 6f 6c 6c 62 61 63  ok(SQLiteRollbac
6dc0: 6b 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 29 0a  kCallback func).
6dd0: 20 20 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61      {.      Unsa
6de0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6df0: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
6e00: 5f 68 6f 6f 6b 28 5f 73 71 6c 2c 20 66 75 6e 63  _hook(_sql, func
6e10: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 3b 0a  , IntPtr.Zero);.
6e20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c      }..    /// <
6e30: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
6e40: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
6e50: 20 74 6f 20 72 65 74 72 69 65 76 65 20 61 20 63   to retrieve a c
6e60: 6f 6c 75 6d 6e 20 6f 66 20 64 61 74 61 20 66 72  olumn of data fr
6e70: 6f 6d 20 61 6e 20 61 63 74 69 76 65 20 73 74 61  om an active sta
6e80: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2f 2f 2f 20  tement..    /// 
6e90: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f  </summary>.    /
6ea0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
6eb0: 73 74 6d 74 22 3e 54 68 65 20 73 74 61 74 65 6d  stmt">The statem
6ec0: 65 6e 74 20 62 65 69 6e 67 20 73 74 65 70 28 29  ent being step()
6ed0: 27 64 20 74 68 72 6f 75 67 68 3c 2f 70 61 72 61  'd through</para
6ee0: 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  m>.    /// <para
6ef0: 6d 20 6e 61 6d 65 3d 22 69 6e 64 65 78 22 3e 54  m name="index">T
6f00: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  he column index 
6f10: 74 6f 20 72 65 74 72 69 65 76 65 3c 2f 70 61 72  to retrieve</par
6f20: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  am>.    /// <par
6f30: 61 6d 20 6e 61 6d 65 3d 22 74 79 70 22 3e 54 68  am name="typ">Th
6f40: 65 20 74 79 70 65 20 6f 66 20 64 61 74 61 20 63  e type of data c
6f50: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
6f60: 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 55 6e 69 6e  column.  If Unin
6f70: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 69 73 20  itialized, this 
6f80: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
6f90: 74 72 69 65 76 65 20 74 68 65 20 64 61 74 61 74  trieve the datat
6fa0: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ype information.
6fb0: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f  </param>.    ///
6fc0: 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e   <returns>Return
6fd0: 73 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  s the data in th
6fe0: 65 20 63 6f 6c 75 6d 6e 3c 2f 72 65 74 75 72 6e  e column</return
6ff0: 73 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  s>.    internal 
7000: 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63 74 20  override object 
7010: 47 65 74 56 61 6c 75 65 28 53 51 4c 69 74 65 53  GetValue(SQLiteS
7020: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
7030: 6e 74 20 69 6e 64 65 78 2c 20 53 51 4c 69 74 65  nt index, SQLite
7040: 54 79 70 65 20 74 79 70 29 0a 20 20 20 20 7b 0a  Type typ).    {.
7050: 20 20 20 20 20 20 69 66 20 28 49 73 4e 75 6c 6c        if (IsNull
7060: 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 29 20 72  (stmt, index)) r
7070: 65 74 75 72 6e 20 44 42 4e 75 6c 6c 2e 56 61 6c  eturn DBNull.Val
7080: 75 65 3b 0a 20 20 20 20 20 20 54 79 70 65 41 66  ue;.      TypeAf
7090: 66 69 6e 69 74 79 20 61 66 66 20 3d 20 74 79 70  finity aff = typ
70a0: 2e 41 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .Affinity;.     
70b0: 20 54 79 70 65 20 74 20 3d 20 6e 75 6c 6c 3b 0a   Type t = null;.
70c0: 0a 20 20 20 20 20 20 69 66 20 28 74 79 70 2e 54  .      if (typ.T
70d0: 79 70 65 20 21 3d 20 44 62 54 79 70 65 2e 4f 62  ype != DbType.Ob
70e0: 6a 65 63 74 29 0a 20 20 20 20 20 20 7b 0a 20 20  ject).      {.  
70f0: 20 20 20 20 20 20 74 20 3d 20 53 51 4c 69 74 65        t = SQLite
7100: 43 6f 6e 76 65 72 74 2e 53 51 4c 69 74 65 54 79  Convert.SQLiteTy
7110: 70 65 54 6f 54 79 70 65 28 74 79 70 29 3b 0a 20  peToType(typ);. 
7120: 20 20 20 20 20 20 20 61 66 66 20 3d 20 54 79 70         aff = Typ
7130: 65 54 6f 41 66 66 69 6e 69 74 79 28 74 29 3b 0a  eToAffinity(t);.
7140: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
7150: 77 69 74 63 68 20 28 61 66 66 29 0a 20 20 20 20  witch (aff).    
7160: 20 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65    {.        case
7170: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c   TypeAffinity.Bl
7180: 6f 62 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ob:.          if
7190: 20 28 74 79 70 2e 54 79 70 65 20 3d 3d 20 44 62   (typ.Type == Db
71a0: 54 79 70 65 2e 47 75 69 64 20 26 26 20 74 79 70  Type.Guid && typ
71b0: 2e 41 66 66 69 6e 69 74 79 20 3d 3d 20 54 79 70  .Affinity == Typ
71c0: 65 41 66 66 69 6e 69 74 79 2e 54 65 78 74 29 0a  eAffinity.Text).
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
71e0: 72 6e 20 6e 65 77 20 47 75 69 64 28 47 65 74 54  rn new Guid(GetT
71f0: 65 78 74 28 73 74 6d 74 2c 20 69 6e 64 65 78 29  ext(stmt, index)
7200: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 6e  );..          in
7210: 74 20 6e 20 3d 20 28 69 6e 74 29 47 65 74 42 79  t n = (int)GetBy
7220: 74 65 73 28 73 74 6d 74 2c 20 69 6e 64 65 78 2c  tes(stmt, index,
7230: 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c 20 30 29 3b   0, null, 0, 0);
7240: 0a 20 20 20 20 20 20 20 20 20 20 62 79 74 65 5b  .          byte[
7250: 5d 20 62 20 3d 20 6e 65 77 20 62 79 74 65 5b 6e  ] b = new byte[n
7260: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 47 65 74  ];.          Get
7270: 42 79 74 65 73 28 73 74 6d 74 2c 20 69 6e 64 65  Bytes(stmt, inde
7280: 78 2c 20 30 2c 20 62 2c 20 30 2c 20 6e 29 3b 0a  x, 0, b, 0, n);.
7290: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74  .          if (t
72a0: 79 70 2e 54 79 70 65 20 3d 3d 20 44 62 54 79 70  yp.Type == DbTyp
72b0: 65 2e 47 75 69 64 20 26 26 20 6e 20 3d 3d 20 31  e.Guid && n == 1
72c0: 36 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  6).            r
72d0: 65 74 75 72 6e 20 6e 65 77 20 47 75 69 64 28 62  eturn new Guid(b
72e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 72 65  );..          re
72f0: 74 75 72 6e 20 62 3b 0a 20 20 20 20 20 20 20 20  turn b;.        
7300: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
7310: 79 2e 44 61 74 65 54 69 6d 65 3a 0a 20 20 20 20  y.DateTime:.    
7320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 47 65 74        return Get
7330: 44 61 74 65 54 69 6d 65 28 73 74 6d 74 2c 20 69  DateTime(stmt, i
7340: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 63  ndex);.        c
7350: 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79  ase TypeAffinity
7360: 2e 44 6f 75 62 6c 65 3a 0a 20 20 20 20 20 20 20  .Double:.       
7370: 20 20 20 69 66 20 28 74 20 3d 3d 20 6e 75 6c 6c     if (t == null
7380: 29 20 72 65 74 75 72 6e 20 47 65 74 44 6f 75 62  ) return GetDoub
7390: 6c 65 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b  le(stmt, index);
73a0: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a  .          else.
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
73c0: 72 6e 20 43 6f 6e 76 65 72 74 2e 43 68 61 6e 67  rn Convert.Chang
73d0: 65 54 79 70 65 28 47 65 74 44 6f 75 62 6c 65 28  eType(GetDouble(
73e0: 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 74 2c  stmt, index), t,
73f0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
7400: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
7410: 79 2e 49 6e 74 36 34 3a 0a 20 20 20 20 20 20 20  y.Int64:.       
7420: 20 20 20 69 66 20 28 74 20 3d 3d 20 6e 75 6c 6c     if (t == null
7430: 29 20 72 65 74 75 72 6e 20 47 65 74 49 6e 74 36  ) return GetInt6
7440: 34 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a  4(stmt, index);.
7450: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20            else. 
7460: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
7470: 6e 20 43 6f 6e 76 65 72 74 2e 43 68 61 6e 67 65  n Convert.Change
7480: 54 79 70 65 28 47 65 74 49 6e 74 36 34 28 73 74  Type(GetInt64(st
7490: 6d 74 2c 20 69 6e 64 65 78 29 2c 20 74 2c 20 6e  mt, index), t, n
74a0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ull);.        de
74b0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
74c0: 20 72 65 74 75 72 6e 20 47 65 74 54 65 78 74 28   return GetText(
74d0: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20  stmt, index);.  
74e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
74f0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
7500: 64 65 20 69 6e 74 20 47 65 74 43 75 72 73 6f 72  de int GetCursor
7510: 46 6f 72 54 61 62 6c 65 28 53 51 4c 69 74 65 53  ForTable(SQLiteS
7520: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
7530: 6e 74 20 64 62 2c 20 69 6e 74 20 72 6f 6f 74 50  nt db, int rootP
7540: 61 67 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 21  age).    {.#if !
7550: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a  SQLITE_STANDARD.
7560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73        return Uns
7570: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
7580: 2e 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  .sqlite3_table_c
7590: 75 72 73 6f 72 28 73 74 6d 74 2e 5f 73 71 6c 69  ursor(stmt._sqli
75a0: 74 65 5f 73 74 6d 74 2c 20 64 62 2c 20 72 6f 6f  te_stmt, db, roo
75b0: 74 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  tPage);.#else.  
75c0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 23      return -1;.#
75d0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
75e0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
75f0: 64 65 20 6c 6f 6e 67 20 47 65 74 52 6f 77 49 64  de long GetRowId
7600: 46 6f 72 43 75 72 73 6f 72 28 53 51 4c 69 74 65  ForCursor(SQLite
7610: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
7620: 69 6e 74 20 63 75 72 73 6f 72 29 0a 20 20 20 20  int cursor).    
7630: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54  {.#if !SQLITE_ST
7640: 41 4e 44 41 52 44 0a 20 20 20 20 20 20 6c 6f 6e  ANDARD.      lon
7650: 67 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20 69  g rowid;.      i
7660: 6e 74 20 72 63 20 3d 20 55 6e 73 61 66 65 4e 61  nt rc = UnsafeNa
7670: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
7680: 74 65 33 5f 63 75 72 73 6f 72 5f 72 6f 77 69 64  te3_cursor_rowid
7690: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
76a0: 6d 74 2c 20 63 75 72 73 6f 72 2c 20 6f 75 74 20  mt, cursor, out 
76b0: 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  rowid);.      if
76c0: 20 28 72 63 20 3d 3d 20 30 29 20 72 65 74 75 72   (rc == 0) retur
76d0: 6e 20 72 6f 77 69 64 3b 0a 0a 20 20 20 20 20 20  n rowid;..      
76e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
76f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7700: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
7710: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
7720: 69 64 65 20 76 6f 69 64 20 47 65 74 49 6e 64 65  ide void GetInde
7730: 78 43 6f 6c 75 6d 6e 45 78 74 65 6e 64 65 64 49  xColumnExtendedI
7740: 6e 66 6f 28 73 74 72 69 6e 67 20 64 61 74 61 62  nfo(string datab
7750: 61 73 65 2c 20 73 74 72 69 6e 67 20 69 6e 64 65  ase, string inde
7760: 78 2c 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e  x, string column
7770: 2c 20 6f 75 74 20 69 6e 74 20 73 6f 72 74 4d 6f  , out int sortMo
7780: 64 65 2c 20 6f 75 74 20 69 6e 74 20 6f 6e 45 72  de, out int onEr
7790: 72 6f 72 2c 20 6f 75 74 20 73 74 72 69 6e 67 20  ror, out string 
77a0: 63 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63  collationSequenc
77b0: 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53 51  e).    {.#if !SQ
77c0: 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20  LITE_STANDARD.  
77d0: 20 20 20 20 49 6e 74 50 74 72 20 63 6f 6c 6c 3b      IntPtr coll;
77e0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6c 6c 6c  .      int colll
77f0: 65 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  en;.      int rc
7800: 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 55 6e  ;..      rc = Un
7810: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
7820: 73 2e 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  s.sqlite3_index_
7830: 63 6f 6c 75 6d 6e 5f 69 6e 66 6f 5f 69 6e 74 65  column_info_inte
7840: 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38  rop(_sql, ToUTF8
7850: 28 64 61 74 61 62 61 73 65 29 2c 20 54 6f 55 54  (database), ToUT
7860: 46 38 28 69 6e 64 65 78 29 2c 20 54 6f 55 54 46  F8(index), ToUTF
7870: 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75 74 20 73  8(column), out s
7880: 6f 72 74 4d 6f 64 65 2c 20 6f 75 74 20 6f 6e 45  ortMode, out onE
7890: 72 72 6f 72 2c 20 6f 75 74 20 63 6f 6c 6c 2c 20  rror, out coll, 
78a0: 6f 75 74 20 63 6f 6c 6c 6c 65 6e 29 3b 0a 20 20  out colllen);.  
78b0: 20 20 20 20 69 66 20 28 72 63 20 21 3d 20 30 29      if (rc != 0)
78c0: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
78d0: 65 45 78 63 65 70 74 69 6f 6e 28 72 63 2c 20 22  eException(rc, "
78e0: 22 29 3b 0a 0a 20 20 20 20 20 20 63 6f 6c 6c 61  ");..      colla
78f0: 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 3d 20 55  tionSequence = U
7900: 54 46 38 54 6f 53 74 72 69 6e 67 28 63 6f 6c 6c  TF8ToString(coll
7910: 2c 20 63 6f 6c 6c 6c 65 6e 29 3b 0a 23 65 6c 73  , colllen);.#els
7920: 65 0a 20 20 20 20 20 20 73 6f 72 74 4d 6f 64 65  e.      sortMode
7930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 6e 45 72   = 0;.      onEr
7940: 72 6f 72 20 3d 20 32 3b 0a 20 20 20 20 20 20 63  ror = 2;.      c
7950: 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65  ollationSequence
7960: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 23 65 6e   = "BINARY";.#en
7970: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.