System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a30cf1fc78b6cebae7cdc3f178f4868ef885e799:


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 55 54 46 38 54 6f 53 74   return UTF8ToSt
0840: 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76  ring(UnsafeNativ
0850: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
0860: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 2d  _libversion(), -
0870: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
0880: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
0890: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43 68 61  override int Cha
08a0: 6e 67 65 73 0a 20 20 20 20 7b 0a 20 20 20 20 20  nges.    {.     
08b0: 20 67 65 74 0a 20 20 20 20 20 20 7b 0a 20 20 20   get.      {.   
08c0: 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61       return Unsa
08d0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
08e0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
08f0: 5f 73 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _sql);.      }. 
0900: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
0910: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
0920: 20 4f 70 65 6e 28 73 74 72 69 6e 67 20 73 74 72   Open(string str
0930: 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 69 74 65  Filename, SQLite
0940: 4f 70 65 6e 46 6c 61 67 73 45 6e 75 6d 20 66 6c  OpenFlagsEnum fl
0950: 61 67 73 2c 20 69 6e 74 20 6d 61 78 50 6f 6f 6c  ags, int maxPool
0960: 53 69 7a 65 2c 20 62 6f 6f 6c 20 75 73 65 50 6f  Size, bool usePo
0970: 6f 6c 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ol).    {.      
0980: 69 66 20 28 5f 73 71 6c 20 21 3d 20 6e 75 6c 6c  if (_sql != null
0990: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 20  ) return;..     
09a0: 20 5f 75 73 65 50 6f 6f 6c 20 3d 20 75 73 65 50   _usePool = useP
09b0: 6f 6f 6c 3b 0a 20 20 20 20 20 20 69 66 20 28 75  ool;.      if (u
09c0: 73 65 50 6f 6f 6c 29 0a 20 20 20 20 20 20 7b 0a  sePool).      {.
09d0: 20 20 20 20 20 20 20 20 5f 66 69 6c 65 4e 61 6d          _fileNam
09e0: 65 20 3d 20 73 74 72 46 69 6c 65 6e 61 6d 65 3b  e = strFilename;
09f0: 0a 20 20 20 20 20 20 20 20 5f 73 71 6c 20 3d 20  .        _sql = 
0a00: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
0a10: 50 6f 6f 6c 2e 52 65 6d 6f 76 65 28 73 74 72 46  Pool.Remove(strF
0a20: 69 6c 65 6e 61 6d 65 2c 20 6d 61 78 50 6f 6f 6c  ilename, maxPool
0a30: 53 69 7a 65 2c 20 6f 75 74 20 5f 70 6f 6f 6c 56  Size, out _poolV
0a40: 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  ersion);.      }
0a50: 0a 0a 20 20 20 20 20 20 69 66 20 28 5f 73 71 6c  ..      if (_sql
0a60: 20 3d 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20   == null).      
0a70: 7b 0a 20 20 20 20 20 20 20 20 49 6e 74 50 74 72  {.        IntPtr
0a80: 20 64 62 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54   db;..#if !SQLIT
0a90: 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20  E_STANDARD.     
0aa0: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
0ab0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
0ac0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e 74 65  qlite3_open_inte
0ad0: 72 6f 70 28 54 6f 55 54 46 38 28 73 74 72 46 69  rop(ToUTF8(strFi
0ae0: 6c 65 6e 61 6d 65 29 2c 20 28 69 6e 74 29 66 6c  lename), (int)fl
0af0: 61 67 73 2c 20 6f 75 74 20 64 62 29 3b 0a 23 65  ags, out db);.#e
0b00: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 6e 74 20  lse.        int 
0b10: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
0b20: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
0b30: 6f 70 65 6e 5f 76 32 28 54 6f 55 54 46 38 28 73  open_v2(ToUTF8(s
0b40: 74 72 46 69 6c 65 6e 61 6d 65 29 2c 20 6f 75 74  trFilename), out
0b50: 20 64 62 2c 20 28 69 6e 74 29 66 6c 61 67 73 2c   db, (int)flags,
0b60: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 3b 0a 23   IntPtr.Zero);.#
0b70: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
0b80: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
0b90: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
0ba0: 6f 6e 28 6e 2c 20 6e 75 6c 6c 29 3b 0a 0a 20 20  on(n, null);..  
0bb0: 20 20 20 20 20 20 5f 73 71 6c 20 3d 20 64 62 3b        _sql = db;
0bc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
0bd0: 2f 20 42 69 6e 64 20 66 75 6e 63 74 69 6f 6e 73  / Bind functions
0be0: 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   to this connect
0bf0: 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 70 72 65  ion.  If any pre
0c00: 76 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e 73 20  vious functions 
0c10: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
0c20: 0a 20 20 20 20 20 20 2f 2f 20 77 65 72 65 20 61  .      // were a
0c30: 6c 72 65 61 64 79 20 62 6f 75 6e 64 2c 20 74 68  lready bound, th
0c40: 65 6e 20 74 68 65 20 6e 65 77 20 62 69 6e 64 69  en the new bindi
0c50: 6e 67 73 20 72 65 70 6c 61 63 65 20 74 68 65 20  ngs replace the 
0c60: 6f 6c 64 2e 0a 20 20 20 20 20 20 5f 66 75 6e 63  old..      _func
0c70: 74 69 6f 6e 73 41 72 72 61 79 20 3d 20 53 51 4c  tionsArray = SQL
0c80: 69 74 65 46 75 6e 63 74 69 6f 6e 2e 42 69 6e 64  iteFunction.Bind
0c90: 46 75 6e 63 74 69 6f 6e 73 28 74 68 69 73 29 3b  Functions(this);
0ca0: 0a 20 20 20 20 20 20 53 65 74 54 69 6d 65 6f 75  .      SetTimeou
0cb0: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  t(0);.    }..   
0cc0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
0cd0: 64 65 20 76 6f 69 64 20 43 6c 65 61 72 50 6f 6f  de void ClearPoo
0ce0: 6c 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  l().    {.      
0cf0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
0d00: 50 6f 6f 6c 2e 43 6c 65 61 72 50 6f 6f 6c 28 5f  Pool.ClearPool(_
0d10: 66 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  fileName);.    }
0d20: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
0d30: 76 65 72 72 69 64 65 20 76 6f 69 64 20 53 65 74  verride void Set
0d40: 54 69 6d 65 6f 75 74 28 69 6e 74 20 6e 54 69 6d  Timeout(int nTim
0d50: 65 6f 75 74 4d 53 29 0a 20 20 20 20 7b 0a 20 20  eoutMS).    {.  
0d60: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
0d70: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
0d80: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
0d90: 65 6f 75 74 28 5f 73 71 6c 2c 20 6e 54 69 6d 65  eout(_sql, nTime
0da0: 6f 75 74 4d 53 29 3b 0a 20 20 20 20 20 20 69 66  outMS);.      if
0db0: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
0dc0: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
0dd0: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
0de0: 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a  Error());.    }.
0df0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
0e00: 65 72 72 69 64 65 20 62 6f 6f 6c 20 53 74 65 70  erride bool Step
0e10: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
0e20: 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20   stmt).    {.   
0e30: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
0e40: 52 61 6e 64 6f 6d 20 72 6e 64 20 3d 20 6e 75 6c  Random rnd = nul
0e50: 6c 3b 0a 20 20 20 20 20 20 75 69 6e 74 20 73 74  l;.      uint st
0e60: 61 72 74 74 69 63 6b 20 3d 20 28 75 69 6e 74 29  arttick = (uint)
0e70: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b  Environment.Tick
0e80: 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 75 69 6e  Count;.      uin
0e90: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 75 69 6e  t timeout = (uin
0ea0: 74 29 28 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64  t)(stmt._command
0eb0: 2e 5f 63 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74  ._commandTimeout
0ec0: 20 2a 20 31 30 30 30 29 3b 0a 0a 20 20 20 20 20   * 1000);..     
0ed0: 20 77 68 69 6c 65 20 28 74 72 75 65 29 0a 20 20   while (true).  
0ee0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6e 20      {.        n 
0ef0: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
0f00: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 73 74  thods.sqlite3_st
0f10: 65 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  ep(stmt._sqlite_
0f20: 73 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  stmt);..        
0f30: 69 66 20 28 6e 20 3d 3d 20 31 30 30 29 20 72 65  if (n == 100) re
0f40: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20  turn true;.     
0f50: 20 20 20 69 66 20 28 6e 20 3d 3d 20 31 30 31 29     if (n == 101)
0f60: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 0a   return false;..
0f70: 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20          if (n > 
0f80: 30 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  0).        {.   
0f90: 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 0a 20         int r;.. 
0fa0: 20 20 20 20 20 20 20 20 20 2f 2f 20 41 6e 20 65           // An e
0fb0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61  rror occurred, a
0fc0: 74 74 65 6d 70 74 20 74 6f 20 72 65 73 65 74 20  ttempt to reset 
0fd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
0fe0: 49 66 20 74 68 65 20 72 65 73 65 74 20 77 6f 72  If the reset wor
0ff0: 6b 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  ked because the.
1000: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 68            // sch
1010: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ema has changed,
1020: 20 72 65 2d 74 72 79 20 74 68 65 20 73 74 65 70   re-try the step
1030: 20 61 67 61 69 6e 2e 20 20 49 66 20 69 74 20 65   again.  If it e
1040: 72 72 6f 72 65 64 20 6f 75 72 20 62 65 63 61 75  rrored our becau
1050: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  se the database.
1060: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 73 20            // is 
1070: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 6b 65 65  locked, then kee
1080: 70 20 72 65 74 72 79 69 6e 67 20 75 6e 74 69 6c  p retrying until
1090: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 69 6d   the command tim
10a0: 65 6f 75 74 20 6f 63 63 75 72 73 2e 0a 20 20 20  eout occurs..   
10b0: 20 20 20 20 20 20 20 72 20 3d 20 52 65 73 65 74         r = Reset
10c0: 28 73 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 20  (stmt);..       
10d0: 20 20 20 69 66 20 28 72 20 3d 3d 20 30 29 0a 20     if (r == 0). 
10e0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
10f0: 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70   new SQLiteExcep
1100: 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61  tion(n, SQLiteLa
1110: 73 74 45 72 72 6f 72 28 29 29 3b 0a 0a 20 20 20  stError());..   
1120: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
1130: 28 72 20 3d 3d 20 36 20 7c 7c 20 72 20 3d 3d 20  (r == 6 || r == 
1140: 35 29 20 26 26 20 73 74 6d 74 2e 5f 63 6f 6d 6d  5) && stmt._comm
1150: 61 6e 64 20 21 3d 20 6e 75 6c 6c 29 20 2f 2f 20  and != null) // 
1160: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 7c 7c  SQLITE_LOCKED ||
1170: 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20   SQLITE_BUSY.   
1180: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1190: 20 20 20 20 20 2f 2f 20 4b 65 65 70 20 74 72 79       // Keep try
11a0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
11b0: 69 66 20 28 72 6e 64 20 3d 3d 20 6e 75 6c 6c 29  if (rnd == null)
11c0: 20 2f 2f 20 46 69 72 73 74 20 74 69 6d 65 20 77   // First time w
11d0: 65 27 76 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  e've encountered
11e0: 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20 20 20 20   the lock.      
11f0: 20 20 20 20 20 20 20 20 72 6e 64 20 3d 20 6e 65          rnd = ne
1200: 77 20 52 61 6e 64 6f 6d 28 29 3b 0a 0a 20 20 20  w Random();..   
1210: 20 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 77           // If w
1220: 65 27 76 65 20 65 78 63 65 65 64 65 64 20 74 68  e've exceeded th
1230: 65 20 63 6f 6d 6d 61 6e 64 27 73 20 74 69 6d 65  e command's time
1240: 6f 75 74 2c 20 67 69 76 65 20 75 70 20 61 6e 64  out, give up and
1250: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 0a   throw an error.
1260: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1270: 28 75 69 6e 74 29 45 6e 76 69 72 6f 6e 6d 65 6e  (uint)Environmen
1280: 74 2e 54 69 63 6b 43 6f 75 6e 74 20 2d 20 73 74  t.TickCount - st
1290: 61 72 74 74 69 63 6b 20 3e 20 74 69 6d 65 6f 75  arttick > timeou
12a0: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  t).            {
12b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
12c0: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
12d0: 78 63 65 70 74 69 6f 6e 28 72 2c 20 53 51 4c 69  xception(r, SQLi
12e0: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  teLastError());.
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1300: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20            else. 
1310: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
1320: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4f 74             // Ot
1330: 68 65 72 77 69 73 65 20 73 6c 65 65 70 20 66 6f  herwise sleep fo
1340: 72 20 61 20 72 61 6e 64 6f 6d 20 61 6d 6f 75 6e  r a random amoun
1350: 74 20 6f 66 20 74 69 6d 65 20 75 70 20 74 6f 20  t of time up to 
1360: 32 35 30 6d 73 0a 20 20 20 20 20 20 20 20 20 20  250ms.          
1370: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
1380: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
1390: 73 6c 65 65 70 28 28 75 69 6e 74 29 72 6e 64 2e  sleep((uint)rnd.
13a0: 4e 65 78 74 28 31 2c 20 32 35 30 29 29 3b 0a 20  Next(1, 250));. 
13b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13e0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
13f0: 76 65 72 72 69 64 65 20 69 6e 74 20 52 65 73 65  verride int Rese
1400: 74 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  t(SQLiteStatemen
1410: 74 20 73 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20  t stmt).    {.  
1420: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 23 69 66 20      int n;..#if 
1430: 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44  !SQLITE_STANDARD
1440: 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66  .      n = Unsaf
1450: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
1460: 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 69 6e 74  qlite3_reset_int
1470: 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74  erop(stmt._sqlit
1480: 65 5f 73 74 6d 74 29 3b 0a 23 65 6c 73 65 0a 20  e_stmt);.#else. 
1490: 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e       n = UnsafeN
14a0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
14b0: 69 74 65 33 5f 72 65 73 65 74 28 73 74 6d 74 2e  ite3_reset(stmt.
14c0: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29 3b 0a 23  _sqlite_stmt);.#
14d0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2f 20  endif..      // 
14e0: 49 66 20 74 68 65 20 73 63 68 65 6d 61 20 63 68  If the schema ch
14f0: 61 6e 67 65 64 2c 20 74 72 79 20 61 6e 64 20 72  anged, try and r
1500: 65 2d 70 72 65 70 61 72 65 20 69 74 0a 20 20 20  e-prepare it.   
1510: 20 20 20 69 66 20 28 6e 20 3d 3d 20 31 37 29 20     if (n == 17) 
1520: 2f 2f 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  // SQLITE_SCHEMA
1530: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1540: 20 2f 2f 20 52 65 63 72 65 61 74 65 20 61 20 64   // Recreate a d
1550: 75 6d 6d 79 20 73 74 61 74 65 6d 65 6e 74 0a 20  ummy statement. 
1560: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 74         string st
1570: 72 3b 0a 20 20 20 20 20 20 20 20 75 73 69 6e 67  r;.        using
1580: 20 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e   (SQLiteStatemen
1590: 74 20 74 6d 70 20 3d 20 50 72 65 70 61 72 65 28  t tmp = Prepare(
15a0: 6e 75 6c 6c 2c 20 73 74 6d 74 2e 5f 73 71 6c 53  null, stmt._sqlS
15b0: 74 61 74 65 6d 65 6e 74 2c 20 6e 75 6c 6c 2c 20  tatement, null, 
15c0: 28 75 69 6e 74 29 28 73 74 6d 74 2e 5f 63 6f 6d  (uint)(stmt._com
15d0: 6d 61 6e 64 2e 5f 63 6f 6d 6d 61 6e 64 54 69 6d  mand._commandTim
15e0: 65 6f 75 74 20 2a 20 31 30 30 30 29 2c 20 6f 75  eout * 1000), ou
15f0: 74 20 73 74 72 29 29 0a 20 20 20 20 20 20 20 20  t str)).        
1600: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46  {.          // F
1610: 69 6e 61 6c 69 7a 65 20 74 68 65 20 65 78 69 73  inalize the exis
1620: 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 0a 20  ting statement. 
1630: 20 20 20 20 20 20 20 20 20 73 74 6d 74 2e 5f 73           stmt._s
1640: 71 6c 69 74 65 5f 73 74 6d 74 2e 44 69 73 70 6f  qlite_stmt.Dispo
1650: 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  se();.          
1660: 2f 2f 20 52 65 61 73 73 69 67 6e 20 61 20 6e 65  // Reassign a ne
1670: 77 20 73 74 61 74 65 6d 65 6e 74 20 70 6f 69 6e  w statement poin
1680: 74 65 72 20 74 6f 20 74 68 65 20 6f 6c 64 20 73  ter to the old s
1690: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 63 6c 65  tatement and cle
16a0: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
16b0: 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 73   one.          s
16c0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
16d0: 20 3d 20 74 6d 70 2e 5f 73 71 6c 69 74 65 5f 73   = tmp._sqlite_s
16e0: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74  tmt;.          t
16f0: 6d 70 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 20  mp._sqlite_stmt 
1700: 3d 20 6e 75 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  = null;..       
1710: 20 20 20 2f 2f 20 52 65 61 70 70 6c 79 20 70 61     // Reapply pa
1720: 72 61 6d 65 74 65 72 73 0a 20 20 20 20 20 20 20  rameters.       
1730: 20 20 20 73 74 6d 74 2e 42 69 6e 64 50 61 72 61     stmt.BindPara
1740: 6d 65 74 65 72 73 28 29 3b 0a 20 20 20 20 20 20  meters();.      
1750: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
1760: 72 6e 20 2d 31 3b 20 2f 2f 20 52 65 73 65 74 20  rn -1; // Reset 
1770: 77 61 73 20 4f 4b 2c 20 77 69 74 68 20 73 63 68  was OK, with sch
1780: 65 6d 61 20 63 68 61 6e 67 65 0a 20 20 20 20 20  ema change.     
1790: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
17a0: 20 28 6e 20 3d 3d 20 36 20 7c 7c 20 6e 20 3d 3d   (n == 6 || n ==
17b0: 20 35 29 20 2f 2f 20 53 51 4c 49 54 45 5f 4c 4f   5) // SQLITE_LO
17c0: 43 4b 45 44 20 7c 7c 20 53 51 4c 49 54 45 5f 42  CKED || SQLITE_B
17d0: 55 53 59 0a 20 20 20 20 20 20 20 20 72 65 74 75  USY.        retu
17e0: 72 6e 20 6e 3b 0a 0a 20 20 20 20 20 20 69 66 20  rn n;..      if 
17f0: 28 6e 20 3e 20 30 29 0a 20 20 20 20 20 20 20 20  (n > 0).        
1800: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
1810: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
1820: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
1830: 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ..      return 0
1840: 3b 20 2f 2f 20 57 65 20 72 65 73 65 74 20 4f 4b  ; // We reset OK
1850: 2c 20 6e 6f 20 73 63 68 65 6d 61 20 63 68 61 6e  , no schema chan
1860: 67 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ges.    }..    i
1870: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
1880: 20 73 74 72 69 6e 67 20 53 51 4c 69 74 65 4c 61   string SQLiteLa
1890: 73 74 45 72 72 6f 72 28 29 0a 20 20 20 20 7b 0a  stError().    {.
18a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18b0: 69 74 65 42 61 73 65 2e 53 51 4c 69 74 65 4c 61  iteBase.SQLiteLa
18c0: 73 74 45 72 72 6f 72 28 5f 73 71 6c 29 3b 0a 20  stError(_sql);. 
18d0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
18e0: 61 6c 20 6f 76 65 72 72 69 64 65 20 53 51 4c 69  al override SQLi
18f0: 74 65 53 74 61 74 65 6d 65 6e 74 20 50 72 65 70  teStatement Prep
1900: 61 72 65 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63  are(SQLiteConnec
1910: 74 69 6f 6e 20 63 6e 6e 2c 20 73 74 72 69 6e 67  tion cnn, string
1920: 20 73 74 72 53 71 6c 2c 20 53 51 4c 69 74 65 53   strSql, SQLiteS
1930: 74 61 74 65 6d 65 6e 74 20 70 72 65 76 69 6f 75  tatement previou
1940: 73 2c 20 75 69 6e 74 20 74 69 6d 65 6f 75 74 4d  s, uint timeoutM
1950: 53 2c 20 6f 75 74 20 73 74 72 69 6e 67 20 73 74  S, out string st
1960: 72 52 65 6d 61 69 6e 29 0a 20 20 20 20 7b 0a 20  rRemain).    {. 
1970: 20 20 20 20 20 49 6e 74 50 74 72 20 73 74 6d 74       IntPtr stmt
1980: 20 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a   = IntPtr.Zero;.
1990: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72        IntPtr ptr
19a0: 20 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 3b 0a   = IntPtr.Zero;.
19b0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
19c0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  0;.      int n =
19d0: 20 31 37 3b 0a 20 20 20 20 20 20 69 6e 74 20 72   17;.      int r
19e0: 65 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20  etries = 0;.    
19f0: 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55    byte[] b = ToU
1a00: 54 46 38 28 73 74 72 53 71 6c 29 3b 0a 20 20 20  TF8(strSql);.   
1a10: 20 20 20 73 74 72 69 6e 67 20 74 79 70 65 64 65     string typede
1a20: 66 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20  fs = null;.     
1a30: 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74   SQLiteStatement
1a40: 20 63 6d 64 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20   cmd = null;.   
1a50: 20 20 20 52 61 6e 64 6f 6d 20 72 6e 64 20 3d 20     Random rnd = 
1a60: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 75 69 6e 74  null;.      uint
1a70: 20 73 74 61 72 74 74 69 63 6b 20 3d 20 28 75 69   starttick = (ui
1a80: 6e 74 29 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54  nt)Environment.T
1a90: 69 63 6b 43 6f 75 6e 74 3b 0a 0a 20 20 20 20 20  ickCount;..     
1aa0: 20 47 43 48 61 6e 64 6c 65 20 68 61 6e 64 6c 65   GCHandle handle
1ab0: 20 3d 20 47 43 48 61 6e 64 6c 65 2e 41 6c 6c 6f   = GCHandle.Allo
1ac0: 63 28 62 2c 20 47 43 48 61 6e 64 6c 65 54 79 70  c(b, GCHandleTyp
1ad0: 65 2e 50 69 6e 6e 65 64 29 3b 0a 20 20 20 20 20  e.Pinned);.     
1ae0: 20 49 6e 74 50 74 72 20 70 73 71 6c 20 3d 20 68   IntPtr psql = h
1af0: 61 6e 64 6c 65 2e 41 64 64 72 4f 66 50 69 6e 6e  andle.AddrOfPinn
1b00: 65 64 4f 62 6a 65 63 74 28 29 3b 0a 20 20 20 20  edObject();.    
1b10: 20 20 74 72 79 0a 20 20 20 20 20 20 7b 0a 20 20    try.      {.  
1b20: 20 20 20 20 20 20 77 68 69 6c 65 20 28 28 6e 20        while ((n 
1b30: 3d 3d 20 31 37 20 7c 7c 20 6e 20 3d 3d 20 36 20  == 17 || n == 6 
1b40: 7c 7c 20 6e 20 3d 3d 20 35 29 20 26 26 20 72 65  || n == 5) && re
1b50: 74 72 69 65 73 20 3c 20 33 29 0a 20 20 20 20 20  tries < 3).     
1b60: 20 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45     {.#if !SQLITE
1b70: 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20  _STANDARD.      
1b80: 20 20 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61      n = UnsafeNa
1b90: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
1ba0: 74 65 33 5f 70 72 65 70 61 72 65 5f 69 6e 74 65  te3_prepare_inte
1bb0: 72 6f 70 28 5f 73 71 6c 2c 20 70 73 71 6c 2c 20  rop(_sql, psql, 
1bc0: 62 2e 4c 65 6e 67 74 68 20 2d 20 31 2c 20 6f 75  b.Length - 1, ou
1bd0: 74 20 73 74 6d 74 2c 20 6f 75 74 20 70 74 72 2c  t stmt, out ptr,
1be0: 20 6f 75 74 20 6c 65 6e 29 3b 0a 23 65 6c 73 65   out len);.#else
1bf0: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 55  .          n = U
1c00: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1c10: 64 73 2e 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ds.sqlite3_prepa
1c20: 72 65 28 5f 73 71 6c 2c 20 70 73 71 6c 2c 20 62  re(_sql, psql, b
1c30: 2e 4c 65 6e 67 74 68 20 2d 20 31 2c 20 6f 75 74  .Length - 1, out
1c40: 20 73 74 6d 74 2c 20 6f 75 74 20 70 74 72 29 3b   stmt, out ptr);
1c50: 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d  .          len =
1c60: 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20   -1;.#endif..   
1c70: 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20         if (n == 
1c80: 31 37 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  17).            
1c90: 72 65 74 72 69 65 73 2b 2b 3b 0a 20 20 20 20 20  retries++;.     
1ca0: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e 20       else if (n 
1cb0: 3d 3d 20 31 29 0a 20 20 20 20 20 20 20 20 20 20  == 1).          
1cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1cd0: 20 28 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65   (String.Compare
1ce0: 28 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72  (SQLiteLastError
1cf0: 28 29 2c 20 22 6e 65 61 72 20 5c 22 54 59 50 45  (), "near \"TYPE
1d00: 53 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  S\": syntax erro
1d10: 72 22 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  r", StringCompar
1d20: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
1d30: 72 65 43 61 73 65 29 20 3d 3d 20 30 29 0a 20 20  reCase) == 0).  
1d40: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
1d50: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 6f            int po
1d60: 73 20 3d 20 73 74 72 53 71 6c 2e 49 6e 64 65 78  s = strSql.Index
1d70: 4f 66 28 27 3b 27 29 3b 0a 20 20 20 20 20 20 20  Of(';');.       
1d80: 20 20 20 20 20 20 20 69 66 20 28 70 6f 73 20 3d         if (pos =
1d90: 3d 20 2d 31 29 20 70 6f 73 20 3d 20 73 74 72 53  = -1) pos = strS
1da0: 71 6c 2e 4c 65 6e 67 74 68 20 2d 20 31 3b 0a 0a  ql.Length - 1;..
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 79                ty
1dc0: 70 65 64 65 66 73 20 3d 20 73 74 72 53 71 6c 2e  pedefs = strSql.
1dd0: 53 75 62 73 74 72 69 6e 67 28 30 2c 20 70 6f 73  Substring(0, pos
1de0: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20   + 1);.         
1df0: 20 20 20 20 20 73 74 72 53 71 6c 20 3d 20 73 74       strSql = st
1e00: 72 53 71 6c 2e 53 75 62 73 74 72 69 6e 67 28 70  rSql.Substring(p
1e10: 6f 73 20 2b 20 31 29 3b 0a 0a 20 20 20 20 20 20  os + 1);..      
1e20: 20 20 20 20 20 20 20 20 73 74 72 52 65 6d 61 69          strRemai
1e30: 6e 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20 20 20  n = "";..       
1e40: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 63 6d         while (cm
1e50: 64 20 3d 3d 20 6e 75 6c 6c 20 26 26 20 73 74 72  d == null && str
1e60: 53 71 6c 2e 4c 65 6e 67 74 68 20 3e 20 30 29 0a  Sql.Length > 0).
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 63 6d 64 20 3d 20 50 72 65 70 61 72 65 28 63 6e  cmd = Prepare(cn
1ea0: 6e 2c 20 73 74 72 53 71 6c 2c 20 70 72 65 76 69  n, strSql, previ
1eb0: 6f 75 73 2c 20 74 69 6d 65 6f 75 74 4d 53 2c 20  ous, timeoutMS, 
1ec0: 6f 75 74 20 73 74 72 52 65 6d 61 69 6e 29 3b 0a  out strRemain);.
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 73 74 72 53 71 6c 20 3d 20 73 74 72 52 65 6d 61  strSql = strRema
1ef0: 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  in;.            
1f00: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1f10: 20 20 20 69 66 20 28 63 6d 64 20 21 3d 20 6e 75     if (cmd != nu
1f20: 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll).            
1f30: 20 20 20 20 63 6d 64 2e 53 65 74 54 79 70 65 73      cmd.SetTypes
1f40: 28 74 79 70 65 64 65 66 73 29 3b 0a 0a 20 20 20  (typedefs);..   
1f50: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1f60: 6e 20 63 6d 64 3b 0a 20 20 20 20 20 20 20 20 20  n cmd;.         
1f70: 20 20 20 7d 0a 23 69 66 20 21 50 4c 41 54 46 4f     }.#if !PLATFO
1f80: 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
1f90: 4f 52 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ORK.            
1fa0: 65 6c 73 65 20 69 66 20 28 5f 62 75 69 6c 64 69  else if (_buildi
1fb0: 6e 67 53 63 68 65 6d 61 20 3d 3d 20 66 61 6c 73  ngSchema == fals
1fc0: 65 20 26 26 20 53 74 72 69 6e 67 2e 43 6f 6d 70  e && String.Comp
1fd0: 61 72 65 28 53 51 4c 69 74 65 4c 61 73 74 45 72  are(SQLiteLastEr
1fe0: 72 6f 72 28 29 2c 20 30 2c 20 22 6e 6f 20 73 75  ror(), 0, "no su
1ff0: 63 68 20 74 61 62 6c 65 3a 20 54 45 4d 50 2e 53  ch table: TEMP.S
2000: 43 48 45 4d 41 22 2c 20 30 2c 20 32 36 2c 20 53  CHEMA", 0, 26, S
2010: 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e  tringComparison.
2020: 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73  OrdinalIgnoreCas
2030: 65 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20  e) == 0).       
2040: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2050: 20 20 20 20 20 73 74 72 52 65 6d 61 69 6e 20 3d       strRemain =
2060: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20   "";.           
2070: 20 20 20 5f 62 75 69 6c 64 69 6e 67 53 63 68 65     _buildingSche
2080: 6d 61 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  ma = true;.     
2090: 20 20 20 20 20 20 20 20 20 74 72 79 0a 20 20 20           try.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 53 51               ISQ
20c0: 4c 69 74 65 53 63 68 65 6d 61 45 78 74 65 6e 73  LiteSchemaExtens
20d0: 69 6f 6e 73 20 65 78 74 20 3d 20 28 28 49 53 65  ions ext = ((ISe
20e0: 72 76 69 63 65 50 72 6f 76 69 64 65 72 29 53 51  rviceProvider)SQ
20f0: 4c 69 74 65 46 61 63 74 6f 72 79 2e 49 6e 73 74  LiteFactory.Inst
2100: 61 6e 63 65 29 2e 47 65 74 53 65 72 76 69 63 65  ance).GetService
2110: 28 74 79 70 65 6f 66 28 49 53 51 4c 69 74 65 53  (typeof(ISQLiteS
2120: 63 68 65 6d 61 45 78 74 65 6e 73 69 6f 6e 73 29  chemaExtensions)
2130: 29 20 61 73 20 49 53 51 4c 69 74 65 53 63 68 65  ) as ISQLiteSche
2140: 6d 61 45 78 74 65 6e 73 69 6f 6e 73 3b 0a 0a 20  maExtensions;.. 
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2160: 66 20 28 65 78 74 20 21 3d 20 6e 75 6c 6c 29 0a  f (ext != null).
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 65 78 74 2e 42 75 69 6c 64 54 65 6d 70 53    ext.BuildTempS
2190: 63 68 65 6d 61 28 63 6e 6e 29 3b 0a 0a 20 20 20  chema(cnn);..   
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
21b0: 6c 65 20 28 63 6d 64 20 3d 3d 20 6e 75 6c 6c 20  le (cmd == null 
21c0: 26 26 20 73 74 72 53 71 6c 2e 4c 65 6e 67 74 68  && strSql.Length
21d0: 20 3e 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   > 0).          
21e0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
21f0: 20 20 20 20 20 20 20 20 20 20 63 6d 64 20 3d 20            cmd = 
2200: 50 72 65 70 61 72 65 28 63 6e 6e 2c 20 73 74 72  Prepare(cnn, str
2210: 53 71 6c 2c 20 70 72 65 76 69 6f 75 73 2c 20 74  Sql, previous, t
2220: 69 6d 65 6f 75 74 4d 53 2c 20 6f 75 74 20 73 74  imeoutMS, out st
2230: 72 52 65 6d 61 69 6e 29 3b 0a 20 20 20 20 20 20  rRemain);.      
2240: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 53              strS
2250: 71 6c 20 3d 20 73 74 72 52 65 6d 61 69 6e 3b 0a  ql = strRemain;.
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
2280: 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0a 20     return cmd;. 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e               fin
22b0: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 20 20 20  ally.           
22c0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
22d0: 20 20 20 20 20 5f 62 75 69 6c 64 69 6e 67 53 63       _buildingSc
22e0: 68 65 6d 61 20 3d 20 66 61 6c 73 65 3b 0a 20 20  hema = false;.  
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2300: 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
2310: 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  if.          }. 
2320: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
2330: 20 28 6e 20 3d 3d 20 36 20 7c 7c 20 6e 20 3d 3d   (n == 6 || n ==
2340: 20 35 29 20 2f 2f 20 4c 6f 63 6b 65 64 20 2d 2d   5) // Locked --
2350: 20 64 65 6c 61 79 20 61 20 73 6d 61 6c 6c 20 61   delay a small a
2360: 6d 6f 75 6e 74 20 62 65 66 6f 72 65 20 72 65 74  mount before ret
2370: 72 79 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rying.          
2380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
2390: 20 4b 65 65 70 20 74 72 79 69 6e 67 0a 20 20 20   Keep trying.   
23a0: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 6e 64           if (rnd
23b0: 20 3d 3d 20 6e 75 6c 6c 29 20 2f 2f 20 46 69 72   == null) // Fir
23c0: 73 74 20 74 69 6d 65 20 77 65 27 76 65 20 65 6e  st time we've en
23d0: 63 6f 75 6e 74 65 72 65 64 20 74 68 65 20 6c 6f  countered the lo
23e0: 63 6b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ck.             
23f0: 20 72 6e 64 20 3d 20 6e 65 77 20 52 61 6e 64 6f   rnd = new Rando
2400: 6d 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  m();..          
2410: 20 20 2f 2f 20 49 66 20 77 65 27 76 65 20 65 78    // If we've ex
2420: 63 65 65 64 65 64 20 74 68 65 20 63 6f 6d 6d 61  ceeded the comma
2430: 6e 64 27 73 20 74 69 6d 65 6f 75 74 2c 20 67 69  nd's timeout, gi
2440: 76 65 20 75 70 20 61 6e 64 20 74 68 72 6f 77 20  ve up and throw 
2450: 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  an error.       
2460: 20 20 20 20 20 69 66 20 28 28 75 69 6e 74 29 45       if ((uint)E
2470: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
2480: 6f 75 6e 74 20 2d 20 73 74 61 72 74 74 69 63 6b  ount - starttick
2490: 20 3e 20 74 69 6d 65 6f 75 74 4d 53 29 0a 20 20   > timeoutMS).  
24a0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
24b0: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
24c0: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
24d0: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
24e0: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 20  tError());.     
24f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2500: 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20       else.      
2510: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2520: 20 20 20 20 20 20 2f 2f 20 4f 74 68 65 72 77 69        // Otherwi
2530: 73 65 20 73 6c 65 65 70 20 66 6f 72 20 61 20 72  se sleep for a r
2540: 61 6e 64 6f 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  andom amount of 
2550: 74 69 6d 65 20 75 70 20 74 6f 20 32 35 30 6d 73  time up to 250ms
2560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55  .              U
2570: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
2580: 64 73 2e 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  ds.sqlite3_sleep
2590: 28 28 75 69 6e 74 29 72 6e 64 2e 4e 65 78 74 28  ((uint)rnd.Next(
25a0: 31 2c 20 32 35 30 29 29 3b 0a 20 20 20 20 20 20  1, 250));.      
25b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
25d0: 20 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30         if (n > 0
25e0: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
25f0: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
2600: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
2610: 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 74 72 52  );..        strR
2620: 65 6d 61 69 6e 20 3d 20 55 54 46 38 54 6f 53 74  emain = UTF8ToSt
2630: 72 69 6e 67 28 70 74 72 2c 20 6c 65 6e 29 3b 0a  ring(ptr, len);.
2640: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 74 6d  .        if (stm
2650: 74 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f  t != IntPtr.Zero
2660: 29 20 63 6d 64 20 3d 20 6e 65 77 20 53 51 4c 69  ) cmd = new SQLi
2670: 74 65 53 74 61 74 65 6d 65 6e 74 28 74 68 69 73  teStatement(this
2680: 2c 20 73 74 6d 74 2c 20 73 74 72 53 71 6c 2e 53  , stmt, strSql.S
2690: 75 62 73 74 72 69 6e 67 28 30 2c 20 73 74 72 53  ubstring(0, strS
26a0: 71 6c 2e 4c 65 6e 67 74 68 20 2d 20 73 74 72 52  ql.Length - strR
26b0: 65 6d 61 69 6e 2e 4c 65 6e 67 74 68 29 2c 20 70  emain.Length), p
26c0: 72 65 76 69 6f 75 73 29 3b 0a 0a 20 20 20 20 20  revious);..     
26d0: 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0a 20     return cmd;. 
26e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 69 6e       }.      fin
26f0: 61 6c 6c 79 0a 20 20 20 20 20 20 7b 0a 20 20 20  ally.      {.   
2700: 20 20 20 20 20 68 61 6e 64 6c 65 2e 46 72 65 65       handle.Free
2710: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
2720: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
2730: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 42 69  override void Bi
2740: 6e 64 5f 44 6f 75 62 6c 65 28 53 51 4c 69 74 65  nd_Double(SQLite
2750: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
2760: 69 6e 74 20 69 6e 64 65 78 2c 20 64 6f 75 62 6c  int index, doubl
2770: 65 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 23  e value).    {.#
2780: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
2790: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20  PACTFRAMEWORK.  
27a0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
27b0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
27c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
27d0: 62 6c 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  ble(stmt._sqlite
27e0: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61  _stmt, index, va
27f0: 6c 75 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  lue);.#else.    
2800: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
2810: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
2820: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
2830: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
2840: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
2850: 65 78 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a  ex, ref value);.
2860: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
2870: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
2880: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
2890: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
28a0: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  rror());.    }..
28b0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
28c0: 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f  rride void Bind_
28d0: 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61 74  Int32(SQLiteStat
28e0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
28f0: 69 6e 64 65 78 2c 20 69 6e 74 20 76 61 6c 75 65  index, int value
2900: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
2910: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
2920: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
2930: 33 5f 62 69 6e 64 5f 69 6e 74 28 73 74 6d 74 2e  3_bind_int(stmt.
2940: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
2950: 64 65 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20  dex, value);.   
2960: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
2970: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
2980: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
2990: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  eLastError());. 
29a0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
29b0: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
29c0: 20 42 69 6e 64 5f 49 6e 74 36 34 28 53 51 4c 69   Bind_Int64(SQLi
29d0: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
29e0: 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 6c 6f 6e  , int index, lon
29f0: 67 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 23  g value).    {.#
2a00: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
2a10: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20  PACTFRAMEWORK.  
2a20: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
2a30: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
2a40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
2a50: 36 34 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  64(stmt._sqlite_
2a60: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c  stmt, index, val
2a70: 75 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ue);.#else.     
2a80: 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e   int n = UnsafeN
2a90: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
2aa0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 5f  ite3_bind_int64_
2ab0: 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71  interop(stmt._sq
2ac0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
2ad0: 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a 23 65  , ref value);.#e
2ae0: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 6e  ndif.      if (n
2af0: 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20   > 0) throw new 
2b00: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
2b10: 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  n, SQLiteLastErr
2b20: 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  or());.    }..  
2b30: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
2b40: 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 54 65  ide void Bind_Te
2b50: 78 74 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  xt(SQLiteStateme
2b60: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
2b70: 65 78 2c 20 73 74 72 69 6e 67 20 76 61 6c 75 65  ex, string value
2b80: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 62 79  ).    {.      by
2b90: 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46 38 28  te[] b = ToUTF8(
2ba0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 6e  value);.      in
2bb0: 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  t n = UnsafeNati
2bc0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
2bd0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 73 74 6d 74  3_bind_text(stmt
2be0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
2bf0: 6e 64 65 78 2c 20 62 2c 20 62 2e 4c 65 6e 67 74  ndex, b, b.Lengt
2c00: 68 20 2d 20 31 2c 20 28 49 6e 74 50 74 72 29 28  h - 1, (IntPtr)(
2c10: 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  -1));.      if (
2c20: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
2c30: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
2c40: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
2c50: 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ror());.    }.. 
2c60: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
2c70: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 44  ride void Bind_D
2c80: 61 74 65 54 69 6d 65 28 53 51 4c 69 74 65 53 74  ateTime(SQLiteSt
2c90: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
2ca0: 74 20 69 6e 64 65 78 2c 20 44 61 74 65 54 69 6d  t index, DateTim
2cb0: 65 20 64 74 29 0a 20 20 20 20 7b 0a 20 20 20 20  e dt).    {.    
2cc0: 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55    byte[] b = ToU
2cd0: 54 46 38 28 64 74 29 3b 0a 20 20 20 20 20 20 69  TF8(dt);.      i
2ce0: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
2cf0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
2d00: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 73 74 6d  e3_bind_text(stm
2d10: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
2d20: 69 6e 64 65 78 2c 20 62 2c 20 62 2e 4c 65 6e 67  index, b, b.Leng
2d30: 74 68 20 2d 20 31 2c 20 28 49 6e 74 50 74 72 29  th - 1, (IntPtr)
2d40: 28 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 20  (-1));.      if 
2d50: 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65  (n > 0) throw ne
2d60: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
2d70: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
2d80: 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  rror());.    }..
2d90: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
2da0: 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f  rride void Bind_
2db0: 42 6c 6f 62 28 53 51 4c 69 74 65 53 74 61 74 65  Blob(SQLiteState
2dc0: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
2dd0: 6e 64 65 78 2c 20 62 79 74 65 5b 5d 20 62 6c 6f  ndex, byte[] blo
2de0: 62 44 61 74 61 29 0a 20 20 20 20 7b 0a 20 20 20  bData).    {.   
2df0: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
2e00: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2e10: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
2e20: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
2e30: 6d 74 2c 20 69 6e 64 65 78 2c 20 62 6c 6f 62 44  mt, index, blobD
2e40: 61 74 61 2c 20 62 6c 6f 62 44 61 74 61 2e 4c 65  ata, blobData.Le
2e50: 6e 67 74 68 2c 20 28 49 6e 74 50 74 72 29 28 2d  ngth, (IntPtr)(-
2e60: 31 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 6e  1));.      if (n
2e70: 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20   > 0) throw new 
2e80: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28  SQLiteException(
2e90: 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72  n, SQLiteLastErr
2ea0: 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  or());.    }..  
2eb0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
2ec0: 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 4e 75  ide void Bind_Nu
2ed0: 6c 6c 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  ll(SQLiteStateme
2ee0: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
2ef0: 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ex).    {.      
2f00: 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61  int n = UnsafeNa
2f10: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
2f20: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 73 74  te3_bind_null(st
2f30: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
2f40: 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 69   index);.      i
2f50: 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20  f (n > 0) throw 
2f60: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
2f70: 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73  ion(n, SQLiteLas
2f80: 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20 7d  tError());.    }
2f90: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
2fa0: 76 65 72 72 69 64 65 20 69 6e 74 20 42 69 6e 64  verride int Bind
2fb0: 5f 50 61 72 61 6d 43 6f 75 6e 74 28 53 51 4c 69  _ParamCount(SQLi
2fc0: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
2fd0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65  ).    {.      re
2fe0: 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76  turn UnsafeNativ
2ff0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
3000: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
3010: 63 6f 75 6e 74 28 73 74 6d 74 2e 5f 73 71 6c 69  count(stmt._sqli
3020: 74 65 5f 73 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  te_stmt);.    }.
3030: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
3040: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 42 69  erride string Bi
3050: 6e 64 5f 50 61 72 61 6d 4e 61 6d 65 28 53 51 4c  nd_ParamName(SQL
3060: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
3070: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20  t, int index).  
3080: 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    {.#if !SQLITE_
3090: 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 69  STANDARD.      i
30a0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65  nt len;.      re
30b0: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
30c0: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
30d0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69  thods.sqlite3_bi
30e0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
30f0: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
3100: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
3110: 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c 65  ex, out len), le
3120: 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  n);.#else.      
3130: 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72  return UTF8ToStr
3140: 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65  ing(UnsafeNative
3150: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
3160: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
3170: 61 6d 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  ame(stmt._sqlite
3180: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 2d  _stmt, index), -
3190: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
31a0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
31b0: 76 65 72 72 69 64 65 20 69 6e 74 20 42 69 6e 64  verride int Bind
31c0: 5f 50 61 72 61 6d 49 6e 64 65 78 28 53 51 4c 69  _ParamIndex(SQLi
31d0: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
31e0: 2c 20 73 74 72 69 6e 67 20 70 61 72 61 6d 4e 61  , string paramNa
31f0: 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  me).    {.      
3200: 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74  return UnsafeNat
3210: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
3220: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
3230: 72 5f 69 6e 64 65 78 28 73 74 6d 74 2e 5f 73 71  r_index(stmt._sq
3240: 6c 69 74 65 5f 73 74 6d 74 2c 20 54 6f 55 54 46  lite_stmt, ToUTF
3250: 38 28 70 61 72 61 6d 4e 61 6d 65 29 29 3b 0a 20  8(paramName));. 
3260: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3270: 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20  al override int 
3280: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 53 51 4c 69  ColumnCount(SQLi
3290: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
32a0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65  ).    {.      re
32b0: 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76  turn UnsafeNativ
32c0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
32d0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 73 74  _column_count(st
32e0: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 29  mt._sqlite_stmt)
32f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
3300: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73  ernal override s
3310: 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65  tring ColumnName
3320: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
3330: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
3340: 29 0a 20 20 20 20 7b 0a 23 69 66 20 21 53 51 4c  ).    {.#if !SQL
3350: 49 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20  ITE_STANDARD.   
3360: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
3370: 20 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53    return UTF8ToS
3380: 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69  tring(UnsafeNati
3390: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
33a0: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 5f 69 6e  3_column_name_in
33b0: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
33c0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
33d0: 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a  out len), len);.
33e0: 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75  #else.      retu
33f0: 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rn UTF8ToString(
3400: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
3410: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
3420: 6d 6e 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f 73 71  mn_name(stmt._sq
3430: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
3440: 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ), -1);.#endif. 
3450: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3460: 61 6c 20 6f 76 65 72 72 69 64 65 20 54 79 70 65  al override Type
3470: 41 66 66 69 6e 69 74 79 20 43 6f 6c 75 6d 6e 41  Affinity ColumnA
3480: 66 66 69 6e 69 74 79 28 53 51 4c 69 74 65 53 74  ffinity(SQLiteSt
3490: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
34a0: 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20  t index).    {. 
34b0: 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61       return Unsa
34c0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
34d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
34e0: 79 70 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  ype(stmt._sqlite
34f0: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20  _stmt, index);. 
3500: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3510: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
3520: 6e 67 20 43 6f 6c 75 6d 6e 54 79 70 65 28 53 51  ng ColumnType(SQ
3530: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
3540: 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 6f  mt, int index, o
3550: 75 74 20 54 79 70 65 41 66 66 69 6e 69 74 79 20  ut TypeAffinity 
3560: 6e 41 66 66 69 6e 69 74 79 29 0a 20 20 20 20 7b  nAffinity).    {
3570: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  .      int len;.
3580: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
3590: 44 41 52 44 0a 20 20 20 20 20 20 49 6e 74 50 74  DARD.      IntPt
35a0: 72 20 70 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  r p = UnsafeNati
35b0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
35c0: 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
35d0: 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f  e_interop(stmt._
35e0: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
35f0: 65 78 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a 23 65  ex, out len);.#e
3600: 6c 73 65 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20  lse.      len = 
3610: 2d 31 3b 0a 20 20 20 20 20 20 49 6e 74 50 74 72  -1;.      IntPtr
3620: 20 70 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   p = UnsafeNativ
3630: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
3640: 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
3650: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
3660: 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 23 65 6e 64  mt, index);.#end
3670: 69 66 0a 20 20 20 20 20 20 6e 41 66 66 69 6e 69  if.      nAffini
3680: 74 79 20 3d 20 43 6f 6c 75 6d 6e 41 66 66 69 6e  ty = ColumnAffin
3690: 69 74 79 28 73 74 6d 74 2c 20 69 6e 64 65 78 29  ity(stmt, index)
36a0: 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 70 20 21  ;..      if (p !
36b0: 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 20 72  = IntPtr.Zero) r
36c0: 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69  eturn UTF8ToStri
36d0: 6e 67 28 70 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  ng(p, len);.    
36e0: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20    else.      {. 
36f0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d 20         string[] 
3700: 61 72 20 3d 20 73 74 6d 74 2e 54 79 70 65 44 65  ar = stmt.TypeDe
3710: 66 69 6e 69 74 69 6f 6e 73 3b 0a 20 20 20 20 20  finitions;.     
3720: 20 20 20 69 66 20 28 61 72 20 21 3d 20 6e 75 6c     if (ar != nul
3730: 6c 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  l).        {.   
3740: 20 20 20 20 20 20 20 69 66 20 28 69 6e 64 65 78         if (index
3750: 20 3c 20 61 72 2e 4c 65 6e 67 74 68 20 26 26 20   < ar.Length && 
3760: 61 72 5b 69 6e 64 65 78 5d 20 21 3d 20 6e 75 6c  ar[index] != nul
3770: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  l).            r
3780: 65 74 75 72 6e 20 61 72 5b 69 6e 64 65 78 5d 3b  eturn ar[index];
3790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37a0: 20 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67     return String
37b0: 2e 45 6d 70 74 79 3b 0a 0a 20 20 20 20 20 20 20  .Empty;..       
37c0: 20 2f 2f 73 77 69 74 63 68 20 28 6e 41 66 66 69   //switch (nAffi
37d0: 6e 69 74 79 29 0a 20 20 20 20 20 20 20 20 2f 2f  nity).        //
37e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 63 61  {.        //  ca
37f0: 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  se TypeAffinity.
3800: 49 6e 74 36 34 3a 0a 20 20 20 20 20 20 20 20 2f  Int64:.        /
3810: 2f 20 20 20 20 72 65 74 75 72 6e 20 22 42 49 47  /    return "BIG
3820: 49 4e 54 22 3b 0a 20 20 20 20 20 20 20 20 2f 2f  INT";.        //
3830: 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e    case TypeAffin
3840: 69 74 79 2e 44 6f 75 62 6c 65 3a 0a 20 20 20 20  ity.Double:.    
3850: 20 20 20 20 2f 2f 20 20 20 20 72 65 74 75 72 6e      //    return
3860: 20 22 44 4f 55 42 4c 45 22 3b 0a 20 20 20 20 20   "DOUBLE";.     
3870: 20 20 20 2f 2f 20 20 63 61 73 65 20 54 79 70 65     //  case Type
3880: 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62 3a 0a 20  Affinity.Blob:. 
3890: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 72 65 74         //    ret
38a0: 75 72 6e 20 22 42 4c 4f 42 22 3b 0a 20 20 20 20  urn "BLOB";.    
38b0: 20 20 20 20 2f 2f 20 20 64 65 66 61 75 6c 74 3a      //  default:
38c0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 72  .        //    r
38d0: 65 74 75 72 6e 20 22 54 45 58 54 22 3b 0a 20 20  eturn "TEXT";.  
38e0: 20 20 20 20 20 20 2f 2f 7d 0a 20 20 20 20 20 20        //}.      
38f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  }.    }..    int
3900: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69  ernal override i
3910: 6e 74 20 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 53  nt ColumnIndex(S
3920: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
3930: 74 6d 74 2c 20 73 74 72 69 6e 67 20 63 6f 6c 75  tmt, string colu
3940: 6d 6e 4e 61 6d 65 29 0a 20 20 20 20 7b 0a 20 20  mnName).    {.  
3950: 20 20 20 20 69 6e 74 20 78 20 3d 20 43 6f 6c 75      int x = Colu
3960: 6d 6e 43 6f 75 6e 74 28 73 74 6d 74 29 3b 0a 0a  mnCount(stmt);..
3970: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e        for (int n
3980: 20 3d 20 30 3b 20 6e 20 3c 20 78 3b 20 6e 2b 2b   = 0; n < x; n++
3990: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
39a0: 20 20 69 66 20 28 53 74 72 69 6e 67 2e 43 6f 6d    if (String.Com
39b0: 70 61 72 65 28 63 6f 6c 75 6d 6e 4e 61 6d 65 2c  pare(columnName,
39c0: 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 74 6d 74   ColumnName(stmt
39d0: 2c 20 6e 29 2c 20 74 72 75 65 2c 20 43 75 6c 74  , n), true, Cult
39e0: 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e  ureInfo.Invarian
39f0: 74 43 75 6c 74 75 72 65 29 20 3d 3d 20 30 29 0a  tCulture) == 0).
3a00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3a10: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
3a20: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
3a30: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
3a40: 20 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67   override string
3a50: 20 43 6f 6c 75 6d 6e 4f 72 69 67 69 6e 61 6c 4e   ColumnOriginalN
3a60: 61 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ame(SQLiteStatem
3a70: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
3a80: 64 65 78 29 0a 20 20 20 20 7b 0a 23 69 66 20 21  dex).    {.#if !
3a90: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0a  SQLITE_STANDARD.
3aa0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
3ab0: 20 20 20 20 20 72 65 74 75 72 6e 20 55 54 46 38       return UTF8
3ac0: 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e  ToString(UnsafeN
3ad0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
3ae0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
3af0: 69 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72 6f 70 28  in_name_interop(
3b00: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3b10: 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65  t, index, out le
3b20: 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  n), len);.#else.
3b30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54 46        return UTF
3b40: 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65  8ToString(Unsafe
3b50: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
3b60: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
3b70: 67 69 6e 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f 73  gin_name(stmt._s
3b80: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
3b90: 78 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  x), -1);.#endif.
3ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
3bb0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
3bc0: 69 6e 67 20 43 6f 6c 75 6d 6e 44 61 74 61 62 61  ing ColumnDataba
3bd0: 73 65 4e 61 6d 65 28 53 51 4c 69 74 65 53 74 61  seName(SQLiteSta
3be0: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
3bf0: 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 23 69   index).    {.#i
3c00: 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  f !SQLITE_STANDA
3c10: 52 44 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  RD.      int len
3c20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  ;.      return U
3c30: 54 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61  TF8ToString(Unsa
3c40: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
3c50: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
3c60: 61 74 61 62 61 73 65 5f 6e 61 6d 65 5f 69 6e 74  atabase_name_int
3c70: 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74  erop(stmt._sqlit
3c80: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f  e_stmt, index, o
3c90: 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23  ut len), len);.#
3ca0: 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75 72  else.      retur
3cb0: 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55  n UTF8ToString(U
3cc0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
3cd0: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
3ce0: 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 28  n_database_name(
3cf0: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3d00: 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0a  t, index), -1);.
3d10: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
3d20: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3d30: 69 64 65 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d  ide string Colum
3d40: 6e 54 61 62 6c 65 4e 61 6d 65 28 53 51 4c 69 74  nTableName(SQLit
3d50: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
3d60: 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20 20   int index).    
3d70: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54  {.#if !SQLITE_ST
3d80: 41 4e 44 41 52 44 0a 20 20 20 20 20 20 69 6e 74  ANDARD.      int
3d90: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74 75   len;.      retu
3da0: 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rn UTF8ToString(
3db0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
3dc0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
3dd0: 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 5f 69 6e  mn_table_name_in
3de0: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
3df0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
3e00: 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a  out len), len);.
3e10: 23 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75  #else.      retu
3e20: 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rn UTF8ToString(
3e30: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
3e40: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
3e50: 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 73 74  mn_table_name(st
3e60: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
3e70: 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0a 23 65   index), -1);.#e
3e80: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
3e90: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
3ea0: 65 20 76 6f 69 64 20 43 6f 6c 75 6d 6e 4d 65 74  e void ColumnMet
3eb0: 61 44 61 74 61 28 73 74 72 69 6e 67 20 64 61 74  aData(string dat
3ec0: 61 42 61 73 65 2c 20 73 74 72 69 6e 67 20 74 61  aBase, string ta
3ed0: 62 6c 65 2c 20 73 74 72 69 6e 67 20 63 6f 6c 75  ble, string colu
3ee0: 6d 6e 2c 20 6f 75 74 20 73 74 72 69 6e 67 20 64  mn, out string d
3ef0: 61 74 61 54 79 70 65 2c 20 6f 75 74 20 73 74 72  ataType, out str
3f00: 69 6e 67 20 63 6f 6c 6c 61 74 65 53 65 71 75 65  ing collateSeque
3f10: 6e 63 65 2c 20 6f 75 74 20 62 6f 6f 6c 20 6e 6f  nce, out bool no
3f20: 74 4e 75 6c 6c 2c 20 6f 75 74 20 62 6f 6f 6c 20  tNull, out bool 
3f30: 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75 74 20  primaryKey, out 
3f40: 62 6f 6f 6c 20 61 75 74 6f 49 6e 63 72 65 6d 65  bool autoIncreme
3f50: 6e 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nt).    {.      
3f60: 49 6e 74 50 74 72 20 64 61 74 61 54 79 70 65 50  IntPtr dataTypeP
3f70: 74 72 3b 0a 20 20 20 20 20 20 49 6e 74 50 74 72  tr;.      IntPtr
3f80: 20 63 6f 6c 6c 53 65 71 50 74 72 3b 0a 20 20 20   collSeqPtr;.   
3f90: 20 20 20 69 6e 74 20 6e 6e 6f 74 4e 75 6c 6c 3b     int nnotNull;
3fa0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 70 72 69 6d  .      int nprim
3fb0: 61 72 79 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  aryKey;.      in
3fc0: 74 20 6e 61 75 74 6f 49 6e 63 3b 0a 20 20 20 20  t nautoInc;.    
3fd0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69    int n;.      i
3fe0: 6e 74 20 64 74 4c 65 6e 3b 0a 20 20 20 20 20 20  nt dtLen;.      
3ff0: 69 6e 74 20 63 73 4c 65 6e 3b 0a 0a 23 69 66 20  int csLen;..#if 
4000: 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44  !SQLITE_STANDARD
4010: 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61 66  .      n = Unsaf
4020: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
4030: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
4040: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 5f 69 6e 74  umn_metadata_int
4050: 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55 54 46  erop(_sql, ToUTF
4060: 38 28 64 61 74 61 42 61 73 65 29 2c 20 54 6f 55  8(dataBase), ToU
4070: 54 46 38 28 74 61 62 6c 65 29 2c 20 54 6f 55 54  TF8(table), ToUT
4080: 46 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75 74 20  F8(column), out 
4090: 64 61 74 61 54 79 70 65 50 74 72 2c 20 6f 75 74  dataTypePtr, out
40a0: 20 63 6f 6c 6c 53 65 71 50 74 72 2c 20 6f 75 74   collSeqPtr, out
40b0: 20 6e 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74 20 6e   nnotNull, out n
40c0: 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75 74 20  primaryKey, out 
40d0: 6e 61 75 74 6f 49 6e 63 2c 20 6f 75 74 20 64 74  nautoInc, out dt
40e0: 4c 65 6e 2c 20 6f 75 74 20 63 73 4c 65 6e 29 3b  Len, out csLen);
40f0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 64 74 4c  .#else.      dtL
4100: 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 63  en = -1;.      c
4110: 73 4c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  sLen = -1;.     
4120: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
4130: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
4140: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
4150: 74 61 64 61 74 61 28 5f 73 71 6c 2c 20 54 6f 55  tadata(_sql, ToU
4160: 54 46 38 28 64 61 74 61 42 61 73 65 29 2c 20 54  TF8(dataBase), T
4170: 6f 55 54 46 38 28 74 61 62 6c 65 29 2c 20 54 6f  oUTF8(table), To
4180: 55 54 46 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75  UTF8(column), ou
4190: 74 20 64 61 74 61 54 79 70 65 50 74 72 2c 20 6f  t dataTypePtr, o
41a0: 75 74 20 63 6f 6c 6c 53 65 71 50 74 72 2c 20 6f  ut collSeqPtr, o
41b0: 75 74 20 6e 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74  ut nnotNull, out
41c0: 20 6e 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75   nprimaryKey, ou
41d0: 74 20 6e 61 75 74 6f 49 6e 63 29 3b 0a 23 65 6e  t nautoInc);.#en
41e0: 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 6e 20  dif.      if (n 
41f0: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
4200: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
4210: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
4220: 72 28 29 29 3b 0a 0a 20 20 20 20 20 20 64 61 74  r());..      dat
4230: 61 54 79 70 65 20 3d 20 55 54 46 38 54 6f 53 74  aType = UTF8ToSt
4240: 72 69 6e 67 28 64 61 74 61 54 79 70 65 50 74 72  ring(dataTypePtr
4250: 2c 20 64 74 4c 65 6e 29 3b 0a 20 20 20 20 20 20  , dtLen);.      
4260: 63 6f 6c 6c 61 74 65 53 65 71 75 65 6e 63 65 20  collateSequence 
4270: 3d 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 63  = UTF8ToString(c
4280: 6f 6c 6c 53 65 71 50 74 72 2c 20 63 73 4c 65 6e  ollSeqPtr, csLen
4290: 29 3b 0a 0a 20 20 20 20 20 20 6e 6f 74 4e 75 6c  );..      notNul
42a0: 6c 20 3d 20 28 6e 6e 6f 74 4e 75 6c 6c 20 3d 3d  l = (nnotNull ==
42b0: 20 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6d 61   1);.      prima
42c0: 72 79 4b 65 79 20 3d 20 28 6e 70 72 69 6d 61 72  ryKey = (nprimar
42d0: 79 4b 65 79 20 3d 3d 20 31 29 3b 0a 20 20 20 20  yKey == 1);.    
42e0: 20 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74 20    autoIncrement 
42f0: 3d 20 28 6e 61 75 74 6f 49 6e 63 20 3d 3d 20 31  = (nautoInc == 1
4300: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
4310: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
4320: 64 6f 75 62 6c 65 20 47 65 74 44 6f 75 62 6c 65  double GetDouble
4330: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
4340: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
4350: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 64 6f  ).    {.      do
4360: 75 62 6c 65 20 76 61 6c 75 65 3b 0a 23 69 66 20  uble value;.#if 
4370: 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43  !PLATFORM_COMPAC
4380: 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20 20 20  TFRAMEWORK.     
4390: 20 76 61 6c 75 65 20 3d 20 55 6e 73 61 66 65 4e   value = UnsafeN
43a0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
43b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
43c0: 6c 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  le(stmt._sqlite_
43d0: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 23 65  stmt, index);.#e
43e0: 6c 73 65 0a 20 20 20 20 20 20 55 6e 73 61 66 65  lse.      Unsafe
43f0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
4400: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
4410: 62 6c 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ble_interop(stmt
4420: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
4430: 6e 64 65 78 2c 20 6f 75 74 20 76 61 6c 75 65 29  ndex, out value)
4440: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
4450: 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20  eturn value;.   
4460: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
4470: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47 65   override int Ge
4480: 74 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61  tInt32(SQLiteSta
4490: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
44a0: 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20 20   index).    {.  
44b0: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
44c0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
44d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
44e0: 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  t(stmt._sqlite_s
44f0: 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20  tmt, index);.   
4500: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
4510: 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67 20 47   override long G
4520: 65 74 49 6e 74 36 34 28 53 51 4c 69 74 65 53 74  etInt64(SQLiteSt
4530: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
4540: 74 20 69 6e 64 65 78 29 0a 20 20 20 20 7b 0a 20  t index).    {. 
4550: 20 20 20 20 20 6c 6f 6e 67 20 76 61 6c 75 65 3b       long value;
4560: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
4570: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a  OMPACTFRAMEWORK.
4580: 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 55 6e        value = Un
4590: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
45a0: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
45b0: 5f 69 6e 74 36 34 28 73 74 6d 74 2e 5f 73 71 6c  _int64(stmt._sql
45c0: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29  ite_stmt, index)
45d0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 55 6e  ;.#else.      Un
45e0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
45f0: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
4600: 5f 69 6e 74 36 34 5f 69 6e 74 65 72 6f 70 28 73  _int64_interop(s
4610: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
4620: 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 76 61 6c  , index, out val
4630: 75 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ue);.#endif.    
4640: 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a    return value;.
4650: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
4660: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72  nal override str
4670: 69 6e 67 20 47 65 74 54 65 78 74 28 53 51 4c 69  ing GetText(SQLi
4680: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
4690: 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20  , int index).   
46a0: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53   {.#if !SQLITE_S
46b0: 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 69 6e  TANDARD.      in
46c0: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74  t len;.      ret
46d0: 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67  urn UTF8ToString
46e0: 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  (UnsafeNativeMet
46f0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
4700: 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70  umn_text_interop
4710: 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74  (stmt._sqlite_st
4720: 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c  mt, index, out l
4730: 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73 65  en), len);.#else
4740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54  .      return UT
4750: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
4760: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
4770: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4780: 78 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  xt(stmt._sqlite_
4790: 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31  stmt, index), -1
47a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
47b0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
47c0: 65 72 72 69 64 65 20 44 61 74 65 54 69 6d 65 20  erride DateTime 
47d0: 47 65 74 44 61 74 65 54 69 6d 65 28 53 51 4c 69  GetDateTime(SQLi
47e0: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
47f0: 2c 20 69 6e 74 20 69 6e 64 65 78 29 0a 20 20 20  , int index).   
4800: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53   {.#if !SQLITE_S
4810: 54 41 4e 44 41 52 44 0a 20 20 20 20 20 20 69 6e  TANDARD.      in
4820: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 72 65 74  t len;.      ret
4830: 75 72 6e 20 54 6f 44 61 74 65 54 69 6d 65 28 55  urn ToDateTime(U
4840: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
4850: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
4860: 6e 5f 74 65 78 74 5f 69 6e 74 65 72 6f 70 28 73  n_text_interop(s
4870: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
4880: 2c 20 69 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e  , index, out len
4890: 29 2c 20 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 20  ), len);.#else. 
48a0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 6f 44 61       return ToDa
48b0: 74 65 54 69 6d 65 28 55 6e 73 61 66 65 4e 61 74  teTime(UnsafeNat
48c0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
48d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 73  e3_column_text(s
48e0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
48f0: 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0a 23  , index), -1);.#
4900: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
4910: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
4920: 64 65 20 6c 6f 6e 67 20 47 65 74 42 79 74 65 73  de long GetBytes
4930: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
4940: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
4950: 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65  , int nDataOffse
4960: 74 2c 20 62 79 74 65 5b 5d 20 62 44 65 73 74 2c  t, byte[] bDest,
4970: 20 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74   int nStart, int
4980: 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a   nLength).    {.
4990: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72        IntPtr ptr
49a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e  ;.      int nlen
49b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  ;.      int nCop
49c0: 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a  ied = nLength;..
49d0: 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20 55 6e 73        nlen = Uns
49e0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
49f0: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
4a00: 62 79 74 65 73 28 73 74 6d 74 2e 5f 73 71 6c 69  bytes(stmt._sqli
4a10: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b  te_stmt, index);
4a20: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 55 6e 73  .      ptr = Uns
4a30: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4a40: 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  .sqlite3_column_
4a50: 62 6c 6f 62 28 73 74 6d 74 2e 5f 73 71 6c 69 74  blob(stmt._sqlit
4a60: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0a  e_stmt, index);.
4a70: 0a 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74  .      if (bDest
4a80: 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   == null) return
4a90: 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66   nlen;..      if
4aa0: 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61   (nCopied + nSta
4ab0: 72 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74  rt > bDest.Lengt
4ac0: 68 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65  h) nCopied = bDe
4ad0: 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61  st.Length - nSta
4ae0: 72 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43  rt;.      if (nC
4af0: 6f 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66  opied + nDataOff
4b00: 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70  set > nlen) nCop
4b10: 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61  ied = nlen - nDa
4b20: 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20  taOffset;..     
4b30: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30   if (nCopied > 0
4b40: 29 0a 20 20 20 20 20 20 20 20 4d 61 72 73 68 61  ).        Marsha
4b50: 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74 72 29 28  l.Copy((IntPtr)(
4b60: 70 74 72 2e 54 6f 49 6e 74 33 32 28 29 20 2b 20  ptr.ToInt32() + 
4b70: 6e 44 61 74 61 4f 66 66 73 65 74 29 2c 20 62 44  nDataOffset), bD
4b80: 65 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f  est, nStart, nCo
4b90: 70 69 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73  pied);.      els
4ba0: 65 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a  e nCopied = 0;..
4bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f        return nCo
4bc0: 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pied;.    }..   
4bd0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
4be0: 64 65 20 6c 6f 6e 67 20 47 65 74 43 68 61 72 73  de long GetChars
4bf0: 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74  (SQLiteStatement
4c00: 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65 78   stmt, int index
4c10: 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65  , int nDataOffse
4c20: 74 2c 20 63 68 61 72 5b 5d 20 62 44 65 73 74 2c  t, char[] bDest,
4c30: 20 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74   int nStart, int
4c40: 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a   nLength).    {.
4c50: 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0a        int nlen;.
4c60: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65        int nCopie
4c70: 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a 20 20  d = nLength;..  
4c80: 20 20 20 20 73 74 72 69 6e 67 20 73 74 72 20 3d      string str =
4c90: 20 47 65 74 54 65 78 74 28 73 74 6d 74 2c 20 69   GetText(stmt, i
4ca0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 6e 6c 65  ndex);.      nle
4cb0: 6e 20 3d 20 73 74 72 2e 4c 65 6e 67 74 68 3b 0a  n = str.Length;.
4cc0: 0a 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74  .      if (bDest
4cd0: 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   == null) return
4ce0: 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66   nlen;..      if
4cf0: 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61   (nCopied + nSta
4d00: 72 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74  rt > bDest.Lengt
4d10: 68 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65  h) nCopied = bDe
4d20: 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61  st.Length - nSta
4d30: 72 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43  rt;.      if (nC
4d40: 6f 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66  opied + nDataOff
4d50: 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70  set > nlen) nCop
4d60: 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61  ied = nlen - nDa
4d70: 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20  taOffset;..     
4d80: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30   if (nCopied > 0
4d90: 29 0a 20 20 20 20 20 20 20 20 73 74 72 2e 43 6f  ).        str.Co
4da0: 70 79 54 6f 28 6e 44 61 74 61 4f 66 66 73 65 74  pyTo(nDataOffset
4db0: 2c 20 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c  , bDest, nStart,
4dc0: 20 6e 43 6f 70 69 65 64 29 3b 0a 20 20 20 20 20   nCopied);.     
4dd0: 20 65 6c 73 65 20 6e 43 6f 70 69 65 64 20 3d 20   else nCopied = 
4de0: 30 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0;..      return
4df0: 20 6e 43 6f 70 69 65 64 3b 0a 20 20 20 20 7d 0a   nCopied;.    }.
4e00: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
4e10: 65 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 4e 75  erride bool IsNu
4e20: 6c 6c 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  ll(SQLiteStateme
4e30: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
4e40: 65 78 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ex).    {.      
4e50: 72 65 74 75 72 6e 20 28 43 6f 6c 75 6d 6e 41 66  return (ColumnAf
4e60: 66 69 6e 69 74 79 28 73 74 6d 74 2c 20 69 6e 64  finity(stmt, ind
4e70: 65 78 29 20 3d 3d 20 54 79 70 65 41 66 66 69 6e  ex) == TypeAffin
4e80: 69 74 79 2e 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  ity.Null);.    }
4e90: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
4ea0: 76 65 72 72 69 64 65 20 69 6e 74 20 41 67 67 72  verride int Aggr
4eb0: 65 67 61 74 65 43 6f 75 6e 74 28 49 6e 74 50 74  egateCount(IntPt
4ec0: 72 20 63 6f 6e 74 65 78 74 29 0a 20 20 20 20 7b  r context).    {
4ed0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e  .      return Un
4ee0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
4ef0: 73 2e 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  s.sqlite3_aggreg
4f00: 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78  ate_count(contex
4f10: 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
4f20: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
4f30: 20 76 6f 69 64 20 43 72 65 61 74 65 46 75 6e 63   void CreateFunc
4f40: 74 69 6f 6e 28 73 74 72 69 6e 67 20 73 74 72 46  tion(string strF
4f50: 75 6e 63 74 69 6f 6e 2c 20 69 6e 74 20 6e 41 72  unction, int nAr
4f60: 67 73 2c 20 62 6f 6f 6c 20 6e 65 65 64 43 6f 6c  gs, bool needCol
4f70: 6c 53 65 71 2c 20 53 51 4c 69 74 65 43 61 6c 6c  lSeq, SQLiteCall
4f80: 62 61 63 6b 20 66 75 6e 63 2c 20 53 51 4c 69 74  back func, SQLit
4f90: 65 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 73 74  eCallback funcst
4fa0: 65 70 2c 20 53 51 4c 69 74 65 46 69 6e 61 6c 43  ep, SQLiteFinalC
4fb0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 66 69 6e 61  allback funcfina
4fc0: 6c 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  l).    {.      i
4fd0: 6e 74 20 6e 3b 0a 0a 23 69 66 20 21 53 51 4c 49  nt n;..#if !SQLI
4fe0: 54 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20  TE_STANDARD.    
4ff0: 20 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69    n = UnsafeNati
5000: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
5010: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
5020: 6e 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20  n_interop(_sql, 
5030: 54 6f 55 54 46 38 28 73 74 72 46 75 6e 63 74 69  ToUTF8(strFuncti
5040: 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 34 2c 20 49  on), nArgs, 4, I
5050: 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66 75 6e 63  ntPtr.Zero, func
5060: 2c 20 66 75 6e 63 73 74 65 70 2c 20 66 75 6e 63  , funcstep, func
5070: 66 69 6e 61 6c 2c 20 28 6e 65 65 64 43 6f 6c 6c  final, (needColl
5080: 53 65 71 20 3d 3d 20 74 72 75 65 29 20 3f 20 31  Seq == true) ? 1
5090: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 20   : 0);.      if 
50a0: 28 6e 20 3d 3d 20 30 29 20 6e 20 3d 20 55 6e 73  (n == 0) n = Uns
50b0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
50c0: 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  .sqlite3_create_
50d0: 66 75 6e 63 74 69 6f 6e 5f 69 6e 74 65 72 6f 70  function_interop
50e0: 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28 73 74  (_sql, ToUTF8(st
50f0: 72 46 75 6e 63 74 69 6f 6e 29 2c 20 6e 41 72 67  rFunction), nArg
5100: 73 2c 20 31 2c 20 49 6e 74 50 74 72 2e 5a 65 72  s, 1, IntPtr.Zer
5110: 6f 2c 20 66 75 6e 63 2c 20 66 75 6e 63 73 74 65  o, func, funcste
5120: 70 2c 20 66 75 6e 63 66 69 6e 61 6c 2c 20 28 6e  p, funcfinal, (n
5130: 65 65 64 43 6f 6c 6c 53 65 71 20 3d 3d 20 74 72  eedCollSeq == tr
5140: 75 65 29 20 3f 20 31 20 3a 20 30 29 3b 0a 23 65  ue) ? 1 : 0);.#e
5150: 6c 73 65 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e  lse.      n = Un
5160: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
5170: 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s.sqlite3_create
5180: 5f 66 75 6e 63 74 69 6f 6e 28 5f 73 71 6c 2c 20  _function(_sql, 
5190: 54 6f 55 54 46 38 28 73 74 72 46 75 6e 63 74 69  ToUTF8(strFuncti
51a0: 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 34 2c 20 49  on), nArgs, 4, I
51b0: 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66 75 6e 63  ntPtr.Zero, func
51c0: 2c 20 66 75 6e 63 73 74 65 70 2c 20 66 75 6e 63  , funcstep, func
51d0: 66 69 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  final);.      if
51e0: 20 28 6e 20 3d 3d 20 30 29 20 6e 20 3d 20 55 6e   (n == 0) n = Un
51f0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
5200: 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s.sqlite3_create
5210: 5f 66 75 6e 63 74 69 6f 6e 28 5f 73 71 6c 2c 20  _function(_sql, 
5220: 54 6f 55 54 46 38 28 73 74 72 46 75 6e 63 74 69  ToUTF8(strFuncti
5230: 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 31 2c 20 49  on), nArgs, 1, I
5240: 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66 75 6e 63  ntPtr.Zero, func
5250: 2c 20 66 75 6e 63 73 74 65 70 2c 20 66 75 6e 63  , funcstep, func
5260: 66 69 6e 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  final);.#endif. 
5270: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
5280: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
5290: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
52a0: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
52b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
52c0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
52d0: 69 64 20 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  id CreateCollati
52e0: 6f 6e 28 73 74 72 69 6e 67 20 73 74 72 43 6f 6c  on(string strCol
52f0: 6c 61 74 69 6f 6e 2c 20 53 51 4c 69 74 65 43 6f  lation, SQLiteCo
5300: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 2c 20 53 51  llation func, SQ
5310: 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e 20 66 75  LiteCollation fu
5320: 6e 63 31 36 29 0a 20 20 20 20 7b 0a 20 20 20 20  nc16).    {.    
5330: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
5340: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
5350: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
5360: 6c 61 74 69 6f 6e 28 5f 73 71 6c 2c 20 54 6f 55  lation(_sql, ToU
5370: 54 46 38 28 73 74 72 43 6f 6c 6c 61 74 69 6f 6e  TF8(strCollation
5380: 29 2c 20 32 2c 20 49 6e 74 50 74 72 2e 5a 65 72  ), 2, IntPtr.Zer
5390: 6f 2c 20 66 75 6e 63 31 36 29 3b 0a 20 20 20 20  o, func16);.    
53a0: 20 20 69 66 20 28 6e 20 3d 3d 20 30 29 20 55 6e    if (n == 0) Un
53b0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
53c0: 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s.sqlite3_create
53d0: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 5f 73 71 6c 2c  _collation(_sql,
53e0: 20 54 6f 55 54 46 38 28 73 74 72 43 6f 6c 6c 61   ToUTF8(strColla
53f0: 74 69 6f 6e 29 2c 20 31 2c 20 49 6e 74 50 74 72  tion), 1, IntPtr
5400: 2e 5a 65 72 6f 2c 20 66 75 6e 63 29 3b 0a 20 20  .Zero, func);.  
5410: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
5420: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
5430: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
5440: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  teLastError());.
5450: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
5460: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74  nal override int
5470: 20 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65 43   ContextCollateC
5480: 6f 6d 70 61 72 65 28 43 6f 6c 6c 61 74 69 6f 6e  ompare(Collation
5490: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 20 65 6e 63  EncodingEnum enc
54a0: 2c 20 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74  , IntPtr context
54b0: 2c 20 73 74 72 69 6e 67 20 73 31 2c 20 73 74 72  , string s1, str
54c0: 69 6e 67 20 73 32 29 0a 20 20 20 20 7b 0a 23 69  ing s2).    {.#i
54d0: 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  f !SQLITE_STANDA
54e0: 52 44 0a 20 20 20 20 20 20 62 79 74 65 5b 5d 20  RD.      byte[] 
54f0: 62 31 3b 0a 20 20 20 20 20 20 62 79 74 65 5b 5d  b1;.      byte[]
5500: 20 62 32 3b 0a 20 20 20 20 20 20 53 79 73 74 65   b2;.      Syste
5510: 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 20  m.Text.Encoding 
5520: 63 6f 6e 76 65 72 74 65 72 20 3d 20 6e 75 6c 6c  converter = null
5530: 3b 0a 0a 20 20 20 20 20 20 73 77 69 74 63 68 20  ;..      switch 
5540: 28 65 6e 63 29 0a 20 20 20 20 20 20 7b 0a 20 20  (enc).      {.  
5550: 20 20 20 20 20 20 63 61 73 65 20 43 6f 6c 6c 61        case Colla
5560: 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d  tionEncodingEnum
5570: 2e 55 54 46 38 3a 0a 20 20 20 20 20 20 20 20 20  .UTF8:.         
5580: 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73   converter = Sys
5590: 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e  tem.Text.Encodin
55a0: 67 2e 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20  g.UTF8;.        
55b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
55c0: 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45   case CollationE
55d0: 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46 31  ncodingEnum.UTF1
55e0: 36 4c 45 3a 0a 20 20 20 20 20 20 20 20 20 20 63  6LE:.          c
55f0: 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73 74 65  onverter = Syste
5600: 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e  m.Text.Encoding.
5610: 55 6e 69 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  Unicode;.       
5620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5630: 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e    case Collation
5640: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46  EncodingEnum.UTF
5650: 31 36 42 45 3a 0a 20 20 20 20 20 20 20 20 20 20  16BE:.          
5660: 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73 74  converter = Syst
5670: 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67  em.Text.Encoding
5680: 2e 42 69 67 45 6e 64 69 61 6e 55 6e 69 63 6f 64  .BigEndianUnicod
5690: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  e;.          bre
56a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
56b0: 20 20 20 62 31 20 3d 20 63 6f 6e 76 65 72 74 65     b1 = converte
56c0: 72 2e 47 65 74 42 79 74 65 73 28 73 31 29 3b 0a  r.GetBytes(s1);.
56d0: 20 20 20 20 20 20 62 32 20 3d 20 63 6f 6e 76 65        b2 = conve
56e0: 72 74 65 72 2e 47 65 74 42 79 74 65 73 28 73 32  rter.GetBytes(s2
56f0: 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
5700: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
5710: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6e  hods.sqlite3_con
5720: 74 65 78 74 5f 63 6f 6c 6c 63 6f 6d 70 61 72 65  text_collcompare
5730: 28 63 6f 6e 74 65 78 74 2c 20 62 31 2c 20 62 31  (context, b1, b1
5740: 2e 4c 65 6e 67 74 68 2c 20 62 32 2c 20 62 32 2e  .Length, b2, b2.
5750: 4c 65 6e 67 74 68 29 3b 0a 23 65 6c 73 65 0a 20  Length);.#else. 
5760: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e       throw new N
5770: 6f 74 49 6d 70 6c 65 6d 65 6e 74 65 64 45 78 63  otImplementedExc
5780: 65 70 74 69 6f 6e 28 29 3b 0a 23 65 6e 64 69 66  eption();.#endif
5790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
57a0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e  rnal override in
57b0: 74 20 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65  t ContextCollate
57c0: 43 6f 6d 70 61 72 65 28 43 6f 6c 6c 61 74 69 6f  Compare(Collatio
57d0: 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 20 65 6e  nEncodingEnum en
57e0: 63 2c 20 49 6e 74 50 74 72 20 63 6f 6e 74 65 78  c, IntPtr contex
57f0: 74 2c 20 63 68 61 72 5b 5d 20 63 31 2c 20 63 68  t, char[] c1, ch
5800: 61 72 5b 5d 20 63 32 29 0a 20 20 20 20 7b 0a 23  ar[] c2).    {.#
5810: 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44  if !SQLITE_STAND
5820: 41 52 44 0a 20 20 20 20 20 20 62 79 74 65 5b 5d  ARD.      byte[]
5830: 20 62 31 3b 0a 20 20 20 20 20 20 62 79 74 65 5b   b1;.      byte[
5840: 5d 20 62 32 3b 0a 20 20 20 20 20 20 53 79 73 74  ] b2;.      Syst
5850: 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67  em.Text.Encoding
5860: 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 6e 75 6c   converter = nul
5870: 6c 3b 0a 0a 20 20 20 20 20 20 73 77 69 74 63 68  l;..      switch
5880: 20 28 65 6e 63 29 0a 20 20 20 20 20 20 7b 0a 20   (enc).      {. 
5890: 20 20 20 20 20 20 20 63 61 73 65 20 43 6f 6c 6c         case Coll
58a0: 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75  ationEncodingEnu
58b0: 6d 2e 55 54 46 38 3a 0a 20 20 20 20 20 20 20 20  m.UTF8:.        
58c0: 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79    converter = Sy
58d0: 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69  stem.Text.Encodi
58e0: 6e 67 2e 55 54 46 38 3b 0a 20 20 20 20 20 20 20  ng.UTF8;.       
58f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5900: 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e    case Collation
5910: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46  EncodingEnum.UTF
5920: 31 36 4c 45 3a 0a 20 20 20 20 20 20 20 20 20 20  16LE:.          
5930: 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73 74  converter = Syst
5940: 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67  em.Text.Encoding
5950: 2e 55 6e 69 63 6f 64 65 3b 0a 20 20 20 20 20 20  .Unicode;.      
5960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5970: 20 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f     case Collatio
5980: 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54  nEncodingEnum.UT
5990: 46 31 36 42 45 3a 0a 20 20 20 20 20 20 20 20 20  F16BE:.         
59a0: 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73   converter = Sys
59b0: 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e  tem.Text.Encodin
59c0: 67 2e 42 69 67 45 6e 64 69 61 6e 55 6e 69 63 6f  g.BigEndianUnico
59d0: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  de;.          br
59e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
59f0: 20 20 20 20 62 31 20 3d 20 63 6f 6e 76 65 72 74      b1 = convert
5a00: 65 72 2e 47 65 74 42 79 74 65 73 28 63 31 29 3b  er.GetBytes(c1);
5a10: 0a 20 20 20 20 20 20 62 32 20 3d 20 63 6f 6e 76  .      b2 = conv
5a20: 65 72 74 65 72 2e 47 65 74 42 79 74 65 73 28 63  erter.GetBytes(c
5a30: 32 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75 72  2);..      retur
5a40: 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  n UnsafeNativeMe
5a50: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
5a60: 6e 74 65 78 74 5f 63 6f 6c 6c 63 6f 6d 70 61 72  ntext_collcompar
5a70: 65 28 63 6f 6e 74 65 78 74 2c 20 62 31 2c 20 62  e(context, b1, b
5a80: 31 2e 4c 65 6e 67 74 68 2c 20 62 32 2c 20 62 32  1.Length, b2, b2
5a90: 2e 4c 65 6e 67 74 68 29 3b 0a 23 65 6c 73 65 0a  .Length);.#else.
5aa0: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
5ab0: 4e 6f 74 49 6d 70 6c 65 6d 65 6e 74 65 64 45 78  NotImplementedEx
5ac0: 63 65 70 74 69 6f 6e 28 29 3b 0a 23 65 6e 64 69  ception();.#endi
5ad0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  f.    }..    int
5ae0: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 43  ernal override C
5af0: 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65  ollationSequence
5b00: 20 47 65 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71   GetCollationSeq
5b10: 75 65 6e 63 65 28 53 51 4c 69 74 65 46 75 6e 63  uence(SQLiteFunc
5b20: 74 69 6f 6e 20 66 75 6e 63 2c 20 49 6e 74 50 74  tion func, IntPt
5b30: 72 20 63 6f 6e 74 65 78 74 29 0a 20 20 20 20 7b  r context).    {
5b40: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41  .#if !SQLITE_STA
5b50: 4e 44 41 52 44 0a 20 20 20 20 20 20 43 6f 6c 6c  NDARD.      Coll
5b60: 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 73 65  ationSequence se
5b70: 71 20 3d 20 6e 65 77 20 43 6f 6c 6c 61 74 69 6f  q = new Collatio
5b80: 6e 53 65 71 75 65 6e 63 65 28 29 3b 0a 20 20 20  nSequence();.   
5b90: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
5ba0: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 20 20    int type;.    
5bb0: 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 20 20 20    int enc;.     
5bc0: 20 49 6e 74 50 74 72 20 70 20 3d 20 55 6e 73 61   IntPtr p = Unsa
5bd0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
5be0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
5bf0: 63 6f 6c 6c 73 65 71 28 63 6f 6e 74 65 78 74 2c  collseq(context,
5c00: 20 6f 75 74 20 74 79 70 65 2c 20 6f 75 74 20 65   out type, out e
5c10: 6e 63 2c 20 6f 75 74 20 6c 65 6e 29 3b 0a 0a 20  nc, out len);.. 
5c20: 20 20 20 20 20 69 66 20 28 70 20 21 3d 20 6e 75       if (p != nu
5c30: 6c 6c 29 20 73 65 71 2e 4e 61 6d 65 20 3d 20 55  ll) seq.Name = U
5c40: 54 46 38 54 6f 53 74 72 69 6e 67 28 70 2c 20 6c  TF8ToString(p, l
5c50: 65 6e 29 3b 0a 20 20 20 20 20 20 73 65 71 2e 54  en);.      seq.T
5c60: 79 70 65 20 3d 20 28 43 6f 6c 6c 61 74 69 6f 6e  ype = (Collation
5c70: 54 79 70 65 45 6e 75 6d 29 74 79 70 65 3b 0a 20  TypeEnum)type;. 
5c80: 20 20 20 20 20 73 65 71 2e 5f 66 75 6e 63 20 3d       seq._func =
5c90: 20 66 75 6e 63 3b 0a 20 20 20 20 20 20 73 65 71   func;.      seq
5ca0: 2e 45 6e 63 6f 64 69 6e 67 20 3d 20 28 43 6f 6c  .Encoding = (Col
5cb0: 6c 61 74 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e  lationEncodingEn
5cc0: 75 6d 29 65 6e 63 3b 0a 0a 20 20 20 20 20 20 72  um)enc;..      r
5cd0: 65 74 75 72 6e 20 73 65 71 3b 0a 23 65 6c 73 65  eturn seq;.#else
5ce0: 0a 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77  .      throw new
5cf0: 20 4e 6f 74 49 6d 70 6c 65 6d 65 6e 74 65 64 45   NotImplementedE
5d00: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 23 65 6e 64  xception();.#end
5d10: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  if.    }..    in
5d20: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
5d30: 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c  long GetParamVal
5d40: 75 65 42 79 74 65 73 28 49 6e 74 50 74 72 20 70  ueBytes(IntPtr p
5d50: 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73 65  , int nDataOffse
5d60: 74 2c 20 62 79 74 65 5b 5d 20 62 44 65 73 74 2c  t, byte[] bDest,
5d70: 20 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e 74   int nStart, int
5d80: 20 6e 4c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a   nLength).    {.
5d90: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 74 72        IntPtr ptr
5da0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65 6e  ;.      int nlen
5db0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  ;.      int nCop
5dc0: 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0a 0a  ied = nLength;..
5dd0: 20 20 20 20 20 20 6e 6c 65 6e 20 3d 20 55 6e 73        nlen = Uns
5de0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
5df0: 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  .sqlite3_value_b
5e00: 79 74 65 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ytes(p);.      p
5e10: 74 72 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76  tr = UnsafeNativ
5e20: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
5e30: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 29 3b 0a  _value_blob(p);.
5e40: 0a 20 20 20 20 20 20 69 66 20 28 62 44 65 73 74  .      if (bDest
5e50: 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   == null) return
5e60: 20 6e 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 69 66   nlen;..      if
5e70: 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61   (nCopied + nSta
5e80: 72 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74  rt > bDest.Lengt
5e90: 68 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65  h) nCopied = bDe
5ea0: 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61  st.Length - nSta
5eb0: 72 74 3b 0a 20 20 20 20 20 20 69 66 20 28 6e 43  rt;.      if (nC
5ec0: 6f 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66 66  opied + nDataOff
5ed0: 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f 70  set > nlen) nCop
5ee0: 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44 61  ied = nlen - nDa
5ef0: 74 61 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20  taOffset;..     
5f00: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 3e 20 30   if (nCopied > 0
5f10: 29 0a 20 20 20 20 20 20 20 20 4d 61 72 73 68 61  ).        Marsha
5f20: 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74 72 29 28  l.Copy((IntPtr)(
5f30: 70 74 72 2e 54 6f 49 6e 74 33 32 28 29 20 2b 20  ptr.ToInt32() + 
5f40: 6e 44 61 74 61 4f 66 66 73 65 74 29 2c 20 62 44  nDataOffset), bD
5f50: 65 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f  est, nStart, nCo
5f60: 70 69 65 64 29 3b 0a 20 20 20 20 20 20 65 6c 73  pied);.      els
5f70: 65 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0a 0a  e nCopied = 0;..
5f80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43 6f        return nCo
5f90: 70 69 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  pied;.    }..   
5fa0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
5fb0: 64 65 20 64 6f 75 62 6c 65 20 47 65 74 50 61 72  de double GetPar
5fc0: 61 6d 56 61 6c 75 65 44 6f 75 62 6c 65 28 49 6e  amValueDouble(In
5fd0: 74 50 74 72 20 70 74 72 29 0a 20 20 20 20 7b 0a  tPtr ptr).    {.
5fe0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c        double val
5ff0: 75 65 3b 0a 23 69 66 20 21 50 4c 41 54 46 4f 52  ue;.#if !PLATFOR
6000: 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f  M_COMPACTFRAMEWO
6010: 52 4b 0a 20 20 20 20 20 20 76 61 6c 75 65 20 3d  RK.      value =
6020: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
6030: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c  hods.sqlite3_val
6040: 75 65 5f 64 6f 75 62 6c 65 28 70 74 72 29 3b 0a  ue_double(ptr);.
6050: 23 65 6c 73 65 0a 20 20 20 20 20 20 55 6e 73 61  #else.      Unsa
6060: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6070: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6080: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 70 74 72  uble_interop(ptr
6090: 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b 0a 23 65  , out value);.#e
60a0: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
60b0: 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a  n value;.    }..
60c0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
60d0: 72 72 69 64 65 20 69 6e 74 20 47 65 74 50 61 72  rride int GetPar
60e0: 61 6d 56 61 6c 75 65 49 6e 74 33 32 28 49 6e 74  amValueInt32(Int
60f0: 50 74 72 20 70 74 72 29 0a 20 20 20 20 7b 0a 20  Ptr ptr).    {. 
6100: 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61       return Unsa
6110: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6120: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6130: 74 28 70 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  t(ptr);.    }.. 
6140: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6150: 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 50 61 72  ride long GetPar
6160: 61 6d 56 61 6c 75 65 49 6e 74 36 34 28 49 6e 74  amValueInt64(Int
6170: 50 74 72 20 70 74 72 29 0a 20 20 20 20 7b 0a 20  Ptr ptr).    {. 
6180: 20 20 20 20 20 49 6e 74 36 34 20 76 61 6c 75 65       Int64 value
6190: 3b 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f  ;.#if !PLATFORM_
61a0: 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b  COMPACTFRAMEWORK
61b0: 0a 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 55  .      value = U
61c0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
61d0: 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ds.sqlite3_value
61e0: 5f 69 6e 74 36 34 28 70 74 72 29 3b 0a 23 65 6c  _int64(ptr);.#el
61f0: 73 65 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  se.      UnsafeN
6200: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
6210: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
6220: 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f 75  _interop(ptr, ou
6230: 74 20 76 61 6c 75 65 29 3b 0a 23 65 6e 64 69 66  t value);.#endif
6240: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 61  .      return va
6250: 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  lue;.    }..    
6260: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
6270: 65 20 73 74 72 69 6e 67 20 47 65 74 50 61 72 61  e string GetPara
6280: 6d 56 61 6c 75 65 54 65 78 74 28 49 6e 74 50 74  mValueText(IntPt
6290: 72 20 70 74 72 29 0a 20 20 20 20 7b 0a 23 69 66  r ptr).    {.#if
62a0: 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52   !SQLITE_STANDAR
62b0: 44 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b  D.      int len;
62c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54  .      return UT
62d0: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
62e0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
62f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6300: 74 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f  t_interop(ptr, o
6310: 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0a 23  ut len), len);.#
6320: 65 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75 72  else.      retur
6330: 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55  n UTF8ToString(U
6340: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6350: 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ds.sqlite3_value
6360: 5f 74 65 78 74 28 70 74 72 29 2c 20 2d 31 29 3b  _text(ptr), -1);
6370: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
6380: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6390: 72 69 64 65 20 54 79 70 65 41 66 66 69 6e 69 74  ride TypeAffinit
63a0: 79 20 47 65 74 50 61 72 61 6d 56 61 6c 75 65 54  y GetParamValueT
63b0: 79 70 65 28 49 6e 74 50 74 72 20 70 74 72 29 0a  ype(IntPtr ptr).
63c0: 20 20 20 20 7b 0a 20 20 20 20 20 20 72 65 74 75      {.      retu
63d0: 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  rn UnsafeNativeM
63e0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76  ethods.sqlite3_v
63f0: 61 6c 75 65 5f 74 79 70 65 28 70 74 72 29 3b 0a  alue_type(ptr);.
6400: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
6410: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
6420: 64 20 52 65 74 75 72 6e 42 6c 6f 62 28 49 6e 74  d ReturnBlob(Int
6430: 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 62 79 74  Ptr context, byt
6440: 65 5b 5d 20 76 61 6c 75 65 29 0a 20 20 20 20 7b  e[] value).    {
6450: 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74  .      UnsafeNat
6460: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
6470: 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63  e3_result_blob(c
6480: 6f 6e 74 65 78 74 2c 20 76 61 6c 75 65 2c 20 76  ontext, value, v
6490: 61 6c 75 65 2e 4c 65 6e 67 74 68 2c 20 28 49 6e  alue.Length, (In
64a0: 74 50 74 72 29 28 2d 31 29 29 3b 0a 20 20 20 20  tPtr)(-1));.    
64b0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
64c0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65  override void Re
64d0: 74 75 72 6e 44 6f 75 62 6c 65 28 49 6e 74 50 74  turnDouble(IntPt
64e0: 72 20 63 6f 6e 74 65 78 74 2c 20 64 6f 75 62 6c  r context, doubl
64f0: 65 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 23  e value).    {.#
6500: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
6510: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20  PACTFRAMEWORK.  
6520: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
6530: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6540: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
6550: 6e 74 65 78 74 2c 20 76 61 6c 75 65 29 3b 0a 23  ntext, value);.#
6560: 65 6c 73 65 0a 20 20 20 20 20 20 55 6e 73 61 66  else.      Unsaf
6570: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
6580: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
6590: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 63 6f 6e  uble_interop(con
65a0: 74 65 78 74 2c 20 72 65 66 20 76 61 6c 75 65 29  text, ref value)
65b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
65c0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
65d0: 72 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72  rride void Retur
65e0: 6e 45 72 72 6f 72 28 49 6e 74 50 74 72 20 63 6f  nError(IntPtr co
65f0: 6e 74 65 78 74 2c 20 73 74 72 69 6e 67 20 76 61  ntext, string va
6600: 6c 75 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  lue).    {.     
6610: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
6620: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73  hods.sqlite3_res
6630: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
6640: 74 2c 20 54 6f 55 54 46 38 28 76 61 6c 75 65 29  t, ToUTF8(value)
6650: 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74 68 29 3b  , value.Length);
6660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
6670: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
6680: 69 64 20 52 65 74 75 72 6e 49 6e 74 33 32 28 49  id ReturnInt32(I
6690: 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 69  ntPtr context, i
66a0: 6e 74 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a  nt value).    {.
66b0: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
66c0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
66d0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
66e0: 74 65 78 74 2c 20 76 61 6c 75 65 29 3b 0a 20 20  text, value);.  
66f0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
6700: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
6710: 52 65 74 75 72 6e 49 6e 74 36 34 28 49 6e 74 50  ReturnInt64(IntP
6720: 74 72 20 63 6f 6e 74 65 78 74 2c 20 6c 6f 6e 67  tr context, long
6730: 20 76 61 6c 75 65 29 0a 20 20 20 20 7b 0a 23 69   value).    {.#i
6740: 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  f !PLATFORM_COMP
6750: 41 43 54 46 52 41 4d 45 57 4f 52 4b 0a 20 20 20  ACTFRAMEWORK.   
6760: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
6770: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72  ethods.sqlite3_r
6780: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
6790: 65 78 74 2c 20 76 61 6c 75 65 29 3b 0a 23 65 6c  ext, value);.#el
67a0: 73 65 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  se.      UnsafeN
67b0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
67c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
67d0: 34 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65 78  4_interop(contex
67e0: 74 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0a 23  t, ref value);.#
67f0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
6800: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
6810: 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e 4e 75  de void ReturnNu
6820: 6c 6c 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78  ll(IntPtr contex
6830: 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 55  t).    {.      U
6840: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6850: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ds.sqlite3_resul
6860: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
6870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
6880: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
6890: 69 64 20 52 65 74 75 72 6e 54 65 78 74 28 49 6e  id ReturnText(In
68a0: 74 50 74 72 20 63 6f 6e 74 65 78 74 2c 20 73 74  tPtr context, st
68b0: 72 69 6e 67 20 76 61 6c 75 65 29 0a 20 20 20 20  ring value).    
68c0: 7b 0a 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62  {.      byte[] b
68d0: 20 3d 20 54 6f 55 54 46 38 28 76 61 6c 75 65 29   = ToUTF8(value)
68e0: 3b 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61  ;.      UnsafeNa
68f0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
6900: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6910: 63 6f 6e 74 65 78 74 2c 20 54 6f 55 54 46 38 28  context, ToUTF8(
6920: 76 61 6c 75 65 29 2c 20 62 2e 4c 65 6e 67 74 68  value), b.Length
6930: 20 2d 20 31 2c 20 28 49 6e 74 50 74 72 29 28 2d   - 1, (IntPtr)(-
6940: 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1));.    }..    
6950: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
6960: 65 20 49 6e 74 50 74 72 20 41 67 67 72 65 67 61  e IntPtr Aggrega
6970: 74 65 43 6f 6e 74 65 78 74 28 49 6e 74 50 74 72  teContext(IntPtr
6980: 20 63 6f 6e 74 65 78 74 29 0a 20 20 20 20 7b 0a   context).    {.
6990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73        return Uns
69a0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
69b0: 2e 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  .sqlite3_aggrega
69c0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
69d0: 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  xt, 1);.    }.. 
69e0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
69f0: 72 69 64 65 20 76 6f 69 64 20 53 65 74 50 61 73  ride void SetPas
6a00: 73 77 6f 72 64 28 62 79 74 65 5b 5d 20 70 61 73  sword(byte[] pas
6a10: 73 77 6f 72 64 42 79 74 65 73 29 0a 20 20 20 20  swordBytes).    
6a20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
6a30: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
6a40: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 6b 65 79 28  ods.sqlite3_key(
6a50: 5f 73 71 6c 2c 20 70 61 73 73 77 6f 72 64 42 79  _sql, passwordBy
6a60: 74 65 73 2c 20 70 61 73 73 77 6f 72 64 42 79 74  tes, passwordByt
6a70: 65 73 2e 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20  es.Length);.    
6a80: 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72    if (n > 0) thr
6a90: 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63  ow new SQLiteExc
6aa0: 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65  eption(n, SQLite
6ab0: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20  LastError());.  
6ac0: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
6ad0: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
6ae0: 43 68 61 6e 67 65 50 61 73 73 77 6f 72 64 28 62  ChangePassword(b
6af0: 79 74 65 5b 5d 20 6e 65 77 50 61 73 73 77 6f 72  yte[] newPasswor
6b00: 64 42 79 74 65 73 29 0a 20 20 20 20 7b 0a 20 20  dBytes).    {.  
6b10: 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61      int n = Unsa
6b20: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6b30: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 28 5f 73  sqlite3_rekey(_s
6b40: 71 6c 2c 20 6e 65 77 50 61 73 73 77 6f 72 64 42  ql, newPasswordB
6b50: 79 74 65 73 2c 20 28 6e 65 77 50 61 73 73 77 6f  ytes, (newPasswo
6b60: 72 64 42 79 74 65 73 20 3d 3d 20 6e 75 6c 6c 29  rdBytes == null)
6b70: 20 3f 20 30 20 3a 20 6e 65 77 50 61 73 73 77 6f   ? 0 : newPasswo
6b80: 72 64 42 79 74 65 73 2e 4c 65 6e 67 74 68 29 3b  rdBytes.Length);
6b90: 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30  .      if (n > 0
6ba0: 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69  ) throw new SQLi
6bb0: 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53  teException(n, S
6bc0: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
6bd0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
6be0: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
6bf0: 76 6f 69 64 20 53 65 74 55 70 64 61 74 65 48 6f  void SetUpdateHo
6c00: 6f 6b 28 53 51 4c 69 74 65 55 70 64 61 74 65 43  ok(SQLiteUpdateC
6c10: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 29 0a 20 20  allback func).  
6c20: 20 20 7b 0a 20 20 20 20 20 20 55 6e 73 61 66 65    {.      Unsafe
6c30: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
6c40: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
6c50: 6b 28 5f 73 71 6c 2c 20 66 75 6e 63 2c 20 49 6e  k(_sql, func, In
6c60: 74 50 74 72 2e 5a 65 72 6f 29 3b 0a 20 20 20 20  tPtr.Zero);.    
6c70: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
6c80: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 53 65  override void Se
6c90: 74 43 6f 6d 6d 69 74 48 6f 6f 6b 28 53 51 4c 69  tCommitHook(SQLi
6ca0: 74 65 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  teCommitCallback
6cb0: 20 66 75 6e 63 29 0a 20 20 20 20 7b 0a 20 20 20   func).    {.   
6cc0: 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d     UnsafeNativeM
6cd0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63  ethods.sqlite3_c
6ce0: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 5f 73 71 6c 2c  ommit_hook(_sql,
6cf0: 20 66 75 6e 63 2c 20 49 6e 74 50 74 72 2e 5a 65   func, IntPtr.Ze
6d00: 72 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ro);.    }..    
6d10: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
6d20: 65 20 76 6f 69 64 20 53 65 74 52 6f 6c 6c 62 61  e void SetRollba
6d30: 63 6b 48 6f 6f 6b 28 53 51 4c 69 74 65 52 6f 6c  ckHook(SQLiteRol
6d40: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 66 75  lbackCallback fu
6d50: 6e 63 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nc).    {.      
6d60: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
6d70: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  ods.sqlite3_roll
6d80: 62 61 63 6b 5f 68 6f 6f 6b 28 5f 73 71 6c 2c 20  back_hook(_sql, 
6d90: 66 75 6e 63 2c 20 49 6e 74 50 74 72 2e 5a 65 72  func, IntPtr.Zer
6da0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
6db0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20  // <summary>.   
6dc0: 20 2f 2f 2f 20 48 65 6c 70 65 72 20 66 75 6e 63   /// Helper func
6dd0: 74 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  tion to retrieve
6de0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 64 61 74   a column of dat
6df0: 61 20 66 72 6f 6d 20 61 6e 20 61 63 74 69 76 65  a from an active
6e00: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
6e10: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
6e20: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
6e30: 6d 65 3d 22 73 74 6d 74 22 3e 54 68 65 20 73 74  me="stmt">The st
6e40: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 73 74  atement being st
6e50: 65 70 28 29 27 64 20 74 68 72 6f 75 67 68 3c 2f  ep()'d through</
6e60: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c  param>.    /// <
6e70: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 6e 64 65  param name="inde
6e80: 78 22 3e 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  x">The column in
6e90: 64 65 78 20 74 6f 20 72 65 74 72 69 65 76 65 3c  dex to retrieve<
6ea0: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20  /param>.    /// 
6eb0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74 79 70  <param name="typ
6ec0: 22 3e 54 68 65 20 74 79 70 65 20 6f 66 20 64 61  ">The type of da
6ed0: 74 61 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ta contained in 
6ee0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20  the column.  If 
6ef0: 55 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74  Uninitialized, t
6f00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
6f10: 6c 20 72 65 74 72 69 65 76 65 20 74 68 65 20 64  l retrieve the d
6f20: 61 74 61 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  atatype informat
6f30: 69 6f 6e 2e 3c 2f 70 61 72 61 6d 3e 0a 20 20 20  ion.</param>.   
6f40: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65   /// <returns>Re
6f50: 74 75 72 6e 73 20 74 68 65 20 64 61 74 61 20 69  turns the data i
6f60: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 3c 2f 72 65  n the column</re
6f70: 74 75 72 6e 73 3e 0a 20 20 20 20 69 6e 74 65 72  turns>.    inter
6f80: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6f 62 6a  nal override obj
6f90: 65 63 74 20 47 65 74 56 61 6c 75 65 28 53 51 4c  ect GetValue(SQL
6fa0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
6fb0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 53 51  t, int index, SQ
6fc0: 4c 69 74 65 54 79 70 65 20 74 79 70 29 0a 20 20  LiteType typ).  
6fd0: 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28 49 73    {.      if (Is
6fe0: 4e 75 6c 6c 28 73 74 6d 74 2c 20 69 6e 64 65 78  Null(stmt, index
6ff0: 29 29 20 72 65 74 75 72 6e 20 44 42 4e 75 6c 6c  )) return DBNull
7000: 2e 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 54 79  .Value;.      Ty
7010: 70 65 41 66 66 69 6e 69 74 79 20 61 66 66 20 3d  peAffinity aff =
7020: 20 74 79 70 2e 41 66 66 69 6e 69 74 79 3b 0a 20   typ.Affinity;. 
7030: 20 20 20 20 20 54 79 70 65 20 74 20 3d 20 6e 75       Type t = nu
7040: 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 74  ll;..      if (t
7050: 79 70 2e 54 79 70 65 20 21 3d 20 44 62 54 79 70  yp.Type != DbTyp
7060: 65 2e 4f 62 6a 65 63 74 29 0a 20 20 20 20 20 20  e.Object).      
7070: 7b 0a 20 20 20 20 20 20 20 20 74 20 3d 20 53 51  {.        t = SQ
7080: 4c 69 74 65 43 6f 6e 76 65 72 74 2e 53 51 4c 69  LiteConvert.SQLi
7090: 74 65 54 79 70 65 54 6f 54 79 70 65 28 74 79 70  teTypeToType(typ
70a0: 29 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  );.        aff =
70b0: 20 54 79 70 65 54 6f 41 66 66 69 6e 69 74 79 28   TypeToAffinity(
70c0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
70d0: 20 20 20 73 77 69 74 63 68 20 28 61 66 66 29 0a     switch (aff).
70e0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
70f0: 63 61 73 65 20 54 79 70 65 41 66 66 69 6e 69 74  case TypeAffinit
7100: 79 2e 42 6c 6f 62 3a 0a 20 20 20 20 20 20 20 20  y.Blob:.        
7110: 20 20 69 66 20 28 74 79 70 2e 54 79 70 65 20 3d    if (typ.Type =
7120: 3d 20 44 62 54 79 70 65 2e 47 75 69 64 20 26 26  = DbType.Guid &&
7130: 20 74 79 70 2e 41 66 66 69 6e 69 74 79 20 3d 3d   typ.Affinity ==
7140: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 54 65   TypeAffinity.Te
7150: 78 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt).            
7160: 72 65 74 75 72 6e 20 6e 65 77 20 47 75 69 64 28  return new Guid(
7170: 47 65 74 54 65 78 74 28 73 74 6d 74 2c 20 69 6e  GetText(stmt, in
7180: 64 65 78 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  dex));..        
7190: 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 47    int n = (int)G
71a0: 65 74 42 79 74 65 73 28 73 74 6d 74 2c 20 69 6e  etBytes(stmt, in
71b0: 64 65 78 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c  dex, 0, null, 0,
71c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
71d0: 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20 62 79  yte[] b = new by
71e0: 74 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 20 20 20  te[n];.         
71f0: 20 47 65 74 42 79 74 65 73 28 73 74 6d 74 2c 20   GetBytes(stmt, 
7200: 69 6e 64 65 78 2c 20 30 2c 20 62 2c 20 30 2c 20  index, 0, b, 0, 
7210: 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  n);..          i
7220: 66 20 28 74 79 70 2e 54 79 70 65 20 3d 3d 20 44  f (typ.Type == D
7230: 62 54 79 70 65 2e 47 75 69 64 20 26 26 20 6e 20  bType.Guid && n 
7240: 3d 3d 20 31 36 29 0a 20 20 20 20 20 20 20 20 20  == 16).         
7250: 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 47 75     return new Gu
7260: 69 64 28 62 29 3b 0a 0a 20 20 20 20 20 20 20 20  id(b);..        
7270: 20 20 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20    return b;.    
7280: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
7290: 69 6e 69 74 79 2e 44 61 74 65 54 69 6d 65 3a 0a  inity.DateTime:.
72a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
72b0: 20 47 65 74 44 61 74 65 54 69 6d 65 28 73 74 6d   GetDateTime(stm
72c0: 74 2c 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  t, index);.     
72d0: 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69     case TypeAffi
72e0: 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0a 20 20 20  nity.Double:.   
72f0: 20 20 20 20 20 20 20 69 66 20 28 74 20 3d 3d 20         if (t == 
7300: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 47 65 74  null) return Get
7310: 44 6f 75 62 6c 65 28 73 74 6d 74 2c 20 69 6e 64  Double(stmt, ind
7320: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ex);.          e
7330: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
7340: 72 65 74 75 72 6e 20 43 6f 6e 76 65 72 74 2e 43  return Convert.C
7350: 68 61 6e 67 65 54 79 70 65 28 47 65 74 44 6f 75  hangeType(GetDou
7360: 62 6c 65 28 73 74 6d 74 2c 20 69 6e 64 65 78 29  ble(stmt, index)
7370: 2c 20 74 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  , t, null);.    
7380: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
7390: 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20  inity.Int64:.   
73a0: 20 20 20 20 20 20 20 69 66 20 28 74 20 3d 3d 20         if (t == 
73b0: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 47 65 74  null) return Get
73c0: 49 6e 74 36 34 28 73 74 6d 74 2c 20 69 6e 64 65  Int64(stmt, inde
73d0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c  x);.          el
73e0: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  se.            r
73f0: 65 74 75 72 6e 20 43 6f 6e 76 65 72 74 2e 43 68  eturn Convert.Ch
7400: 61 6e 67 65 54 79 70 65 28 47 65 74 49 6e 74 36  angeType(GetInt6
7410: 34 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20  4(stmt, index), 
7420: 74 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  t, null);.      
7430: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
7440: 20 20 20 20 20 72 65 74 75 72 6e 20 47 65 74 54       return GetT
7450: 65 78 74 28 73 74 6d 74 2c 20 69 6e 64 65 78 29  ext(stmt, index)
7460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7470: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
7480: 65 72 72 69 64 65 20 69 6e 74 20 47 65 74 43 75  erride int GetCu
7490: 72 73 6f 72 46 6f 72 54 61 62 6c 65 28 53 51 4c  rsorForTable(SQL
74a0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
74b0: 74 2c 20 69 6e 74 20 64 62 2c 20 69 6e 74 20 72  t, int db, int r
74c0: 6f 6f 74 50 61 67 65 29 0a 20 20 20 20 7b 0a 23  ootPage).    {.#
74d0: 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44  if !SQLITE_STAND
74e0: 41 52 44 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ARD.      return
74f0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
7500: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 74 61 62  hods.sqlite3_tab
7510: 6c 65 5f 63 75 72 73 6f 72 28 73 74 6d 74 2e 5f  le_cursor(stmt._
7520: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 64 62 2c  sqlite_stmt, db,
7530: 20 72 6f 6f 74 50 61 67 65 29 3b 0a 23 65 6c 73   rootPage);.#els
7540: 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  e.      return -
7550: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  1;.#endif.    }.
7560: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
7570: 65 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 52  erride long GetR
7580: 6f 77 49 64 46 6f 72 43 75 72 73 6f 72 28 53 51  owIdForCursor(SQ
7590: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
75a0: 6d 74 2c 20 69 6e 74 20 63 75 72 73 6f 72 29 0a  mt, int cursor).
75b0: 20 20 20 20 7b 0a 23 69 66 20 21 53 51 4c 49 54      {.#if !SQLIT
75c0: 45 5f 53 54 41 4e 44 41 52 44 0a 20 20 20 20 20  E_STANDARD.     
75d0: 20 6c 6f 6e 67 20 72 6f 77 69 64 3b 0a 20 20 20   long rowid;.   
75e0: 20 20 20 69 6e 74 20 72 63 20 3d 20 55 6e 73 61     int rc = Unsa
75f0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
7600: 73 71 6c 69 74 65 33 5f 63 75 72 73 6f 72 5f 72  sqlite3_cursor_r
7610: 6f 77 69 64 28 73 74 6d 74 2e 5f 73 71 6c 69 74  owid(stmt._sqlit
7620: 65 5f 73 74 6d 74 2c 20 63 75 72 73 6f 72 2c 20  e_stmt, cursor, 
7630: 6f 75 74 20 72 6f 77 69 64 29 3b 0a 20 20 20 20  out rowid);.    
7640: 20 20 69 66 20 28 72 63 20 3d 3d 20 30 29 20 72    if (rc == 0) r
7650: 65 74 75 72 6e 20 72 6f 77 69 64 3b 0a 0a 20 20  eturn rowid;..  
7660: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65      return 0;.#e
7670: 6c 73 65 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lse.      return
7680: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   0;.#endif.    }
7690: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
76a0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 47 65 74  verride void Get
76b0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 45 78 74 65 6e  IndexColumnExten
76c0: 64 65 64 49 6e 66 6f 28 73 74 72 69 6e 67 20 64  dedInfo(string d
76d0: 61 74 61 62 61 73 65 2c 20 73 74 72 69 6e 67 20  atabase, string 
76e0: 69 6e 64 65 78 2c 20 73 74 72 69 6e 67 20 63 6f  index, string co
76f0: 6c 75 6d 6e 2c 20 6f 75 74 20 69 6e 74 20 73 6f  lumn, out int so
7700: 72 74 4d 6f 64 65 2c 20 6f 75 74 20 69 6e 74 20  rtMode, out int 
7710: 6f 6e 45 72 72 6f 72 2c 20 6f 75 74 20 73 74 72  onError, out str
7720: 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 53 65 71  ing collationSeq
7730: 75 65 6e 63 65 29 0a 20 20 20 20 7b 0a 23 69 66  uence).    {.#if
7740: 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52   !SQLITE_STANDAR
7750: 44 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20 63  D.      IntPtr c
7760: 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  oll;.      int c
7770: 6f 6c 6c 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  olllen;.      in
7780: 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 72 63 20  t rc;..      rc 
7790: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
77a0: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 69 6e  thods.sqlite3_in
77b0: 64 65 78 5f 63 6f 6c 75 6d 6e 5f 69 6e 66 6f 5f  dex_column_info_
77c0: 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f  interop(_sql, To
77d0: 55 54 46 38 28 64 61 74 61 62 61 73 65 29 2c 20  UTF8(database), 
77e0: 54 6f 55 54 46 38 28 69 6e 64 65 78 29 2c 20 54  ToUTF8(index), T
77f0: 6f 55 54 46 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f  oUTF8(column), o
7800: 75 74 20 73 6f 72 74 4d 6f 64 65 2c 20 6f 75 74  ut sortMode, out
7810: 20 6f 6e 45 72 72 6f 72 2c 20 6f 75 74 20 63 6f   onError, out co
7820: 6c 6c 2c 20 6f 75 74 20 63 6f 6c 6c 6c 65 6e 29  ll, out colllen)
7830: 3b 0a 20 20 20 20 20 20 69 66 20 28 72 63 20 21  ;.      if (rc !
7840: 3d 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  = 0) throw new S
7850: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 72  QLiteException(r
7860: 63 2c 20 22 22 29 3b 0a 0a 20 20 20 20 20 20 63  c, "");..      c
7870: 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65  ollationSequence
7880: 20 3d 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28   = UTF8ToString(
7890: 63 6f 6c 6c 2c 20 63 6f 6c 6c 6c 65 6e 29 3b 0a  coll, colllen);.
78a0: 23 65 6c 73 65 0a 20 20 20 20 20 20 73 6f 72 74  #else.      sort
78b0: 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
78c0: 6f 6e 45 72 72 6f 72 20 3d 20 32 3b 0a 20 20 20  onError = 2;.   
78d0: 20 20 20 63 6f 6c 6c 61 74 69 6f 6e 53 65 71 75     collationSequ
78e0: 65 6e 63 65 20 3d 20 22 42 49 4e 41 52 59 22 3b  ence = "BINARY";
78f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
7900: 7d 0a 7d 0a                                      }.}.