System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c99c10e89495642137b49834ae46b0a68e32ad2d:


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 0d 0a 20 2a  ************.. *
0040: 20 41 44 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74   ADO.NET 2.0 Dat
0050: 61 20 50 72 6f 76 69 64 65 72 20 66 6f 72 20 53  a Provider for S
0060: 51 4c 69 74 65 20 56 65 72 73 69 6f 6e 20 33 2e  QLite Version 3.
0070: 58 0d 0a 20 2a 20 57 72 69 74 74 65 6e 20 62 79  X.. * Written by
0080: 20 52 6f 62 65 72 74 20 53 69 6d 70 73 6f 6e 20   Robert Simpson 
0090: 28 72 6f 62 65 72 74 40 62 6c 61 63 6b 63 61 73  (robert@blackcas
00a0: 74 6c 65 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a  tlesoft.com).. *
00b0: 20 0d 0a 20 2a 20 52 65 6c 65 61 73 65 64 20 74   .. * Released t
00c0: 6f 20 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d  o the public dom
00d0: 61 69 6e 2c 20 75 73 65 20 61 74 20 79 6f 75 72  ain, use at your
00e0: 20 6f 77 6e 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a   own 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: 2a 2a 2a 2a 2a 2f 0d 0a 0d 0a 6e 61 6d 65 73 70  *****/....namesp
0130: 61 63 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ace System.Data.
0140: 53 51 4c 69 74 65 0d 0a 7b 0d 0a 20 20 75 73 69  SQLite..{..  usi
0150: 6e 67 20 53 79 73 74 65 6d 3b 0d 0a 20 20 75 73  ng System;..  us
0160: 69 6e 67 20 53 79 73 74 65 6d 2e 52 75 6e 74 69  ing System.Runti
0170: 6d 65 2e 49 6e 74 65 72 6f 70 53 65 72 76 69 63  me.InteropServic
0180: 65 73 3b 0d 0a 0d 0a 23 69 66 20 21 50 4c 41 54  es;....#if !PLAT
0190: 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d  FORM_COMPACTFRAM
01a0: 45 57 4f 52 4b 0d 0a 20 20 5b 55 6e 6d 61 6e 61  EWORK..  [Unmana
01b0: 67 65 64 46 75 6e 63 74 69 6f 6e 50 6f 69 6e 74  gedFunctionPoint
01c0: 65 72 28 43 61 6c 6c 69 6e 67 43 6f 6e 76 65 6e  er(CallingConven
01d0: 74 69 6f 6e 2e 43 64 65 63 6c 29 5d 0d 0a 23 65  tion.Cdecl)]..#e
01e0: 6e 64 69 66 0d 0a 20 20 69 6e 74 65 72 6e 61 6c  ndif..  internal
01f0: 20 64 65 6c 65 67 61 74 65 20 76 6f 69 64 20 53   delegate void S
0200: 51 4c 69 74 65 4c 6f 67 43 61 6c 6c 62 61 63 6b  QLiteLogCallback
0210: 28 49 6e 74 50 74 72 20 70 75 73 65 72 2c 20 69  (IntPtr puser, i
0220: 6e 74 20 65 72 72 5f 63 6f 64 65 2c 20 49 6e 74  nt err_code, Int
0230: 50 74 72 20 6d 65 73 73 61 67 65 29 3b 0d 0a 0d  Ptr message);...
0240: 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e  .  /// <summary>
0250: 0d 0a 20 20 2f 2f 2f 20 54 68 69 73 20 63 6c 61  ..  /// This cla
0260: 73 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 53 51  ss implements SQ
0270: 4c 69 74 65 42 61 73 65 20 63 6f 6d 70 6c 65 74  LiteBase complet
0280: 65 6c 79 2c 20 61 6e 64 20 69 73 20 74 68 65 20  ely, and is the 
0290: 67 75 74 73 20 6f 66 20 74 68 65 20 63 6f 64 65  guts of the code
02a0: 20 74 68 61 74 20 69 6e 74 65 72 6f 70 27 73 20   that interop's 
02b0: 53 51 4c 69 74 65 20 77 69 74 68 20 2e 4e 45 54  SQLite with .NET
02c0: 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72  ..  /// </summar
02d0: 79 3e 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20 63  y>..  internal c
02e0: 6c 61 73 73 20 53 51 4c 69 74 65 33 20 3a 20 53  lass SQLite3 : S
02f0: 51 4c 69 74 65 42 61 73 65 0d 0a 20 20 7b 0d 0a  QLiteBase..  {..
0300: 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f  #if !PLATFORM_CO
0310: 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a  MPACTFRAMEWORK..
0320: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e      internal con
0330: 73 74 20 73 74 72 69 6e 67 20 44 65 73 69 67 6e  st string Design
0340: 65 72 56 65 72 73 69 6f 6e 20 3d 20 22 31 2e 30  erVersion = "1.0
0350: 2e 37 36 2e 30 22 3b 0d 0a 23 65 6e 64 69 66 0d  .76.0";..#endif.
0360: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
0370: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  ary>..    /// Th
0380: 65 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65 72  e opaque pointer
0390: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 75 73 20   returned to us 
03a0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 20 70 72  by the sqlite pr
03b0: 6f 76 69 64 65 72 0d 0a 20 20 20 20 2f 2f 2f 20  ovider..    /// 
03c0: 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20  </summary>..    
03d0: 70 72 6f 74 65 63 74 65 64 20 53 51 4c 69 74 65  protected SQLite
03e0: 43 6f 6e 6e 65 63 74 69 6f 6e 48 61 6e 64 6c 65  ConnectionHandle
03f0: 20 5f 73 71 6c 3b 0d 0a 20 20 20 20 70 72 6f 74   _sql;..    prot
0400: 65 63 74 65 64 20 73 74 72 69 6e 67 20 5f 66 69  ected string _fi
0410: 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 70 72 6f  leName;..    pro
0420: 74 65 63 74 65 64 20 62 6f 6f 6c 20 5f 75 73 65  tected bool _use
0430: 50 6f 6f 6c 3b 0d 0a 20 20 20 20 70 72 6f 74 65  Pool;..    prote
0440: 63 74 65 64 20 69 6e 74 20 5f 70 6f 6f 6c 56 65  cted int _poolVe
0450: 72 73 69 6f 6e 3b 0d 0a 0d 0a 23 69 66 20 21 50  rsion;....#if !P
0460: 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
0470: 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 70 72  RAMEWORK..    pr
0480: 69 76 61 74 65 20 62 6f 6f 6c 20 5f 62 75 69 6c  ivate bool _buil
0490: 64 69 6e 67 53 63 68 65 6d 61 3b 0d 0a 23 65 6e  dingSchema;..#en
04a0: 64 69 66 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  dif..    /// <su
04b0: 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20  mmary>..    /// 
04c0: 54 68 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64  The user-defined
04d0: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 67 69 73   functions regis
04e0: 74 65 72 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  tered on this co
04f0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 2f 2f  nnection..    //
0500: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
0510: 20 20 70 72 6f 74 65 63 74 65 64 20 53 51 4c 69    protected SQLi
0520: 74 65 46 75 6e 63 74 69 6f 6e 5b 5d 20 5f 66 75  teFunction[] _fu
0530: 6e 63 74 69 6f 6e 73 41 72 72 61 79 3b 0d 0a 0d  nctionsArray;...
0540: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 53 51  .    internal SQ
0550: 4c 69 74 65 33 28 53 51 4c 69 74 65 44 61 74 65  Lite3(SQLiteDate
0560: 46 6f 72 6d 61 74 73 20 66 6d 74 29 0d 0a 20 20  Formats fmt)..  
0570: 20 20 20 20 3a 20 62 61 73 65 28 66 6d 74 29 0d      : base(fmt).
0580: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 0d  .    {..    }...
0590: 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64 20 6f  .    protected o
05a0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 44 69 73  verride void Dis
05b0: 70 6f 73 65 28 62 6f 6f 6c 20 62 44 69 73 70 6f  pose(bool bDispo
05c0: 73 69 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  sing)..    {..  
05d0: 20 20 20 20 69 66 20 28 62 44 69 73 70 6f 73 69      if (bDisposi
05e0: 6e 67 29 0d 0a 20 20 20 20 20 20 20 20 43 6c 6f  ng)..        Clo
05f0: 73 65 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  se();..    }....
0600: 20 20 20 20 2f 2f 20 49 74 20 69 73 6e 27 74 20      // It isn't 
0610: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 6c 65  necessary to cle
0620: 61 6e 75 70 20 61 6e 79 20 66 75 6e 63 74 69 6f  anup any functio
0630: 6e 73 20 77 65 27 76 65 20 72 65 67 69 73 74 65  ns we've registe
0640: 72 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6e  red.  If the con
0650: 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 2f 2f 20  nection..    // 
0660: 67 6f 65 73 20 74 6f 20 74 68 65 20 70 6f 6f 6c  goes to the pool
0670: 20 61 6e 64 20 69 73 20 72 65 73 75 72 72 65 63   and is resurrec
0680: 74 65 64 20 6c 61 74 65 72 2c 20 72 65 2d 72 65  ted later, re-re
0690: 67 69 73 74 65 72 65 64 20 66 75 6e 63 74 69 6f  gistered functio
06a0: 6e 73 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ns will overwrit
06b0: 65 20 74 68 65 0d 0a 20 20 20 20 2f 2f 20 70 72  e the..    // pr
06c0: 65 76 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e 73  evious functions
06d0: 2e 20 20 54 68 65 20 53 51 4c 69 74 65 46 75 6e  .  The SQLiteFun
06e0: 63 74 69 6f 6e 43 6f 6f 6b 69 65 48 61 6e 64 6c  ctionCookieHandl
06f0: 65 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  e will take care
0700: 20 6f 66 20 66 72 65 65 69 6e 67 20 75 6e 6d 61   of freeing unma
0710: 6e 61 67 65 64 0d 0a 20 20 20 20 2f 2f 20 72 65  naged..    // re
0720: 73 6f 75 72 63 65 73 20 62 65 6c 6f 6e 67 69 6e  sources belongin
0730: 67 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  g to the previou
0740: 73 6c 79 2d 72 65 67 69 73 74 65 72 65 64 20 66  sly-registered f
0750: 75 6e 63 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 69  unctions...    i
0760: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
0770: 20 76 6f 69 64 20 43 6c 6f 73 65 28 29 0d 0a 20   void Close().. 
0780: 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28     {..      if (
0790: 5f 73 71 6c 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20  _sql != null).. 
07a0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
07b0: 69 66 20 28 5f 75 73 65 50 6f 6f 6c 29 0d 0a 20  if (_usePool).. 
07c0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
07d0: 20 20 20 20 53 51 4c 69 74 65 42 61 73 65 2e 52      SQLiteBase.R
07e0: 65 73 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 28 5f  esetConnection(_
07f0: 73 71 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  sql);..         
0800: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
0810: 6e 50 6f 6f 6c 2e 41 64 64 28 5f 66 69 6c 65 4e  nPool.Add(_fileN
0820: 61 6d 65 2c 20 5f 73 71 6c 2c 20 5f 70 6f 6f 6c  ame, _sql, _pool
0830: 56 65 72 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20  Version);..     
0840: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 65 6c     }..        el
0850: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 5f 73  se..          _s
0860: 71 6c 2e 44 69 73 70 6f 73 65 28 29 3b 0d 0a 20  ql.Dispose();.. 
0870: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
0880: 5f 73 71 6c 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  _sql = null;..  
0890: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
08a0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
08b0: 64 20 43 61 6e 63 65 6c 28 29 0d 0a 20 20 20 20  d Cancel()..    
08c0: 7b 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  {..      UnsafeN
08d0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
08e0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 5f  ite3_interrupt(_
08f0: 73 71 6c 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  sql);..    }....
0900: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
0910: 72 72 69 64 65 20 73 74 72 69 6e 67 20 56 65 72  rride string Ver
0920: 73 69 6f 6e 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  sion..    {..   
0930: 20 20 20 67 65 74 0d 0a 20 20 20 20 20 20 7b 0d     get..      {.
0940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0950: 53 51 4c 69 74 65 33 2e 53 51 4c 69 74 65 56 65  SQLite3.SQLiteVe
0960: 72 73 69 6f 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d  rsion;..      }.
0970: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
0980: 74 65 72 6e 61 6c 20 73 74 61 74 69 63 20 73 74  ternal static st
0990: 72 69 6e 67 20 53 51 4c 69 74 65 56 65 72 73 69  ring SQLiteVersi
09a0: 6f 6e 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  on..    {..     
09b0: 20 67 65 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20   get..      {.. 
09c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54         return UT
09d0: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
09e0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
09f0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
0a00: 6e 28 29 2c 20 2d 31 29 3b 0d 0a 20 20 20 20 20  n(), -1);..     
0a10: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20   }..    }....   
0a20: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
0a30: 64 65 20 62 6f 6f 6c 20 41 75 74 6f 43 6f 6d 6d  de bool AutoComm
0a40: 69 74 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  it..    {..     
0a50: 20 67 65 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20   get..      {.. 
0a60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 49 73         return Is
0a70: 41 75 74 6f 63 6f 6d 6d 69 74 28 5f 73 71 6c 29  Autocommit(_sql)
0a80: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ;..      }..    
0a90: 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
0aa0: 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67 20  l override long 
0ab0: 4c 61 73 74 49 6e 73 65 72 74 52 6f 77 49 64 0d  LastInsertRowId.
0ac0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 67 65  .    {..      ge
0ad0: 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  t..      {..    
0ae0: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
0af0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
0b00: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
0b10: 72 74 5f 72 6f 77 69 64 28 5f 73 71 6c 29 3b 0d  rt_rowid(_sql);.
0b20: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
0b30: 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ...    internal 
0b40: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43 68 61  override int Cha
0b50: 6e 67 65 73 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  nges..    {..   
0b60: 20 20 20 67 65 74 0d 0a 20 20 20 20 20 20 7b 0d     get..      {.
0b70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0b80: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
0b90: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 68 61 6e  ods.sqlite3_chan
0ba0: 67 65 73 28 5f 73 71 6c 29 3b 0d 0a 20 20 20 20  ges(_sql);..    
0bb0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20    }..    }....  
0bc0: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d    /// <summary>.
0bd0: 0a 20 20 20 20 2f 2f 2f 20 53 68 75 74 64 6f 77  .    /// Shutdow
0be0: 6e 20 74 68 65 20 53 51 4c 69 74 65 20 65 6e 67  n the SQLite eng
0bf0: 69 6e 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ine so that it c
0c00: 61 6e 20 62 65 20 72 65 73 74 61 72 74 65 64 20  an be restarted 
0c10: 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 63  with different c
0c20: 6f 6e 66 69 67 20 6f 70 74 69 6f 6e 73 2e 0d 0a  onfig options...
0c30: 20 20 20 20 2f 2f 2f 20 57 65 20 64 65 70 65 6e      /// We depen
0c40: 64 20 6f 6e 20 61 75 74 6f 20 69 6e 69 74 69 61  d on auto initia
0c50: 6c 69 7a 61 74 69 6f 6e 20 74 6f 20 72 65 63 6f  lization to reco
0c60: 76 65 72 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ver...    /// </
0c70: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
0c80: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72  / <returns>Retur
0c90: 6e 73 20 61 20 72 65 73 75 6c 74 20 63 6f 64 65  ns a result code
0ca0: 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20  </returns>..    
0cb0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
0cc0: 65 20 69 6e 74 20 53 68 75 74 64 6f 77 6e 28 29  e int Shutdown()
0cd0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
0ce0: 20 69 6e 74 20 72 63 20 3d 20 55 6e 73 61 66 65   int rc = Unsafe
0cf0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
0d00: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
0d10: 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ;..        retur
0d20: 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  n rc;..    }....
0d30: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
0d40: 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 4f 70 65  rride bool IsOpe
0d50: 6e 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  n()..    {..    
0d60: 20 20 20 20 72 65 74 75 72 6e 20 28 5f 73 71 6c      return (_sql
0d70: 20 21 3d 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20   != null);..    
0d80: 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
0d90: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
0da0: 4f 70 65 6e 28 73 74 72 69 6e 67 20 73 74 72 46  Open(string strF
0db0: 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 69 74 65 4f  ilename, SQLiteO
0dc0: 70 65 6e 46 6c 61 67 73 45 6e 75 6d 20 66 6c 61  penFlagsEnum fla
0dd0: 67 73 2c 20 69 6e 74 20 6d 61 78 50 6f 6f 6c 53  gs, int maxPoolS
0de0: 69 7a 65 2c 20 62 6f 6f 6c 20 75 73 65 50 6f 6f  ize, bool usePoo
0df0: 6c 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  l)..    {..     
0e00: 20 69 66 20 28 5f 73 71 6c 20 21 3d 20 6e 75 6c   if (_sql != nul
0e10: 6c 29 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20  l) return;....  
0e20: 20 20 20 20 5f 75 73 65 50 6f 6f 6c 20 3d 20 75      _usePool = u
0e30: 73 65 50 6f 6f 6c 3b 0d 0a 20 20 20 20 20 20 69  sePool;..      i
0e40: 66 20 28 75 73 65 50 6f 6f 6c 29 0d 0a 20 20 20  f (usePool)..   
0e50: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 5f 66     {..        _f
0e60: 69 6c 65 4e 61 6d 65 20 3d 20 73 74 72 46 69 6c  ileName = strFil
0e70: 65 6e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20  ename;..        
0e80: 5f 73 71 6c 20 3d 20 53 51 4c 69 74 65 43 6f 6e  _sql = SQLiteCon
0e90: 6e 65 63 74 69 6f 6e 50 6f 6f 6c 2e 52 65 6d 6f  nectionPool.Remo
0ea0: 76 65 28 73 74 72 46 69 6c 65 6e 61 6d 65 2c 20  ve(strFilename, 
0eb0: 6d 61 78 50 6f 6f 6c 53 69 7a 65 2c 20 6f 75 74  maxPoolSize, out
0ec0: 20 5f 70 6f 6f 6c 56 65 72 73 69 6f 6e 29 3b 0d   _poolVersion);.
0ed0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
0ee0: 20 20 69 66 20 28 5f 73 71 6c 20 3d 3d 20 6e 75    if (_sql == nu
0ef0: 6c 6c 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ll)..      {..  
0f00: 20 20 20 20 20 20 49 6e 74 50 74 72 20 64 62 3b        IntPtr db;
0f10: 0d 0a 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  ....#if !SQLITE_
0f20: 53 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20 20  STANDARD..      
0f30: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
0f40: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
0f50: 6c 69 74 65 33 5f 6f 70 65 6e 5f 69 6e 74 65 72  lite3_open_inter
0f60: 6f 70 28 54 6f 55 54 46 38 28 73 74 72 46 69 6c  op(ToUTF8(strFil
0f70: 65 6e 61 6d 65 29 2c 20 28 69 6e 74 29 66 6c 61  ename), (int)fla
0f80: 67 73 2c 20 6f 75 74 20 64 62 29 3b 0d 0a 23 65  gs, out db);..#e
0f90: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 69 6e 74  lse..        int
0fa0: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
0fb0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
0fc0: 5f 6f 70 65 6e 5f 76 32 28 54 6f 55 54 46 38 28  _open_v2(ToUTF8(
0fd0: 73 74 72 46 69 6c 65 6e 61 6d 65 29 2c 20 6f 75  strFilename), ou
0fe0: 74 20 64 62 2c 20 28 69 6e 74 29 66 6c 61 67 73  t db, (int)flags
0ff0: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 29 3b 0d  , IntPtr.Zero);.
1000: 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20  .#endif..       
1010: 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f   if (n > 0) thro
1020: 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65  w new SQLiteExce
1030: 70 74 69 6f 6e 28 6e 2c 20 6e 75 6c 6c 29 3b 0d  ption(n, null);.
1040: 0a 0d 0a 20 20 20 20 20 20 20 20 5f 73 71 6c 20  ...        _sql 
1050: 3d 20 64 62 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  = db;..      }..
1060: 20 20 20 20 20 20 2f 2f 20 42 69 6e 64 20 66 75        // Bind fu
1070: 6e 63 74 69 6f 6e 73 20 74 6f 20 74 68 69 73 20  nctions to this 
1080: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 49 66 20  connection.  If 
1090: 61 6e 79 20 70 72 65 76 69 6f 75 73 20 66 75 6e  any previous fun
10a0: 63 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61  ctions of the sa
10b0: 6d 65 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 2f  me name..      /
10c0: 2f 20 77 65 72 65 20 61 6c 72 65 61 64 79 20 62  / were already b
10d0: 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  ound, then the n
10e0: 65 77 20 62 69 6e 64 69 6e 67 73 20 72 65 70 6c  ew bindings repl
10f0: 61 63 65 20 74 68 65 20 6f 6c 64 2e 0d 0a 20 20  ace the old...  
1100: 20 20 20 20 5f 66 75 6e 63 74 69 6f 6e 73 41 72      _functionsAr
1110: 72 61 79 20 3d 20 53 51 4c 69 74 65 46 75 6e 63  ray = SQLiteFunc
1120: 74 69 6f 6e 2e 42 69 6e 64 46 75 6e 63 74 69 6f  tion.BindFunctio
1130: 6e 73 28 74 68 69 73 29 3b 0d 0a 20 20 20 20 20  ns(this);..     
1140: 20 53 65 74 54 69 6d 65 6f 75 74 28 30 29 3b 0d   SetTimeout(0);.
1150: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
1160: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
1170: 76 6f 69 64 20 43 6c 65 61 72 50 6f 6f 6c 28 29  void ClearPool()
1180: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 53  ..    {..      S
1190: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50  QLiteConnectionP
11a0: 6f 6f 6c 2e 43 6c 65 61 72 50 6f 6f 6c 28 5f 66  ool.ClearPool(_f
11b0: 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 7d  ileName);..    }
11c0: 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ....    internal
11d0: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 53   override void S
11e0: 65 74 54 69 6d 65 6f 75 74 28 69 6e 74 20 6e 54  etTimeout(int nT
11f0: 69 6d 65 6f 75 74 4d 53 29 0d 0a 20 20 20 20 7b  imeoutMS)..    {
1200: 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ..      int n = 
1210: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
1220: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 75 73 79  ods.sqlite3_busy
1230: 5f 74 69 6d 65 6f 75 74 28 5f 73 71 6c 2c 20 6e  _timeout(_sql, n
1240: 54 69 6d 65 6f 75 74 4d 53 29 3b 0d 0a 20 20 20  TimeoutMS);..   
1250: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
1260: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
1270: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
1280: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0d 0a  eLastError());..
1290: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74      }....    int
12a0: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 62  ernal override b
12b0: 6f 6f 6c 20 53 74 65 70 28 53 51 4c 69 74 65 53  ool Step(SQLiteS
12c0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 29 0d 0a  tatement stmt)..
12d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74      {..      int
12e0: 20 6e 3b 0d 0a 20 20 20 20 20 20 52 61 6e 64 6f   n;..      Rando
12f0: 6d 20 72 6e 64 20 3d 20 6e 75 6c 6c 3b 0d 0a 20  m rnd = null;.. 
1300: 20 20 20 20 20 75 69 6e 74 20 73 74 61 72 74 74       uint startt
1310: 69 63 6b 20 3d 20 28 75 69 6e 74 29 45 6e 76 69  ick = (uint)Envi
1320: 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e  ronment.TickCoun
1330: 74 3b 0d 0a 20 20 20 20 20 20 75 69 6e 74 20 74  t;..      uint t
1340: 69 6d 65 6f 75 74 20 3d 20 28 75 69 6e 74 29 28  imeout = (uint)(
1350: 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64 2e 5f 63  stmt._command._c
1360: 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74 20 2a 20  ommandTimeout * 
1370: 31 30 30 30 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  1000);....      
1380: 77 68 69 6c 65 20 28 74 72 75 65 29 0d 0a 20 20  while (true)..  
1390: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 6e      {..        n
13a0: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
13b0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 73  ethods.sqlite3_s
13c0: 74 65 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  tep(stmt._sqlite
13d0: 5f 73 74 6d 74 29 3b 0d 0a 0d 0a 20 20 20 20 20  _stmt);....     
13e0: 20 20 20 69 66 20 28 6e 20 3d 3d 20 31 30 30 29     if (n == 100)
13f0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20   return true;.. 
1400: 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20         if (n == 
1410: 31 30 31 29 20 72 65 74 75 72 6e 20 66 61 6c 73  101) return fals
1420: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  e;....        if
1430: 20 28 6e 20 3e 20 30 29 0d 0a 20 20 20 20 20 20   (n > 0)..      
1440: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69    {..          i
1450: 6e 74 20 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  nt r;....       
1460: 20 20 20 2f 2f 20 41 6e 20 65 72 72 6f 72 20 6f     // An error o
1470: 63 63 75 72 72 65 64 2c 20 61 74 74 65 6d 70 74  ccurred, attempt
1480: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
1490: 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  atement.  If the
14a0: 20 72 65 73 65 74 20 77 6f 72 6b 65 64 20 62 65   reset worked be
14b0: 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20  cause the..     
14c0: 20 20 20 20 20 2f 2f 20 73 63 68 65 6d 61 20 68       // schema h
14d0: 61 73 20 63 68 61 6e 67 65 64 2c 20 72 65 2d 74  as changed, re-t
14e0: 72 79 20 74 68 65 20 73 74 65 70 20 61 67 61 69  ry the step agai
14f0: 6e 2e 20 20 49 66 20 69 74 20 65 72 72 6f 72 65  n.  If it errore
1500: 64 20 6f 75 72 20 62 65 63 61 75 73 65 20 74 68  d our because th
1510: 65 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20  e database..    
1520: 20 20 20 20 20 20 2f 2f 20 69 73 20 6c 6f 63 6b        // is lock
1530: 65 64 2c 20 74 68 65 6e 20 6b 65 65 70 20 72 65  ed, then keep re
1540: 74 72 79 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  trying until the
1550: 20 63 6f 6d 6d 61 6e 64 20 74 69 6d 65 6f 75 74   command timeout
1560: 20 6f 63 63 75 72 73 2e 0d 0a 20 20 20 20 20 20   occurs...      
1570: 20 20 20 20 72 20 3d 20 52 65 73 65 74 28 73 74      r = Reset(st
1580: 6d 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  mt);....        
1590: 20 20 69 66 20 28 72 20 3d 3d 20 30 29 0d 0a 20    if (r == 0).. 
15a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
15b0: 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70   new SQLiteExcep
15c0: 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61  tion(n, SQLiteLa
15d0: 73 74 45 72 72 6f 72 28 29 29 3b 0d 0a 0d 0a 20  stError());.... 
15e0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
15f0: 20 28 28 72 20 3d 3d 20 36 20 7c 7c 20 72 20 3d   ((r == 6 || r =
1600: 3d 20 35 29 20 26 26 20 73 74 6d 74 2e 5f 63 6f  = 5) && stmt._co
1610: 6d 6d 61 6e 64 20 21 3d 20 6e 75 6c 6c 29 20 2f  mmand != null) /
1620: 2f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  / SQLITE_LOCKED 
1630: 7c 7c 20 53 51 4c 49 54 45 5f 42 55 53 59 0d 0a  || SQLITE_BUSY..
1640: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1650: 20 20 20 20 20 20 20 20 20 2f 2f 20 4b 65 65 70           // Keep
1660: 20 74 72 79 69 6e 67 0d 0a 20 20 20 20 20 20 20   trying..       
1670: 20 20 20 20 20 69 66 20 28 72 6e 64 20 3d 3d 20       if (rnd == 
1680: 6e 75 6c 6c 29 20 2f 2f 20 46 69 72 73 74 20 74  null) // First t
1690: 69 6d 65 20 77 65 27 76 65 20 65 6e 63 6f 75 6e  ime we've encoun
16a0: 74 65 72 65 64 20 74 68 65 20 6c 6f 63 6b 0d 0a  tered the lock..
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6e                rn
16c0: 64 20 3d 20 6e 65 77 20 52 61 6e 64 6f 6d 28 29  d = new Random()
16d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
16e0: 20 2f 2f 20 49 66 20 77 65 27 76 65 20 65 78 63   // If we've exc
16f0: 65 65 64 65 64 20 74 68 65 20 63 6f 6d 6d 61 6e  eeded the comman
1700: 64 27 73 20 74 69 6d 65 6f 75 74 2c 20 67 69 76  d's timeout, giv
1710: 65 20 75 70 20 61 6e 64 20 74 68 72 6f 77 20 61  e up and throw a
1720: 6e 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  n error..       
1730: 20 20 20 20 20 69 66 20 28 28 75 69 6e 74 29 45       if ((uint)E
1740: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43  nvironment.TickC
1750: 6f 75 6e 74 20 2d 20 73 74 61 72 74 74 69 63 6b  ount - starttick
1760: 20 3e 20 74 69 6d 65 6f 75 74 29 0d 0a 20 20 20   > timeout)..   
1770: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1780: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
1790: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
17a0: 69 6f 6e 28 72 2c 20 53 51 4c 69 74 65 4c 61 73  ion(r, SQLiteLas
17b0: 74 45 72 72 6f 72 28 29 29 3b 0d 0a 20 20 20 20  tError());..    
17c0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17d0: 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20         else..   
17e0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
17f0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4f 74 68            // Oth
1800: 65 72 77 69 73 65 20 73 6c 65 65 70 20 66 6f 72  erwise sleep for
1810: 20 61 20 72 61 6e 64 6f 6d 20 61 6d 6f 75 6e 74   a random amount
1820: 20 6f 66 20 74 69 6d 65 20 75 70 20 74 6f 20 31   of time up to 1
1830: 35 30 6d 73 0d 0a 20 20 20 20 20 20 20 20 20 20  50ms..          
1840: 20 20 20 20 53 79 73 74 65 6d 2e 54 68 72 65 61      System.Threa
1850: 64 69 6e 67 2e 54 68 72 65 61 64 2e 53 6c 65 65  ding.Thread.Slee
1860: 70 28 72 6e 64 2e 4e 65 78 74 28 31 2c 20 31 35  p(rnd.Next(1, 15
1870: 30 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  0));..          
1880: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1890: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
18a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
18b0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
18c0: 72 69 64 65 20 69 6e 74 20 52 65 73 65 74 28 53  ride int Reset(S
18d0: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
18e0: 74 6d 74 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  tmt)..    {..   
18f0: 20 20 20 69 6e 74 20 6e 3b 0d 0a 0d 0a 23 69 66     int n;....#if
1900: 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52   !SQLITE_STANDAR
1910: 44 0d 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73  D..      n = Uns
1920: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
1930: 2e 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 69  .sqlite3_reset_i
1940: 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c  nterop(stmt._sql
1950: 69 74 65 5f 73 74 6d 74 29 3b 0d 0a 23 65 6c 73  ite_stmt);..#els
1960: 65 0d 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73  e..      n = Uns
1970: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
1980: 2e 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 73  .sqlite3_reset(s
1990: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
19a0: 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20  );..#endif....  
19b0: 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20 73 63      // If the sc
19c0: 68 65 6d 61 20 63 68 61 6e 67 65 64 2c 20 74 72  hema changed, tr
19d0: 79 20 61 6e 64 20 72 65 2d 70 72 65 70 61 72 65  y and re-prepare
19e0: 20 69 74 0d 0a 20 20 20 20 20 20 69 66 20 28 6e   it..      if (n
19f0: 20 3d 3d 20 31 37 29 20 2f 2f 20 53 51 4c 49 54   == 17) // SQLIT
1a00: 45 5f 53 43 48 45 4d 41 0d 0a 20 20 20 20 20 20  E_SCHEMA..      
1a10: 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 52 65  {..        // Re
1a20: 63 72 65 61 74 65 20 61 20 64 75 6d 6d 79 20 73  create a dummy s
1a30: 74 61 74 65 6d 65 6e 74 0d 0a 20 20 20 20 20 20  tatement..      
1a40: 20 20 73 74 72 69 6e 67 20 73 74 72 3b 0d 0a 20    string str;.. 
1a50: 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51         using (SQ
1a60: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 74 6d  LiteStatement tm
1a70: 70 20 3d 20 50 72 65 70 61 72 65 28 6e 75 6c 6c  p = Prepare(null
1a80: 2c 20 73 74 6d 74 2e 5f 73 71 6c 53 74 61 74 65  , stmt._sqlState
1a90: 6d 65 6e 74 2c 20 6e 75 6c 6c 2c 20 28 75 69 6e  ment, null, (uin
1aa0: 74 29 28 73 74 6d 74 2e 5f 63 6f 6d 6d 61 6e 64  t)(stmt._command
1ab0: 2e 5f 63 6f 6d 6d 61 6e 64 54 69 6d 65 6f 75 74  ._commandTimeout
1ac0: 20 2a 20 31 30 30 30 29 2c 20 6f 75 74 20 73 74   * 1000), out st
1ad0: 72 29 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  r))..        {..
1ae0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 69 6e            // Fin
1af0: 61 6c 69 7a 65 20 74 68 65 20 65 78 69 73 74 69  alize the existi
1b00: 6e 67 20 73 74 61 74 65 6d 65 6e 74 0d 0a 20 20  ng statement..  
1b10: 20 20 20 20 20 20 20 20 73 74 6d 74 2e 5f 73 71          stmt._sq
1b20: 6c 69 74 65 5f 73 74 6d 74 2e 44 69 73 70 6f 73  lite_stmt.Dispos
1b30: 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  e();..          
1b40: 2f 2f 20 52 65 61 73 73 69 67 6e 20 61 20 6e 65  // Reassign a ne
1b50: 77 20 73 74 61 74 65 6d 65 6e 74 20 70 6f 69 6e  w statement poin
1b60: 74 65 72 20 74 6f 20 74 68 65 20 6f 6c 64 20 73  ter to the old s
1b70: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 63 6c 65  tatement and cle
1b80: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
1b90: 20 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 20 20   one..          
1ba0: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
1bb0: 74 20 3d 20 74 6d 70 2e 5f 73 71 6c 69 74 65 5f  t = tmp._sqlite_
1bc0: 73 74 6d 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  stmt;..         
1bd0: 20 74 6d 70 2e 5f 73 71 6c 69 74 65 5f 73 74 6d   tmp._sqlite_stm
1be0: 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  t = null;....   
1bf0: 20 20 20 20 20 20 20 2f 2f 20 52 65 61 70 70 6c         // Reappl
1c00: 79 20 70 61 72 61 6d 65 74 65 72 73 0d 0a 20 20  y parameters..  
1c10: 20 20 20 20 20 20 20 20 73 74 6d 74 2e 42 69 6e          stmt.Bin
1c20: 64 50 61 72 61 6d 65 74 65 72 73 28 29 3b 0d 0a  dParameters();..
1c30: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c40: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 20 2f 2f     return -1; //
1c50: 20 52 65 73 65 74 20 77 61 73 20 4f 4b 2c 20 77   Reset was OK, w
1c60: 69 74 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ith schema chang
1c70: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
1c80: 20 20 65 6c 73 65 20 69 66 20 28 6e 20 3d 3d 20    else if (n == 
1c90: 36 20 7c 7c 20 6e 20 3d 3d 20 35 29 20 2f 2f 20  6 || n == 5) // 
1ca0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 7c 7c  SQLITE_LOCKED ||
1cb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 0d 0a 20 20   SQLITE_BUSY..  
1cc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0d        return n;.
1cd0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e  ...      if (n >
1ce0: 20 30 29 0d 0a 20 20 20 20 20 20 20 20 74 68 72   0)..        thr
1cf0: 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63  ow new SQLiteExc
1d00: 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65  eption(n, SQLite
1d10: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0d 0a 0d  LastError());...
1d20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1d30: 20 2f 2f 20 57 65 20 72 65 73 65 74 20 4f 4b 2c   // We reset OK,
1d40: 20 6e 6f 20 73 63 68 65 6d 61 20 63 68 61 6e 67   no schema chang
1d50: 65 73 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  es..    }....   
1d60: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
1d70: 64 65 20 73 74 72 69 6e 67 20 53 51 4c 69 74 65  de string SQLite
1d80: 4c 61 73 74 45 72 72 6f 72 28 29 0d 0a 20 20 20  LastError()..   
1d90: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1da0: 20 53 51 4c 69 74 65 42 61 73 65 2e 53 51 4c 69   SQLiteBase.SQLi
1db0: 74 65 4c 61 73 74 45 72 72 6f 72 28 5f 73 71 6c  teLastError(_sql
1dc0: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
1dd0: 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69   internal overri
1de0: 64 65 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65  de SQLiteStateme
1df0: 6e 74 20 50 72 65 70 61 72 65 28 53 51 4c 69 74  nt Prepare(SQLit
1e00: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6e 6e 2c  eConnection cnn,
1e10: 20 73 74 72 69 6e 67 20 73 74 72 53 71 6c 2c 20   string strSql, 
1e20: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
1e30: 70 72 65 76 69 6f 75 73 2c 20 75 69 6e 74 20 74  previous, uint t
1e40: 69 6d 65 6f 75 74 4d 53 2c 20 6f 75 74 20 73 74  imeoutMS, out st
1e50: 72 69 6e 67 20 73 74 72 52 65 6d 61 69 6e 29 0d  ring strRemain).
1e60: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 49 6e  .    {..      In
1e70: 74 50 74 72 20 73 74 6d 74 20 3d 20 49 6e 74 50  tPtr stmt = IntP
1e80: 74 72 2e 5a 65 72 6f 3b 0d 0a 20 20 20 20 20 20  tr.Zero;..      
1e90: 49 6e 74 50 74 72 20 70 74 72 20 3d 20 49 6e 74  IntPtr ptr = Int
1ea0: 50 74 72 2e 5a 65 72 6f 3b 0d 0a 20 20 20 20 20  Ptr.Zero;..     
1eb0: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0d 0a 20   int len = 0;.. 
1ec0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 31 37 3b       int n = 17;
1ed0: 0d 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 72  ..      int retr
1ee0: 69 65 73 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20  ies = 0;..      
1ef0: 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54 46  byte[] b = ToUTF
1f00: 38 28 73 74 72 53 71 6c 29 3b 0d 0a 20 20 20 20  8(strSql);..    
1f10: 20 20 73 74 72 69 6e 67 20 74 79 70 65 64 65 66    string typedef
1f20: 73 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  s = null;..     
1f30: 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74   SQLiteStatement
1f40: 20 63 6d 64 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20   cmd = null;..  
1f50: 20 20 20 20 52 61 6e 64 6f 6d 20 72 6e 64 20 3d      Random rnd =
1f60: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 75 69   null;..      ui
1f70: 6e 74 20 73 74 61 72 74 74 69 63 6b 20 3d 20 28  nt starttick = (
1f80: 75 69 6e 74 29 45 6e 76 69 72 6f 6e 6d 65 6e 74  uint)Environment
1f90: 2e 54 69 63 6b 43 6f 75 6e 74 3b 0d 0a 0d 0a 20  .TickCount;.... 
1fa0: 20 20 20 20 20 47 43 48 61 6e 64 6c 65 20 68 61       GCHandle ha
1fb0: 6e 64 6c 65 20 3d 20 47 43 48 61 6e 64 6c 65 2e  ndle = GCHandle.
1fc0: 41 6c 6c 6f 63 28 62 2c 20 47 43 48 61 6e 64 6c  Alloc(b, GCHandl
1fd0: 65 54 79 70 65 2e 50 69 6e 6e 65 64 29 3b 0d 0a  eType.Pinned);..
1fe0: 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 73 71        IntPtr psq
1ff0: 6c 20 3d 20 68 61 6e 64 6c 65 2e 41 64 64 72 4f  l = handle.AddrO
2000: 66 50 69 6e 6e 65 64 4f 62 6a 65 63 74 28 29 3b  fPinnedObject();
2010: 0d 0a 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20  ..      try..   
2020: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 77 68     {..        wh
2030: 69 6c 65 20 28 28 6e 20 3d 3d 20 31 37 20 7c 7c  ile ((n == 17 ||
2040: 20 6e 20 3d 3d 20 36 20 7c 7c 20 6e 20 3d 3d 20   n == 6 || n == 
2050: 35 29 20 26 26 20 72 65 74 72 69 65 73 20 3c 20  5) && retries < 
2060: 33 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 23  3)..        {..#
2070: 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44  if !SQLITE_STAND
2080: 41 52 44 0d 0a 20 20 20 20 20 20 20 20 20 20 6e  ARD..          n
2090: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
20a0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 70  ethods.sqlite3_p
20b0: 72 65 70 61 72 65 5f 69 6e 74 65 72 6f 70 28 5f  repare_interop(_
20c0: 73 71 6c 2c 20 70 73 71 6c 2c 20 62 2e 4c 65 6e  sql, psql, b.Len
20d0: 67 74 68 20 2d 20 31 2c 20 6f 75 74 20 73 74 6d  gth - 1, out stm
20e0: 74 2c 20 6f 75 74 20 70 74 72 2c 20 6f 75 74 20  t, out ptr, out 
20f0: 6c 65 6e 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  len);..#else..  
2100: 20 20 20 20 20 20 20 20 6e 20 3d 20 55 6e 73 61          n = Unsa
2110: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
2120: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
2130: 5f 73 71 6c 2c 20 70 73 71 6c 2c 20 62 2e 4c 65  _sql, psql, b.Le
2140: 6e 67 74 68 20 2d 20 31 2c 20 6f 75 74 20 73 74  ngth - 1, out st
2150: 6d 74 2c 20 6f 75 74 20 70 74 72 29 3b 0d 0a 20  mt, out ptr);.. 
2160: 20 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 2d           len = -
2170: 31 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20  1;..#endif....  
2180: 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d          if (n ==
2190: 20 31 37 29 0d 0a 20 20 20 20 20 20 20 20 20 20   17)..          
21a0: 20 20 72 65 74 72 69 65 73 2b 2b 3b 0d 0a 20 20    retries++;..  
21b0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
21c0: 28 6e 20 3d 3d 20 31 29 0d 0a 20 20 20 20 20 20  (n == 1)..      
21d0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
21e0: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 43 6f     if (String.Co
21f0: 6d 70 61 72 65 28 53 51 4c 69 74 65 4c 61 73 74  mpare(SQLiteLast
2200: 45 72 72 6f 72 28 29 2c 20 22 6e 65 61 72 20 5c  Error(), "near \
2210: 22 54 59 50 45 53 5c 22 3a 20 73 79 6e 74 61 78  "TYPES\": syntax
2220: 20 65 72 72 6f 72 22 2c 20 53 74 72 69 6e 67 43   error", StringC
2230: 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61  omparison.Ordina
2240: 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20  lIgnoreCase) == 
2250: 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)..            
2260: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2270: 20 69 6e 74 20 70 6f 73 20 3d 20 73 74 72 53 71   int pos = strSq
2280: 6c 2e 49 6e 64 65 78 4f 66 28 27 3b 27 29 3b 0d  l.IndexOf(';');.
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22a0: 66 20 28 70 6f 73 20 3d 3d 20 2d 31 29 20 70 6f  f (pos == -1) po
22b0: 73 20 3d 20 73 74 72 53 71 6c 2e 4c 65 6e 67 74  s = strSql.Lengt
22c0: 68 20 2d 20 31 3b 0d 0a 0d 0a 20 20 20 20 20 20  h - 1;....      
22d0: 20 20 20 20 20 20 20 20 74 79 70 65 64 65 66 73          typedefs
22e0: 20 3d 20 73 74 72 53 71 6c 2e 53 75 62 73 74 72   = strSql.Substr
22f0: 69 6e 67 28 30 2c 20 70 6f 73 20 2b 20 31 29 3b  ing(0, pos + 1);
2300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2310: 73 74 72 53 71 6c 20 3d 20 73 74 72 53 71 6c 2e  strSql = strSql.
2320: 53 75 62 73 74 72 69 6e 67 28 70 6f 73 20 2b 20  Substring(pos + 
2330: 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  1);....         
2340: 20 20 20 20 20 73 74 72 52 65 6d 61 69 6e 20 3d       strRemain =
2350: 20 22 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20   "";....        
2360: 20 20 20 20 20 20 77 68 69 6c 65 20 28 63 6d 64        while (cmd
2370: 20 3d 3d 20 6e 75 6c 6c 20 26 26 20 73 74 72 53   == null && strS
2380: 71 6c 2e 4c 65 6e 67 74 68 20 3e 20 30 29 0d 0a  ql.Length > 0)..
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
23a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b0: 20 63 6d 64 20 3d 20 50 72 65 70 61 72 65 28 63   cmd = Prepare(c
23c0: 6e 6e 2c 20 73 74 72 53 71 6c 2c 20 70 72 65 76  nn, strSql, prev
23d0: 69 6f 75 73 2c 20 74 69 6d 65 6f 75 74 4d 53 2c  ious, timeoutMS,
23e0: 20 6f 75 74 20 73 74 72 52 65 6d 61 69 6e 29 3b   out strRemain);
23f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2400: 20 20 73 74 72 53 71 6c 20 3d 20 73 74 72 52 65    strSql = strRe
2410: 6d 61 69 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20  main;..         
2420: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2430: 20 20 20 20 20 20 20 20 69 66 20 28 63 6d 64 20          if (cmd 
2440: 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
2450: 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 53 65            cmd.Se
2460: 74 54 79 70 65 73 28 74 79 70 65 64 65 66 73 29  tTypes(typedefs)
2470: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2480: 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b 0d 0a     return cmd;..
2490: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 23              }..#
24a0: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
24b0: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20  PACTFRAMEWORK.. 
24c0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
24d0: 69 66 20 28 5f 62 75 69 6c 64 69 6e 67 53 63 68  if (_buildingSch
24e0: 65 6d 61 20 3d 3d 20 66 61 6c 73 65 20 26 26 20  ema == false && 
24f0: 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65 28 53  String.Compare(S
2500: 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29  QLiteLastError()
2510: 2c 20 30 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  , 0, "no such ta
2520: 62 6c 65 3a 20 54 45 4d 50 2e 53 43 48 45 4d 41  ble: TEMP.SCHEMA
2530: 22 2c 20 30 2c 20 32 36 2c 20 53 74 72 69 6e 67  ", 0, 26, String
2540: 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e  Comparison.Ordin
2550: 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d  alIgnoreCase) ==
2560: 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0)..           
2570: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2580: 20 20 73 74 72 52 65 6d 61 69 6e 20 3d 20 22 22    strRemain = ""
2590: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
25a0: 20 5f 62 75 69 6c 64 69 6e 67 53 63 68 65 6d 61   _buildingSchema
25b0: 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
25c0: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
25d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 53                IS
25f0: 51 4c 69 74 65 53 63 68 65 6d 61 45 78 74 65 6e  QLiteSchemaExten
2600: 73 69 6f 6e 73 20 65 78 74 20 3d 20 28 28 49 53  sions ext = ((IS
2610: 65 72 76 69 63 65 50 72 6f 76 69 64 65 72 29 53  erviceProvider)S
2620: 51 4c 69 74 65 46 61 63 74 6f 72 79 2e 49 6e 73  QLiteFactory.Ins
2630: 74 61 6e 63 65 29 2e 47 65 74 53 65 72 76 69 63  tance).GetServic
2640: 65 28 74 79 70 65 6f 66 28 49 53 51 4c 69 74 65  e(typeof(ISQLite
2650: 53 63 68 65 6d 61 45 78 74 65 6e 73 69 6f 6e 73  SchemaExtensions
2660: 29 29 20 61 73 20 49 53 51 4c 69 74 65 53 63 68  )) as ISQLiteSch
2670: 65 6d 61 45 78 74 65 6e 73 69 6f 6e 73 3b 0d 0a  emaExtensions;..
2680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2690: 20 20 69 66 20 28 65 78 74 20 21 3d 20 6e 75 6c    if (ext != nul
26a0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
26b0: 20 20 20 20 20 20 65 78 74 2e 42 75 69 6c 64 54        ext.BuildT
26c0: 65 6d 70 53 63 68 65 6d 61 28 63 6e 6e 29 3b 0d  empSchema(cnn);.
26d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
26e0: 20 20 20 77 68 69 6c 65 20 28 63 6d 64 20 3d 3d     while (cmd ==
26f0: 20 6e 75 6c 6c 20 26 26 20 73 74 72 53 71 6c 2e   null && strSql.
2700: 4c 65 6e 67 74 68 20 3e 20 30 29 0d 0a 20 20 20  Length > 0)..   
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 63 6d 64 20 3d 20 50 72 65 70 61 72 65 28    cmd = Prepare(
2740: 63 6e 6e 2c 20 73 74 72 53 71 6c 2c 20 70 72 65  cnn, strSql, pre
2750: 76 69 6f 75 73 2c 20 74 69 6d 65 6f 75 74 4d 53  vious, timeoutMS
2760: 2c 20 6f 75 74 20 73 74 72 52 65 6d 61 69 6e 29  , out strRemain)
2770: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2780: 20 20 20 20 20 73 74 72 53 71 6c 20 3d 20 73 74       strSql = st
2790: 72 52 65 6d 61 69 6e 3b 0d 0a 20 20 20 20 20 20  rRemain;..      
27a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27c0: 65 74 75 72 6e 20 63 6d 64 3b 0d 0a 20 20 20 20  eturn cmd;..    
27d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
27e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
27f0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
2800: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2810: 20 20 20 20 20 5f 62 75 69 6c 64 69 6e 67 53 63       _buildingSc
2820: 68 65 6d 61 20 3d 20 66 61 6c 73 65 3b 0d 0a 20  hema = false;.. 
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 23              }..#
2850: 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20 20  endif..         
2860: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c   }..          el
2870: 73 65 20 69 66 20 28 6e 20 3d 3d 20 36 20 7c 7c  se if (n == 6 ||
2880: 20 6e 20 3d 3d 20 35 29 20 2f 2f 20 4c 6f 63 6b   n == 5) // Lock
2890: 65 64 20 2d 2d 20 64 65 6c 61 79 20 61 20 73 6d  ed -- delay a sm
28a0: 61 6c 6c 20 61 6d 6f 75 6e 74 20 62 65 66 6f 72  all amount befor
28b0: 65 20 72 65 74 72 79 69 6e 67 0d 0a 20 20 20 20  e retrying..    
28c0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
28d0: 20 20 20 20 20 2f 2f 20 4b 65 65 70 20 74 72 79       // Keep try
28e0: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
28f0: 20 69 66 20 28 72 6e 64 20 3d 3d 20 6e 75 6c 6c   if (rnd == null
2900: 29 20 2f 2f 20 46 69 72 73 74 20 74 69 6d 65 20  ) // First time 
2910: 77 65 27 76 65 20 65 6e 63 6f 75 6e 74 65 72 65  we've encountere
2920: 64 20 74 68 65 20 6c 6f 63 6b 0d 0a 20 20 20 20  d the lock..    
2930: 20 20 20 20 20 20 20 20 20 20 72 6e 64 20 3d 20            rnd = 
2940: 6e 65 77 20 52 61 6e 64 6f 6d 28 29 3b 0d 0a 0d  new Random();...
2950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
2960: 49 66 20 77 65 27 76 65 20 65 78 63 65 65 64 65  If we've exceede
2970: 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 27 73 20  d the command's 
2980: 74 69 6d 65 6f 75 74 2c 20 67 69 76 65 20 75 70  timeout, give up
2990: 20 61 6e 64 20 74 68 72 6f 77 20 61 6e 20 65 72   and throw an er
29a0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
29b0: 20 69 66 20 28 28 75 69 6e 74 29 45 6e 76 69 72   if ((uint)Envir
29c0: 6f 6e 6d 65 6e 74 2e 54 69 63 6b 43 6f 75 6e 74  onment.TickCount
29d0: 20 2d 20 73 74 61 72 74 74 69 63 6b 20 3e 20 74   - starttick > t
29e0: 69 6d 65 6f 75 74 4d 53 29 0d 0a 20 20 20 20 20  imeoutMS)..     
29f0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2a00: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
2a10: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
2a20: 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45  n(n, SQLiteLastE
2a30: 72 72 6f 72 28 29 29 3b 0d 0a 20 20 20 20 20 20  rror());..      
2a40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a50: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
2a60: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2a70: 20 20 20 20 20 20 20 20 2f 2f 20 4f 74 68 65 72          // Other
2a80: 77 69 73 65 20 73 6c 65 65 70 20 66 6f 72 20 61  wise sleep for a
2a90: 20 72 61 6e 64 6f 6d 20 61 6d 6f 75 6e 74 20 6f   random amount o
2aa0: 66 20 74 69 6d 65 20 75 70 20 74 6f 20 31 35 30  f time up to 150
2ab0: 6d 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ms..            
2ac0: 20 20 53 79 73 74 65 6d 2e 54 68 72 65 61 64 69    System.Threadi
2ad0: 6e 67 2e 54 68 72 65 61 64 2e 53 6c 65 65 70 28  ng.Thread.Sleep(
2ae0: 72 6e 64 2e 4e 65 78 74 28 31 2c 20 31 35 30 29  rnd.Next(1, 150)
2af0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
2b00: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2b10: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2b20: 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20       if (n > 0) 
2b30: 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65  throw new SQLite
2b40: 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c  Exception(n, SQL
2b50: 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  iteLastError());
2b60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 74 72 52  ....        strR
2b70: 65 6d 61 69 6e 20 3d 20 55 54 46 38 54 6f 53 74  emain = UTF8ToSt
2b80: 72 69 6e 67 28 70 74 72 2c 20 6c 65 6e 29 3b 0d  ring(ptr, len);.
2b90: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  ...        if (s
2ba0: 74 6d 74 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65  tmt != IntPtr.Ze
2bb0: 72 6f 29 20 63 6d 64 20 3d 20 6e 65 77 20 53 51  ro) cmd = new SQ
2bc0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 28 74 68  LiteStatement(th
2bd0: 69 73 2c 20 73 74 6d 74 2c 20 73 74 72 53 71 6c  is, stmt, strSql
2be0: 2e 53 75 62 73 74 72 69 6e 67 28 30 2c 20 73 74  .Substring(0, st
2bf0: 72 53 71 6c 2e 4c 65 6e 67 74 68 20 2d 20 73 74  rSql.Length - st
2c00: 72 52 65 6d 61 69 6e 2e 4c 65 6e 67 74 68 29 2c  rRemain.Length),
2c10: 20 70 72 65 76 69 6f 75 73 29 3b 0d 0a 0d 0a 20   previous);.... 
2c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6d         return cm
2c30: 64 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  d;..      }..   
2c40: 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20 20 20 20     finally..    
2c50: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 68 61 6e    {..        han
2c60: 64 6c 65 2e 46 72 65 65 28 29 3b 0d 0a 20 20 20  dle.Free();..   
2c70: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20     }..    }.... 
2c80: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
2c90: 72 69 64 65 20 76 6f 69 64 20 42 69 6e 64 5f 44  ride void Bind_D
2ca0: 6f 75 62 6c 65 28 53 51 4c 69 74 65 53 74 61 74  ouble(SQLiteStat
2cb0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
2cc0: 69 6e 64 65 78 2c 20 64 6f 75 62 6c 65 20 76 61  index, double va
2cd0: 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a 23 69 66  lue)..    {..#if
2ce0: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41   !PLATFORM_COMPA
2cf0: 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20  CTFRAMEWORK..   
2d00: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
2d10: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2d20: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
2d30: 6c 65 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  le(stmt._sqlite_
2d40: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c  stmt, index, val
2d50: 75 65 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20  ue);..#else..   
2d60: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
2d70: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2d80: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
2d90: 6c 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  le_interop(stmt.
2da0: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
2db0: 64 65 78 2c 20 72 65 66 20 76 61 6c 75 65 29 3b  dex, ref value);
2dc0: 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20  ..#endif..      
2dd0: 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77  if (n > 0) throw
2de0: 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70   new SQLiteExcep
2df0: 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61  tion(n, SQLiteLa
2e00: 73 74 45 72 72 6f 72 28 29 29 3b 0d 0a 20 20 20  stError());..   
2e10: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
2e20: 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  al override void
2e30: 20 42 69 6e 64 5f 49 6e 74 33 32 28 53 51 4c 69   Bind_Int32(SQLi
2e40: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
2e50: 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e 74  , int index, int
2e60: 20 76 61 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a   value)..    {..
2e70: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e        int n = Un
2e80: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
2e90: 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  s.sqlite3_bind_i
2ea0: 6e 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  nt(stmt._sqlite_
2eb0: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c  stmt, index, val
2ec0: 75 65 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  ue);..      if (
2ed0: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
2ee0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
2ef0: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
2f00: 72 6f 72 28 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ror());..    }..
2f10: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
2f20: 76 65 72 72 69 64 65 20 76 6f 69 64 20 42 69 6e  verride void Bin
2f30: 64 5f 49 6e 74 36 34 28 53 51 4c 69 74 65 53 74  d_Int64(SQLiteSt
2f40: 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e  atement stmt, in
2f50: 74 20 69 6e 64 65 78 2c 20 6c 6f 6e 67 20 76 61  t index, long va
2f60: 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a 23 69 66  lue)..    {..#if
2f70: 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41   !PLATFORM_COMPA
2f80: 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20  CTFRAMEWORK..   
2f90: 20 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66     int n = Unsaf
2fa0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
2fb0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
2fc0: 34 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73  4(stmt._sqlite_s
2fd0: 74 6d 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75  tmt, index, valu
2fe0: 65 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20  e);..#else..    
2ff0: 20 20 69 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65    int n = Unsafe
3000: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
3010: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
3020: 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73  _interop(stmt._s
3030: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
3040: 78 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0d 0a  x, ref value);..
3050: 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 69 66  #endif..      if
3060: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
3070: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
3080: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
3090: 45 72 72 6f 72 28 29 29 3b 0d 0a 20 20 20 20 7d  Error());..    }
30a0: 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ....    internal
30b0: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 42   override void B
30c0: 69 6e 64 5f 54 65 78 74 28 53 51 4c 69 74 65 53  ind_Text(SQLiteS
30d0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
30e0: 6e 74 20 69 6e 64 65 78 2c 20 73 74 72 69 6e 67  nt index, string
30f0: 20 76 61 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a   value)..    {..
3100: 20 20 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d        byte[] b =
3110: 20 54 6f 55 54 46 38 28 76 61 6c 75 65 29 3b 0d   ToUTF8(value);.
3120: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 55  .      int n = U
3130: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
3140: 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ds.sqlite3_bind_
3150: 74 65 78 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74  text(stmt._sqlit
3160: 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 62  e_stmt, index, b
3170: 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20 31 2c 20  , b.Length - 1, 
3180: 28 49 6e 74 50 74 72 29 28 2d 31 29 29 3b 0d 0a  (IntPtr)(-1));..
3190: 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29        if (n > 0)
31a0: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
31b0: 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51  eException(n, SQ
31c0: 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29  LiteLastError())
31d0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
31e0: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
31f0: 65 20 76 6f 69 64 20 42 69 6e 64 5f 44 61 74 65  e void Bind_Date
3200: 54 69 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65  Time(SQLiteState
3210: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
3220: 6e 64 65 78 2c 20 44 61 74 65 54 69 6d 65 20 64  ndex, DateTime d
3230: 74 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  t)..    {..     
3240: 20 62 79 74 65 5b 5d 20 62 20 3d 20 54 6f 55 54   byte[] b = ToUT
3250: 46 38 28 64 74 29 3b 0d 0a 20 20 20 20 20 20 69  F8(dt);..      i
3260: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
3270: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
3280: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 73 74 6d  e3_bind_text(stm
3290: 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20  t._sqlite_stmt, 
32a0: 69 6e 64 65 78 2c 20 62 2c 20 62 2e 4c 65 6e 67  index, b, b.Leng
32b0: 74 68 20 2d 20 31 2c 20 28 49 6e 74 50 74 72 29  th - 1, (IntPtr)
32c0: 28 2d 31 29 29 3b 0d 0a 20 20 20 20 20 20 69 66  (-1));..      if
32d0: 20 28 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e   (n > 0) throw n
32e0: 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ew SQLiteExcepti
32f0: 6f 6e 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74  on(n, SQLiteLast
3300: 45 72 72 6f 72 28 29 29 3b 0d 0a 20 20 20 20 7d  Error());..    }
3310: 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ....    internal
3320: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 42   override void B
3330: 69 6e 64 5f 42 6c 6f 62 28 53 51 4c 69 74 65 53  ind_Blob(SQLiteS
3340: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
3350: 6e 74 20 69 6e 64 65 78 2c 20 62 79 74 65 5b 5d  nt index, byte[]
3360: 20 62 6c 6f 62 44 61 74 61 29 0d 0a 20 20 20 20   blobData)..    
3370: 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  {..      int n =
3380: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
3390: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e  hods.sqlite3_bin
33a0: 64 5f 62 6c 6f 62 28 73 74 6d 74 2e 5f 73 71 6c  d_blob(stmt._sql
33b0: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c  ite_stmt, index,
33c0: 20 62 6c 6f 62 44 61 74 61 2c 20 62 6c 6f 62 44   blobData, blobD
33d0: 61 74 61 2e 4c 65 6e 67 74 68 2c 20 28 49 6e 74  ata.Length, (Int
33e0: 50 74 72 29 28 2d 31 29 29 3b 0d 0a 20 20 20 20  Ptr)(-1));..    
33f0: 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68 72    if (n > 0) thr
3400: 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63  ow new SQLiteExc
3410: 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74 65  eption(n, SQLite
3420: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0d 0a 20  LastError());.. 
3430: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65     }....    inte
3440: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
3450: 69 64 20 42 69 6e 64 5f 4e 75 6c 6c 28 53 51 4c  id Bind_Null(SQL
3460: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
3470: 74 2c 20 69 6e 74 20 69 6e 64 65 78 29 0d 0a 20  t, int index).. 
3480: 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20     {..      int 
3490: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
34a0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
34b0: 62 69 6e 64 5f 6e 75 6c 6c 28 73 74 6d 74 2e 5f  bind_null(stmt._
34c0: 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64  sqlite_stmt, ind
34d0: 65 78 29 3b 0d 0a 20 20 20 20 20 20 69 66 20 28  ex);..      if (
34e0: 6e 20 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77  n > 0) throw new
34f0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
3500: 28 6e 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72  (n, SQLiteLastEr
3510: 72 6f 72 28 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ror());..    }..
3520: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
3530: 76 65 72 72 69 64 65 20 69 6e 74 20 42 69 6e 64  verride int Bind
3540: 5f 50 61 72 61 6d 43 6f 75 6e 74 28 53 51 4c 69  _ParamCount(SQLi
3550: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
3560: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
3570: 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74  return UnsafeNat
3580: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
3590: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
35a0: 72 5f 63 6f 75 6e 74 28 73 74 6d 74 2e 5f 73 71  r_count(stmt._sq
35b0: 6c 69 74 65 5f 73 74 6d 74 29 3b 0d 0a 20 20 20  lite_stmt);..   
35c0: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
35d0: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
35e0: 6e 67 20 42 69 6e 64 5f 50 61 72 61 6d 4e 61 6d  ng Bind_ParamNam
35f0: 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  e(SQLiteStatemen
3600: 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64 65  t stmt, int inde
3610: 78 29 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 21  x)..    {..#if !
3620: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0d  SQLITE_STANDARD.
3630: 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0d  .      int len;.
3640: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54  .      return UT
3650: 46 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66  F8ToString(Unsaf
3660: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3670: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
3680: 6d 65 74 65 72 5f 6e 61 6d 65 5f 69 6e 74 65 72  meter_name_inter
3690: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
36a0: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74  stmt, index, out
36b0: 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0d 0a 23 65   len), len);..#e
36c0: 6c 73 65 0d 0a 20 20 20 20 20 20 72 65 74 75 72  lse..      retur
36d0: 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55  n UTF8ToString(U
36e0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
36f0: 64 73 2e 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ds.sqlite3_bind_
3700: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 73  parameter_name(s
3710: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
3720: 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0d 0a  , index), -1);..
3730: 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d  #endif..    }...
3740: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
3750: 65 72 72 69 64 65 20 69 6e 74 20 42 69 6e 64 5f  erride int Bind_
3760: 50 61 72 61 6d 49 6e 64 65 78 28 53 51 4c 69 74  ParamIndex(SQLit
3770: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
3780: 20 73 74 72 69 6e 67 20 70 61 72 61 6d 4e 61 6d   string paramNam
3790: 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  e)..    {..     
37a0: 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e 61   return UnsafeNa
37b0: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
37c0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
37d0: 65 72 5f 69 6e 64 65 78 28 73 74 6d 74 2e 5f 73  er_index(stmt._s
37e0: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 54 6f 55 54  qlite_stmt, ToUT
37f0: 46 38 28 70 61 72 61 6d 4e 61 6d 65 29 29 3b 0d  F8(paramName));.
3800: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
3810: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
3820: 69 6e 74 20 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  int ColumnCount(
3830: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
3840: 73 74 6d 74 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  stmt)..    {..  
3850: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
3860: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
3870: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
3880: 75 6e 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  unt(stmt._sqlite
3890: 5f 73 74 6d 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a  _stmt);..    }..
38a0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
38b0: 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 43  verride string C
38c0: 6f 6c 75 6d 6e 4e 61 6d 65 28 53 51 4c 69 74 65  olumnName(SQLite
38d0: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20  Statement stmt, 
38e0: 69 6e 74 20 69 6e 64 65 78 29 0d 0a 20 20 20 20  int index)..    
38f0: 7b 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53  {..#if !SQLITE_S
3900: 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20 20 69  TANDARD..      i
3910: 6e 74 20 6c 65 6e 3b 0d 0a 20 20 20 20 20 20 72  nt len;..      r
3920: 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69  eturn UTF8ToStri
3930: 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  ng(UnsafeNativeM
3940: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63  ethods.sqlite3_c
3950: 6f 6c 75 6d 6e 5f 6e 61 6d 65 5f 69 6e 74 65 72  olumn_name_inter
3960: 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  op(stmt._sqlite_
3970: 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75 74  stmt, index, out
3980: 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0d 0a 23 65   len), len);..#e
3990: 6c 73 65 0d 0a 20 20 20 20 20 20 72 65 74 75 72  lse..      retur
39a0: 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28 55  n UTF8ToString(U
39b0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
39c0: 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ds.sqlite3_colum
39d0: 6e 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f 73 71 6c  n_name(stmt._sql
39e0: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29  ite_stmt, index)
39f0: 2c 20 2d 31 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a  , -1);..#endif..
3a00: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74      }....    int
3a10: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 54  ernal override T
3a20: 79 70 65 41 66 66 69 6e 69 74 79 20 43 6f 6c 75  ypeAffinity Colu
3a30: 6d 6e 41 66 66 69 6e 69 74 79 28 53 51 4c 69 74  mnAffinity(SQLit
3a40: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
3a50: 20 69 6e 74 20 69 6e 64 65 78 29 0d 0a 20 20 20   int index)..   
3a60: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
3a70: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
3a80: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
3a90: 75 6d 6e 5f 74 79 70 65 28 73 74 6d 74 2e 5f 73  umn_type(stmt._s
3aa0: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
3ab0: 78 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  x);..    }....  
3ac0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
3ad0: 69 64 65 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d  ide string Colum
3ae0: 6e 54 79 70 65 28 53 51 4c 69 74 65 53 74 61 74  nType(SQLiteStat
3af0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
3b00: 69 6e 64 65 78 2c 20 6f 75 74 20 54 79 70 65 41  index, out TypeA
3b10: 66 66 69 6e 69 74 79 20 6e 41 66 66 69 6e 69 74  ffinity nAffinit
3b20: 79 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  y)..    {..     
3b30: 20 69 6e 74 20 6c 65 6e 3b 0d 0a 23 69 66 20 21   int len;..#if !
3b40: 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 0d  SQLITE_STANDARD.
3b50: 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 20  .      IntPtr p 
3b60: 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  = UnsafeNativeMe
3b70: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
3b80: 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 5f 69 6e  lumn_decltype_in
3b90: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
3ba0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
3bb0: 6f 75 74 20 6c 65 6e 29 3b 0d 0a 23 65 6c 73 65  out len);..#else
3bc0: 0d 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 2d 31  ..      len = -1
3bd0: 3b 0d 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20  ;..      IntPtr 
3be0: 70 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  p = UnsafeNative
3bf0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
3c00: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28  column_decltype(
3c10: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
3c20: 74 2c 20 69 6e 64 65 78 29 3b 0d 0a 23 65 6e 64  t, index);..#end
3c30: 69 66 0d 0a 20 20 20 20 20 20 6e 41 66 66 69 6e  if..      nAffin
3c40: 69 74 79 20 3d 20 43 6f 6c 75 6d 6e 41 66 66 69  ity = ColumnAffi
3c50: 6e 69 74 79 28 73 74 6d 74 2c 20 69 6e 64 65 78  nity(stmt, index
3c60: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28  );....      if (
3c70: 70 20 21 3d 20 49 6e 74 50 74 72 2e 5a 65 72 6f  p != IntPtr.Zero
3c80: 29 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53  ) return UTF8ToS
3c90: 74 72 69 6e 67 28 70 2c 20 6c 65 6e 29 3b 0d 0a  tring(p, len);..
3ca0: 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
3cb0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 74 72    {..        str
3cc0: 69 6e 67 5b 5d 20 61 72 20 3d 20 73 74 6d 74 2e  ing[] ar = stmt.
3cd0: 54 79 70 65 44 65 66 69 6e 69 74 69 6f 6e 73 3b  TypeDefinitions;
3ce0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 61 72  ..        if (ar
3cf0: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
3d00: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3d10: 69 66 20 28 69 6e 64 65 78 20 3c 20 61 72 2e 4c  if (index < ar.L
3d20: 65 6e 67 74 68 20 26 26 20 61 72 5b 69 6e 64 65  ength && ar[inde
3d30: 78 5d 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  x] != null)..   
3d40: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3d50: 61 72 5b 69 6e 64 65 78 5d 3b 0d 0a 20 20 20 20  ar[index];..    
3d60: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
3d70: 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 45 6d 70  eturn String.Emp
3d80: 74 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ty;....        /
3d90: 2f 73 77 69 74 63 68 20 28 6e 41 66 66 69 6e 69  /switch (nAffini
3da0: 74 79 29 0d 0a 20 20 20 20 20 20 20 20 2f 2f 7b  ty)..        //{
3db0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 63 61  ..        //  ca
3dc0: 73 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e  se TypeAffinity.
3dd0: 49 6e 74 36 34 3a 0d 0a 20 20 20 20 20 20 20 20  Int64:..        
3de0: 2f 2f 20 20 20 20 72 65 74 75 72 6e 20 22 42 49  //    return "BI
3df0: 47 49 4e 54 22 3b 0d 0a 20 20 20 20 20 20 20 20  GINT";..        
3e00: 2f 2f 20 20 63 61 73 65 20 54 79 70 65 41 66 66  //  case TypeAff
3e10: 69 6e 69 74 79 2e 44 6f 75 62 6c 65 3a 0d 0a 20  inity.Double:.. 
3e20: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 72 65 74         //    ret
3e30: 75 72 6e 20 22 44 4f 55 42 4c 45 22 3b 0d 0a 20  urn "DOUBLE";.. 
3e40: 20 20 20 20 20 20 20 2f 2f 20 20 63 61 73 65 20         //  case 
3e50: 54 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f  TypeAffinity.Blo
3e60: 62 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20  b:..        //  
3e70: 20 20 72 65 74 75 72 6e 20 22 42 4c 4f 42 22 3b    return "BLOB";
3e80: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 64 65  ..        //  de
3e90: 66 61 75 6c 74 3a 0d 0a 20 20 20 20 20 20 20 20  fault:..        
3ea0: 2f 2f 20 20 20 20 72 65 74 75 72 6e 20 22 54 45  //    return "TE
3eb0: 58 54 22 3b 0d 0a 20 20 20 20 20 20 20 20 2f 2f  XT";..        //
3ec0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
3ed0: 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
3ee0: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 43  l override int C
3ef0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 53 51 4c 69 74  olumnIndex(SQLit
3f00: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
3f10: 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 4e 61   string columnNa
3f20: 6d 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  me)..    {..    
3f30: 20 20 69 6e 74 20 78 20 3d 20 43 6f 6c 75 6d 6e    int x = Column
3f40: 43 6f 75 6e 74 28 73 74 6d 74 29 3b 0d 0a 0d 0a  Count(stmt);....
3f50: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e        for (int n
3f60: 20 3d 20 30 3b 20 6e 20 3c 20 78 3b 20 6e 2b 2b   = 0; n < x; n++
3f70: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
3f80: 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 43      if (String.C
3f90: 6f 6d 70 61 72 65 28 63 6f 6c 75 6d 6e 4e 61 6d  ompare(columnNam
3fa0: 65 2c 20 43 6f 6c 75 6d 6e 4e 61 6d 65 28 73 74  e, ColumnName(st
3fb0: 6d 74 2c 20 6e 29 2c 20 53 74 72 69 6e 67 43 6f  mt, n), StringCo
3fc0: 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c  mparison.Ordinal
3fd0: 49 67 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20 30  IgnoreCase) == 0
3fe0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  )..          ret
3ff0: 75 72 6e 20 6e 3b 0d 0a 20 20 20 20 20 20 7d 0d  urn n;..      }.
4000: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
4010: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
4020: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
4030: 65 20 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 4f  e string ColumnO
4040: 72 69 67 69 6e 61 6c 4e 61 6d 65 28 53 51 4c 69  riginalName(SQLi
4050: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
4060: 2c 20 69 6e 74 20 69 6e 64 65 78 29 0d 0a 20 20  , int index)..  
4070: 20 20 7b 0d 0a 23 69 66 20 21 53 51 4c 49 54 45    {..#if !SQLITE
4080: 5f 53 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20  _STANDARD..     
4090: 20 69 6e 74 20 6c 65 6e 3b 0d 0a 20 20 20 20 20   int len;..     
40a0: 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74   return UTF8ToSt
40b0: 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76  ring(UnsafeNativ
40c0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
40d0: 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
40e0: 61 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ame_interop(stmt
40f0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
4100: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20  ndex, out len), 
4110: 6c 65 6e 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  len);..#else..  
4120: 20 20 20 20 72 65 74 75 72 6e 20 55 54 46 38 54      return UTF8T
4130: 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61  oString(UnsafeNa
4140: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
4150: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
4160: 6e 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f 73 71 6c  n_name(stmt._sql
4170: 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29  ite_stmt, index)
4180: 2c 20 2d 31 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a  , -1);..#endif..
4190: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74      }....    int
41a0: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 73  ernal override s
41b0: 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 44 61 74 61  tring ColumnData
41c0: 62 61 73 65 4e 61 6d 65 28 53 51 4c 69 74 65 53  baseName(SQLiteS
41d0: 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69  tatement stmt, i
41e0: 6e 74 20 69 6e 64 65 78 29 0d 0a 20 20 20 20 7b  nt index)..    {
41f0: 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54  ..#if !SQLITE_ST
4200: 41 4e 44 41 52 44 0d 0a 20 20 20 20 20 20 69 6e  ANDARD..      in
4210: 74 20 6c 65 6e 3b 0d 0a 20 20 20 20 20 20 72 65  t len;..      re
4220: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
4230: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
4240: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
4250: 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
4260: 6d 65 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e  me_interop(stmt.
4270: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
4280: 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20 6c  dex, out len), l
4290: 65 6e 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20  en);..#else..   
42a0: 20 20 20 72 65 74 75 72 6e 20 55 54 46 38 54 6f     return UTF8To
42b0: 53 74 72 69 6e 67 28 55 6e 73 61 66 65 4e 61 74  String(UnsafeNat
42c0: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
42d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
42e0: 73 65 5f 6e 61 6d 65 28 73 74 6d 74 2e 5f 73 71  se_name(stmt._sq
42f0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
4300: 29 2c 20 2d 31 29 3b 0d 0a 23 65 6e 64 69 66 0d  ), -1);..#endif.
4310: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
4320: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
4330: 73 74 72 69 6e 67 20 43 6f 6c 75 6d 6e 54 61 62  string ColumnTab
4340: 6c 65 4e 61 6d 65 28 53 51 4c 69 74 65 53 74 61  leName(SQLiteSta
4350: 74 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74  tement stmt, int
4360: 20 69 6e 64 65 78 29 0d 0a 20 20 20 20 7b 0d 0a   index)..    {..
4370: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
4380: 44 41 52 44 0d 0a 20 20 20 20 20 20 69 6e 74 20  DARD..      int 
4390: 6c 65 6e 3b 0d 0a 20 20 20 20 20 20 72 65 74 75  len;..      retu
43a0: 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rn UTF8ToString(
43b0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
43c0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
43d0: 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 5f 69 6e  mn_table_name_in
43e0: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
43f0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
4400: 6f 75 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0d  out len), len);.
4410: 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 72 65  .#else..      re
4420: 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e  turn UTF8ToStrin
4430: 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  g(UnsafeNativeMe
4440: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f  thods.sqlite3_co
4450: 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28  lumn_table_name(
4460: 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d  stmt._sqlite_stm
4470: 74 2c 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0d  t, index), -1);.
4480: 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a  .#endif..    }..
4490: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
44a0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 43 6f 6c  verride void Col
44b0: 75 6d 6e 4d 65 74 61 44 61 74 61 28 73 74 72 69  umnMetaData(stri
44c0: 6e 67 20 64 61 74 61 42 61 73 65 2c 20 73 74 72  ng dataBase, str
44d0: 69 6e 67 20 74 61 62 6c 65 2c 20 73 74 72 69 6e  ing table, strin
44e0: 67 20 63 6f 6c 75 6d 6e 2c 20 6f 75 74 20 73 74  g column, out st
44f0: 72 69 6e 67 20 64 61 74 61 54 79 70 65 2c 20 6f  ring dataType, o
4500: 75 74 20 73 74 72 69 6e 67 20 63 6f 6c 6c 61 74  ut string collat
4510: 65 53 65 71 75 65 6e 63 65 2c 20 6f 75 74 20 62  eSequence, out b
4520: 6f 6f 6c 20 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74  ool notNull, out
4530: 20 62 6f 6f 6c 20 70 72 69 6d 61 72 79 4b 65 79   bool primaryKey
4540: 2c 20 6f 75 74 20 62 6f 6f 6c 20 61 75 74 6f 49  , out bool autoI
4550: 6e 63 72 65 6d 65 6e 74 29 0d 0a 20 20 20 20 7b  ncrement)..    {
4560: 0d 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20 64  ..      IntPtr d
4570: 61 74 61 54 79 70 65 50 74 72 3b 0d 0a 20 20 20  ataTypePtr;..   
4580: 20 20 20 49 6e 74 50 74 72 20 63 6f 6c 6c 53 65     IntPtr collSe
4590: 71 50 74 72 3b 0d 0a 20 20 20 20 20 20 69 6e 74  qPtr;..      int
45a0: 20 6e 6e 6f 74 4e 75 6c 6c 3b 0d 0a 20 20 20 20   nnotNull;..    
45b0: 20 20 69 6e 74 20 6e 70 72 69 6d 61 72 79 4b 65    int nprimaryKe
45c0: 79 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 61  y;..      int na
45d0: 75 74 6f 49 6e 63 3b 0d 0a 20 20 20 20 20 20 69  utoInc;..      i
45e0: 6e 74 20 6e 3b 0d 0a 20 20 20 20 20 20 69 6e 74  nt n;..      int
45f0: 20 64 74 4c 65 6e 3b 0d 0a 20 20 20 20 20 20 69   dtLen;..      i
4600: 6e 74 20 63 73 4c 65 6e 3b 0d 0a 0d 0a 23 69 66  nt csLen;....#if
4610: 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52   !SQLITE_STANDAR
4620: 44 0d 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73  D..      n = Uns
4630: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4640: 2e 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  .sqlite3_table_c
4650: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 5f 69  olumn_metadata_i
4660: 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54 6f 55  nterop(_sql, ToU
4670: 54 46 38 28 64 61 74 61 42 61 73 65 29 2c 20 54  TF8(dataBase), T
4680: 6f 55 54 46 38 28 74 61 62 6c 65 29 2c 20 54 6f  oUTF8(table), To
4690: 55 54 46 38 28 63 6f 6c 75 6d 6e 29 2c 20 6f 75  UTF8(column), ou
46a0: 74 20 64 61 74 61 54 79 70 65 50 74 72 2c 20 6f  t dataTypePtr, o
46b0: 75 74 20 63 6f 6c 6c 53 65 71 50 74 72 2c 20 6f  ut collSeqPtr, o
46c0: 75 74 20 6e 6e 6f 74 4e 75 6c 6c 2c 20 6f 75 74  ut nnotNull, out
46d0: 20 6e 70 72 69 6d 61 72 79 4b 65 79 2c 20 6f 75   nprimaryKey, ou
46e0: 74 20 6e 61 75 74 6f 49 6e 63 2c 20 6f 75 74 20  t nautoInc, out 
46f0: 64 74 4c 65 6e 2c 20 6f 75 74 20 63 73 4c 65 6e  dtLen, out csLen
4700: 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20  );..#else..     
4710: 20 64 74 4c 65 6e 20 3d 20 2d 31 3b 0d 0a 20 20   dtLen = -1;..  
4720: 20 20 20 20 63 73 4c 65 6e 20 3d 20 2d 31 3b 0d      csLen = -1;.
4730: 0a 0d 0a 20 20 20 20 20 20 6e 20 3d 20 55 6e 73  ...      n = Uns
4740: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
4750: 2e 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  .sqlite3_table_c
4760: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 5f  olumn_metadata(_
4770: 73 71 6c 2c 20 54 6f 55 54 46 38 28 64 61 74 61  sql, ToUTF8(data
4780: 42 61 73 65 29 2c 20 54 6f 55 54 46 38 28 74 61  Base), ToUTF8(ta
4790: 62 6c 65 29 2c 20 54 6f 55 54 46 38 28 63 6f 6c  ble), ToUTF8(col
47a0: 75 6d 6e 29 2c 20 6f 75 74 20 64 61 74 61 54 79  umn), out dataTy
47b0: 70 65 50 74 72 2c 20 6f 75 74 20 63 6f 6c 6c 53  pePtr, out collS
47c0: 65 71 50 74 72 2c 20 6f 75 74 20 6e 6e 6f 74 4e  eqPtr, out nnotN
47d0: 75 6c 6c 2c 20 6f 75 74 20 6e 70 72 69 6d 61 72  ull, out nprimar
47e0: 79 4b 65 79 2c 20 6f 75 74 20 6e 61 75 74 6f 49  yKey, out nautoI
47f0: 6e 63 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20  nc);..#endif..  
4800: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
4810: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
4820: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
4830: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0d  teLastError());.
4840: 0a 0d 0a 20 20 20 20 20 20 64 61 74 61 54 79 70  ...      dataTyp
4850: 65 20 3d 20 55 54 46 38 54 6f 53 74 72 69 6e 67  e = UTF8ToString
4860: 28 64 61 74 61 54 79 70 65 50 74 72 2c 20 64 74  (dataTypePtr, dt
4870: 4c 65 6e 29 3b 0d 0a 20 20 20 20 20 20 63 6f 6c  Len);..      col
4880: 6c 61 74 65 53 65 71 75 65 6e 63 65 20 3d 20 55  lateSequence = U
4890: 54 46 38 54 6f 53 74 72 69 6e 67 28 63 6f 6c 6c  TF8ToString(coll
48a0: 53 65 71 50 74 72 2c 20 63 73 4c 65 6e 29 3b 0d  SeqPtr, csLen);.
48b0: 0a 0d 0a 20 20 20 20 20 20 6e 6f 74 4e 75 6c 6c  ...      notNull
48c0: 20 3d 20 28 6e 6e 6f 74 4e 75 6c 6c 20 3d 3d 20   = (nnotNull == 
48d0: 31 29 3b 0d 0a 20 20 20 20 20 20 70 72 69 6d 61  1);..      prima
48e0: 72 79 4b 65 79 20 3d 20 28 6e 70 72 69 6d 61 72  ryKey = (nprimar
48f0: 79 4b 65 79 20 3d 3d 20 31 29 3b 0d 0a 20 20 20  yKey == 1);..   
4900: 20 20 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74     autoIncrement
4910: 20 3d 20 28 6e 61 75 74 6f 49 6e 63 20 3d 3d 20   = (nautoInc == 
4920: 31 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  1);..    }....  
4930: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
4940: 69 64 65 20 64 6f 75 62 6c 65 20 47 65 74 44 6f  ide double GetDo
4950: 75 62 6c 65 28 53 51 4c 69 74 65 53 74 61 74 65  uble(SQLiteState
4960: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
4970: 6e 64 65 78 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ndex)..    {..  
4980: 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
4990: 3b 0d 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d  ;..#if !PLATFORM
49a0: 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
49b0: 4b 0d 0a 20 20 20 20 20 20 76 61 6c 75 65 20 3d  K..      value =
49c0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
49d0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c  hods.sqlite3_col
49e0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 73 74 6d 74 2e  umn_double(stmt.
49f0: 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e  _sqlite_stmt, in
4a00: 64 65 78 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  dex);..#else..  
4a10: 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65      UnsafeNative
4a20: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
4a30: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 5f 69 6e  column_double_in
4a40: 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69  terop(stmt._sqli
4a50: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20  te_stmt, index, 
4a60: 6f 75 74 20 76 61 6c 75 65 29 3b 0d 0a 23 65 6e  out value);..#en
4a70: 64 69 66 0d 0a 20 20 20 20 20 20 72 65 74 75 72  dif..      retur
4a80: 6e 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 7d 0d  n value;..    }.
4a90: 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ...    internal 
4aa0: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47 65 74  override int Get
4ab0: 49 6e 74 33 32 28 53 51 4c 69 74 65 53 74 61 74  Int32(SQLiteStat
4ac0: 65 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20  ement stmt, int 
4ad0: 69 6e 64 65 78 29 0d 0a 20 20 20 20 7b 0d 0a 20  index)..    {.. 
4ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61       return Unsa
4af0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
4b00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
4b10: 6e 74 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65 5f  nt(stmt._sqlite_
4b20: 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0d 0a 20  stmt, index);.. 
4b30: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65     }....    inte
4b40: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c 6f  rnal override lo
4b50: 6e 67 20 47 65 74 49 6e 74 36 34 28 53 51 4c 69  ng GetInt64(SQLi
4b60: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74  teStatement stmt
4b70: 2c 20 69 6e 74 20 69 6e 64 65 78 29 0d 0a 20 20  , int index)..  
4b80: 20 20 7b 0d 0a 20 20 20 20 20 20 6c 6f 6e 67 20    {..      long 
4b90: 76 61 6c 75 65 3b 0d 0a 23 69 66 20 21 50 4c 41  value;..#if !PLA
4ba0: 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41  TFORM_COMPACTFRA
4bb0: 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 20 20 76 61  MEWORK..      va
4bc0: 6c 75 65 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  lue = UnsafeNati
4bd0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
4be0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 73  3_column_int64(s
4bf0: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
4c00: 2c 20 69 6e 64 65 78 29 3b 0d 0a 23 65 6c 73 65  , index);..#else
4c10: 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61  ..      UnsafeNa
4c20: 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69  tiveMethods.sqli
4c30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
4c40: 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74 2e 5f 73  _interop(stmt._s
4c50: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65  qlite_stmt, inde
4c60: 78 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b 0d 0a  x, out value);..
4c70: 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 72 65  #endif..      re
4c80: 74 75 72 6e 20 76 61 6c 75 65 3b 0d 0a 20 20 20  turn value;..   
4c90: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
4ca0: 61 6c 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  al override stri
4cb0: 6e 67 20 47 65 74 54 65 78 74 28 53 51 4c 69 74  ng GetText(SQLit
4cc0: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
4cd0: 20 69 6e 74 20 69 6e 64 65 78 29 0d 0a 20 20 20   int index)..   
4ce0: 20 7b 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   {..#if !SQLITE_
4cf0: 53 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20 20  STANDARD..      
4d00: 69 6e 74 20 6c 65 6e 3b 0d 0a 20 20 20 20 20 20  int len;..      
4d10: 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72  return UTF8ToStr
4d20: 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65  ing(UnsafeNative
4d30: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
4d40: 63 6f 6c 75 6d 6e 5f 74 65 78 74 5f 69 6e 74 65  column_text_inte
4d50: 72 6f 70 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  rop(stmt._sqlite
4d60: 5f 73 74 6d 74 2c 20 69 6e 64 65 78 2c 20 6f 75  _stmt, index, ou
4d70: 74 20 6c 65 6e 29 2c 20 6c 65 6e 29 3b 0d 0a 23  t len), len);..#
4d80: 65 6c 73 65 0d 0a 20 20 20 20 20 20 72 65 74 75  else..      retu
4d90: 72 6e 20 55 54 46 38 54 6f 53 74 72 69 6e 67 28  rn UTF8ToString(
4da0: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
4db0: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ods.sqlite3_colu
4dc0: 6d 6e 5f 74 65 78 74 28 73 74 6d 74 2e 5f 73 71  mn_text(stmt._sq
4dd0: 6c 69 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78  lite_stmt, index
4de0: 29 2c 20 2d 31 29 3b 0d 0a 23 65 6e 64 69 66 0d  ), -1);..#endif.
4df0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
4e00: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
4e10: 44 61 74 65 54 69 6d 65 20 47 65 74 44 61 74 65  DateTime GetDate
4e20: 54 69 6d 65 28 53 51 4c 69 74 65 53 74 61 74 65  Time(SQLiteState
4e30: 6d 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69  ment stmt, int i
4e40: 6e 64 65 78 29 0d 0a 20 20 20 20 7b 0d 0a 23 69  ndex)..    {..#i
4e50: 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  f !SQLITE_STANDA
4e60: 52 44 0d 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  RD..      int le
4e70: 6e 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n;..      return
4e80: 20 54 6f 44 61 74 65 54 69 6d 65 28 55 6e 73 61   ToDateTime(Unsa
4e90: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
4ea0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
4eb0: 65 78 74 5f 69 6e 74 65 72 6f 70 28 73 74 6d 74  ext_interop(stmt
4ec0: 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c 20 69  ._sqlite_stmt, i
4ed0: 6e 64 65 78 2c 20 6f 75 74 20 6c 65 6e 29 2c 20  ndex, out len), 
4ee0: 6c 65 6e 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  len);..#else..  
4ef0: 20 20 20 20 72 65 74 75 72 6e 20 54 6f 44 61 74      return ToDat
4f00: 65 54 69 6d 65 28 55 6e 73 61 66 65 4e 61 74 69  eTime(UnsafeNati
4f10: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
4f20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 73 74  3_column_text(st
4f30: 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74 2c  mt._sqlite_stmt,
4f40: 20 69 6e 64 65 78 29 2c 20 2d 31 29 3b 0d 0a 23   index), -1);..#
4f50: 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  endif..    }....
4f60: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
4f70: 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 42 79  rride long GetBy
4f80: 74 65 73 28 53 51 4c 69 74 65 53 74 61 74 65 6d  tes(SQLiteStatem
4f90: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e  ent stmt, int in
4fa0: 64 65 78 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66  dex, int nDataOf
4fb0: 66 73 65 74 2c 20 62 79 74 65 5b 5d 20 62 44 65  fset, byte[] bDe
4fc0: 73 74 2c 20 69 6e 74 20 6e 53 74 61 72 74 2c 20  st, int nStart, 
4fd0: 69 6e 74 20 6e 4c 65 6e 67 74 68 29 0d 0a 20 20  int nLength)..  
4fe0: 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e    {..      int n
4ff0: 6c 65 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69  len = UnsafeNati
5000: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
5010: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 73  3_column_bytes(s
5020: 74 6d 74 2e 5f 73 71 6c 69 74 65 5f 73 74 6d 74  tmt._sqlite_stmt
5030: 2c 20 69 6e 64 65 78 29 3b 0d 0a 0d 0a 20 20 20  , index);....   
5040: 20 20 20 2f 2f 20 49 66 20 6e 6f 20 64 65 73 74     // If no dest
5050: 69 6e 61 74 69 6f 6e 20 62 75 66 66 65 72 2c 20  ination buffer, 
5060: 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  return the size 
5070: 6e 65 65 64 65 64 2e 0d 0a 20 20 20 20 20 20 69  needed...      i
5080: 66 20 28 62 44 65 73 74 20 3d 3d 20 6e 75 6c 6c  f (bDest == null
5090: 29 20 72 65 74 75 72 6e 20 6e 6c 65 6e 3b 0d 0a  ) return nlen;..
50a0: 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  ..      int nCop
50b0: 69 65 64 20 3d 20 6e 4c 65 6e 67 74 68 3b 0d 0a  ied = nLength;..
50c0: 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 43 6f 70  ..      if (nCop
50d0: 69 65 64 20 2b 20 6e 53 74 61 72 74 20 3e 20 62  ied + nStart > b
50e0: 44 65 73 74 2e 4c 65 6e 67 74 68 29 20 6e 43 6f  Dest.Length) nCo
50f0: 70 69 65 64 20 3d 20 62 44 65 73 74 2e 4c 65 6e  pied = bDest.Len
5100: 67 74 68 20 2d 20 6e 53 74 61 72 74 3b 0d 0a 20  gth - nStart;.. 
5110: 20 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64       if (nCopied
5120: 20 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 20 3e   + nDataOffset >
5130: 20 6e 6c 65 6e 29 20 6e 43 6f 70 69 65 64 20 3d   nlen) nCopied =
5140: 20 6e 6c 65 6e 20 2d 20 6e 44 61 74 61 4f 66 66   nlen - nDataOff
5150: 73 65 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66  set;....      if
5160: 20 28 6e 43 6f 70 69 65 64 20 3e 20 30 29 0d 0a   (nCopied > 0)..
5170: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5180: 20 49 6e 74 50 74 72 20 70 74 72 20 3d 20 55 6e   IntPtr ptr = Un
5190: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
51a0: 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  s.sqlite3_column
51b0: 5f 62 6c 6f 62 28 73 74 6d 74 2e 5f 73 71 6c 69  _blob(stmt._sqli
51c0: 74 65 5f 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b  te_stmt, index);
51d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 4d 61 72 73  ....        Mars
51e0: 68 61 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74 72  hal.Copy((IntPtr
51f0: 29 28 70 74 72 2e 54 6f 49 6e 74 36 34 28 29 20  )(ptr.ToInt64() 
5200: 2b 20 6e 44 61 74 61 4f 66 66 73 65 74 29 2c 20  + nDataOffset), 
5210: 62 44 65 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e  bDest, nStart, n
5220: 43 6f 70 69 65 64 29 3b 0d 0a 20 20 20 20 20 20  Copied);..      
5230: 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a 20  }..      else.. 
5240: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5250: 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0d 0a 20 20  nCopied = 0;..  
5260: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
5270: 65 74 75 72 6e 20 6e 43 6f 70 69 65 64 3b 0d 0a  eturn nCopied;..
5280: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74      }....    int
5290: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c  ernal override l
52a0: 6f 6e 67 20 47 65 74 43 68 61 72 73 28 53 51 4c  ong GetChars(SQL
52b0: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
52c0: 74 2c 20 69 6e 74 20 69 6e 64 65 78 2c 20 69 6e  t, int index, in
52d0: 74 20 6e 44 61 74 61 4f 66 66 73 65 74 2c 20 63  t nDataOffset, c
52e0: 68 61 72 5b 5d 20 62 44 65 73 74 2c 20 69 6e 74  har[] bDest, int
52f0: 20 6e 53 74 61 72 74 2c 20 69 6e 74 20 6e 4c 65   nStart, int nLe
5300: 6e 67 74 68 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  ngth)..    {..  
5310: 20 20 20 20 69 6e 74 20 6e 6c 65 6e 3b 0d 0a 20      int nlen;.. 
5320: 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 69 65 64       int nCopied
5330: 20 3d 20 6e 4c 65 6e 67 74 68 3b 0d 0a 0d 0a 20   = nLength;.... 
5340: 20 20 20 20 20 73 74 72 69 6e 67 20 73 74 72 20       string str 
5350: 3d 20 47 65 74 54 65 78 74 28 73 74 6d 74 2c 20  = GetText(stmt, 
5360: 69 6e 64 65 78 29 3b 0d 0a 20 20 20 20 20 20 6e  index);..      n
5370: 6c 65 6e 20 3d 20 73 74 72 2e 4c 65 6e 67 74 68  len = str.Length
5380: 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 62  ;....      if (b
5390: 44 65 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 72 65  Dest == null) re
53a0: 74 75 72 6e 20 6e 6c 65 6e 3b 0d 0a 0d 0a 20 20  turn nlen;....  
53b0: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
53c0: 2b 20 6e 53 74 61 72 74 20 3e 20 62 44 65 73 74  + nStart > bDest
53d0: 2e 4c 65 6e 67 74 68 29 20 6e 43 6f 70 69 65 64  .Length) nCopied
53e0: 20 3d 20 62 44 65 73 74 2e 4c 65 6e 67 74 68 20   = bDest.Length 
53f0: 2d 20 6e 53 74 61 72 74 3b 0d 0a 20 20 20 20 20  - nStart;..     
5400: 20 69 66 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e   if (nCopied + n
5410: 44 61 74 61 4f 66 66 73 65 74 20 3e 20 6e 6c 65  DataOffset > nle
5420: 6e 29 20 6e 43 6f 70 69 65 64 20 3d 20 6e 6c 65  n) nCopied = nle
5430: 6e 20 2d 20 6e 44 61 74 61 4f 66 66 73 65 74 3b  n - nDataOffset;
5440: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 43  ....      if (nC
5450: 6f 70 69 65 64 20 3e 20 30 29 0d 0a 20 20 20 20  opied > 0)..    
5460: 20 20 20 20 73 74 72 2e 43 6f 70 79 54 6f 28 6e      str.CopyTo(n
5470: 44 61 74 61 4f 66 66 73 65 74 2c 20 62 44 65 73  DataOffset, bDes
5480: 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f 70 69  t, nStart, nCopi
5490: 65 64 29 3b 0d 0a 20 20 20 20 20 20 65 6c 73 65  ed);..      else
54a0: 20 6e 43 6f 70 69 65 64 20 3d 20 30 3b 0d 0a 0d   nCopied = 0;...
54b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 43  .      return nC
54c0: 6f 70 69 65 64 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  opied;..    }...
54d0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
54e0: 65 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 4e 75  erride bool IsNu
54f0: 6c 6c 28 53 51 4c 69 74 65 53 74 61 74 65 6d 65  ll(SQLiteStateme
5500: 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 69 6e 64  nt stmt, int ind
5510: 65 78 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  ex)..    {..    
5520: 20 20 72 65 74 75 72 6e 20 28 43 6f 6c 75 6d 6e    return (Column
5530: 41 66 66 69 6e 69 74 79 28 73 74 6d 74 2c 20 69  Affinity(stmt, i
5540: 6e 64 65 78 29 20 3d 3d 20 54 79 70 65 41 66 66  ndex) == TypeAff
5550: 69 6e 69 74 79 2e 4e 75 6c 6c 29 3b 0d 0a 20 20  inity.Null);..  
5560: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
5570: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74  nal override int
5580: 20 41 67 67 72 65 67 61 74 65 43 6f 75 6e 74 28   AggregateCount(
5590: 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 29 0d  IntPtr context).
55a0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
55b0: 74 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76  turn UnsafeNativ
55c0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
55d0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74  _aggregate_count
55e0: 28 63 6f 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20  (context);..    
55f0: 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
5600: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
5610: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 28 73  CreateFunction(s
5620: 74 72 69 6e 67 20 73 74 72 46 75 6e 63 74 69 6f  tring strFunctio
5630: 6e 2c 20 69 6e 74 20 6e 41 72 67 73 2c 20 62 6f  n, int nArgs, bo
5640: 6f 6c 20 6e 65 65 64 43 6f 6c 6c 53 65 71 2c 20  ol needCollSeq, 
5650: 53 51 4c 69 74 65 43 61 6c 6c 62 61 63 6b 20 66  SQLiteCallback f
5660: 75 6e 63 2c 20 53 51 4c 69 74 65 43 61 6c 6c 62  unc, SQLiteCallb
5670: 61 63 6b 20 66 75 6e 63 73 74 65 70 2c 20 53 51  ack funcstep, SQ
5680: 4c 69 74 65 46 69 6e 61 6c 43 61 6c 6c 62 61 63  LiteFinalCallbac
5690: 6b 20 66 75 6e 63 66 69 6e 61 6c 29 0d 0a 20 20  k funcfinal)..  
56a0: 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e    {..      int n
56b0: 3b 0d 0a 0d 0a 23 69 66 20 21 53 51 4c 49 54 45  ;....#if !SQLITE
56c0: 5f 53 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20  _STANDARD..     
56d0: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
56e0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
56f0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
5700: 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c 2c 20 54  _interop(_sql, T
5710: 6f 55 54 46 38 28 73 74 72 46 75 6e 63 74 69 6f  oUTF8(strFunctio
5720: 6e 29 2c 20 6e 41 72 67 73 2c 20 34 2c 20 49 6e  n), nArgs, 4, In
5730: 74 50 74 72 2e 5a 65 72 6f 2c 20 66 75 6e 63 2c  tPtr.Zero, func,
5740: 20 66 75 6e 63 73 74 65 70 2c 20 66 75 6e 63 66   funcstep, funcf
5750: 69 6e 61 6c 2c 20 28 6e 65 65 64 43 6f 6c 6c 53  inal, (needCollS
5760: 65 71 20 3d 3d 20 74 72 75 65 29 20 3f 20 31 20  eq == true) ? 1 
5770: 3a 20 30 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  : 0);..      if 
5780: 28 6e 20 3d 3d 20 30 29 20 6e 20 3d 20 55 6e 73  (n == 0) n = Uns
5790: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
57a0: 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  .sqlite3_create_
57b0: 66 75 6e 63 74 69 6f 6e 5f 69 6e 74 65 72 6f 70  function_interop
57c0: 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28 73 74  (_sql, ToUTF8(st
57d0: 72 46 75 6e 63 74 69 6f 6e 29 2c 20 6e 41 72 67  rFunction), nArg
57e0: 73 2c 20 31 2c 20 49 6e 74 50 74 72 2e 5a 65 72  s, 1, IntPtr.Zer
57f0: 6f 2c 20 66 75 6e 63 2c 20 66 75 6e 63 73 74 65  o, func, funcste
5800: 70 2c 20 66 75 6e 63 66 69 6e 61 6c 2c 20 28 6e  p, funcfinal, (n
5810: 65 65 64 43 6f 6c 6c 53 65 71 20 3d 3d 20 74 72  eedCollSeq == tr
5820: 75 65 29 20 3f 20 31 20 3a 20 30 29 3b 0d 0a 23  ue) ? 1 : 0);..#
5830: 65 6c 73 65 0d 0a 20 20 20 20 20 20 6e 20 3d 20  else..      n = 
5840: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
5850: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65 61  ods.sqlite3_crea
5860: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 5f 73 71 6c  te_function(_sql
5870: 2c 20 54 6f 55 54 46 38 28 73 74 72 46 75 6e 63  , ToUTF8(strFunc
5880: 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 34 2c  tion), nArgs, 4,
5890: 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66 75   IntPtr.Zero, fu
58a0: 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66 75  nc, funcstep, fu
58b0: 6e 63 66 69 6e 61 6c 29 3b 0d 0a 20 20 20 20 20  ncfinal);..     
58c0: 20 69 66 20 28 6e 20 3d 3d 20 30 29 20 6e 20 3d   if (n == 0) n =
58d0: 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74   UnsafeNativeMet
58e0: 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 72 65  hods.sqlite3_cre
58f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 5f 73 71  ate_function(_sq
5900: 6c 2c 20 54 6f 55 54 46 38 28 73 74 72 46 75 6e  l, ToUTF8(strFun
5910: 63 74 69 6f 6e 29 2c 20 6e 41 72 67 73 2c 20 31  ction), nArgs, 1
5920: 2c 20 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66  , IntPtr.Zero, f
5930: 75 6e 63 2c 20 66 75 6e 63 73 74 65 70 2c 20 66  unc, funcstep, f
5940: 75 6e 63 66 69 6e 61 6c 29 3b 0d 0a 23 65 6e 64  uncfinal);..#end
5950: 69 66 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 20  if..      if (n 
5960: 3e 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53  > 0) throw new S
5970: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e  QLiteException(n
5980: 2c 20 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f  , SQLiteLastErro
5990: 72 28 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  r());..    }....
59a0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65      internal ove
59b0: 72 72 69 64 65 20 76 6f 69 64 20 43 72 65 61 74  rride void Creat
59c0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 73 74 72 69 6e  eCollation(strin
59d0: 67 20 73 74 72 43 6f 6c 6c 61 74 69 6f 6e 2c 20  g strCollation, 
59e0: 53 51 4c 69 74 65 43 6f 6c 6c 61 74 69 6f 6e 20  SQLiteCollation 
59f0: 66 75 6e 63 2c 20 53 51 4c 69 74 65 43 6f 6c 6c  func, SQLiteColl
5a00: 61 74 69 6f 6e 20 66 75 6e 63 31 36 29 0d 0a 20  ation func16).. 
5a10: 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20     {..      int 
5a20: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
5a30: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
5a40: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
5a50: 28 5f 73 71 6c 2c 20 54 6f 55 54 46 38 28 73 74  (_sql, ToUTF8(st
5a60: 72 43 6f 6c 6c 61 74 69 6f 6e 29 2c 20 32 2c 20  rCollation), 2, 
5a70: 49 6e 74 50 74 72 2e 5a 65 72 6f 2c 20 66 75 6e  IntPtr.Zero, fun
5a80: 63 31 36 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  c16);..      if 
5a90: 28 6e 20 3d 3d 20 30 29 20 6e 20 3d 20 55 6e 73  (n == 0) n = Uns
5aa0: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
5ab0: 2e 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  .sqlite3_create_
5ac0: 63 6f 6c 6c 61 74 69 6f 6e 28 5f 73 71 6c 2c 20  collation(_sql, 
5ad0: 54 6f 55 54 46 38 28 73 74 72 43 6f 6c 6c 61 74  ToUTF8(strCollat
5ae0: 69 6f 6e 29 2c 20 31 2c 20 49 6e 74 50 74 72 2e  ion), 1, IntPtr.
5af0: 5a 65 72 6f 2c 20 66 75 6e 63 29 3b 0d 0a 20 20  Zero, func);..  
5b00: 20 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74      if (n > 0) t
5b10: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
5b20: 78 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69  xception(n, SQLi
5b30: 74 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0d  teLastError());.
5b40: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e  .    }....    in
5b50: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
5b60: 69 6e 74 20 43 6f 6e 74 65 78 74 43 6f 6c 6c 61  int ContextColla
5b70: 74 65 43 6f 6d 70 61 72 65 28 43 6f 6c 6c 61 74  teCompare(Collat
5b80: 69 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 20  ionEncodingEnum 
5b90: 65 6e 63 2c 20 49 6e 74 50 74 72 20 63 6f 6e 74  enc, IntPtr cont
5ba0: 65 78 74 2c 20 73 74 72 69 6e 67 20 73 31 2c 20  ext, string s1, 
5bb0: 73 74 72 69 6e 67 20 73 32 29 0d 0a 20 20 20 20  string s2)..    
5bc0: 7b 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53  {..#if !SQLITE_S
5bd0: 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20 20 62  TANDARD..      b
5be0: 79 74 65 5b 5d 20 62 31 3b 0d 0a 20 20 20 20 20  yte[] b1;..     
5bf0: 20 62 79 74 65 5b 5d 20 62 32 3b 0d 0a 20 20 20   byte[] b2;..   
5c00: 20 20 20 53 79 73 74 65 6d 2e 54 65 78 74 2e 45     System.Text.E
5c10: 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 74 65  ncoding converte
5c20: 72 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  r = null;....   
5c30: 20 20 20 73 77 69 74 63 68 20 28 65 6e 63 29 0d     switch (enc).
5c40: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
5c50: 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e    case Collation
5c60: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46  EncodingEnum.UTF
5c70: 38 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f  8:..          co
5c80: 6e 76 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d  nverter = System
5c90: 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55  .Text.Encoding.U
5ca0: 54 46 38 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  TF8;..          
5cb0: 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20  break;..        
5cc0: 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e  case CollationEn
5cd0: 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46 31 36  codingEnum.UTF16
5ce0: 4c 45 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  LE:..          c
5cf0: 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73 74 65  onverter = Syste
5d00: 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e  m.Text.Encoding.
5d10: 55 6e 69 63 6f 64 65 3b 0d 0a 20 20 20 20 20 20  Unicode;..      
5d20: 20 20 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20      break;..    
5d30: 20 20 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69      case Collati
5d40: 6f 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55  onEncodingEnum.U
5d50: 54 46 31 36 42 45 3a 0d 0a 20 20 20 20 20 20 20  TF16BE:..       
5d60: 20 20 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53     converter = S
5d70: 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64  ystem.Text.Encod
5d80: 69 6e 67 2e 42 69 67 45 6e 64 69 61 6e 55 6e 69  ing.BigEndianUni
5d90: 63 6f 64 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  code;..         
5da0: 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d   break;..      }
5db0: 0d 0a 0d 0a 20 20 20 20 20 20 62 31 20 3d 20 63  ....      b1 = c
5dc0: 6f 6e 76 65 72 74 65 72 2e 47 65 74 42 79 74 65  onverter.GetByte
5dd0: 73 28 73 31 29 3b 0d 0a 20 20 20 20 20 20 62 32  s(s1);..      b2
5de0: 20 3d 20 63 6f 6e 76 65 72 74 65 72 2e 47 65 74   = converter.Get
5df0: 42 79 74 65 73 28 73 32 29 3b 0d 0a 0d 0a 20 20  Bytes(s2);....  
5e00: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
5e10: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
5e20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 63  qlite3_context_c
5e30: 6f 6c 6c 63 6f 6d 70 61 72 65 28 63 6f 6e 74 65  ollcompare(conte
5e40: 78 74 2c 20 62 31 2c 20 62 31 2e 4c 65 6e 67 74  xt, b1, b1.Lengt
5e50: 68 2c 20 62 32 2c 20 62 32 2e 4c 65 6e 67 74 68  h, b2, b2.Length
5e60: 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20  );..#else..     
5e70: 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74 49 6d   throw new NotIm
5e80: 70 6c 65 6d 65 6e 74 65 64 45 78 63 65 70 74 69  plementedExcepti
5e90: 6f 6e 28 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20  on();..#endif.. 
5ea0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65     }....    inte
5eb0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e  rnal override in
5ec0: 74 20 43 6f 6e 74 65 78 74 43 6f 6c 6c 61 74 65  t ContextCollate
5ed0: 43 6f 6d 70 61 72 65 28 43 6f 6c 6c 61 74 69 6f  Compare(Collatio
5ee0: 6e 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 20 65 6e  nEncodingEnum en
5ef0: 63 2c 20 49 6e 74 50 74 72 20 63 6f 6e 74 65 78  c, IntPtr contex
5f00: 74 2c 20 63 68 61 72 5b 5d 20 63 31 2c 20 63 68  t, char[] c1, ch
5f10: 61 72 5b 5d 20 63 32 29 0d 0a 20 20 20 20 7b 0d  ar[] c2)..    {.
5f20: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41  .#if !SQLITE_STA
5f30: 4e 44 41 52 44 0d 0a 20 20 20 20 20 20 62 79 74  NDARD..      byt
5f40: 65 5b 5d 20 62 31 3b 0d 0a 20 20 20 20 20 20 62  e[] b1;..      b
5f50: 79 74 65 5b 5d 20 62 32 3b 0d 0a 20 20 20 20 20  yte[] b2;..     
5f60: 20 53 79 73 74 65 6d 2e 54 65 78 74 2e 45 6e 63   System.Text.Enc
5f70: 6f 64 69 6e 67 20 63 6f 6e 76 65 72 74 65 72 20  oding converter 
5f80: 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  = null;....     
5f90: 20 73 77 69 74 63 68 20 28 65 6e 63 29 0d 0a 20   switch (enc).. 
5fa0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5fb0: 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e  case CollationEn
5fc0: 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46 38 3a  codingEnum.UTF8:
5fd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 76  ..          conv
5fe0: 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e 54  erter = System.T
5ff0: 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55 54 46  ext.Encoding.UTF
6000: 38 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72  8;..          br
6010: 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 63 61  eak;..        ca
6020: 73 65 20 43 6f 6c 6c 61 74 69 6f 6e 45 6e 63 6f  se CollationEnco
6030: 64 69 6e 67 45 6e 75 6d 2e 55 54 46 31 36 4c 45  dingEnum.UTF16LE
6040: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  :..          con
6050: 76 65 72 74 65 72 20 3d 20 53 79 73 74 65 6d 2e  verter = System.
6060: 54 65 78 74 2e 45 6e 63 6f 64 69 6e 67 2e 55 6e  Text.Encoding.Un
6070: 69 63 6f 64 65 3b 0d 0a 20 20 20 20 20 20 20 20  icode;..        
6080: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20    break;..      
6090: 20 20 63 61 73 65 20 43 6f 6c 6c 61 74 69 6f 6e    case Collation
60a0: 45 6e 63 6f 64 69 6e 67 45 6e 75 6d 2e 55 54 46  EncodingEnum.UTF
60b0: 31 36 42 45 3a 0d 0a 20 20 20 20 20 20 20 20 20  16BE:..         
60c0: 20 63 6f 6e 76 65 72 74 65 72 20 3d 20 53 79 73   converter = Sys
60d0: 74 65 6d 2e 54 65 78 74 2e 45 6e 63 6f 64 69 6e  tem.Text.Encodin
60e0: 67 2e 42 69 67 45 6e 64 69 61 6e 55 6e 69 63 6f  g.BigEndianUnico
60f0: 64 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 62  de;..          b
6100: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  reak;..      }..
6110: 0d 0a 20 20 20 20 20 20 62 31 20 3d 20 63 6f 6e  ..      b1 = con
6120: 76 65 72 74 65 72 2e 47 65 74 42 79 74 65 73 28  verter.GetBytes(
6130: 63 31 29 3b 0d 0a 20 20 20 20 20 20 62 32 20 3d  c1);..      b2 =
6140: 20 63 6f 6e 76 65 72 74 65 72 2e 47 65 74 42 79   converter.GetBy
6150: 74 65 73 28 63 32 29 3b 0d 0a 0d 0a 20 20 20 20  tes(c2);....    
6160: 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e    return UnsafeN
6170: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
6180: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 63 6f 6c  ite3_context_col
6190: 6c 63 6f 6d 70 61 72 65 28 63 6f 6e 74 65 78 74  lcompare(context
61a0: 2c 20 62 31 2c 20 62 31 2e 4c 65 6e 67 74 68 2c  , b1, b1.Length,
61b0: 20 62 32 2c 20 62 32 2e 4c 65 6e 67 74 68 29 3b   b2, b2.Length);
61c0: 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 74  ..#else..      t
61d0: 68 72 6f 77 20 6e 65 77 20 4e 6f 74 49 6d 70 6c  hrow new NotImpl
61e0: 65 6d 65 6e 74 65 64 45 78 63 65 70 74 69 6f 6e  ementedException
61f0: 28 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20  ();..#endif..   
6200: 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e   }....    intern
6210: 61 6c 20 6f 76 65 72 72 69 64 65 20 43 6f 6c 6c  al override Coll
6220: 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 47 65  ationSequence Ge
6230: 74 43 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e  tCollationSequen
6240: 63 65 28 53 51 4c 69 74 65 46 75 6e 63 74 69 6f  ce(SQLiteFunctio
6250: 6e 20 66 75 6e 63 2c 20 49 6e 74 50 74 72 20 63  n func, IntPtr c
6260: 6f 6e 74 65 78 74 29 0d 0a 20 20 20 20 7b 0d 0a  ontext)..    {..
6270: 23 69 66 20 21 53 51 4c 49 54 45 5f 53 54 41 4e  #if !SQLITE_STAN
6280: 44 41 52 44 0d 0a 20 20 20 20 20 20 43 6f 6c 6c  DARD..      Coll
6290: 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 20 73 65  ationSequence se
62a0: 71 20 3d 20 6e 65 77 20 43 6f 6c 6c 61 74 69 6f  q = new Collatio
62b0: 6e 53 65 71 75 65 6e 63 65 28 29 3b 0d 0a 20 20  nSequence();..  
62c0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0d 0a 20 20      int len;..  
62d0: 20 20 20 20 69 6e 74 20 74 79 70 65 3b 0d 0a 20      int type;.. 
62e0: 20 20 20 20 20 69 6e 74 20 65 6e 63 3b 0d 0a 20       int enc;.. 
62f0: 20 20 20 20 20 49 6e 74 50 74 72 20 70 20 3d 20       IntPtr p = 
6300: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
6310: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ods.sqlite3_cont
6320: 65 78 74 5f 63 6f 6c 6c 73 65 71 28 63 6f 6e 74  ext_collseq(cont
6330: 65 78 74 2c 20 6f 75 74 20 74 79 70 65 2c 20 6f  ext, out type, o
6340: 75 74 20 65 6e 63 2c 20 6f 75 74 20 6c 65 6e 29  ut enc, out len)
6350: 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 28 70  ;....      if (p
6360: 20 21 3d 20 6e 75 6c 6c 29 20 73 65 71 2e 4e 61   != null) seq.Na
6370: 6d 65 20 3d 20 55 54 46 38 54 6f 53 74 72 69 6e  me = UTF8ToStrin
6380: 67 28 70 2c 20 6c 65 6e 29 3b 0d 0a 20 20 20 20  g(p, len);..    
6390: 20 20 73 65 71 2e 54 79 70 65 20 3d 20 28 43 6f    seq.Type = (Co
63a0: 6c 6c 61 74 69 6f 6e 54 79 70 65 45 6e 75 6d 29  llationTypeEnum)
63b0: 74 79 70 65 3b 0d 0a 20 20 20 20 20 20 73 65 71  type;..      seq
63c0: 2e 5f 66 75 6e 63 20 3d 20 66 75 6e 63 3b 0d 0a  ._func = func;..
63d0: 20 20 20 20 20 20 73 65 71 2e 45 6e 63 6f 64 69        seq.Encodi
63e0: 6e 67 20 3d 20 28 43 6f 6c 6c 61 74 69 6f 6e 45  ng = (CollationE
63f0: 6e 63 6f 64 69 6e 67 45 6e 75 6d 29 65 6e 63 3b  ncodingEnum)enc;
6400: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
6410: 20 73 65 71 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20   seq;..#else..  
6420: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f      throw new No
6430: 74 49 6d 70 6c 65 6d 65 6e 74 65 64 45 78 63 65  tImplementedExce
6440: 70 74 69 6f 6e 28 29 3b 0d 0a 23 65 6e 64 69 66  ption();..#endif
6450: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
6460: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
6470: 20 6c 6f 6e 67 20 47 65 74 50 61 72 61 6d 56 61   long GetParamVa
6480: 6c 75 65 42 79 74 65 73 28 49 6e 74 50 74 72 20  lueBytes(IntPtr 
6490: 70 2c 20 69 6e 74 20 6e 44 61 74 61 4f 66 66 73  p, int nDataOffs
64a0: 65 74 2c 20 62 79 74 65 5b 5d 20 62 44 65 73 74  et, byte[] bDest
64b0: 2c 20 69 6e 74 20 6e 53 74 61 72 74 2c 20 69 6e  , int nStart, in
64c0: 74 20 6e 4c 65 6e 67 74 68 29 0d 0a 20 20 20 20  t nLength)..    
64d0: 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 6e 6c 65  {..      int nle
64e0: 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  n = UnsafeNative
64f0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6500: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 29 3b 0d  value_bytes(p);.
6510: 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 49 66 20 6e  ...      // If n
6520: 6f 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 62 75  o destination bu
6530: 66 66 65 72 2c 20 72 65 74 75 72 6e 20 74 68 65  ffer, return the
6540: 20 73 69 7a 65 20 6e 65 65 64 65 64 2e 0d 0a 20   size needed... 
6550: 20 20 20 20 20 69 66 20 28 62 44 65 73 74 20 3d       if (bDest =
6560: 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 6e  = null) return n
6570: 6c 65 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 6e  len;....      in
6580: 74 20 6e 43 6f 70 69 65 64 20 3d 20 6e 4c 65 6e  t nCopied = nLen
6590: 67 74 68 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66  gth;....      if
65a0: 20 28 6e 43 6f 70 69 65 64 20 2b 20 6e 53 74 61   (nCopied + nSta
65b0: 72 74 20 3e 20 62 44 65 73 74 2e 4c 65 6e 67 74  rt > bDest.Lengt
65c0: 68 29 20 6e 43 6f 70 69 65 64 20 3d 20 62 44 65  h) nCopied = bDe
65d0: 73 74 2e 4c 65 6e 67 74 68 20 2d 20 6e 53 74 61  st.Length - nSta
65e0: 72 74 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 6e  rt;..      if (n
65f0: 43 6f 70 69 65 64 20 2b 20 6e 44 61 74 61 4f 66  Copied + nDataOf
6600: 66 73 65 74 20 3e 20 6e 6c 65 6e 29 20 6e 43 6f  fset > nlen) nCo
6610: 70 69 65 64 20 3d 20 6e 6c 65 6e 20 2d 20 6e 44  pied = nlen - nD
6620: 61 74 61 4f 66 66 73 65 74 3b 0d 0a 0d 0a 20 20  ataOffset;....  
6630: 20 20 20 20 69 66 20 28 6e 43 6f 70 69 65 64 20      if (nCopied 
6640: 3e 20 30 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  > 0)..      {.. 
6650: 20 20 20 20 20 20 20 49 6e 74 50 74 72 20 70 74         IntPtr pt
6660: 72 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65  r = UnsafeNative
6670: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6680: 76 61 6c 75 65 5f 62 6c 6f 62 28 70 29 3b 0d 0a  value_blob(p);..
6690: 0d 0a 20 20 20 20 20 20 20 20 4d 61 72 73 68 61  ..        Marsha
66a0: 6c 2e 43 6f 70 79 28 28 49 6e 74 50 74 72 29 28  l.Copy((IntPtr)(
66b0: 70 74 72 2e 54 6f 49 6e 74 36 34 28 29 20 2b 20  ptr.ToInt64() + 
66c0: 6e 44 61 74 61 4f 66 66 73 65 74 29 2c 20 62 44  nDataOffset), bD
66d0: 65 73 74 2c 20 6e 53 74 61 72 74 2c 20 6e 43 6f  est, nStart, nCo
66e0: 70 69 65 64 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  pied);..      }.
66f0: 0a 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20  .      else..   
6700: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 6e 43     {..        nC
6710: 6f 70 69 65 64 20 3d 20 30 3b 0d 0a 20 20 20 20  opied = 0;..    
6720: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
6730: 75 72 6e 20 6e 43 6f 70 69 65 64 3b 0d 0a 20 20  urn nCopied;..  
6740: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
6750: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 64 6f 75  nal override dou
6760: 62 6c 65 20 47 65 74 50 61 72 61 6d 56 61 6c 75  ble GetParamValu
6770: 65 44 6f 75 62 6c 65 28 49 6e 74 50 74 72 20 70  eDouble(IntPtr p
6780: 74 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  tr)..    {..    
6790: 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0d    double value;.
67a0: 0a 23 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43  .#if !PLATFORM_C
67b0: 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d  OMPACTFRAMEWORK.
67c0: 0a 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 55  .      value = U
67d0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
67e0: 64 73 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ds.sqlite3_value
67f0: 5f 64 6f 75 62 6c 65 28 70 74 72 29 3b 0d 0a 23  _double(ptr);..#
6800: 65 6c 73 65 0d 0a 20 20 20 20 20 20 55 6e 73 61  else..      Unsa
6810: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e  feNativeMethods.
6820: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f  sqlite3_value_do
6830: 75 62 6c 65 5f 69 6e 74 65 72 6f 70 28 70 74 72  uble_interop(ptr
6840: 2c 20 6f 75 74 20 76 61 6c 75 65 29 3b 0d 0a 23  , out value);..#
6850: 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 72 65 74  endif..      ret
6860: 75 72 6e 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20  urn value;..    
6870: 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
6880: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 47  l override int G
6890: 65 74 50 61 72 61 6d 56 61 6c 75 65 49 6e 74 33  etParamValueInt3
68a0: 32 28 49 6e 74 50 74 72 20 70 74 72 29 0d 0a 20  2(IntPtr ptr).. 
68b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75     {..      retu
68c0: 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  rn UnsafeNativeM
68d0: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 76  ethods.sqlite3_v
68e0: 61 6c 75 65 5f 69 6e 74 28 70 74 72 29 3b 0d 0a  alue_int(ptr);..
68f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74      }....    int
6900: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 6c  ernal override l
6910: 6f 6e 67 20 47 65 74 50 61 72 61 6d 56 61 6c 75  ong GetParamValu
6920: 65 49 6e 74 36 34 28 49 6e 74 50 74 72 20 70 74  eInt64(IntPtr pt
6930: 72 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  r)..    {..     
6940: 20 49 6e 74 36 34 20 76 61 6c 75 65 3b 0d 0a 23   Int64 value;..#
6950: 69 66 20 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d  if !PLATFORM_COM
6960: 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20  PACTFRAMEWORK.. 
6970: 20 20 20 20 20 76 61 6c 75 65 20 3d 20 55 6e 73       value = Uns
6980: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
6990: 2e 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  .sqlite3_value_i
69a0: 6e 74 36 34 28 70 74 72 29 3b 0d 0a 23 65 6c 73  nt64(ptr);..#els
69b0: 65 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  e..      UnsafeN
69c0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
69d0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
69e0: 5f 69 6e 74 65 72 6f 70 28 70 74 72 2c 20 6f 75  _interop(ptr, ou
69f0: 74 20 76 61 6c 75 65 29 3b 0d 0a 23 65 6e 64 69  t value);..#endi
6a00: 66 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  f..      return 
6a10: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  value;..    }...
6a20: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
6a30: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 47 65  erride string Ge
6a40: 74 50 61 72 61 6d 56 61 6c 75 65 54 65 78 74 28  tParamValueText(
6a50: 49 6e 74 50 74 72 20 70 74 72 29 0d 0a 20 20 20  IntPtr ptr)..   
6a60: 20 7b 0d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   {..#if !SQLITE_
6a70: 53 54 41 4e 44 41 52 44 0d 0a 20 20 20 20 20 20  STANDARD..      
6a80: 69 6e 74 20 6c 65 6e 3b 0d 0a 20 20 20 20 20 20  int len;..      
6a90: 72 65 74 75 72 6e 20 55 54 46 38 54 6f 53 74 72  return UTF8ToStr
6aa0: 69 6e 67 28 55 6e 73 61 66 65 4e 61 74 69 76 65  ing(UnsafeNative
6ab0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6ac0: 76 61 6c 75 65 5f 74 65 78 74 5f 69 6e 74 65 72  value_text_inter
6ad0: 6f 70 28 70 74 72 2c 20 6f 75 74 20 6c 65 6e 29  op(ptr, out len)
6ae0: 2c 20 6c 65 6e 29 3b 0d 0a 23 65 6c 73 65 0d 0a  , len);..#else..
6af0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 54 46        return UTF
6b00: 38 54 6f 53 74 72 69 6e 67 28 55 6e 73 61 66 65  8ToString(Unsafe
6b10: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
6b20: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6b30: 28 70 74 72 29 2c 20 2d 31 29 3b 0d 0a 23 65 6e  (ptr), -1);..#en
6b40: 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  dif..    }....  
6b50: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
6b60: 69 64 65 20 54 79 70 65 41 66 66 69 6e 69 74 79  ide TypeAffinity
6b70: 20 47 65 74 50 61 72 61 6d 56 61 6c 75 65 54 79   GetParamValueTy
6b80: 70 65 28 49 6e 74 50 74 72 20 70 74 72 29 0d 0a  pe(IntPtr ptr)..
6b90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
6ba0: 75 72 6e 20 55 6e 73 61 66 65 4e 61 74 69 76 65  urn UnsafeNative
6bb0: 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f  Methods.sqlite3_
6bc0: 76 61 6c 75 65 5f 74 79 70 65 28 70 74 72 29 3b  value_type(ptr);
6bd0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69  ..    }....    i
6be0: 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65  nternal override
6bf0: 20 76 6f 69 64 20 52 65 74 75 72 6e 42 6c 6f 62   void ReturnBlob
6c00: 28 49 6e 74 50 74 72 20 63 6f 6e 74 65 78 74 2c  (IntPtr context,
6c10: 20 62 79 74 65 5b 5d 20 76 61 6c 75 65 29 0d 0a   byte[] value)..
6c20: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 55 6e 73      {..      Uns
6c30: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
6c40: 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f  .sqlite3_result_
6c50: 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 76 61  blob(context, va
6c60: 6c 75 65 2c 20 76 61 6c 75 65 2e 4c 65 6e 67 74  lue, value.Lengt
6c70: 68 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29  h, (IntPtr)(-1))
6c80: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
6c90: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
6ca0: 65 20 76 6f 69 64 20 52 65 74 75 72 6e 44 6f 75  e void ReturnDou
6cb0: 62 6c 65 28 49 6e 74 50 74 72 20 63 6f 6e 74 65  ble(IntPtr conte
6cc0: 78 74 2c 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  xt, double value
6cd0: 29 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 21 50  )..    {..#if !P
6ce0: 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
6cf0: 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20 20 20  RAMEWORK..      
6d00: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
6d10: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75  ods.sqlite3_resu
6d20: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
6d30: 74 2c 20 76 61 6c 75 65 29 3b 0d 0a 23 65 6c 73  t, value);..#els
6d40: 65 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  e..      UnsafeN
6d50: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
6d60: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
6d70: 6c 65 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65  le_interop(conte
6d80: 78 74 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0d  xt, ref value);.
6d90: 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a  .#endif..    }..
6da0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
6db0: 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65 74  verride void Ret
6dc0: 75 72 6e 45 72 72 6f 72 28 49 6e 74 50 74 72 20  urnError(IntPtr 
6dd0: 63 6f 6e 74 65 78 74 2c 20 73 74 72 69 6e 67 20  context, string 
6de0: 76 61 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a 20  value)..    {.. 
6df0: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
6e00: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
6e10: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6e20: 6e 74 65 78 74 2c 20 54 6f 55 54 46 38 28 76 61  ntext, ToUTF8(va
6e30: 6c 75 65 29 2c 20 76 61 6c 75 65 2e 4c 65 6e 67  lue), value.Leng
6e40: 74 68 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  th);..    }.... 
6e50: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
6e60: 72 69 64 65 20 76 6f 69 64 20 52 65 74 75 72 6e  ride void Return
6e70: 49 6e 74 33 32 28 49 6e 74 50 74 72 20 63 6f 6e  Int32(IntPtr con
6e80: 74 65 78 74 2c 20 69 6e 74 20 76 61 6c 75 65 29  text, int value)
6e90: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 55  ..    {..      U
6ea0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
6eb0: 64 73 2e 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  ds.sqlite3_resul
6ec0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 76  t_int(context, v
6ed0: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  alue);..    }...
6ee0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
6ef0: 65 72 72 69 64 65 20 76 6f 69 64 20 52 65 74 75  erride void Retu
6f00: 72 6e 49 6e 74 36 34 28 49 6e 74 50 74 72 20 63  rnInt64(IntPtr c
6f10: 6f 6e 74 65 78 74 2c 20 6c 6f 6e 67 20 76 61 6c  ontext, long val
6f20: 75 65 29 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20  ue)..    {..#if 
6f30: 21 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43  !PLATFORM_COMPAC
6f40: 54 46 52 41 4d 45 57 4f 52 4b 0d 0a 20 20 20 20  TFRAMEWORK..    
6f50: 20 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65    UnsafeNativeMe
6f60: 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 72 65  thods.sqlite3_re
6f70: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
6f80: 78 74 2c 20 76 61 6c 75 65 29 3b 0d 0a 23 65 6c  xt, value);..#el
6f90: 73 65 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65  se..      Unsafe
6fa0: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71  NativeMethods.sq
6fb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6fc0: 36 34 5f 69 6e 74 65 72 6f 70 28 63 6f 6e 74 65  64_interop(conte
6fd0: 78 74 2c 20 72 65 66 20 76 61 6c 75 65 29 3b 0d  xt, ref value);.
6fe0: 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a  .#endif..    }..
6ff0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
7000: 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65 74  verride void Ret
7010: 75 72 6e 4e 75 6c 6c 28 49 6e 74 50 74 72 20 63  urnNull(IntPtr c
7020: 6f 6e 74 65 78 74 29 0d 0a 20 20 20 20 7b 0d 0a  ontext)..    {..
7030: 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69        UnsafeNati
7040: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
7050: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
7060: 6e 74 65 78 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ntext);..    }..
7070: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
7080: 76 65 72 72 69 64 65 20 76 6f 69 64 20 52 65 74  verride void Ret
7090: 75 72 6e 54 65 78 74 28 49 6e 74 50 74 72 20 63  urnText(IntPtr c
70a0: 6f 6e 74 65 78 74 2c 20 73 74 72 69 6e 67 20 76  ontext, string v
70b0: 61 6c 75 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  alue)..    {..  
70c0: 20 20 20 20 62 79 74 65 5b 5d 20 62 20 3d 20 54      byte[] b = T
70d0: 6f 55 54 46 38 28 76 61 6c 75 65 29 3b 0d 0a 20  oUTF8(value);.. 
70e0: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
70f0: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
7100: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
7110: 74 65 78 74 2c 20 54 6f 55 54 46 38 28 76 61 6c  text, ToUTF8(val
7120: 75 65 29 2c 20 62 2e 4c 65 6e 67 74 68 20 2d 20  ue), b.Length - 
7130: 31 2c 20 28 49 6e 74 50 74 72 29 28 2d 31 29 29  1, (IntPtr)(-1))
7140: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
7150: 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64  internal overrid
7160: 65 20 49 6e 74 50 74 72 20 41 67 67 72 65 67 61  e IntPtr Aggrega
7170: 74 65 43 6f 6e 74 65 78 74 28 49 6e 74 50 74 72  teContext(IntPtr
7180: 20 63 6f 6e 74 65 78 74 29 0d 0a 20 20 20 20 7b   context)..    {
7190: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55  ..      return U
71a0: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
71b0: 64 73 2e 73 71 6c 69 74 65 33 5f 61 67 67 72 65  ds.sqlite3_aggre
71c0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
71d0: 74 65 78 74 2c 20 31 29 3b 0d 0a 20 20 20 20 7d  text, 1);..    }
71e0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 45 6e 61 62  ....    /// Enab
71f0: 6c 65 73 20 6f 72 20 64 69 73 61 62 6c 65 64 20  les or disabled 
7200: 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
7210: 63 6f 64 65 73 20 72 65 74 75 72 6e 65 64 20 62  codes returned b
7220: 79 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 69 6e  y SQLite..    in
7230: 74 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20  ternal override 
7240: 76 6f 69 64 20 53 65 74 45 78 74 65 6e 64 65 64  void SetExtended
7250: 52 65 73 75 6c 74 43 6f 64 65 73 28 62 6f 6f 6c  ResultCodes(bool
7260: 20 62 4f 6e 4f 66 66 29 0d 0a 20 20 20 20 7b 0d   bOnOff)..    {.
7270: 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74  .      UnsafeNat
7280: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
7290: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
72a0: 6c 74 5f 63 6f 64 65 73 28 5f 73 71 6c 2c 20 28  lt_codes(_sql, (
72b0: 62 4f 6e 4f 66 66 20 3f 20 2d 31 20 3a 20 30 29  bOnOff ? -1 : 0)
72c0: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 2f  );..    }..    /
72d0: 2f 2f 20 47 65 74 73 20 74 68 65 20 6c 61 73 74  // Gets the last
72e0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
72f0: 64 65 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  de..    internal
7300: 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 52 65   override int Re
7310: 73 75 6c 74 43 6f 64 65 28 29 0d 0a 20 20 20 20  sultCode()..    
7320: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
7330: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
7340: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 65 72 72 63  ods.sqlite3_errc
7350: 6f 64 65 28 5f 73 71 6c 29 3b 0d 0a 20 20 20 20  ode(_sql);..    
7360: 7d 0d 0a 20 20 20 20 2f 2f 2f 20 47 65 74 73 20  }..    /// Gets 
7370: 74 68 65 20 6c 61 73 74 20 53 51 4c 69 74 65 20  the last SQLite 
7380: 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
7390: 6f 64 65 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  ode..    interna
73a0: 6c 20 6f 76 65 72 72 69 64 65 20 69 6e 74 20 45  l override int E
73b0: 78 74 65 6e 64 65 64 52 65 73 75 6c 74 43 6f 64  xtendedResultCod
73c0: 65 28 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  e()..    {..    
73d0: 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66 65 4e    return UnsafeN
73e0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
73f0: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
7400: 72 63 6f 64 65 28 5f 73 71 6c 29 3b 0d 0a 20 20  rcode(_sql);..  
7410: 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20 41    }....    /// A
7420: 64 64 20 61 20 6c 6f 67 20 6d 65 73 73 61 67 65  dd a log message
7430: 20 76 69 61 20 74 68 65 20 53 51 4c 69 74 65 20   via the SQLite 
7440: 73 71 6c 69 74 65 33 5f 6c 6f 67 20 69 6e 74 65  sqlite3_log inte
7450: 72 66 61 63 65 2e 0d 0a 20 20 20 20 69 6e 74 65  rface...    inte
7460: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f  rnal override vo
7470: 69 64 20 4c 6f 67 4d 65 73 73 61 67 65 28 69 6e  id LogMessage(in
7480: 74 20 69 45 72 72 43 6f 64 65 2c 20 73 74 72 69  t iErrCode, stri
7490: 6e 67 20 7a 4d 65 73 73 61 67 65 29 0d 0a 20 20  ng zMessage)..  
74a0: 20 20 7b 0d 0a 20 20 20 20 20 20 55 6e 73 61 66    {..      Unsaf
74b0: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
74c0: 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 43  qlite3_log(iErrC
74d0: 6f 64 65 2c 20 54 6f 55 54 46 38 28 7a 4d 65 73  ode, ToUTF8(zMes
74e0: 73 61 67 65 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a  sage));..    }..
74f0: 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
7500: 76 65 72 72 69 64 65 20 76 6f 69 64 20 53 65 74  verride void Set
7510: 50 61 73 73 77 6f 72 64 28 62 79 74 65 5b 5d 20  Password(byte[] 
7520: 70 61 73 73 77 6f 72 64 42 79 74 65 73 29 0d 0a  passwordBytes)..
7530: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74      {..      int
7540: 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76   n = UnsafeNativ
7550: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
7560: 5f 6b 65 79 28 5f 73 71 6c 2c 20 70 61 73 73 77  _key(_sql, passw
7570: 6f 72 64 42 79 74 65 73 2c 20 70 61 73 73 77 6f  ordBytes, passwo
7580: 72 64 42 79 74 65 73 2e 4c 65 6e 67 74 68 29 3b  rdBytes.Length);
7590: 0d 0a 20 20 20 20 20 20 69 66 20 28 6e 20 3e 20  ..      if (n > 
75a0: 30 29 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c  0) throw new SQL
75b0: 69 74 65 45 78 63 65 70 74 69 6f 6e 28 6e 2c 20  iteException(n, 
75c0: 53 51 4c 69 74 65 4c 61 73 74 45 72 72 6f 72 28  SQLiteLastError(
75d0: 29 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ));..    }....  
75e0: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
75f0: 69 64 65 20 76 6f 69 64 20 43 68 61 6e 67 65 50  ide void ChangeP
7600: 61 73 73 77 6f 72 64 28 62 79 74 65 5b 5d 20 6e  assword(byte[] n
7610: 65 77 50 61 73 73 77 6f 72 64 42 79 74 65 73 29  ewPasswordBytes)
7620: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 69  ..    {..      i
7630: 6e 74 20 6e 20 3d 20 55 6e 73 61 66 65 4e 61 74  nt n = UnsafeNat
7640: 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74  iveMethods.sqlit
7650: 65 33 5f 72 65 6b 65 79 28 5f 73 71 6c 2c 20 6e  e3_rekey(_sql, n
7660: 65 77 50 61 73 73 77 6f 72 64 42 79 74 65 73 2c  ewPasswordBytes,
7670: 20 28 6e 65 77 50 61 73 73 77 6f 72 64 42 79 74   (newPasswordByt
7680: 65 73 20 3d 3d 20 6e 75 6c 6c 29 20 3f 20 30 20  es == null) ? 0 
7690: 3a 20 6e 65 77 50 61 73 73 77 6f 72 64 42 79 74  : newPasswordByt
76a0: 65 73 2e 4c 65 6e 67 74 68 29 3b 0d 0a 20 20 20  es.Length);..   
76b0: 20 20 20 69 66 20 28 6e 20 3e 20 30 29 20 74 68     if (n > 0) th
76c0: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
76d0: 63 65 70 74 69 6f 6e 28 6e 2c 20 53 51 4c 69 74  ception(n, SQLit
76e0: 65 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0d 0a  eLastError());..
76f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74      }....    int
7700: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76  ernal override v
7710: 6f 69 64 20 53 65 74 55 70 64 61 74 65 48 6f 6f  oid SetUpdateHoo
7720: 6b 28 53 51 4c 69 74 65 55 70 64 61 74 65 43 61  k(SQLiteUpdateCa
7730: 6c 6c 62 61 63 6b 20 66 75 6e 63 29 0d 0a 20 20  llback func)..  
7740: 20 20 7b 0d 0a 20 20 20 20 20 20 55 6e 73 61 66    {..      Unsaf
7750: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
7760: 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
7770: 6f 6b 28 5f 73 71 6c 2c 20 66 75 6e 63 2c 20 49  ok(_sql, func, I
7780: 6e 74 50 74 72 2e 5a 65 72 6f 29 3b 0d 0a 20 20  ntPtr.Zero);..  
7790: 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72    }....    inter
77a0: 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69  nal override voi
77b0: 64 20 53 65 74 43 6f 6d 6d 69 74 48 6f 6f 6b 28  d SetCommitHook(
77c0: 53 51 4c 69 74 65 43 6f 6d 6d 69 74 43 61 6c 6c  SQLiteCommitCall
77d0: 62 61 63 6b 20 66 75 6e 63 29 0d 0a 20 20 20 20  back func)..    
77e0: 7b 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  {..      UnsafeN
77f0: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
7800: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
7810: 28 5f 73 71 6c 2c 20 66 75 6e 63 2c 20 49 6e 74  (_sql, func, Int
7820: 50 74 72 2e 5a 65 72 6f 29 3b 0d 0a 20 20 20 20  Ptr.Zero);..    
7830: 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  }....    interna
7840: 6c 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  l override void 
7850: 53 65 74 54 72 61 63 65 43 61 6c 6c 62 61 63 6b  SetTraceCallback
7860: 28 53 51 4c 69 74 65 54 72 61 63 65 43 61 6c 6c  (SQLiteTraceCall
7870: 62 61 63 6b 20 66 75 6e 63 29 0d 0a 20 20 20 20  back func)..    
7880: 7b 0d 0a 20 20 20 20 20 20 55 6e 73 61 66 65 4e  {..      UnsafeN
7890: 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c  ativeMethods.sql
78a0: 69 74 65 33 5f 74 72 61 63 65 28 5f 73 71 6c 2c  ite3_trace(_sql,
78b0: 20 66 75 6e 63 2c 20 49 6e 74 50 74 72 2e 5a 65   func, IntPtr.Ze
78c0: 72 6f 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ro);..    }.... 
78d0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
78e0: 72 69 64 65 20 76 6f 69 64 20 53 65 74 52 6f 6c  ride void SetRol
78f0: 6c 62 61 63 6b 48 6f 6f 6b 28 53 51 4c 69 74 65  lbackHook(SQLite
7900: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
7910: 20 66 75 6e 63 29 0d 0a 20 20 20 20 7b 0d 0a 20   func)..    {.. 
7920: 20 20 20 20 20 55 6e 73 61 66 65 4e 61 74 69 76       UnsafeNativ
7930: 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33  eMethods.sqlite3
7940: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 5f  _rollback_hook(_
7950: 73 71 6c 2c 20 66 75 6e 63 2c 20 49 6e 74 50 74  sql, func, IntPt
7960: 72 2e 5a 65 72 6f 29 3b 0d 0a 20 20 20 20 7d 0d  r.Zero);..    }.
7970: 0a 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ...    /// <summ
7980: 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 41 6c  ary>..    /// Al
7990: 6c 6f 77 73 20 74 68 65 20 73 65 74 74 69 6e 67  lows the setting
79a0: 20 6f 66 20 61 20 6c 6f 67 67 69 6e 67 20 63 61   of a logging ca
79b0: 6c 6c 62 61 63 6b 20 69 6e 76 6f 6b 65 64 20 62  llback invoked b
79c0: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 61 0d  y SQLite when a.
79d0: 0a 20 20 20 20 2f 2f 2f 20 6c 6f 67 20 65 76 65  .    /// log eve
79e0: 6e 74 20 6f 63 63 75 72 73 2e 20 20 4f 6e 6c 79  nt occurs.  Only
79f0: 20 6f 6e 65 20 63 61 6c 6c 62 61 63 6b 20 6d 61   one callback ma
7a00: 79 20 62 65 20 73 65 74 2e 20 20 49 66 20 4e 55  y be set.  If NU
7a10: 4c 4c 20 69 73 20 70 61 73 73 65 64 2c 0d 0a 20  LL is passed,.. 
7a20: 20 20 20 2f 2f 2f 20 74 68 65 20 6c 6f 67 67 69     /// the loggi
7a30: 6e 67 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75  ng callback is u
7a40: 6e 72 65 67 69 73 74 65 72 65 64 2e 0d 0a 20 20  nregistered...  
7a50: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
7a60: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
7a70: 20 6e 61 6d 65 3d 22 66 75 6e 63 22 3e 54 68 65   name="func">The
7a80: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
7a90: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 2e 3c 2f 70  on to invoke.</p
7aa0: 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  aram>..    /// <
7ab0: 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e 73 20  returns>Returns 
7ac0: 61 20 72 65 73 75 6c 74 20 63 6f 64 65 3c 2f 72  a result code</r
7ad0: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 69 6e 74  eturns>..    int
7ae0: 65 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69  ernal override i
7af0: 6e 74 20 53 65 74 4c 6f 67 43 61 6c 6c 62 61 63  nt SetLogCallbac
7b00: 6b 28 53 51 4c 69 74 65 4c 6f 67 43 61 6c 6c 62  k(SQLiteLogCallb
7b10: 61 63 6b 20 66 75 6e 63 29 0d 0a 20 20 20 20 7b  ack func)..    {
7b20: 0d 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ..        int rc
7b30: 20 3d 20 55 6e 73 61 66 65 4e 61 74 69 76 65 4d   = UnsafeNativeM
7b40: 65 74 68 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63  ethods.sqlite3_c
7b50: 6f 6e 66 69 67 28 28 69 6e 74 29 53 51 4c 69 74  onfig((int)SQLit
7b60: 65 43 6f 6e 66 69 67 4f 70 73 45 6e 75 6d 2e 53  eConfigOpsEnum.S
7b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47  QLITE_CONFIG_LOG
7b80: 2c 20 66 75 6e 63 2c 20 28 49 6e 74 50 74 72 29  , func, (IntPtr)
7b90: 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  0);..        ret
7ba0: 75 72 6e 20 72 63 3b 0d 0a 20 20 20 20 7d 0d 0a  urn rc;..    }..
7bb0: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
7bc0: 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 48 65 6c  ry>..    /// Hel
7bd0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  per function to 
7be0: 72 65 74 72 69 65 76 65 20 61 20 63 6f 6c 75 6d  retrieve a colum
7bf0: 6e 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 20 61  n of data from a
7c00: 6e 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  n active stateme
7c10: 6e 74 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  nt...    /// </s
7c20: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
7c30: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 73 74   <param name="st
7c40: 6d 74 22 3e 54 68 65 20 73 74 61 74 65 6d 65 6e  mt">The statemen
7c50: 74 20 62 65 69 6e 67 20 73 74 65 70 28 29 27 64  t being step()'d
7c60: 20 74 68 72 6f 75 67 68 3c 2f 70 61 72 61 6d 3e   through</param>
7c70: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
7c80: 20 6e 61 6d 65 3d 22 69 6e 64 65 78 22 3e 54 68   name="index">Th
7c90: 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 74  e column index t
7ca0: 6f 20 72 65 74 72 69 65 76 65 3c 2f 70 61 72 61  o retrieve</para
7cb0: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
7cc0: 61 6d 20 6e 61 6d 65 3d 22 74 79 70 22 3e 54 68  am name="typ">Th
7cd0: 65 20 74 79 70 65 20 6f 66 20 64 61 74 61 20 63  e type of data c
7ce0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
7cf0: 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 55 6e 69 6e  column.  If Unin
7d00: 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 69 73 20  itialized, this 
7d10: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
7d20: 74 72 69 65 76 65 20 74 68 65 20 64 61 74 61 74  trieve the datat
7d30: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ype information.
7d40: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
7d50: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72  / <returns>Retur
7d60: 6e 73 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  ns the data in t
7d70: 68 65 20 63 6f 6c 75 6d 6e 3c 2f 72 65 74 75 72  he column</retur
7d80: 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  ns>..    interna
7d90: 6c 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63  l override objec
7da0: 74 20 47 65 74 56 61 6c 75 65 28 53 51 4c 69 74  t GetValue(SQLit
7db0: 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 74 2c  eStatement stmt,
7dc0: 20 69 6e 74 20 69 6e 64 65 78 2c 20 53 51 4c 69   int index, SQLi
7dd0: 74 65 54 79 70 65 20 74 79 70 29 0d 0a 20 20 20  teType typ)..   
7de0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 28 49 73   {..      if (Is
7df0: 4e 75 6c 6c 28 73 74 6d 74 2c 20 69 6e 64 65 78  Null(stmt, index
7e00: 29 29 20 72 65 74 75 72 6e 20 44 42 4e 75 6c 6c  )) return DBNull
7e10: 2e 56 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 54  .Value;..      T
7e20: 79 70 65 41 66 66 69 6e 69 74 79 20 61 66 66 20  ypeAffinity aff 
7e30: 3d 20 74 79 70 2e 41 66 66 69 6e 69 74 79 3b 0d  = typ.Affinity;.
7e40: 0a 20 20 20 20 20 20 54 79 70 65 20 74 20 3d 20  .      Type t = 
7e50: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 69  null;....      i
7e60: 66 20 28 74 79 70 2e 54 79 70 65 20 21 3d 20 44  f (typ.Type != D
7e70: 62 54 79 70 65 2e 4f 62 6a 65 63 74 29 0d 0a 20  bType.Object).. 
7e80: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7e90: 74 20 3d 20 53 51 4c 69 74 65 43 6f 6e 76 65 72  t = SQLiteConver
7ea0: 74 2e 53 51 4c 69 74 65 54 79 70 65 54 6f 54 79  t.SQLiteTypeToTy
7eb0: 70 65 28 74 79 70 29 3b 0d 0a 20 20 20 20 20 20  pe(typ);..      
7ec0: 20 20 61 66 66 20 3d 20 54 79 70 65 54 6f 41 66    aff = TypeToAf
7ed0: 66 69 6e 69 74 79 28 74 29 3b 0d 0a 20 20 20 20  finity(t);..    
7ee0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 77 69    }....      swi
7ef0: 74 63 68 20 28 61 66 66 29 0d 0a 20 20 20 20 20  tch (aff)..     
7f00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65   {..        case
7f10: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c   TypeAffinity.Bl
7f20: 6f 62 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ob:..          i
7f30: 66 20 28 74 79 70 2e 54 79 70 65 20 3d 3d 20 44  f (typ.Type == D
7f40: 62 54 79 70 65 2e 47 75 69 64 20 26 26 20 74 79  bType.Guid && ty
7f50: 70 2e 41 66 66 69 6e 69 74 79 20 3d 3d 20 54 79  p.Affinity == Ty
7f60: 70 65 41 66 66 69 6e 69 74 79 2e 54 65 78 74 29  peAffinity.Text)
7f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
7f80: 74 75 72 6e 20 6e 65 77 20 47 75 69 64 28 47 65  turn new Guid(Ge
7f90: 74 54 65 78 74 28 73 74 6d 74 2c 20 69 6e 64 65  tText(stmt, inde
7fa0: 78 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  x));....        
7fb0: 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 47    int n = (int)G
7fc0: 65 74 42 79 74 65 73 28 73 74 6d 74 2c 20 69 6e  etBytes(stmt, in
7fd0: 64 65 78 2c 20 30 2c 20 6e 75 6c 6c 2c 20 30 2c  dex, 0, null, 0,
7fe0: 20 30 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20   0);..          
7ff0: 62 79 74 65 5b 5d 20 62 20 3d 20 6e 65 77 20 62  byte[] b = new b
8000: 79 74 65 5b 6e 5d 3b 0d 0a 20 20 20 20 20 20 20  yte[n];..       
8010: 20 20 20 47 65 74 42 79 74 65 73 28 73 74 6d 74     GetBytes(stmt
8020: 2c 20 69 6e 64 65 78 2c 20 30 2c 20 62 2c 20 30  , index, 0, b, 0
8030: 2c 20 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  , n);....       
8040: 20 20 20 69 66 20 28 74 79 70 2e 54 79 70 65 20     if (typ.Type 
8050: 3d 3d 20 44 62 54 79 70 65 2e 47 75 69 64 20 26  == DbType.Guid &
8060: 26 20 6e 20 3d 3d 20 31 36 29 0d 0a 20 20 20 20  & n == 16)..    
8070: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
8080: 65 77 20 47 75 69 64 28 62 29 3b 0d 0a 0d 0a 20  ew Guid(b);.... 
8090: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
80a0: 62 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73 65  b;..        case
80b0: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 44 61   TypeAffinity.Da
80c0: 74 65 54 69 6d 65 3a 0d 0a 20 20 20 20 20 20 20  teTime:..       
80d0: 20 20 20 72 65 74 75 72 6e 20 47 65 74 44 61 74     return GetDat
80e0: 65 54 69 6d 65 28 73 74 6d 74 2c 20 69 6e 64 65  eTime(stmt, inde
80f0: 78 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 61 73  x);..        cas
8100: 65 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 44  e TypeAffinity.D
8110: 6f 75 62 6c 65 3a 0d 0a 20 20 20 20 20 20 20 20  ouble:..        
8120: 20 20 69 66 20 28 74 20 3d 3d 20 6e 75 6c 6c 29    if (t == null)
8130: 20 72 65 74 75 72 6e 20 47 65 74 44 6f 75 62 6c   return GetDoubl
8140: 65 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 3b 0d  e(stmt, index);.
8150: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d  .          else.
8160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
8170: 75 72 6e 20 43 6f 6e 76 65 72 74 2e 43 68 61 6e  urn Convert.Chan
8180: 67 65 54 79 70 65 28 47 65 74 44 6f 75 62 6c 65  geType(GetDouble
8190: 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c 20 74  (stmt, index), t
81a0: 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20 20 20  , null);..      
81b0: 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e    case TypeAffin
81c0: 69 74 79 2e 49 6e 74 36 34 3a 0d 0a 20 20 20 20  ity.Int64:..    
81d0: 20 20 20 20 20 20 69 66 20 28 74 20 3d 3d 20 6e        if (t == n
81e0: 75 6c 6c 29 20 72 65 74 75 72 6e 20 47 65 74 49  ull) return GetI
81f0: 6e 74 36 34 28 73 74 6d 74 2c 20 69 6e 64 65 78  nt64(stmt, index
8200: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c  );..          el
8210: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
8220: 72 65 74 75 72 6e 20 43 6f 6e 76 65 72 74 2e 43  return Convert.C
8230: 68 61 6e 67 65 54 79 70 65 28 47 65 74 49 6e 74  hangeType(GetInt
8240: 36 34 28 73 74 6d 74 2c 20 69 6e 64 65 78 29 2c  64(stmt, index),
8250: 20 74 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20   t, null);..    
8260: 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20      default:..  
8270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 47          return G
8280: 65 74 54 65 78 74 28 73 74 6d 74 2c 20 69 6e 64  etText(stmt, ind
8290: 65 78 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ex);..      }.. 
82a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 69 6e 74 65     }....    inte
82b0: 72 6e 61 6c 20 6f 76 65 72 72 69 64 65 20 69 6e  rnal override in
82c0: 74 20 47 65 74 43 75 72 73 6f 72 46 6f 72 54 61  t GetCursorForTa
82d0: 62 6c 65 28 53 51 4c 69 74 65 53 74 61 74 65 6d  ble(SQLiteStatem
82e0: 65 6e 74 20 73 74 6d 74 2c 20 69 6e 74 20 64 62  ent stmt, int db
82f0: 2c 20 69 6e 74 20 72 6f 6f 74 50 61 67 65 29 0d  , int rootPage).
8300: 0a 20 20 20 20 7b 0d 0a 23 69 66 20 21 53 51 4c  .    {..#if !SQL
8310: 49 54 45 5f 53 54 41 4e 44 41 52 44 0d 0a 20 20  ITE_STANDARD..  
8320: 20 20 20 20 72 65 74 75 72 6e 20 55 6e 73 61 66      return Unsaf
8330: 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 2e 73  eNativeMethods.s
8340: 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 75 72  qlite3_table_cur
8350: 73 6f 72 28 73 74 6d 74 2e 5f 73 71 6c 69 74 65  sor(stmt._sqlite
8360: 5f 73 74 6d 74 2c 20 64 62 2c 20 72 6f 6f 74 50  _stmt, db, rootP
8370: 61 67 65 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20  age);..#else..  
8380: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0d 0a      return -1;..
8390: 23 65 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d  #endif..    }...
83a0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76  .    internal ov
83b0: 65 72 72 69 64 65 20 6c 6f 6e 67 20 47 65 74 52  erride long GetR
83c0: 6f 77 49 64 46 6f 72 43 75 72 73 6f 72 28 53 51  owIdForCursor(SQ
83d0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74  LiteStatement st
83e0: 6d 74 2c 20 69 6e 74 20 63 75 72 73 6f 72 29 0d  mt, int cursor).
83f0: 0a 20 20 20 20 7b 0d 0a 23 69 66 20 21 53 51 4c  .    {..#if !SQL
8400: 49 54 45 5f 53 54 41 4e 44 41 52 44 0d 0a 20 20  ITE_STANDARD..  
8410: 20 20 20 20 6c 6f 6e 67 20 72 6f 77 69 64 3b 0d      long rowid;.
8420: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
8430: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
8440: 6f 64 73 2e 73 71 6c 69 74 65 33 5f 63 75 72 73  ods.sqlite3_curs
8450: 6f 72 5f 72 6f 77 69 64 28 73 74 6d 74 2e 5f 73  or_rowid(stmt._s
8460: 71 6c 69 74 65 5f 73 74 6d 74 2c 20 63 75 72 73  qlite_stmt, curs
8470: 6f 72 2c 20 6f 75 74 20 72 6f 77 69 64 29 3b 0d  or, out rowid);.
8480: 0a 20 20 20 20 20 20 69 66 20 28 72 63 20 3d 3d  .      if (rc ==
8490: 20 30 29 20 72 65 74 75 72 6e 20 72 6f 77 69 64   0) return rowid
84a0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ;....      retur
84b0: 6e 20 30 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20  n 0;..#else..   
84c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 23 65     return 0;..#e
84d0: 6e 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ndif..    }.... 
84e0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72     internal over
84f0: 72 69 64 65 20 76 6f 69 64 20 47 65 74 49 6e 64  ride void GetInd
8500: 65 78 43 6f 6c 75 6d 6e 45 78 74 65 6e 64 65 64  exColumnExtended
8510: 49 6e 66 6f 28 73 74 72 69 6e 67 20 64 61 74 61  Info(string data
8520: 62 61 73 65 2c 20 73 74 72 69 6e 67 20 69 6e 64  base, string ind
8530: 65 78 2c 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d  ex, string colum
8540: 6e 2c 20 6f 75 74 20 69 6e 74 20 73 6f 72 74 4d  n, out int sortM
8550: 6f 64 65 2c 20 6f 75 74 20 69 6e 74 20 6f 6e 45  ode, out int onE
8560: 72 72 6f 72 2c 20 6f 75 74 20 73 74 72 69 6e 67  rror, out string
8570: 20 63 6f 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e   collationSequen
8580: 63 65 29 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20  ce)..    {..#if 
8590: 21 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44  !SQLITE_STANDARD
85a0: 0d 0a 20 20 20 20 20 20 49 6e 74 50 74 72 20 63  ..      IntPtr c
85b0: 6f 6c 6c 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20  oll;..      int 
85c0: 63 6f 6c 6c 6c 65 6e 3b 0d 0a 20 20 20 20 20 20  colllen;..      
85d0: 69 6e 74 20 72 63 3b 0d 0a 0d 0a 20 20 20 20 20  int rc;....     
85e0: 20 72 63 20 3d 20 55 6e 73 61 66 65 4e 61 74 69   rc = UnsafeNati
85f0: 76 65 4d 65 74 68 6f 64 73 2e 73 71 6c 69 74 65  veMethods.sqlite
8600: 33 5f 69 6e 64 65 78 5f 63 6f 6c 75 6d 6e 5f 69  3_index_column_i
8610: 6e 66 6f 5f 69 6e 74 65 72 6f 70 28 5f 73 71 6c  nfo_interop(_sql
8620: 2c 20 54 6f 55 54 46 38 28 64 61 74 61 62 61 73  , ToUTF8(databas
8630: 65 29 2c 20 54 6f 55 54 46 38 28 69 6e 64 65 78  e), ToUTF8(index
8640: 29 2c 20 54 6f 55 54 46 38 28 63 6f 6c 75 6d 6e  ), ToUTF8(column
8650: 29 2c 20 6f 75 74 20 73 6f 72 74 4d 6f 64 65 2c  ), out sortMode,
8660: 20 6f 75 74 20 6f 6e 45 72 72 6f 72 2c 20 6f 75   out onError, ou
8670: 74 20 63 6f 6c 6c 2c 20 6f 75 74 20 63 6f 6c 6c  t coll, out coll
8680: 6c 65 6e 29 3b 0d 0a 20 20 20 20 20 20 69 66 20  len);..      if 
8690: 28 72 63 20 21 3d 20 30 29 20 74 68 72 6f 77 20  (rc != 0) throw 
86a0: 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70 74  new SQLiteExcept
86b0: 69 6f 6e 28 72 63 2c 20 22 22 29 3b 0d 0a 0d 0a  ion(rc, "");....
86c0: 20 20 20 20 20 20 63 6f 6c 6c 61 74 69 6f 6e 53        collationS
86d0: 65 71 75 65 6e 63 65 20 3d 20 55 54 46 38 54 6f  equence = UTF8To
86e0: 53 74 72 69 6e 67 28 63 6f 6c 6c 2c 20 63 6f 6c  String(coll, col
86f0: 6c 6c 65 6e 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20  llen);..#else.. 
8700: 20 20 20 20 20 73 6f 72 74 4d 6f 64 65 20 3d 20       sortMode = 
8710: 30 3b 0d 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f  0;..      onErro
8720: 72 20 3d 20 32 3b 0d 0a 20 20 20 20 20 20 63 6f  r = 2;..      co
8730: 6c 6c 61 74 69 6f 6e 53 65 71 75 65 6e 63 65 20  llationSequence 
8740: 3d 20 22 42 49 4e 41 52 59 22 3b 0d 0a 23 65 6e  = "BINARY";..#en
8750: 64 69 66 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  dif..    }....  
8760: 20 20 69 6e 74 65 72 6e 61 6c 20 6f 76 65 72 72    internal overr
8770: 69 64 65 20 69 6e 74 20 46 69 6c 65 43 6f 6e 74  ide int FileCont
8780: 72 6f 6c 28 73 74 72 69 6e 67 20 7a 44 62 4e 61  rol(string zDbNa
8790: 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 49 6e 74 50  me, int op, IntP
87a0: 74 72 20 70 41 72 67 29 0d 0a 20 20 20 20 7b 0d  tr pArg)..    {.
87b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 55 6e  .      return Un
87c0: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
87d0: 73 2e 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  s.sqlite3_file_c
87e0: 6f 6e 74 72 6f 6c 28 5f 73 71 6c 2c 20 28 7a 44  ontrol(_sql, (zD
87f0: 62 4e 61 6d 65 20 21 3d 20 6e 75 6c 6c 29 20 3f  bName != null) ?
8800: 20 54 6f 55 54 46 38 28 7a 44 62 4e 61 6d 65 29   ToUTF8(zDbName)
8810: 20 3a 20 6e 75 6c 6c 2c 20 6f 70 2c 20 70 41 72   : null, op, pAr
8820: 67 29 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d  g);..    }..  }.
8830: 0a 7d 0d 0a                                      .}..