System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact ce112fe272b493aecd77ace4a6da3c405b965613:


0000: 2f 2a 2a 2a 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 0a 20 2a 20 41 44 4f  *********. * ADO
0040: 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50 72  .NET 2.0 Data Pr
0050: 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69 74  ovider for SQLit
0060: 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0a 20 2a  e Version 3.X. *
0070: 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f 62 65   Written by Robe
0080: 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f 62 65  rt Simpson (robe
0090: 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65 73 6f  rt@blackcastleso
00a0: 66 74 2e 63 6f 6d 29 0a 20 2a 0a 20 2a 20 52 65  ft.com). *. * Re
00b0: 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70 75  leased to the pu
00c0: 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73 65  blic domain, use
00d0: 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69 73   at your own ris
00e0: 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k!. ************
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 2f 0a 0a 6e  ************/..n
0120: 61 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d 2e  amespace System.
0130: 44 61 74 61 2e 53 51 4c 69 74 65 0a 7b 0a 20 20  Data.SQLite.{.  
0140: 75 73 69 6e 67 20 53 79 73 74 65 6d 3b 0a 20 20  using System;.  
0150: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6c  using System.Col
0160: 6c 65 63 74 69 6f 6e 73 2e 47 65 6e 65 72 69 63  lections.Generic
0170: 3b 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  ;.  using System
0180: 2e 43 6f 6c 6c 65 63 74 69 6f 6e 73 2e 53 70 65  .Collections.Spe
0190: 63 69 61 6c 69 7a 65 64 3b 0a 20 20 75 73 69 6e  cialized;.  usin
01a0: 67 20 53 79 73 74 65 6d 2e 44 61 74 61 3b 0a 20  g System.Data;. 
01b0: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61   using System.Da
01c0: 74 61 2e 43 6f 6d 6d 6f 6e 3b 0a 20 20 75 73 69  ta.Common;.  usi
01d0: 6e 67 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61 6c  ng System.Global
01e0: 69 7a 61 74 69 6f 6e 3b 0a 0a 20 20 2f 2f 2f 20  ization;..  /// 
01f0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 2f 2f 2f 20  <summary>.  /// 
0200: 53 51 4c 69 74 65 20 69 6d 70 6c 65 6d 65 6e 74  SQLite implement
0210: 61 74 69 6f 6e 20 6f 66 20 44 62 44 61 74 61 52  ation of DbDataR
0220: 65 61 64 65 72 2e 0a 20 20 2f 2f 2f 20 3c 2f 73  eader..  /// </s
0230: 75 6d 6d 61 72 79 3e 0a 20 20 70 75 62 6c 69 63  ummary>.  public
0240: 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 53 51   sealed class SQ
0250: 4c 69 74 65 44 61 74 61 52 65 61 64 65 72 20 3a  LiteDataReader :
0260: 20 44 62 44 61 74 61 52 65 61 64 65 72 0a 20 20   DbDataReader.  
0270: 7b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  {.    /// <summa
0280: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 55 6e 64 65  ry>.    /// Unde
0290: 72 6c 79 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 74  rlying command t
02a0: 68 69 73 20 72 65 61 64 65 72 20 69 73 20 61 74  his reader is at
02b0: 74 61 63 68 65 64 20 74 6f 0a 20 20 20 20 2f 2f  tached to.    //
02c0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
02d0: 20 70 72 69 76 61 74 65 20 53 51 4c 69 74 65 43   private SQLiteC
02e0: 6f 6d 6d 61 6e 64 20 5f 63 6f 6d 6d 61 6e 64 3b  ommand _command;
02f0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
0300: 79 3e 0a 20 20 20 20 2f 2f 2f 20 49 6e 64 65 78  y>.    /// Index
0310: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
0320: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
0330: 20 63 6f 6d 6d 61 6e 64 20 62 65 69 6e 67 20 70   command being p
0340: 72 6f 63 65 73 73 65 64 0a 20 20 20 20 2f 2f 2f  rocessed.    ///
0350: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
0360: 70 72 69 76 61 74 65 20 69 6e 74 20 5f 61 63 74  private int _act
0370: 69 76 65 53 74 61 74 65 6d 65 6e 74 49 6e 64 65  iveStatementInde
0380: 78 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  x;.    /// <summ
0390: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 43 75 72  ary>.    /// Cur
03a0: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 62  rent statement b
03b0: 65 69 6e 67 20 52 65 61 64 28 29 0a 20 20 20 20  eing Read().    
03c0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
03d0: 20 20 20 70 72 69 76 61 74 65 20 53 51 4c 69 74     private SQLit
03e0: 65 53 74 61 74 65 6d 65 6e 74 20 5f 61 63 74 69  eStatement _acti
03f0: 76 65 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20  veStatement;.   
0400: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
0410: 20 20 20 2f 2f 2f 20 53 74 61 74 65 20 6f 66 20     /// State of 
0420: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
0430: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 72 6f 63  ement being proc
0440: 65 73 73 65 64 2e 0a 20 20 20 20 2f 2f 2f 20 2d  essed..    /// -
0450: 31 20 3d 20 46 69 72 73 74 20 53 74 65 70 28 29  1 = First Step()
0460: 20 65 78 65 63 75 74 65 64 2c 20 73 6f 20 74 68   executed, so th
0470: 65 20 66 69 72 73 74 20 52 65 61 64 28 29 20 77  e first Read() w
0480: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 20  ill be ignored. 
0490: 20 20 20 2f 2f 2f 20 20 30 20 3d 20 41 63 74 69     ///  0 = Acti
04a0: 76 65 6c 79 20 72 65 61 64 69 6e 67 0a 20 20 20  vely reading.   
04b0: 20 2f 2f 2f 20 20 31 20 3d 20 46 69 6e 69 73 68   ///  1 = Finish
04c0: 65 64 20 72 65 61 64 69 6e 67 0a 20 20 20 20 2f  ed reading.    /
04d0: 2f 2f 20 20 32 20 3d 20 4e 6f 6e 2d 72 6f 77 2d  //  2 = Non-row-
04e0: 72 65 74 75 72 6e 69 6e 67 20 73 74 61 74 65 6d  returning statem
04f0: 65 6e 74 2c 20 6e 6f 20 72 65 63 6f 72 64 73 0a  ent, no records.
0500: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
0510: 79 3e 0a 20 20 20 20 70 72 69 76 61 74 65 20 69  y>.    private i
0520: 6e 74 20 5f 72 65 61 64 69 6e 67 53 74 61 74 65  nt _readingState
0530: 3b 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ;.    /// <summa
0540: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 4e 75 6d 62  ry>.    /// Numb
0550: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 61 66  er of records af
0560: 66 65 63 74 65 64 20 62 79 20 74 68 65 20 69 6e  fected by the in
0570: 73 65 72 74 2f 75 70 64 61 74 65 20 73 74 61 74  sert/update stat
0580: 65 6d 65 6e 74 73 20 65 78 65 63 75 74 65 64 20  ements executed 
0590: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 0a 20  on the command. 
05a0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
05b0: 3e 0a 20 20 20 20 70 72 69 76 61 74 65 20 69 6e  >.    private in
05c0: 74 20 5f 72 6f 77 73 41 66 66 65 63 74 65 64 3b  t _rowsAffected;
05d0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
05e0: 79 3e 0a 20 20 20 20 2f 2f 2f 20 43 6f 75 6e 74  y>.    /// Count
05f0: 20 6f 66 20 66 69 65 6c 64 73 20 28 63 6f 6c 75   of fields (colu
0600: 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 6f 77 2d  mns) in the row-
0610: 72 65 74 75 72 6e 69 6e 67 20 73 74 61 74 65 6d  returning statem
0620: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 62 65  ent currently be
0630: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 0a 20 20  ing processed.  
0640: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
0650: 0a 20 20 20 20 70 72 69 76 61 74 65 20 69 6e 74  .    private int
0660: 20 5f 66 69 65 6c 64 43 6f 75 6e 74 3b 0a 20 20   _fieldCount;.  
0670: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
0680: 20 20 20 20 2f 2f 2f 20 4d 61 70 73 20 74 68 65      /// Maps the
0690: 20 66 69 65 6c 64 20 28 63 6f 6c 75 6d 6e 29 20   field (column) 
06a0: 6e 61 6d 65 73 20 74 6f 20 74 68 65 69 72 20 63  names to their c
06b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 64  orresponding ind
06c0: 65 78 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  exes within the 
06d0: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 2f 2f 2f  results..    ///
06e0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
06f0: 70 72 69 76 61 74 65 20 44 69 63 74 69 6f 6e 61  private Dictiona
0700: 72 79 3c 73 74 72 69 6e 67 2c 20 69 6e 74 3e 20  ry<string, int> 
0710: 5f 66 69 65 6c 64 49 6e 64 65 78 65 73 3b 0a 20  _fieldIndexes;. 
0720: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
0730: 0a 20 20 20 20 2f 2f 2f 20 44 61 74 61 74 79 70  .    /// Datatyp
0740: 65 73 20 6f 66 20 61 63 74 69 76 65 20 66 69 65  es of active fie
0750: 6c 64 73 20 28 63 6f 6c 75 6d 6e 73 29 20 69 6e  lds (columns) in
0760: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
0770: 74 65 6d 65 6e 74 2c 20 75 73 65 64 20 66 6f 72  tement, used for
0780: 20 74 79 70 65 2d 72 65 73 74 72 69 63 74 69 6e   type-restrictin
0790: 67 20 64 61 74 61 0a 20 20 20 20 2f 2f 2f 20 3c  g data.    /// <
07a0: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72  /summary>.    pr
07b0: 69 76 61 74 65 20 53 51 4c 69 74 65 54 79 70 65  ivate SQLiteType
07c0: 5b 5d 20 5f 66 69 65 6c 64 54 79 70 65 41 72 72  [] _fieldTypeArr
07d0: 61 79 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  ay;..    /// <su
07e0: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54  mmary>.    /// T
07f0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
0800: 68 65 20 64 61 74 61 72 65 61 64 65 72 0a 20 20  he datareader.  
0810: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
0820: 0a 20 20 20 20 70 72 69 76 61 74 65 20 43 6f 6d  .    private Com
0830: 6d 61 6e 64 42 65 68 61 76 69 6f 72 20 5f 63 6f  mandBehavior _co
0840: 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 3b 0a 0a  mmandBehavior;..
0850: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
0860: 3e 0a 20 20 20 20 2f 2f 2f 20 49 66 20 73 65 74  >.    /// If set
0870: 2c 20 74 68 65 6e 20 64 69 73 70 6f 73 65 20 6f  , then dispose o
0880: 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 62  f the command ob
0890: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
08a0: 61 64 65 72 20 69 73 20 66 69 6e 69 73 68 65 64  ader is finished
08b0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
08c0: 72 79 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ry>.    internal
08d0: 20 62 6f 6f 6c 20 5f 64 69 73 70 6f 73 65 43 6f   bool _disposeCo
08e0: 6d 6d 61 6e 64 3b 0a 0a 20 20 20 20 2f 2f 2f 20  mmand;..    /// 
08f0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  <summary>.    //
0900: 2f 20 49 66 20 73 65 74 2c 20 74 68 65 6e 20 72  / If set, then r
0910: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
0920: 6e 20 77 68 65 6e 20 74 68 65 20 6f 62 6a 65 63  n when the objec
0930: 74 20 69 73 20 61 63 63 65 73 73 65 64 20 61 66  t is accessed af
0940: 74 65 72 20 62 65 69 6e 67 20 64 69 73 70 6f 73  ter being dispos
0950: 65 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ed..    /// </su
0960: 6d 6d 61 72 79 3e 0a 20 20 20 20 69 6e 74 65 72  mmary>.    inter
0970: 6e 61 6c 20 62 6f 6f 6c 20 5f 74 68 72 6f 77 4f  nal bool _throwO
0980: 6e 44 69 73 70 6f 73 65 64 3b 0a 0a 20 20 20 20  nDisposed;..    
0990: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20  /// <summary>.  
09a0: 20 20 2f 2f 2f 20 41 6e 20 61 72 72 61 79 20 6f    /// An array o
09b0: 66 20 72 6f 77 69 64 27 73 20 66 6f 72 20 74 68  f rowid's for th
09c0: 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  e active stateme
09d0: 6e 74 20 69 66 20 43 6f 6d 6d 61 6e 64 42 65 68  nt if CommandBeh
09e0: 61 76 69 6f 72 2e 4b 65 79 49 6e 66 6f 20 69 73  avior.KeyInfo is
09f0: 20 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 2f   specified.    /
0a00: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
0a10: 20 20 70 72 69 76 61 74 65 20 53 51 4c 69 74 65    private SQLite
0a20: 4b 65 79 52 65 61 64 65 72 20 5f 6b 65 79 49 6e  KeyReader _keyIn
0a30: 66 6f 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  fo;..    /// <su
0a40: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 4d  mmary>.    /// M
0a50: 61 74 63 68 65 73 20 74 68 65 20 76 65 72 73 69  atches the versi
0a60: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
0a70: 74 69 6f 6e 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f  tion..    /// </
0a80: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 69 6e 74  summary>.    int
0a90: 65 72 6e 61 6c 20 6c 6f 6e 67 20 5f 76 65 72 73  ernal long _vers
0aa0: 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73  ion;..    /// <s
0ab0: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20  ummary>.    /// 
0ac0: 54 68 65 20 22 73 74 75 62 22 20 28 69 2e 65 2e  The "stub" (i.e.
0ad0: 20 70 6c 61 63 65 68 6f 6c 64 65 72 29 20 62 61   placeholder) ba
0ae0: 73 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 74  se schema name t
0af0: 6f 20 75 73 65 20 77 68 65 6e 20 72 65 74 75 72  o use when retur
0b00: 6e 69 6e 67 0a 20 20 20 20 2f 2f 2f 20 63 6f 6c  ning.    /// col
0b10: 75 6d 6e 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  umn schema infor
0b20: 6d 61 74 69 6f 6e 2e 20 20 4d 61 74 63 68 65 73  mation.  Matches
0b30: 20 74 68 65 20 62 61 73 65 20 73 63 68 65 6d 61   the base schema
0b40: 20 6e 61 6d 65 20 75 73 65 64 20 62 79 20 74 68   name used by th
0b50: 65 0a 20 20 20 20 2f 2f 2f 20 61 73 73 6f 63 69  e.    /// associ
0b60: 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ated connection.
0b70: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
0b80: 72 79 3e 0a 20 20 20 20 70 72 69 76 61 74 65 20  ry>.    private 
0b90: 73 74 72 69 6e 67 20 5f 62 61 73 65 53 63 68 65  string _baseSche
0ba0: 6d 61 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2f 2f  maName;..    ///
0bb0: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
0bc0: 2f 2f 20 49 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  // Internal cons
0bd0: 74 72 75 63 74 6f 72 2c 20 69 6e 69 74 69 61 6c  tructor, initial
0be0: 69 7a 65 73 20 74 68 65 20 64 61 74 61 72 65 61  izes the datarea
0bf0: 64 65 72 20 61 6e 64 20 73 65 74 73 20 75 70 20  der and sets up 
0c00: 74 6f 20 62 65 67 69 6e 20 65 78 65 63 75 74 69  to begin executi
0c10: 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  ng statements.  
0c20: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
0c30: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
0c40: 6e 61 6d 65 3d 22 63 6d 64 22 3e 54 68 65 20 53  name="cmd">The S
0c50: 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 20 74 68 69  QLiteCommand thi
0c60: 73 20 64 61 74 61 20 72 65 61 64 65 72 20 69 73  s data reader is
0c70: 20 66 6f 72 3c 2f 70 61 72 61 6d 3e 0a 20 20 20   for</param>.   
0c80: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
0c90: 3d 22 62 65 68 61 76 65 22 3e 54 68 65 20 65 78  ="behave">The ex
0ca0: 70 65 63 74 65 64 20 62 65 68 61 76 69 6f 72 20  pected behavior 
0cb0: 6f 66 20 74 68 65 20 64 61 74 61 20 72 65 61 64  of the data read
0cc0: 65 72 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 69  er</param>.    i
0cd0: 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 44 61  nternal SQLiteDa
0ce0: 74 61 52 65 61 64 65 72 28 53 51 4c 69 74 65 43  taReader(SQLiteC
0cf0: 6f 6d 6d 61 6e 64 20 63 6d 64 2c 20 43 6f 6d 6d  ommand cmd, Comm
0d00: 61 6e 64 42 65 68 61 76 69 6f 72 20 62 65 68 61  andBehavior beha
0d10: 76 65 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ve).    {.      
0d20: 5f 74 68 72 6f 77 4f 6e 44 69 73 70 6f 73 65 64  _throwOnDisposed
0d30: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 5f   = true;.      _
0d40: 63 6f 6d 6d 61 6e 64 20 3d 20 63 6d 64 3b 0a 20  command = cmd;. 
0d50: 20 20 20 20 20 5f 76 65 72 73 69 6f 6e 20 3d 20       _version = 
0d60: 5f 63 6f 6d 6d 61 6e 64 2e 43 6f 6e 6e 65 63 74  _command.Connect
0d70: 69 6f 6e 2e 5f 76 65 72 73 69 6f 6e 3b 0a 20 20  ion._version;.  
0d80: 20 20 20 20 5f 62 61 73 65 53 63 68 65 6d 61 4e      _baseSchemaN
0d90: 61 6d 65 20 3d 20 5f 63 6f 6d 6d 61 6e 64 2e 43  ame = _command.C
0da0: 6f 6e 6e 65 63 74 69 6f 6e 2e 5f 62 61 73 65 53  onnection._baseS
0db0: 63 68 65 6d 61 4e 61 6d 65 3b 0a 0a 20 20 20 20  chemaName;..    
0dc0: 20 20 5f 63 6f 6d 6d 61 6e 64 42 65 68 61 76 69    _commandBehavi
0dd0: 6f 72 20 3d 20 62 65 68 61 76 65 3b 0a 20 20 20  or = behave;.   
0de0: 20 20 20 5f 61 63 74 69 76 65 53 74 61 74 65 6d     _activeStatem
0df0: 65 6e 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  entIndex = -1;. 
0e00: 20 20 20 20 20 5f 72 6f 77 73 41 66 66 65 63 74       _rowsAffect
0e10: 65 64 20 3d 20 2d 31 3b 0d 0a 0d 0a 20 20 20 20  ed = -1;....    
0e20: 20 20 69 66 20 28 5f 63 6f 6d 6d 61 6e 64 20 21    if (_command !
0e30: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 7b  = null)..      {
0e40: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69  ..          SQLi
0e50: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2e 4f 6e 43  teConnection.OnC
0e60: 68 61 6e 67 65 64 28 5f 63 6f 6d 6d 61 6e 64 2e  hanged(_command.
0e70: 43 6f 6e 6e 65 63 74 69 6f 6e 2c 0d 0a 20 20 20  Connection,..   
0e80: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 43             new C
0e90: 6f 6e 6e 65 63 74 69 6f 6e 45 76 65 6e 74 41 72  onnectionEventAr
0ea0: 67 73 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs(SQLiteConnect
0eb0: 69 6f 6e 45 76 65 6e 74 54 79 70 65 2e 4e 65 77  ionEventType.New
0ec0: 44 61 74 61 52 65 61 64 65 72 2c 0d 0a 20 20 20  DataReader,..   
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
0ee0: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 5f 63 6f 6d 6d  ull, null, _comm
0ef0: 61 6e 64 2c 20 6e 75 6c 6c 2c 20 6e 65 77 20 6f  and, null, new o
0f00: 62 6a 65 63 74 5b 5d 20 7b 20 74 68 69 73 2c 20  bject[] { this, 
0f10: 62 65 68 61 76 65 20 7d 29 29 3b 0d 0a 0d 0a 20  behave }));.... 
0f20: 20 20 20 20 20 20 20 20 20 4e 65 78 74 52 65 73           NextRes
0f30: 75 6c 74 28 29 3b 0d 0a 20 20 20 20 20 20 7d 0a  ult();..      }.
0f40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 2f 2f      }..    /////
0f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20 20 20 20  //////////..    
0fb0: 23 72 65 67 69 6f 6e 20 49 44 69 73 70 6f 73 61  #region IDisposa
0fc0: 62 6c 65 20 22 50 61 74 74 65 72 6e 22 20 4d 65  ble "Pattern" Me
0fd0: 6d 62 65 72 73 0a 20 20 20 20 70 72 69 76 61 74  mbers.    privat
0fe0: 65 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65 64 3b  e bool disposed;
0ff0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69  .    private voi
1000: 64 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28  d CheckDisposed(
1010: 29 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0a 20 20  ) /* throw */.  
1020: 20 20 7b 0a 23 69 66 20 54 48 52 4f 57 5f 4f 4e    {.#if THROW_ON
1030: 5f 44 49 53 50 4f 53 45 44 0a 20 20 20 20 20 20  _DISPOSED.      
1040: 20 20 69 66 20 28 64 69 73 70 6f 73 65 64 20 26    if (disposed &
1050: 26 20 5f 74 68 72 6f 77 4f 6e 44 69 73 70 6f 73  & _throwOnDispos
1060: 65 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed).            
1070: 74 68 72 6f 77 20 6e 65 77 20 4f 62 6a 65 63 74  throw new Object
1080: 44 69 73 70 6f 73 65 64 45 78 63 65 70 74 69 6f  DisposedExceptio
1090: 6e 28 74 79 70 65 6f 66 28 53 51 4c 69 74 65 44  n(typeof(SQLiteD
10a0: 61 74 61 52 65 61 64 65 72 29 2e 4e 61 6d 65 29  ataReader).Name)
10b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
10c0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
10d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1120: 2f 2f 2f 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75  ///..    /// <su
1130: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 44  mmary>.    /// D
1140: 69 73 70 6f 73 65 20 6f 66 20 61 6c 6c 20 72 65  ispose of all re
1150: 73 6f 75 72 63 65 73 20 75 73 65 64 20 62 79 20  sources used by 
1160: 74 68 69 73 20 64 61 74 61 72 65 61 64 65 72 2e  this datareader.
1170: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
1180: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ry>.    /// <par
1190: 61 6d 20 6e 61 6d 65 3d 22 64 69 73 70 6f 73 69  am name="disposi
11a0: 6e 67 22 3e 3c 2f 70 61 72 61 6d 3e 0a 20 20 20  ng"></param>.   
11b0: 20 70 72 6f 74 65 63 74 65 64 20 6f 76 65 72 72   protected overr
11c0: 69 64 65 20 76 6f 69 64 20 44 69 73 70 6f 73 65  ide void Dispose
11d0: 28 62 6f 6f 6c 20 64 69 73 70 6f 73 69 6e 67 29  (bool disposing)
11e0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 74  .    {.        t
11f0: 72 79 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  ry.        {.   
1200: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 64 69           if (!di
1210: 73 70 6f 73 65 64 29 0a 20 20 20 20 20 20 20 20  sposed).        
1220: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
1230: 20 20 20 20 20 20 2f 2f 69 66 20 28 64 69 73 70        //if (disp
1240: 6f 73 69 6e 67 29 0a 20 20 20 20 20 20 20 20 20  osing).         
1250: 20 20 20 20 20 20 20 2f 2f 7b 0a 20 20 20 20 20         //{.     
1260: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
1270: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1290: 2f 2f 2f 2f 2f 0a 20 20 20 20 20 20 20 20 20 20  /////.          
12a0: 20 20 20 20 20 20 2f 2f 20 20 20 20 2f 2f 20 64        //    // d
12b0: 69 73 70 6f 73 65 20 6d 61 6e 61 67 65 64 20 72  ispose managed r
12c0: 65 73 6f 75 72 63 65 73 20 68 65 72 65 2e 2e 2e  esources here...
12d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12e0: 20 2f 2f 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f   //    /////////
12f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 20 20 20 20  ///////////.    
1310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 7d 0a              //}.
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1330: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1350: 2f 2f 2f 2f 2f 2f 2f 0a 20 20 20 20 20 20 20 20  ///////.        
1360: 20 20 20 20 20 20 20 20 2f 2f 20 72 65 6c 65 61          // relea
1370: 73 65 20 75 6e 6d 61 6e 61 67 65 64 20 72 65 73  se unmanaged res
1380: 6f 75 72 63 65 73 20 68 65 72 65 2e 2e 2e 0a 20  ources here.... 
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13c0: 2f 2f 2f 2f 2f 0a 0a 20 20 20 20 20 20 20 20 20  /////..         
13d0: 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20         //.      
13e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
13f0: 45 3a 20 46 69 78 20 66 6f 72 20 74 69 63 6b 65  E: Fix for ticke
1400: 74 20 5b 65 31 62 32 65 30 66 37 36 39 5d 2c 20  t [e1b2e0f769], 
1410: 64 6f 20 4e 4f 54 20 74 68 72 6f 77 20 65 78 63  do NOT throw exc
1420: 65 70 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  eptions.        
1430: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
1440: 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 62 65   while we are be
1450: 69 6e 67 20 64 69 73 70 6f 73 65 64 2e 0a 20 20  ing disposed..  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1480: 20 5f 74 68 72 6f 77 4f 6e 44 69 73 70 6f 73 65   _throwOnDispose
1490: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  d = false;.     
14a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14b0: 20 7d 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c   }.        final
14c0: 6c 79 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  ly.        {.   
14d0: 20 20 20 20 20 20 20 20 20 62 61 73 65 2e 44 69           base.Di
14e0: 73 70 6f 73 65 28 64 69 73 70 6f 73 69 6e 67 29  spose(disposing)
14f0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
1500: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  /.            //
1510: 20 4e 4f 54 45 3a 20 45 76 65 72 79 74 68 69 6e   NOTE: Everythin
1520: 67 20 73 68 6f 75 6c 64 20 62 65 20 66 75 6c 6c  g should be full
1530: 79 20 64 69 73 70 6f 73 65 64 20 61 74 20 74 68  y disposed at th
1540: 69 73 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 20  is point..      
1550: 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20        //.       
1560: 20 20 20 20 20 64 69 73 70 6f 73 65 64 20 3d 20       disposed = 
1570: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  true;.        }.
1580: 20 20 20 20 7d 0a 20 20 20 20 23 65 6e 64 72 65      }.    #endre
1590: 67 69 6f 6e 0a 0a 20 20 20 20 2f 2f 2f 2f 2f 2f  gion..    //////
15a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20 20 20 20 69  /////////..    i
1600: 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 43 61 6e  nternal void Can
1610: 63 65 6c 28 29 0a 20 20 20 20 7b 0a 20 20 20 20  cel().    {.    
1620: 20 20 5f 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a    _version = 0;.
1630: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c      }..    /// <
1640: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
1650: 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74 61   Closes the data
1660: 72 65 61 64 65 72 2c 20 70 6f 74 65 6e 74 69 61  reader, potentia
1670: 6c 6c 79 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  lly closing the 
1680: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 77 65  connection as we
1690: 6c 6c 20 69 66 20 43 6f 6d 6d 61 6e 64 42 65 68  ll if CommandBeh
16a0: 61 76 69 6f 72 2e 43 6c 6f 73 65 43 6f 6e 6e 65  avior.CloseConne
16b0: 63 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66  ction was specif
16c0: 69 65 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ied..    /// </s
16d0: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 75 62 6c  ummary>.    publ
16e0: 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ic override void
16f0: 20 43 6c 6f 73 65 28 29 0a 20 20 20 20 7b 0a 20   Close().    {. 
1700: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
1710: 65 64 28 29 3b 0a 0a 20 20 20 20 20 20 74 72 79  ed();..      try
1720: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1730: 20 69 66 20 28 5f 63 6f 6d 6d 61 6e 64 20 21 3d   if (_command !=
1740: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 7b   null).        {
1750: 0a 20 20 20 20 20 20 20 20 20 20 74 72 79 0a 20  .          try. 
1760: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1770: 20 20 20 20 20 20 20 74 72 79 0a 20 20 20 20 20         try.     
1780: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1790: 20 20 20 20 20 20 20 2f 2f 20 4d 61 6b 65 20 73         // Make s
17a0: 75 72 65 20 77 65 27 76 65 20 6e 6f 74 20 62 65  ure we've not be
17b0: 65 6e 20 63 61 6e 63 65 6c 65 64 0a 20 20 20 20  en canceled.    
17c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f 76            if (_v
17d0: 65 72 73 69 6f 6e 20 21 3d 20 30 29 0a 20 20 20  ersion != 0).   
17e0: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1810: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1820: 20 20 20 20 20 77 68 69 6c 65 20 28 4e 65 78 74       while (Next
1830: 52 65 73 75 6c 74 28 29 29 0a 20 20 20 20 20 20  Result()).      
1840: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1870: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1880: 20 20 20 20 63 61 74 63 68 28 53 51 4c 69 74 65      catch(SQLite
1890: 45 78 63 65 70 74 69 6f 6e 29 0a 20 20 20 20 20  Exception).     
18a0: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f               _co
18e0: 6d 6d 61 6e 64 2e 43 6c 65 61 72 44 61 74 61 52  mmand.ClearDataR
18f0: 65 61 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20  eader();.       
1900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1910: 20 20 20 66 69 6e 61 6c 6c 79 0a 20 20 20 20 20     finally.     
1920: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1930: 20 20 20 20 20 20 20 2f 2f 20 49 66 20 74 68 65         // If the
1940: 20 64 61 74 61 72 65 61 64 65 72 27 73 20 62 65   datareader's be
1950: 68 61 76 69 6f 72 20 69 6e 63 6c 75 64 65 73 20  havior includes 
1960: 63 6c 6f 73 69 6e 67 20 74 68 65 20 63 6f 6e 6e  closing the conn
1970: 65 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  ection, then do 
1980: 73 6f 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  so here..       
1990: 20 20 20 20 20 20 20 69 66 20 28 28 5f 63 6f 6d         if ((_com
19a0: 6d 61 6e 64 42 65 68 61 76 69 6f 72 20 26 20 43  mandBehavior & C
19b0: 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 43  ommandBehavior.C
19c0: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 29 20  loseConnection) 
19d0: 21 3d 20 30 20 26 26 20 5f 63 6f 6d 6d 61 6e 64  != 0 && _command
19e0: 2e 43 6f 6e 6e 65 63 74 69 6f 6e 20 21 3d 20 6e  .Connection != n
19f0: 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20  ull).           
1a00: 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64 2e 43 6f       _command.Co
1a10: 6e 6e 65 63 74 69 6f 6e 2e 43 6c 6f 73 65 28 29  nnection.Close()
1a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1a30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a40: 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0a 20 20        finally.  
1a50: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1a60: 20 20 20 20 20 20 69 66 20 28 5f 64 69 73 70 6f        if (_dispo
1a70: 73 65 43 6f 6d 6d 61 6e 64 29 0a 20 20 20 20 20  seCommand).     
1a80: 20 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e           _comman
1a90: 64 2e 44 69 73 70 6f 73 65 28 29 3b 0a 20 20 20  d.Dispose();.   
1aa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ab0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 5f 63 6f 6d   }..        _com
1ac0: 6d 61 6e 64 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20  mand = null;.   
1ad0: 20 20 20 20 20 5f 61 63 74 69 76 65 53 74 61 74       _activeStat
1ae0: 65 6d 65 6e 74 20 3d 20 6e 75 6c 6c 3b 0a 20 20  ement = null;.  
1af0: 20 20 20 20 20 20 5f 66 69 65 6c 64 49 6e 64 65        _fieldInde
1b00: 78 65 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  xes = null;.    
1b10: 20 20 20 20 5f 66 69 65 6c 64 54 79 70 65 41 72      _fieldTypeAr
1b20: 72 61 79 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  ray = null;.    
1b30: 20 20 7d 0a 20 20 20 20 20 20 66 69 6e 61 6c 6c    }.      finall
1b40: 79 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  y.      {.      
1b50: 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 20 21    if (_keyInfo !
1b60: 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20  = null).        
1b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 5f 6b 65 79  {.          _key
1b80: 49 6e 66 6f 2e 44 69 73 70 6f 73 65 28 29 3b 0a  Info.Dispose();.
1b90: 20 20 20 20 20 20 20 20 20 20 5f 6b 65 79 49 6e            _keyIn
1ba0: 66 6f 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20  fo = null;.     
1bb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bc0: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d   }..    /// <sum
1bd0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 54 68  mary>.    /// Th
1be0: 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
1bf0: 74 68 65 20 64 61 74 61 72 65 61 64 65 72 20 69  the datareader i
1c00: 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2f 2f 2f  s closed.    ///
1c10: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
1c20: 70 72 69 76 61 74 65 20 76 6f 69 64 20 43 68 65  private void Che
1c30: 63 6b 43 6c 6f 73 65 64 28 29 0a 20 20 20 20 7b  ckClosed().    {
1c40: 0a 20 20 20 20 20 20 69 66 20 28 21 5f 74 68 72  .      if (!_thr
1c50: 6f 77 4f 6e 44 69 73 70 6f 73 65 64 29 0a 20 20  owOnDisposed).  
1c60: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20        return;.. 
1c70: 20 20 20 20 20 69 66 20 28 5f 63 6f 6d 6d 61 6e       if (_comman
1c80: 64 20 3d 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20  d == null).     
1c90: 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76     throw new Inv
1ca0: 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63  alidOperationExc
1cb0: 65 70 74 69 6f 6e 28 22 44 61 74 61 52 65 61 64  eption("DataRead
1cc0: 65 72 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  er has been clos
1cd0: 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 69 66 20  ed");..      if 
1ce0: 28 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 30 29 0a  (_version == 0).
1cf0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
1d00: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
1d10: 6e 28 22 45 78 65 63 75 74 69 6f 6e 20 77 61 73  n("Execution was
1d20: 20 61 62 6f 72 74 65 64 20 62 79 20 74 68 65 20   aborted by the 
1d30: 75 73 65 72 22 29 3b 0a 0a 20 20 20 20 20 20 69  user");..      i
1d40: 66 20 28 5f 63 6f 6d 6d 61 6e 64 2e 43 6f 6e 6e  f (_command.Conn
1d50: 65 63 74 69 6f 6e 2e 53 74 61 74 65 20 21 3d 20  ection.State != 
1d60: 43 6f 6e 6e 65 63 74 69 6f 6e 53 74 61 74 65 2e  ConnectionState.
1d70: 4f 70 65 6e 20 7c 7c 20 5f 63 6f 6d 6d 61 6e 64  Open || _command
1d80: 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e 5f 76 65 72  .Connection._ver
1d90: 73 69 6f 6e 20 21 3d 20 5f 76 65 72 73 69 6f 6e  sion != _version
1da0: 29 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20  ).        throw 
1db0: 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61  new InvalidOpera
1dc0: 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28 22 43  tionException("C
1dd0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
1de0: 6f 73 65 64 2c 20 73 74 61 74 65 6d 65 6e 74 20  osed, statement 
1df0: 77 61 73 20 74 65 72 6d 69 6e 61 74 65 64 22 29  was terminated")
1e00: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  ;.    }..    ///
1e10: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
1e20: 2f 2f 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  // Throw an erro
1e30: 72 20 69 66 20 61 20 72 6f 77 20 69 73 20 6e 6f  r if a row is no
1e40: 74 20 6c 6f 61 64 65 64 0a 20 20 20 20 2f 2f 2f  t loaded.    ///
1e50: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
1e60: 70 72 69 76 61 74 65 20 76 6f 69 64 20 43 68 65  private void Che
1e70: 63 6b 56 61 6c 69 64 52 6f 77 28 29 0a 20 20 20  ckValidRow().   
1e80: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 72 65   {.      if (_re
1e90: 61 64 69 6e 67 53 74 61 74 65 20 21 3d 20 30 29  adingState != 0)
1ea0: 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e  .        throw n
1eb0: 65 77 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74  ew InvalidOperat
1ec0: 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28 22 4e 6f  ionException("No
1ed0: 20 63 75 72 72 65 6e 74 20 72 6f 77 22 29 3b 0a   current row");.
1ee0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c      }..    /// <
1ef0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
1f00: 20 45 6e 75 6d 65 72 61 74 6f 72 20 73 75 70 70   Enumerator supp
1f10: 6f 72 74 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ort.    /// </su
1f20: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c  mmary>.    /// <
1f30: 72 65 74 75 72 6e 73 3e 52 65 74 75 72 6e 73 20  returns>Returns 
1f40: 61 20 44 62 45 6e 75 6d 65 72 61 74 6f 72 20 6f  a DbEnumerator o
1f50: 62 6a 65 63 74 2e 3c 2f 72 65 74 75 72 6e 73 3e  bject.</returns>
1f60: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
1f70: 72 69 64 65 20 43 6f 6c 6c 65 63 74 69 6f 6e 73  ride Collections
1f80: 2e 49 45 6e 75 6d 65 72 61 74 6f 72 20 47 65 74  .IEnumerator Get
1f90: 45 6e 75 6d 65 72 61 74 6f 72 28 29 0a 20 20 20  Enumerator().   
1fa0: 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44 69   {.      CheckDi
1fb0: 73 70 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20  sposed();.      
1fc0: 72 65 74 75 72 6e 20 6e 65 77 20 44 62 45 6e 75  return new DbEnu
1fd0: 6d 65 72 61 74 6f 72 28 74 68 69 73 2c 20 28 28  merator(this, ((
1fe0: 5f 63 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72  _commandBehavior
1ff0: 20 26 20 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69   & CommandBehavi
2000: 6f 72 2e 43 6c 6f 73 65 43 6f 6e 6e 65 63 74 69  or.CloseConnecti
2010: 6f 6e 29 20 3d 3d 20 43 6f 6d 6d 61 6e 64 42 65  on) == CommandBe
2020: 68 61 76 69 6f 72 2e 43 6c 6f 73 65 43 6f 6e 6e  havior.CloseConn
2030: 65 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 0a  ection));.    }.
2040: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
2050: 79 3e 0a 20 20 20 20 2f 2f 2f 20 4e 6f 74 20 69  y>.    /// Not i
2060: 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 52 65 74  mplemented.  Ret
2070: 75 72 6e 73 20 30 0a 20 20 20 20 2f 2f 2f 20 3c  urns 0.    /// <
2080: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 75  /summary>.    pu
2090: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 69 6e  blic override in
20a0: 74 20 44 65 70 74 68 0a 20 20 20 20 7b 0a 20 20  t Depth.    {.  
20b0: 20 20 20 20 67 65 74 0a 20 20 20 20 20 20 7b 0a      get.      {.
20c0: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
20d0: 70 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 20  posed();.       
20e0: 20 43 68 65 63 6b 43 6c 6f 73 65 64 28 29 3b 0a   CheckClosed();.
20f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2110: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
2120: 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72  y>.    /// Retur
2130: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2140: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2150: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 65  current resultse
2160: 74 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  t.    /// </summ
2170: 61 72 79 3e 0a 20 20 20 20 70 75 62 6c 69 63 20  ary>.    public 
2180: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 46 69 65  override int Fie
2190: 6c 64 43 6f 75 6e 74 0a 20 20 20 20 7b 0a 20 20  ldCount.    {.  
21a0: 20 20 20 20 67 65 74 0a 20 20 20 20 20 20 7b 0a      get.      {.
21b0: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
21c0: 70 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 20  posed();.       
21d0: 20 43 68 65 63 6b 43 6c 6f 73 65 64 28 29 3b 0a   CheckClosed();.
21e0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 5f 6b 65  .        if (_ke
21f0: 79 49 6e 66 6f 20 3d 3d 20 6e 75 6c 6c 29 0a 20  yInfo == null). 
2200: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2210: 5f 66 69 65 6c 64 43 6f 75 6e 74 3b 0a 0a 20 20  _fieldCount;..  
2220: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 66 69        return _fi
2230: 65 6c 64 43 6f 75 6e 74 20 2b 20 5f 6b 65 79 49  eldCount + _keyI
2240: 6e 66 6f 2e 43 6f 75 6e 74 3b 0a 20 20 20 20 20  nfo.Count;.     
2250: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
2260: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
2270: 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68 65 20  /// Returns the 
2280: 6e 75 6d 62 65 72 20 6f 66 20 76 69 73 69 62 6c  number of visibl
2290: 65 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  e fields in the 
22a0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 65  current resultse
22b0: 74 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  t.    /// </summ
22c0: 61 72 79 3e 0a 20 20 20 20 70 75 62 6c 69 63 20  ary>.    public 
22d0: 6f 76 65 72 72 69 64 65 20 69 6e 74 20 56 69 73  override int Vis
22e0: 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 0a 20  ibleFieldCount. 
22f0: 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74 0a 20     {.      get. 
2300: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 43       {.        C
2310: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a  heckDisposed();.
2320: 20 20 20 20 20 20 20 20 43 68 65 63 6b 43 6c 6f          CheckClo
2330: 73 65 64 28 29 3b 0a 20 20 20 20 20 20 20 20 72  sed();.        r
2340: 65 74 75 72 6e 20 5f 66 69 65 6c 64 43 6f 75 6e  eturn _fieldCoun
2350: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2360: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
2370: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 53 51 4c 69  ry>.    /// SQLi
2380: 74 65 20 69 73 20 69 6e 68 65 72 65 6e 74 6c 79  te is inherently
2390: 20 75 6e 2d 74 79 70 65 64 2e 20 20 41 6c 6c 20   un-typed.  All 
23a0: 64 61 74 61 74 79 70 65 73 20 69 6e 20 53 51 4c  datatypes in SQL
23b0: 69 74 65 20 61 72 65 20 6e 61 74 69 76 65 6c 79  ite are natively
23c0: 20 73 74 72 69 6e 67 73 2e 20 20 54 68 65 20 64   strings.  The d
23d0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
23e0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 74 61   columns of a ta
23f0: 62 6c 65 0a 20 20 20 20 2f 2f 2f 20 61 6e 64 20  ble.    /// and 
2400: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
2410: 72 65 74 75 72 6e 65 64 20 74 79 70 65 73 20 61  returned types a
2420: 72 65 20 61 6c 6c 20 77 65 20 68 61 76 65 20 74  re all we have t
2430: 6f 20 67 6f 20 6f 6e 20 74 6f 20 74 79 70 65 2d  o go on to type-
2440: 72 65 73 74 72 69 63 74 20 64 61 74 61 20 69 6e  restrict data in
2450: 20 74 68 65 20 72 65 61 64 65 72 2e 0a 20 20 20   the reader..   
2460: 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54 68 69   ///.    /// Thi
2470: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
2480: 70 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  pts to verify th
2490: 61 74 20 74 68 65 20 74 79 70 65 20 6f 66 20 64  at the type of d
24a0: 61 74 61 20 62 65 69 6e 67 20 72 65 71 75 65 73  ata being reques
24b0: 74 65 64 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ted of a column 
24c0: 6d 61 74 63 68 65 73 20 74 68 65 20 64 61 74 61  matches the data
24d0: 74 79 70 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  type of the colu
24e0: 6d 6e 2e 20 20 49 6e 0a 20 20 20 20 2f 2f 2f 20  mn.  In.    /// 
24f0: 74 68 65 20 63 61 73 65 20 6f 66 20 63 6f 6c 75  the case of colu
2500: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  mns that are not
2510: 20 62 61 63 6b 65 64 20 69 6e 74 6f 20 61 20 74   backed into a t
2520: 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2c  able definition,
2530: 20 77 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   we attempt to m
2540: 61 74 63 68 20 75 70 20 74 68 65 20 61 66 66 69  atch up the affi
2550: 6e 69 74 79 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  nity of a column
2560: 20 28 69 6e 74 2c 20 64 6f 75 62 6c 65 2c 20 73   (int, double, s
2570: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 29 0a 20  tring or blob). 
2580: 20 20 20 2f 2f 2f 20 74 6f 20 61 20 73 65 74 20     /// to a set 
2590: 6f 66 20 6b 6e 6f 77 6e 20 74 79 70 65 73 20 74  of known types t
25a0: 68 61 74 20 63 6c 6f 73 65 6c 79 20 6d 61 74 63  hat closely matc
25b0: 68 20 74 68 61 74 20 61 66 66 69 6e 69 74 79 2e  h that affinity.
25c0: 20 20 49 74 27 73 20 6e 6f 74 20 61 6e 20 65 78    It's not an ex
25d0: 61 63 74 20 73 63 69 65 6e 63 65 2c 20 62 75 74  act science, but
25e0: 20 69 74 73 20 74 68 65 20 62 65 73 74 20 77 65   its the best we
25f0: 20 63 61 6e 20 64 6f 2e 0a 20 20 20 20 2f 2f 2f   can do..    ///
2600: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
2610: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 0a 20 20  /// <returns>.  
2620: 20 20 2f 2f 2f 20 54 68 69 73 20 66 75 6e 63 74    /// This funct
2630: 69 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 49 6e  ion throws an In
2640: 76 61 6c 69 64 54 79 70 65 43 61 73 74 28 29 20  validTypeCast() 
2650: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  exception if the
2660: 20 72 65 71 75 65 73 74 65 64 20 74 79 70 65 20   requested type 
2670: 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 74 68  doesn't match th
2680: 65 20 63 6f 6c 75 6d 6e 27 73 20 64 65 66 69 6e  e column's defin
2690: 69 74 69 6f 6e 20 6f 72 20 61 66 66 69 6e 69 74  ition or affinit
26a0: 79 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74  y..    /// </ret
26b0: 75 72 6e 73 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  urns>.    /// <p
26c0: 61 72 61 6d 20 6e 61 6d 65 3d 22 69 22 3e 54 68  aram name="i">Th
26d0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
26e0: 6f 6c 75 6d 6e 20 74 6f 20 74 79 70 65 2d 63 68  olumn to type-ch
26f0: 65 63 6b 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20  eck</param>.    
2700: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
2710: 22 74 79 70 22 3e 54 68 65 20 74 79 70 65 20 77  "typ">The type w
2720: 65 20 77 61 6e 74 20 74 6f 20 67 65 74 20 6f 75  e want to get ou
2730: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 3c  t of the column<
2740: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 70 72 69 76  /param>.    priv
2750: 61 74 65 20 54 79 70 65 41 66 66 69 6e 69 74 79  ate TypeAffinity
2760: 20 56 65 72 69 66 79 54 79 70 65 28 69 6e 74 20   VerifyType(int 
2770: 69 2c 20 44 62 54 79 70 65 20 74 79 70 29 0a 20  i, DbType typ). 
2780: 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b     {.      Check
2790: 43 6c 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20  Closed();.      
27a0: 43 68 65 63 6b 56 61 6c 69 64 52 6f 77 28 29 3b  CheckValidRow();
27b0: 0a 0a 20 20 20 20 20 20 54 79 70 65 41 66 66 69  ..      TypeAffi
27c0: 6e 69 74 79 20 61 66 66 69 6e 69 74 79 20 3d 20  nity affinity = 
27d0: 47 65 74 53 51 4c 69 74 65 54 79 70 65 28 69 29  GetSQLiteType(i)
27e0: 2e 41 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20  .Affinity;..    
27f0: 20 20 73 77 69 74 63 68 20 28 61 66 66 69 6e 69    switch (affini
2800: 74 79 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ty).      {.    
2810: 20 20 20 20 63 61 73 65 20 54 79 70 65 41 66 66      case TypeAff
2820: 69 6e 69 74 79 2e 49 6e 74 36 34 3a 0a 20 20 20  inity.Int64:.   
2830: 20 20 20 20 20 20 20 69 66 20 28 74 79 70 20 3d         if (typ =
2840: 3d 20 44 62 54 79 70 65 2e 49 6e 74 31 36 29 20  = DbType.Int16) 
2850: 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74 79 3b  return affinity;
2860: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74  .          if (t
2870: 79 70 20 3d 3d 20 44 62 54 79 70 65 2e 49 6e 74  yp == DbType.Int
2880: 33 32 29 20 72 65 74 75 72 6e 20 61 66 66 69 6e  32) return affin
2890: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ity;.          i
28a0: 66 20 28 74 79 70 20 3d 3d 20 44 62 54 79 70 65  f (typ == DbType
28b0: 2e 49 6e 74 36 34 29 20 72 65 74 75 72 6e 20 61  .Int64) return a
28c0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
28d0: 20 20 20 69 66 20 28 74 79 70 20 3d 3d 20 44 62     if (typ == Db
28e0: 54 79 70 65 2e 42 6f 6f 6c 65 61 6e 29 20 72 65  Type.Boolean) re
28f0: 74 75 72 6e 20 61 66 66 69 6e 69 74 79 3b 0a 20  turn affinity;. 
2900: 20 20 20 20 20 20 20 20 20 69 66 20 28 74 79 70           if (typ
2910: 20 3d 3d 20 44 62 54 79 70 65 2e 42 79 74 65 29   == DbType.Byte)
2920: 20 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74 79   return affinity
2930: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ;.          if (
2940: 74 79 70 20 3d 3d 20 44 62 54 79 70 65 2e 44 61  typ == DbType.Da
2950: 74 65 54 69 6d 65 29 20 72 65 74 75 72 6e 20 61  teTime) return a
2960: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
2970: 20 20 20 69 66 20 28 74 79 70 20 3d 3d 20 44 62     if (typ == Db
2980: 54 79 70 65 2e 53 69 6e 67 6c 65 29 20 72 65 74  Type.Single) ret
2990: 75 72 6e 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  urn affinity;.  
29a0: 20 20 20 20 20 20 20 20 69 66 20 28 74 79 70 20          if (typ 
29b0: 3d 3d 20 44 62 54 79 70 65 2e 44 6f 75 62 6c 65  == DbType.Double
29c0: 29 20 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74  ) return affinit
29d0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  y;.          if 
29e0: 28 74 79 70 20 3d 3d 20 44 62 54 79 70 65 2e 44  (typ == DbType.D
29f0: 65 63 69 6d 61 6c 29 20 72 65 74 75 72 6e 20 61  ecimal) return a
2a00: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a20: 20 20 63 61 73 65 20 54 79 70 65 41 66 66 69 6e    case TypeAffin
2a30: 69 74 79 2e 44 6f 75 62 6c 65 3a 0a 20 20 20 20  ity.Double:.    
2a40: 20 20 20 20 20 20 69 66 20 28 74 79 70 20 3d 3d        if (typ ==
2a50: 20 44 62 54 79 70 65 2e 53 69 6e 67 6c 65 29 20   DbType.Single) 
2a60: 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74 79 3b  return affinity;
2a70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74  .          if (t
2a80: 79 70 20 3d 3d 20 44 62 54 79 70 65 2e 44 6f 75  yp == DbType.Dou
2a90: 62 6c 65 29 20 72 65 74 75 72 6e 20 61 66 66 69  ble) return affi
2aa0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
2ab0: 69 66 20 28 74 79 70 20 3d 3d 20 44 62 54 79 70  if (typ == DbTyp
2ac0: 65 2e 44 65 63 69 6d 61 6c 29 20 72 65 74 75 72  e.Decimal) retur
2ad0: 6e 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  n affinity;.    
2ae0: 20 20 20 20 20 20 69 66 20 28 74 79 70 20 3d 3d        if (typ ==
2af0: 20 44 62 54 79 70 65 2e 44 61 74 65 54 69 6d 65   DbType.DateTime
2b00: 29 20 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74  ) return affinit
2b10: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  y;.          bre
2b20: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
2b30: 20 54 79 70 65 41 66 66 69 6e 69 74 79 2e 54 65   TypeAffinity.Te
2b40: 78 74 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  xt:.          if
2b50: 20 28 74 79 70 20 3d 3d 20 44 62 54 79 70 65 2e   (typ == DbType.
2b60: 53 42 79 74 65 29 20 72 65 74 75 72 6e 20 61 66  SByte) return af
2b70: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
2b80: 20 20 69 66 20 28 74 79 70 20 3d 3d 20 44 62 54    if (typ == DbT
2b90: 79 70 65 2e 53 74 72 69 6e 67 29 20 72 65 74 75  ype.String) retu
2ba0: 72 6e 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  rn affinity;.   
2bb0: 20 20 20 20 20 20 20 69 66 20 28 74 79 70 20 3d         if (typ =
2bc0: 3d 20 44 62 54 79 70 65 2e 53 42 79 74 65 29 20  = DbType.SByte) 
2bd0: 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74 79 3b  return affinity;
2be0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74  .          if (t
2bf0: 79 70 20 3d 3d 20 44 62 54 79 70 65 2e 47 75 69  yp == DbType.Gui
2c00: 64 29 20 72 65 74 75 72 6e 20 61 66 66 69 6e 69  d) return affini
2c10: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ty;.          if
2c20: 20 28 74 79 70 20 3d 3d 20 44 62 54 79 70 65 2e   (typ == DbType.
2c30: 44 61 74 65 54 69 6d 65 29 20 72 65 74 75 72 6e  DateTime) return
2c40: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
2c50: 20 20 20 20 20 69 66 20 28 74 79 70 20 3d 3d 20       if (typ == 
2c60: 44 62 54 79 70 65 2e 44 65 63 69 6d 61 6c 29 20  DbType.Decimal) 
2c70: 72 65 74 75 72 6e 20 61 66 66 69 6e 69 74 79 3b  return affinity;
2c80: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2c90: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 54  ;.        case T
2ca0: 79 70 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62  ypeAffinity.Blob
2cb0: 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  :.          if (
2cc0: 74 79 70 20 3d 3d 20 44 62 54 79 70 65 2e 47 75  typ == DbType.Gu
2cd0: 69 64 29 20 72 65 74 75 72 6e 20 61 66 66 69 6e  id) return affin
2ce0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ity;.          i
2cf0: 66 20 28 74 79 70 20 3d 3d 20 44 62 54 79 70 65  f (typ == DbType
2d00: 2e 53 74 72 69 6e 67 29 20 72 65 74 75 72 6e 20  .String) return 
2d10: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
2d20: 20 20 20 20 69 66 20 28 74 79 70 20 3d 3d 20 44      if (typ == D
2d30: 62 54 79 70 65 2e 42 69 6e 61 72 79 29 20 72 65  bType.Binary) re
2d40: 74 75 72 6e 20 61 66 66 69 6e 69 74 79 3b 0a 20  turn affinity;. 
2d50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2d60: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 74        }..      t
2d70: 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64  hrow new Invalid
2d80: 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  CastException();
2d90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
2da0: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  <summary>.    //
2db0: 2f 20 52 65 74 72 69 65 76 65 73 20 74 68 65 20  / Retrieves the 
2dc0: 63 6f 6c 75 6d 6e 20 61 73 20 61 20 62 6f 6f 6c  column as a bool
2dd0: 65 61 6e 20 76 61 6c 75 65 0a 20 20 20 20 2f 2f  ean value.    //
2de0: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
2df0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
2e00: 3d 22 69 22 3e 54 68 65 20 69 6e 64 65 78 20 6f  ="i">The index o
2e10: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
2e20: 72 65 74 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e  retrieve</param>
2e30: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
2e40: 73 3e 62 6f 6f 6c 3c 2f 72 65 74 75 72 6e 73 3e  s>bool</returns>
2e50: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
2e60: 72 69 64 65 20 62 6f 6f 6c 20 47 65 74 42 6f 6f  ride bool GetBoo
2e70: 6c 65 61 6e 28 69 6e 74 20 69 29 0a 20 20 20 20  lean(int i).    
2e80: 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44 69 73  {.      CheckDis
2e90: 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20 20 20 20  posed();..      
2ea0: 69 66 20 28 69 20 3e 3d 20 56 69 73 69 62 6c 65  if (i >= Visible
2eb0: 46 69 65 6c 64 43 6f 75 6e 74 20 26 26 20 5f 6b  FieldCount && _k
2ec0: 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c 29 0a  eyInfo != null).
2ed0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f          return _
2ee0: 6b 65 79 49 6e 66 6f 2e 47 65 74 42 6f 6f 6c 65  keyInfo.GetBoole
2ef0: 61 6e 28 69 20 2d 20 56 69 73 69 62 6c 65 46 69  an(i - VisibleFi
2f00: 65 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20 20 20 20  eldCount);..    
2f10: 20 20 56 65 72 69 66 79 54 79 70 65 28 69 2c 20    VerifyType(i, 
2f20: 44 62 54 79 70 65 2e 42 6f 6f 6c 65 61 6e 29 3b  DbType.Boolean);
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 43 6f  .      return Co
2f40: 6e 76 65 72 74 2e 54 6f 42 6f 6f 6c 65 61 6e 28  nvert.ToBoolean(
2f50: 47 65 74 56 61 6c 75 65 28 69 29 2c 20 43 75 6c  GetValue(i), Cul
2f60: 74 75 72 65 49 6e 66 6f 2e 43 75 72 72 65 6e 74  tureInfo.Current
2f70: 43 75 6c 74 75 72 65 29 3b 0a 20 20 20 20 7d 0a  Culture);.    }.
2f80: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
2f90: 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65 74 72 69  y>.    /// Retri
2fa0: 65 76 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  eves the column 
2fb0: 61 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  as a single byte
2fc0: 20 76 61 6c 75 65 0a 20 20 20 20 2f 2f 2f 20 3c   value.    /// <
2fd0: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  /summary>.    //
2fe0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
2ff0: 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  ">The index of t
3000: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  he column to ret
3010: 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20  rieve</param>.  
3020: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 62    /// <returns>b
3030: 79 74 65 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20  yte</returns>.  
3040: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
3050: 65 20 62 79 74 65 20 47 65 74 42 79 74 65 28 69  e byte GetByte(i
3060: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
3070: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
3080: 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 69 20  );..      if (i 
3090: 3e 3d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43  >= VisibleFieldC
30a0: 6f 75 6e 74 20 26 26 20 5f 6b 65 79 49 6e 66 6f  ount && _keyInfo
30b0: 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20   != null).      
30c0: 20 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66    return _keyInf
30d0: 6f 2e 47 65 74 42 79 74 65 28 69 20 2d 20 56 69  o.GetByte(i - Vi
30e0: 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 29  sibleFieldCount)
30f0: 3b 0a 0a 20 20 20 20 20 20 56 65 72 69 66 79 54  ;..      VerifyT
3100: 79 70 65 28 69 2c 20 44 62 54 79 70 65 2e 42 79  ype(i, DbType.By
3110: 74 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  te);.      retur
3120: 6e 20 43 6f 6e 76 65 72 74 2e 54 6f 42 79 74 65  n Convert.ToByte
3130: 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65 6e  (_activeStatemen
3140: 74 2e 5f 73 71 6c 2e 47 65 74 49 6e 74 33 32 28  t._sql.GetInt32(
3150: 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65 6e 74  _activeStatement
3160: 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , i));.    }..  
3170: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
3180: 20 20 20 20 2f 2f 2f 20 52 65 74 72 69 65 76 65      /// Retrieve
3190: 73 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 61 6e  s a column as an
31a0: 20 61 72 72 61 79 20 6f 66 20 62 79 74 65 73 20   array of bytes 
31b0: 28 62 6c 6f 62 29 0a 20 20 20 20 2f 2f 2f 20 3c  (blob).    /// <
31c0: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  /summary>.    //
31d0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
31e0: 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  ">The index of t
31f0: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  he column to ret
3200: 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20  rieve</param>.  
3210: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
3220: 65 3d 22 66 69 65 6c 64 4f 66 66 73 65 74 22 3e  e="fieldOffset">
3230: 54 68 65 20 7a 65 72 6f 2d 62 61 73 65 64 20 69  The zero-based i
3240: 6e 64 65 78 20 6f 66 20 77 68 65 72 65 20 74 6f  ndex of where to
3250: 20 62 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   begin reading t
3260: 68 65 20 64 61 74 61 3c 2f 70 61 72 61 6d 3e 0a  he data</param>.
3270: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
3280: 61 6d 65 3d 22 62 75 66 66 65 72 22 3e 54 68 65  ame="buffer">The
3290: 20 62 75 66 66 65 72 20 74 6f 20 77 72 69 74 65   buffer to write
32a0: 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 3c   the bytes into<
32b0: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20  /param>.    /// 
32c0: 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 62 75 66  <param name="buf
32d0: 66 65 72 6f 66 66 73 65 74 22 3e 54 68 65 20 7a  feroffset">The z
32e0: 65 72 6f 2d 62 61 73 65 64 20 69 6e 64 65 78 20  ero-based index 
32f0: 6f 66 20 77 68 65 72 65 20 74 6f 20 62 65 67 69  of where to begi
3300: 6e 20 77 72 69 74 69 6e 67 20 69 6e 74 6f 20 74  n writing into t
3310: 68 65 20 61 72 72 61 79 3c 2f 70 61 72 61 6d 3e  he array</param>
3320: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
3330: 6e 61 6d 65 3d 22 6c 65 6e 67 74 68 22 3e 54 68  name="length">Th
3340: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
3350: 73 20 74 6f 20 72 65 74 72 69 65 76 65 3c 2f 70  s to retrieve</p
3360: 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72  aram>.    /// <r
3370: 65 74 75 72 6e 73 3e 54 68 65 20 61 63 74 75 61  eturns>The actua
3380: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
3390: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
33a0: 68 65 20 61 72 72 61 79 3c 2f 72 65 74 75 72 6e  he array</return
33b0: 73 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d 61  s>.    /// <rema
33c0: 72 6b 73 3e 0a 20 20 20 20 2f 2f 2f 20 54 6f 20  rks>.    /// To 
33d0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75  determine the nu
33e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
33f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 70 61 73   the column, pas
3400: 73 20 61 20 6e 75 6c 6c 20 76 61 6c 75 65 20 66  s a null value f
3410: 6f 72 20 74 68 65 20 62 75 66 66 65 72 2e 20 20  or the buffer.  
3420: 54 68 65 20 74 6f 74 61 6c 20 6c 65 6e 67 74 68  The total length
3430: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
3440: 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d  d..    /// </rem
3450: 61 72 6b 73 3e 0a 20 20 20 20 70 75 62 6c 69 63  arks>.    public
3460: 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67 20 47   override long G
3470: 65 74 42 79 74 65 73 28 69 6e 74 20 69 2c 20 6c  etBytes(int i, l
3480: 6f 6e 67 20 66 69 65 6c 64 4f 66 66 73 65 74 2c  ong fieldOffset,
3490: 20 62 79 74 65 5b 5d 20 62 75 66 66 65 72 2c 20   byte[] buffer, 
34a0: 69 6e 74 20 62 75 66 66 65 72 6f 66 66 73 65 74  int bufferoffset
34b0: 2c 20 69 6e 74 20 6c 65 6e 67 74 68 29 0a 20 20  , int length).  
34c0: 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44    {.      CheckD
34d0: 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20 20  isposed();..    
34e0: 20 20 69 66 20 28 69 20 3e 3d 20 56 69 73 69 62    if (i >= Visib
34f0: 6c 65 46 69 65 6c 64 43 6f 75 6e 74 20 26 26 20  leFieldCount && 
3500: 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c  _keyInfo != null
3510: 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ).        return
3520: 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 42 79 74   _keyInfo.GetByt
3530: 65 73 28 69 20 2d 20 56 69 73 69 62 6c 65 46 69  es(i - VisibleFi
3540: 65 6c 64 43 6f 75 6e 74 2c 20 66 69 65 6c 64 4f  eldCount, fieldO
3550: 66 66 73 65 74 2c 20 62 75 66 66 65 72 2c 20 62  ffset, buffer, b
3560: 75 66 66 65 72 6f 66 66 73 65 74 2c 20 6c 65 6e  ufferoffset, len
3570: 67 74 68 29 3b 0a 0a 20 20 20 20 20 20 56 65 72  gth);..      Ver
3580: 69 66 79 54 79 70 65 28 69 2c 20 44 62 54 79 70  ifyType(i, DbTyp
3590: 65 2e 42 69 6e 61 72 79 29 3b 0a 20 20 20 20 20  e.Binary);.     
35a0: 20 72 65 74 75 72 6e 20 5f 61 63 74 69 76 65 53   return _activeS
35b0: 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47 65  tatement._sql.Ge
35c0: 74 42 79 74 65 73 28 5f 61 63 74 69 76 65 53 74  tBytes(_activeSt
35d0: 61 74 65 6d 65 6e 74 2c 20 69 2c 20 28 69 6e 74  atement, i, (int
35e0: 29 66 69 65 6c 64 4f 66 66 73 65 74 2c 20 62 75  )fieldOffset, bu
35f0: 66 66 65 72 2c 20 62 75 66 66 65 72 6f 66 66 73  ffer, bufferoffs
3600: 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20  et, length);.   
3610: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d   }..    /// <sum
3620: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65  mary>.    /// Re
3630: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  turns the column
3640: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68 61   as a single cha
3650: 72 61 63 74 65 72 0a 20 20 20 20 2f 2f 2f 20 3c  racter.    /// <
3660: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  /summary>.    //
3670: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
3680: 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  ">The index of t
3690: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  he column to ret
36a0: 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20  rieve</param>.  
36b0: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 63    /// <returns>c
36c0: 68 61 72 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20  har</returns>.  
36d0: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
36e0: 65 20 63 68 61 72 20 47 65 74 43 68 61 72 28 69  e char GetChar(i
36f0: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
3700: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
3710: 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 69 20  );..      if (i 
3720: 3e 3d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43  >= VisibleFieldC
3730: 6f 75 6e 74 20 26 26 20 5f 6b 65 79 49 6e 66 6f  ount && _keyInfo
3740: 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20   != null).      
3750: 20 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66    return _keyInf
3760: 6f 2e 47 65 74 43 68 61 72 28 69 20 2d 20 56 69  o.GetChar(i - Vi
3770: 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 29  sibleFieldCount)
3780: 3b 0a 0a 20 20 20 20 20 20 56 65 72 69 66 79 54  ;..      VerifyT
3790: 79 70 65 28 69 2c 20 44 62 54 79 70 65 2e 53 42  ype(i, DbType.SB
37a0: 79 74 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  yte);.      retu
37b0: 72 6e 20 43 6f 6e 76 65 72 74 2e 54 6f 43 68 61  rn Convert.ToCha
37c0: 72 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65  r(_activeStateme
37d0: 6e 74 2e 5f 73 71 6c 2e 47 65 74 49 6e 74 33 32  nt._sql.GetInt32
37e0: 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65 6e  (_activeStatemen
37f0: 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  t, i));.    }.. 
3800: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
3810: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 72 69 65 76  .    /// Retriev
3820: 65 73 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 61  es a column as a
3830: 6e 20 61 72 72 61 79 20 6f 66 20 63 68 61 72 73  n array of chars
3840: 20 28 62 6c 6f 62 29 0a 20 20 20 20 2f 2f 2f 20   (blob).    /// 
3850: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f  </summary>.    /
3860: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
3870: 69 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20  i">The index of 
3880: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65  the column to re
3890: 74 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20  trieve</param>. 
38a0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
38b0: 6d 65 3d 22 66 69 65 6c 64 6f 66 66 73 65 74 22  me="fieldoffset"
38c0: 3e 54 68 65 20 7a 65 72 6f 2d 62 61 73 65 64 20  >The zero-based 
38d0: 69 6e 64 65 78 20 6f 66 20 77 68 65 72 65 20 74  index of where t
38e0: 6f 20 62 65 67 69 6e 20 72 65 61 64 69 6e 67 20  o begin reading 
38f0: 74 68 65 20 64 61 74 61 3c 2f 70 61 72 61 6d 3e  the data</param>
3900: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
3910: 6e 61 6d 65 3d 22 62 75 66 66 65 72 22 3e 54 68  name="buffer">Th
3920: 65 20 62 75 66 66 65 72 20 74 6f 20 77 72 69 74  e buffer to writ
3930: 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72 73  e the characters
3940: 20 69 6e 74 6f 3c 2f 70 61 72 61 6d 3e 0a 20 20   into</param>.  
3950: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d    /// <param nam
3960: 65 3d 22 62 75 66 66 65 72 6f 66 66 73 65 74 22  e="bufferoffset"
3970: 3e 54 68 65 20 7a 65 72 6f 2d 62 61 73 65 64 20  >The zero-based 
3980: 69 6e 64 65 78 20 6f 66 20 77 68 65 72 65 20 74  index of where t
3990: 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
39a0: 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 3c 2f  into the array</
39b0: 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c  param>.    /// <
39c0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6c 65 6e 67  param name="leng
39d0: 74 68 22 3e 54 68 65 20 6e 75 6d 62 65 72 20 6f  th">The number o
39e0: 66 20 62 79 74 65 73 20 74 6f 20 72 65 74 72 69  f bytes to retri
39f0: 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20  eve</param>.    
3a00: 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 54 68 65  /// <returns>The
3a10: 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f   actual number o
3a20: 66 20 63 68 61 72 61 63 74 65 72 73 20 77 72 69  f characters wri
3a30: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 61 72  tten into the ar
3a40: 72 61 79 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20  ray</returns>.  
3a50: 20 20 2f 2f 2f 20 3c 72 65 6d 61 72 6b 73 3e 0a    /// <remarks>.
3a60: 20 20 20 20 2f 2f 2f 20 54 6f 20 64 65 74 65 72      /// To deter
3a70: 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mine the number 
3a80: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
3a90: 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 70 61 73   the column, pas
3aa0: 73 20 61 20 6e 75 6c 6c 20 76 61 6c 75 65 20 66  s a null value f
3ab0: 6f 72 20 74 68 65 20 62 75 66 66 65 72 2e 20 20  or the buffer.  
3ac0: 54 68 65 20 74 6f 74 61 6c 20 6c 65 6e 67 74 68  The total length
3ad0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
3ae0: 64 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d  d..    /// </rem
3af0: 61 72 6b 73 3e 0a 20 20 20 20 70 75 62 6c 69 63  arks>.    public
3b00: 20 6f 76 65 72 72 69 64 65 20 6c 6f 6e 67 20 47   override long G
3b10: 65 74 43 68 61 72 73 28 69 6e 74 20 69 2c 20 6c  etChars(int i, l
3b20: 6f 6e 67 20 66 69 65 6c 64 6f 66 66 73 65 74 2c  ong fieldoffset,
3b30: 20 63 68 61 72 5b 5d 20 62 75 66 66 65 72 2c 20   char[] buffer, 
3b40: 69 6e 74 20 62 75 66 66 65 72 6f 66 66 73 65 74  int bufferoffset
3b50: 2c 20 69 6e 74 20 6c 65 6e 67 74 68 29 0a 20 20  , int length).  
3b60: 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44    {.      CheckD
3b70: 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20 20  isposed();..    
3b80: 20 20 69 66 20 28 69 20 3e 3d 20 56 69 73 69 62    if (i >= Visib
3b90: 6c 65 46 69 65 6c 64 43 6f 75 6e 74 20 26 26 20  leFieldCount && 
3ba0: 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c  _keyInfo != null
3bb0: 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ).        return
3bc0: 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 43 68 61   _keyInfo.GetCha
3bd0: 72 73 28 69 20 2d 20 56 69 73 69 62 6c 65 46 69  rs(i - VisibleFi
3be0: 65 6c 64 43 6f 75 6e 74 2c 20 66 69 65 6c 64 6f  eldCount, fieldo
3bf0: 66 66 73 65 74 2c 20 62 75 66 66 65 72 2c 20 62  ffset, buffer, b
3c00: 75 66 66 65 72 6f 66 66 73 65 74 2c 20 6c 65 6e  ufferoffset, len
3c10: 67 74 68 29 3b 0a 0a 20 20 20 20 20 20 56 65 72  gth);..      Ver
3c20: 69 66 79 54 79 70 65 28 69 2c 20 44 62 54 79 70  ifyType(i, DbTyp
3c30: 65 2e 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 20  e.String);.     
3c40: 20 72 65 74 75 72 6e 20 5f 61 63 74 69 76 65 53   return _activeS
3c50: 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47 65  tatement._sql.Ge
3c60: 74 43 68 61 72 73 28 5f 61 63 74 69 76 65 53 74  tChars(_activeSt
3c70: 61 74 65 6d 65 6e 74 2c 20 69 2c 20 28 69 6e 74  atement, i, (int
3c80: 29 66 69 65 6c 64 6f 66 66 73 65 74 2c 20 62 75  )fieldoffset, bu
3c90: 66 66 65 72 2c 20 62 75 66 66 65 72 6f 66 66 73  ffer, bufferoffs
3ca0: 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20  et, length);.   
3cb0: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d   }..    /// <sum
3cc0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65  mary>.    /// Re
3cd0: 74 72 69 65 76 65 73 20 74 68 65 20 6e 61 6d 65  trieves the name
3ce0: 20 6f 66 20 74 68 65 20 62 61 63 6b 2d 65 6e 64   of the back-end
3cf0: 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68 65   datatype of the
3d00: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2f 2f 2f 20   column.    /// 
3d10: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f  </summary>.    /
3d20: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
3d30: 69 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20  i">The index of 
3d40: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65  the column to re
3d50: 74 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20  trieve</param>. 
3d60: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
3d70: 73 74 72 69 6e 67 3c 2f 72 65 74 75 72 6e 73 3e  string</returns>
3d80: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
3d90: 72 69 64 65 20 73 74 72 69 6e 67 20 47 65 74 44  ride string GetD
3da0: 61 74 61 54 79 70 65 4e 61 6d 65 28 69 6e 74 20  ataTypeName(int 
3db0: 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 43  i).    {.      C
3dc0: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a  heckDisposed();.
3dd0: 0a 20 20 20 20 20 20 69 66 20 28 69 20 3e 3d 20  .      if (i >= 
3de0: 56 69 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e  VisibleFieldCoun
3df0: 74 20 26 26 20 5f 6b 65 79 49 6e 66 6f 20 21 3d  t && _keyInfo !=
3e00: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 72   null).        r
3e10: 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47  eturn _keyInfo.G
3e20: 65 74 44 61 74 61 54 79 70 65 4e 61 6d 65 28 69  etDataTypeName(i
3e30: 20 2d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43   - VisibleFieldC
3e40: 6f 75 6e 74 29 3b 0a 0a 20 20 20 20 20 20 53 51  ount);..      SQ
3e50: 4c 69 74 65 54 79 70 65 20 74 79 70 20 3d 20 47  LiteType typ = G
3e60: 65 74 53 51 4c 69 74 65 54 79 70 65 28 69 29 3b  etSQLiteType(i);
3e70: 0a 20 20 20 20 20 20 69 66 20 28 74 79 70 2e 54  .      if (typ.T
3e80: 79 70 65 20 3d 3d 20 44 62 54 79 70 65 2e 4f 62  ype == DbType.Ob
3e90: 6a 65 63 74 29 20 72 65 74 75 72 6e 20 53 51 4c  ject) return SQL
3ea0: 69 74 65 43 6f 6e 76 65 72 74 2e 53 51 4c 69 74  iteConvert.SQLit
3eb0: 65 54 79 70 65 54 6f 54 79 70 65 28 74 79 70 29  eTypeToType(typ)
3ec0: 2e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 72 65 74  .Name;.      ret
3ed0: 75 72 6e 20 5f 61 63 74 69 76 65 53 74 61 74 65  urn _activeState
3ee0: 6d 65 6e 74 2e 5f 73 71 6c 2e 43 6f 6c 75 6d 6e  ment._sql.Column
3ef0: 54 79 70 65 28 5f 61 63 74 69 76 65 53 74 61 74  Type(_activeStat
3f00: 65 6d 65 6e 74 2c 20 69 2c 20 6f 75 74 20 74 79  ement, i, out ty
3f10: 70 2e 41 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  p.Affinity);.   
3f20: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d   }..    /// <sum
3f30: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65  mary>.    /// Re
3f40: 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 75 6d  trieve the colum
3f50: 6e 20 61 73 20 61 20 64 61 74 65 2f 74 69 6d 65  n as a date/time
3f60: 20 76 61 6c 75 65 0a 20 20 20 20 2f 2f 2f 20 3c   value.    /// <
3f70: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  /summary>.    //
3f80: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
3f90: 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  ">The index of t
3fa0: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  he column to ret
3fb0: 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20  rieve</param>.  
3fc0: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 44    /// <returns>D
3fd0: 61 74 65 54 69 6d 65 3c 2f 72 65 74 75 72 6e 73  ateTime</returns
3fe0: 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  >.    public ove
3ff0: 72 72 69 64 65 20 44 61 74 65 54 69 6d 65 20 47  rride DateTime G
4000: 65 74 44 61 74 65 54 69 6d 65 28 69 6e 74 20 69  etDateTime(int i
4010: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 43 68  ).    {.      Ch
4020: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a  eckDisposed();..
4030: 20 20 20 20 20 20 69 66 20 28 69 20 3e 3d 20 56        if (i >= V
4040: 69 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74  isibleFieldCount
4050: 20 26 26 20 5f 6b 65 79 49 6e 66 6f 20 21 3d 20   && _keyInfo != 
4060: 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 72 65  null).        re
4070: 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47 65  turn _keyInfo.Ge
4080: 74 44 61 74 65 54 69 6d 65 28 69 20 2d 20 56 69  tDateTime(i - Vi
4090: 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 29  sibleFieldCount)
40a0: 3b 0a 0a 20 20 20 20 20 20 56 65 72 69 66 79 54  ;..      VerifyT
40b0: 79 70 65 28 69 2c 20 44 62 54 79 70 65 2e 44 61  ype(i, DbType.Da
40c0: 74 65 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 72  teTime);.      r
40d0: 65 74 75 72 6e 20 5f 61 63 74 69 76 65 53 74 61  eturn _activeSta
40e0: 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47 65 74 44  tement._sql.GetD
40f0: 61 74 65 54 69 6d 65 28 5f 61 63 74 69 76 65 53  ateTime(_activeS
4100: 74 61 74 65 6d 65 6e 74 2c 20 69 29 3b 0a 20 20  tatement, i);.  
4110: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    }..    /// <su
4120: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52  mmary>.    /// R
4130: 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c 75  etrieve the colu
4140: 6d 6e 20 61 73 20 61 20 64 65 63 69 6d 61 6c 20  mn as a decimal 
4150: 76 61 6c 75 65 0a 20 20 20 20 2f 2f 2f 20 3c 2f  value.    /// </
4160: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
4170: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 22   <param name="i"
4180: 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68  >The index of th
4190: 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72  e column to retr
41a0: 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20  ieve</param>.   
41b0: 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 64 65   /// <returns>de
41c0: 63 69 6d 61 6c 3c 2f 72 65 74 75 72 6e 73 3e 0a  cimal</returns>.
41d0: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
41e0: 69 64 65 20 64 65 63 69 6d 61 6c 20 47 65 74 44  ide decimal GetD
41f0: 65 63 69 6d 61 6c 28 69 6e 74 20 69 29 0a 20 20  ecimal(int i).  
4200: 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44    {.      CheckD
4210: 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20 20  isposed();..    
4220: 20 20 69 66 20 28 69 20 3e 3d 20 56 69 73 69 62    if (i >= Visib
4230: 6c 65 46 69 65 6c 64 43 6f 75 6e 74 20 26 26 20  leFieldCount && 
4240: 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c  _keyInfo != null
4250: 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ).        return
4260: 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 44 65 63   _keyInfo.GetDec
4270: 69 6d 61 6c 28 69 20 2d 20 56 69 73 69 62 6c 65  imal(i - Visible
4280: 46 69 65 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20 20  FieldCount);..  
4290: 20 20 20 20 56 65 72 69 66 79 54 79 70 65 28 69      VerifyType(i
42a0: 2c 20 44 62 54 79 70 65 2e 44 65 63 69 6d 61 6c  , DbType.Decimal
42b0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
42c0: 44 65 63 69 6d 61 6c 2e 50 61 72 73 65 28 5f 61  Decimal.Parse(_a
42d0: 63 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f  ctiveStatement._
42e0: 73 71 6c 2e 47 65 74 54 65 78 74 28 5f 61 63 74  sql.GetText(_act
42f0: 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20 69 29  iveStatement, i)
4300: 2c 20 4e 75 6d 62 65 72 53 74 79 6c 65 73 2e 41  , NumberStyles.A
4310: 6c 6c 6f 77 44 65 63 69 6d 61 6c 50 6f 69 6e 74  llowDecimalPoint
4320: 20 7c 20 4e 75 6d 62 65 72 53 74 79 6c 65 73 2e   | NumberStyles.
4330: 41 6c 6c 6f 77 45 78 70 6f 6e 65 6e 74 20 7c 20  AllowExponent | 
4340: 4e 75 6d 62 65 72 53 74 79 6c 65 73 2e 41 6c 6c  NumberStyles.All
4350: 6f 77 4c 65 61 64 69 6e 67 53 69 67 6e 2c 20 43  owLeadingSign, C
4360: 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72  ultureInfo.Invar
4370: 69 61 6e 74 43 75 6c 74 75 72 65 29 3b 0a 20 20  iantCulture);.  
4380: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    }..    /// <su
4390: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52  mmary>.    /// R
43a0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 75 6d  eturns the colum
43b0: 6e 20 61 73 20 61 20 64 6f 75 62 6c 65 0a 20 20  n as a double.  
43c0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
43d0: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
43e0: 6e 61 6d 65 3d 22 69 22 3e 54 68 65 20 69 6e 64  name="i">The ind
43f0: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
4400: 20 74 6f 20 72 65 74 72 69 65 76 65 3c 2f 70 61   to retrieve</pa
4410: 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65  ram>.    /// <re
4420: 74 75 72 6e 73 3e 64 6f 75 62 6c 65 3c 2f 72 65  turns>double</re
4430: 74 75 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69  turns>.    publi
4440: 63 20 6f 76 65 72 72 69 64 65 20 64 6f 75 62 6c  c override doubl
4450: 65 20 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 20  e GetDouble(int 
4460: 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 43  i).    {.      C
4470: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a  heckDisposed();.
4480: 0a 20 20 20 20 20 20 69 66 20 28 69 20 3e 3d 20  .      if (i >= 
4490: 56 69 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e  VisibleFieldCoun
44a0: 74 20 26 26 20 5f 6b 65 79 49 6e 66 6f 20 21 3d  t && _keyInfo !=
44b0: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 72   null).        r
44c0: 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47  eturn _keyInfo.G
44d0: 65 74 44 6f 75 62 6c 65 28 69 20 2d 20 56 69 73  etDouble(i - Vis
44e0: 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 29 3b  ibleFieldCount);
44f0: 0a 0a 20 20 20 20 20 20 56 65 72 69 66 79 54 79  ..      VerifyTy
4500: 70 65 28 69 2c 20 44 62 54 79 70 65 2e 44 6f 75  pe(i, DbType.Dou
4510: 62 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ble);.      retu
4520: 72 6e 20 5f 61 63 74 69 76 65 53 74 61 74 65 6d  rn _activeStatem
4530: 65 6e 74 2e 5f 73 71 6c 2e 47 65 74 44 6f 75 62  ent._sql.GetDoub
4540: 6c 65 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d  le(_activeStatem
4550: 65 6e 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 0a  ent, i);.    }..
4560: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
4570: 3e 0a 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e  >.    /// Return
4580: 73 20 74 68 65 20 2e 4e 45 54 20 74 79 70 65 20  s the .NET type 
4590: 6f 66 20 61 20 67 69 76 65 6e 20 63 6f 6c 75 6d  of a given colum
45a0: 6e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  n.    /// </summ
45b0: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ary>.    /// <pa
45c0: 72 61 6d 20 6e 61 6d 65 3d 22 69 22 3e 54 68 65  ram name="i">The
45d0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
45e0: 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69 65 76 65  lumn to retrieve
45f0: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f  </param>.    ///
4600: 20 3c 72 65 74 75 72 6e 73 3e 54 79 70 65 3c 2f   <returns>Type</
4610: 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 70 75 62  returns>.    pub
4620: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 54 79 70  lic override Typ
4630: 65 20 47 65 74 46 69 65 6c 64 54 79 70 65 28 69  e GetFieldType(i
4640: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
4650: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
4660: 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 69 20  );..      if (i 
4670: 3e 3d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43  >= VisibleFieldC
4680: 6f 75 6e 74 20 26 26 20 5f 6b 65 79 49 6e 66 6f  ount && _keyInfo
4690: 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20   != null).      
46a0: 20 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66    return _keyInf
46b0: 6f 2e 47 65 74 46 69 65 6c 64 54 79 70 65 28 69  o.GetFieldType(i
46c0: 20 2d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43   - VisibleFieldC
46d0: 6f 75 6e 74 29 3b 0a 0a 20 20 20 20 20 20 72 65  ount);..      re
46e0: 74 75 72 6e 20 53 51 4c 69 74 65 43 6f 6e 76 65  turn SQLiteConve
46f0: 72 74 2e 53 51 4c 69 74 65 54 79 70 65 54 6f 54  rt.SQLiteTypeToT
4700: 79 70 65 28 47 65 74 53 51 4c 69 74 65 54 79 70  ype(GetSQLiteTyp
4710: 65 28 69 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e(i));.    }..  
4720: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
4730: 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20      /// Returns 
4740: 61 20 63 6f 6c 75 6d 6e 20 61 73 20 61 20 66 6c  a column as a fl
4750: 6f 61 74 20 76 61 6c 75 65 0a 20 20 20 20 2f 2f  oat value.    //
4760: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
4770: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
4780: 3d 22 69 22 3e 54 68 65 20 69 6e 64 65 78 20 6f  ="i">The index o
4790: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
47a0: 72 65 74 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e  retrieve</param>
47b0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
47c0: 73 3e 66 6c 6f 61 74 3c 2f 72 65 74 75 72 6e 73  s>float</returns
47d0: 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  >.    public ove
47e0: 72 72 69 64 65 20 66 6c 6f 61 74 20 47 65 74 46  rride float GetF
47f0: 6c 6f 61 74 28 69 6e 74 20 69 29 0a 20 20 20 20  loat(int i).    
4800: 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44 69 73  {.      CheckDis
4810: 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20 20 20 20  posed();..      
4820: 69 66 20 28 69 20 3e 3d 20 56 69 73 69 62 6c 65  if (i >= Visible
4830: 46 69 65 6c 64 43 6f 75 6e 74 20 26 26 20 5f 6b  FieldCount && _k
4840: 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c 29 0a  eyInfo != null).
4850: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f          return _
4860: 6b 65 79 49 6e 66 6f 2e 47 65 74 46 6c 6f 61 74  keyInfo.GetFloat
4870: 28 69 20 2d 20 56 69 73 69 62 6c 65 46 69 65 6c  (i - VisibleFiel
4880: 64 43 6f 75 6e 74 29 3b 0a 0a 20 20 20 20 20 20  dCount);..      
4890: 56 65 72 69 66 79 54 79 70 65 28 69 2c 20 44 62  VerifyType(i, Db
48a0: 54 79 70 65 2e 53 69 6e 67 6c 65 29 3b 0a 20 20  Type.Single);.  
48b0: 20 20 20 20 72 65 74 75 72 6e 20 43 6f 6e 76 65      return Conve
48c0: 72 74 2e 54 6f 53 69 6e 67 6c 65 28 5f 61 63 74  rt.ToSingle(_act
48d0: 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f 73 71  iveStatement._sq
48e0: 6c 2e 47 65 74 44 6f 75 62 6c 65 28 5f 61 63 74  l.GetDouble(_act
48f0: 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20 69 29  iveStatement, i)
4900: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  );.    }..    //
4910: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
4920: 2f 2f 2f 20 52 65 74 75 72 6e 73 20 74 68 65 20  /// Returns the 
4930: 63 6f 6c 75 6d 6e 20 61 73 20 61 20 47 75 69 64  column as a Guid
4940: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
4950: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ry>.    /// <par
4960: 61 6d 20 6e 61 6d 65 3d 22 69 22 3e 54 68 65 20  am name="i">The 
4970: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
4980: 75 6d 6e 20 74 6f 20 72 65 74 72 69 65 76 65 3c  umn to retrieve<
4990: 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20  /param>.    /// 
49a0: 3c 72 65 74 75 72 6e 73 3e 47 75 69 64 3c 2f 72  <returns>Guid</r
49b0: 65 74 75 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c  eturns>.    publ
49c0: 69 63 20 6f 76 65 72 72 69 64 65 20 47 75 69 64  ic override Guid
49d0: 20 47 65 74 47 75 69 64 28 69 6e 74 20 69 29 0a   GetGuid(int i).
49e0: 20 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63      {.      Chec
49f0: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20  kDisposed();..  
4a00: 20 20 20 20 69 66 20 28 69 20 3e 3d 20 56 69 73      if (i >= Vis
4a10: 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 20 26  ibleFieldCount &
4a20: 26 20 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75  & _keyInfo != nu
4a30: 6c 6c 29 0a 20 20 20 20 20 20 20 20 72 65 74 75  ll).        retu
4a40: 72 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 47  rn _keyInfo.GetG
4a50: 75 69 64 28 69 20 2d 20 56 69 73 69 62 6c 65 46  uid(i - VisibleF
4a60: 69 65 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20 20 20  ieldCount);..   
4a70: 20 20 20 54 79 70 65 41 66 66 69 6e 69 74 79 20     TypeAffinity 
4a80: 61 66 66 69 6e 69 74 79 20 3d 20 56 65 72 69 66  affinity = Verif
4a90: 79 54 79 70 65 28 69 2c 20 44 62 54 79 70 65 2e  yType(i, DbType.
4aa0: 47 75 69 64 29 3b 0a 20 20 20 20 20 20 69 66 20  Guid);.      if 
4ab0: 28 61 66 66 69 6e 69 74 79 20 3d 3d 20 54 79 70  (affinity == Typ
4ac0: 65 41 66 66 69 6e 69 74 79 2e 42 6c 6f 62 29 0a  eAffinity.Blob).
4ad0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
4ae0: 62 79 74 65 5b 5d 20 62 75 66 66 65 72 20 3d 20  byte[] buffer = 
4af0: 6e 65 77 20 62 79 74 65 5b 31 36 5d 3b 0a 20 20  new byte[16];.  
4b00: 20 20 20 20 20 20 5f 61 63 74 69 76 65 53 74 61        _activeSta
4b10: 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47 65 74 42  tement._sql.GetB
4b20: 79 74 65 73 28 5f 61 63 74 69 76 65 53 74 61 74  ytes(_activeStat
4b30: 65 6d 65 6e 74 2c 20 69 2c 20 30 2c 20 62 75 66  ement, i, 0, buf
4b40: 66 65 72 2c 20 30 2c 20 31 36 29 3b 0a 20 20 20  fer, 0, 16);.   
4b50: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20       return new 
4b60: 47 75 69 64 28 62 75 66 66 65 72 29 3b 0a 20 20  Guid(buffer);.  
4b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
4b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4b90: 6e 65 77 20 47 75 69 64 28 5f 61 63 74 69 76 65  new Guid(_active
4ba0: 53 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47  Statement._sql.G
4bb0: 65 74 54 65 78 74 28 5f 61 63 74 69 76 65 53 74  etText(_activeSt
4bc0: 61 74 65 6d 65 6e 74 2c 20 69 29 29 3b 0a 20 20  atement, i));.  
4bd0: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    }..    /// <su
4be0: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52  mmary>.    /// R
4bf0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 75 6d  eturns the colum
4c00: 6e 20 61 73 20 61 20 73 68 6f 72 74 0a 20 20 20  n as a short.   
4c10: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
4c20: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
4c30: 61 6d 65 3d 22 69 22 3e 54 68 65 20 69 6e 64 65  ame="i">The inde
4c40: 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
4c50: 74 6f 20 72 65 74 72 69 65 76 65 3c 2f 70 61 72  to retrieve</par
4c60: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  am>.    /// <ret
4c70: 75 72 6e 73 3e 49 6e 74 31 36 3c 2f 72 65 74 75  urns>Int16</retu
4c80: 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20  rns>.    public 
4c90: 6f 76 65 72 72 69 64 65 20 49 6e 74 31 36 20 47  override Int16 G
4ca0: 65 74 49 6e 74 31 36 28 69 6e 74 20 69 29 0a 20  etInt16(int i). 
4cb0: 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b     {.      Check
4cc0: 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20  Disposed();..   
4cd0: 20 20 20 69 66 20 28 69 20 3e 3d 20 56 69 73 69     if (i >= Visi
4ce0: 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 20 26 26  bleFieldCount &&
4cf0: 20 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c   _keyInfo != nul
4d00: 6c 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  l).        retur
4d10: 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 49 6e  n _keyInfo.GetIn
4d20: 74 31 36 28 69 20 2d 20 56 69 73 69 62 6c 65 46  t16(i - VisibleF
4d30: 69 65 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20 20 20  ieldCount);..   
4d40: 20 20 20 56 65 72 69 66 79 54 79 70 65 28 69 2c     VerifyType(i,
4d50: 20 44 62 54 79 70 65 2e 49 6e 74 31 36 29 3b 0a   DbType.Int16);.
4d60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 43 6f 6e        return Con
4d70: 76 65 72 74 2e 54 6f 49 6e 74 31 36 28 5f 61 63  vert.ToInt16(_ac
4d80: 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f 73  tiveStatement._s
4d90: 71 6c 2e 47 65 74 49 6e 74 33 32 28 5f 61 63 74  ql.GetInt32(_act
4da0: 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20 69 29  iveStatement, i)
4db0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  );.    }..    //
4dc0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
4dd0: 2f 2f 2f 20 52 65 74 72 69 65 76 65 73 20 74 68  /// Retrieves th
4de0: 65 20 63 6f 6c 75 6d 6e 20 61 73 20 61 6e 20 69  e column as an i
4df0: 6e 74 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  nt.    /// </sum
4e00: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  mary>.    /// <p
4e10: 61 72 61 6d 20 6e 61 6d 65 3d 22 69 22 3e 54 68  aram name="i">Th
4e20: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
4e30: 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69 65 76  olumn to retriev
4e40: 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f  e</param>.    //
4e50: 2f 20 3c 72 65 74 75 72 6e 73 3e 49 6e 74 33 32  / <returns>Int32
4e60: 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 70  </returns>.    p
4e70: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 49  ublic override I
4e80: 6e 74 33 32 20 47 65 74 49 6e 74 33 32 28 69 6e  nt32 GetInt32(in
4e90: 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  t i).    {.     
4ea0: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
4eb0: 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 69 20 3e  ;..      if (i >
4ec0: 3d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43 6f  = VisibleFieldCo
4ed0: 75 6e 74 20 26 26 20 5f 6b 65 79 49 6e 66 6f 20  unt && _keyInfo 
4ee0: 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20  != null).       
4ef0: 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f   return _keyInfo
4f00: 2e 47 65 74 49 6e 74 33 32 28 69 20 2d 20 56 69  .GetInt32(i - Vi
4f10: 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 29  sibleFieldCount)
4f20: 3b 0a 0a 20 20 20 20 20 20 56 65 72 69 66 79 54  ;..      VerifyT
4f30: 79 70 65 28 69 2c 20 44 62 54 79 70 65 2e 49 6e  ype(i, DbType.In
4f40: 74 33 32 29 3b 0a 20 20 20 20 20 20 72 65 74 75  t32);.      retu
4f50: 72 6e 20 5f 61 63 74 69 76 65 53 74 61 74 65 6d  rn _activeStatem
4f60: 65 6e 74 2e 5f 73 71 6c 2e 47 65 74 49 6e 74 33  ent._sql.GetInt3
4f70: 32 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65  2(_activeStateme
4f80: 6e 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 0a 20  nt, i);.    }.. 
4f90: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
4fa0: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 72 69 65 76  .    /// Retriev
4fb0: 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 73  es the column as
4fc0: 20 61 20 6c 6f 6e 67 0a 20 20 20 20 2f 2f 2f 20   a long.    /// 
4fd0: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f  </summary>.    /
4fe0: 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22  // <param name="
4ff0: 69 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20  i">The index of 
5000: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65  the column to re
5010: 74 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20  trieve</param>. 
5020: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
5030: 49 6e 74 36 34 3c 2f 72 65 74 75 72 6e 73 3e 0a  Int64</returns>.
5040: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
5050: 69 64 65 20 49 6e 74 36 34 20 47 65 74 49 6e 74  ide Int64 GetInt
5060: 36 34 28 69 6e 74 20 69 29 0a 20 20 20 20 7b 0a  64(int i).    {.
5070: 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f        CheckDispo
5080: 73 65 64 28 29 3b 0a 0a 20 20 20 20 20 20 69 66  sed();..      if
5090: 20 28 69 20 3e 3d 20 56 69 73 69 62 6c 65 46 69   (i >= VisibleFi
50a0: 65 6c 64 43 6f 75 6e 74 20 26 26 20 5f 6b 65 79  eldCount && _key
50b0: 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c 29 0a 20 20  Info != null).  
50c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 6b 65        return _ke
50d0: 79 49 6e 66 6f 2e 47 65 74 49 6e 74 36 34 28 69  yInfo.GetInt64(i
50e0: 20 2d 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43   - VisibleFieldC
50f0: 6f 75 6e 74 29 3b 0a 0a 20 20 20 20 20 20 56 65  ount);..      Ve
5100: 72 69 66 79 54 79 70 65 28 69 2c 20 44 62 54 79  rifyType(i, DbTy
5110: 70 65 2e 49 6e 74 36 34 29 3b 0a 20 20 20 20 20  pe.Int64);.     
5120: 20 72 65 74 75 72 6e 20 5f 61 63 74 69 76 65 53   return _activeS
5130: 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47 65  tatement._sql.Ge
5140: 74 49 6e 74 36 34 28 5f 61 63 74 69 76 65 53 74  tInt64(_activeSt
5150: 61 74 65 6d 65 6e 74 2c 20 69 29 3b 0a 20 20 20  atement, i);.   
5160: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d   }..    /// <sum
5170: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65  mary>.    /// Re
5180: 74 72 69 65 76 65 73 20 74 68 65 20 6e 61 6d 65  trieves the name
5190: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   of the column. 
51a0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
51b0: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  >.    /// <param
51c0: 20 6e 61 6d 65 3d 22 69 22 3e 54 68 65 20 69 6e   name="i">The in
51d0: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
51e0: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 3c 2f 70  n to retrieve</p
51f0: 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72  aram>.    /// <r
5200: 65 74 75 72 6e 73 3e 73 74 72 69 6e 67 3c 2f 72  eturns>string</r
5210: 65 74 75 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c  eturns>.    publ
5220: 69 63 20 6f 76 65 72 72 69 64 65 20 73 74 72 69  ic override stri
5230: 6e 67 20 47 65 74 4e 61 6d 65 28 69 6e 74 20 69  ng GetName(int i
5240: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 43 68  ).    {.      Ch
5250: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a  eckDisposed();..
5260: 20 20 20 20 20 20 69 66 20 28 69 20 3e 3d 20 56        if (i >= V
5270: 69 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74  isibleFieldCount
5280: 20 26 26 20 5f 6b 65 79 49 6e 66 6f 20 21 3d 20   && _keyInfo != 
5290: 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 72 65  null).        re
52a0: 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47 65  turn _keyInfo.Ge
52b0: 74 4e 61 6d 65 28 69 20 2d 20 56 69 73 69 62 6c  tName(i - Visibl
52c0: 65 46 69 65 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20  eFieldCount);.. 
52d0: 20 20 20 20 20 72 65 74 75 72 6e 20 5f 61 63 74       return _act
52e0: 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f 73 71  iveStatement._sq
52f0: 6c 2e 43 6f 6c 75 6d 6e 4e 61 6d 65 28 5f 61 63  l.ColumnName(_ac
5300: 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20 69  tiveStatement, i
5310: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  );.    }..    //
5320: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
5330: 2f 2f 2f 20 52 65 74 72 69 65 76 65 73 20 74 68  /// Retrieves th
5340: 65 20 69 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2c  e i of a column,
5350: 20 67 69 76 65 6e 20 69 74 73 20 6e 61 6d 65 0a   given its name.
5360: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
5370: 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  y>.    /// <para
5380: 6d 20 6e 61 6d 65 3d 22 6e 61 6d 65 22 3e 54 68  m name="name">Th
5390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  e name of the co
53a0: 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69 65 76 65  lumn to retrieve
53b0: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f  </param>.    ///
53c0: 20 3c 72 65 74 75 72 6e 73 3e 54 68 65 20 69 6e   <returns>The in
53d0: 74 20 69 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  t i of the colum
53e0: 6e 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20  n</returns>.    
53f0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
5400: 69 6e 74 20 47 65 74 4f 72 64 69 6e 61 6c 28 73  int GetOrdinal(s
5410: 74 72 69 6e 67 20 6e 61 6d 65 29 0a 20 20 20 20  tring name).    
5420: 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44 69 73  {.      CheckDis
5430: 70 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 43  posed();.      C
5440: 68 65 63 6b 43 6c 6f 73 65 64 28 29 3b 0a 20 20  heckClosed();.  
5450: 20 20 20 20 69 66 20 28 5f 74 68 72 6f 77 4f 6e      if (_throwOn
5460: 44 69 73 70 6f 73 65 64 29 20 53 51 4c 69 74 65  Disposed) SQLite
5470: 43 6f 6d 6d 61 6e 64 2e 43 68 65 63 6b 28 5f 63  Command.Check(_c
5480: 6f 6d 6d 61 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ommand);..      
5490: 2f 2f 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45  //.      // NOTE
54a0: 3a 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69  : First, check i
54b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  f the column nam
54c0: 65 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  e cache has been
54d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74   initialized yet
54e0: 2e 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20  ..      //      
54f0: 20 49 66 20 6e 6f 74 2c 20 64 6f 20 69 74 20 6e   If not, do it n
5500: 6f 77 2e 0a 20 20 20 20 20 20 2f 2f 0a 20 20 20  ow..      //.   
5510: 20 20 20 69 66 20 28 5f 66 69 65 6c 64 49 6e 64     if (_fieldInd
5520: 65 78 65 73 20 3d 3d 20 6e 75 6c 6c 29 0a 20 20  exes == null).  
5530: 20 20 20 20 20 20 20 20 5f 66 69 65 6c 64 49 6e          _fieldIn
5540: 64 65 78 65 73 20 3d 20 6e 65 77 20 44 69 63 74  dexes = new Dict
5550: 69 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 69  ionary<string, i
5560: 6e 74 3e 28 6e 65 77 20 43 6f 6c 75 6d 6e 4e 61  nt>(new ColumnNa
5570: 6d 65 43 6f 6d 70 61 72 65 72 28 29 29 3b 0a 0a  meComparer());..
5580: 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 2f        //.      /
5590: 2f 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 73 65  / NOTE: Next, se
55a0: 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 66  e if the index f
55b0: 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  or the requested
55c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 68 61 73   column name has
55d0: 20 62 65 65 6e 0a 20 20 20 20 20 20 2f 2f 20 20   been.      //  
55e0: 20 20 20 20 20 63 61 63 68 65 64 20 61 6c 72 65       cached alre
55f0: 61 64 79 2e 20 20 49 66 20 73 6f 2c 20 72 65 74  ady.  If so, ret
5600: 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 76  urn the cached v
5610: 61 6c 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65  alue.  Otherwise
5620: 2c 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20  ,.      //      
5630: 20 6c 6f 6f 6b 75 70 20 74 68 65 20 76 61 6c 75   lookup the valu
5640: 65 20 61 6e 64 20 74 68 65 6e 20 63 61 63 68 65  e and then cache
5650: 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
5660: 66 75 74 75 72 65 20 75 73 65 2e 0a 20 20 20 20  future use..    
5670: 20 20 2f 2f 0a 20 20 20 20 20 20 69 6e 74 20 72    //.      int r
5680: 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 21 5f 66  ;..      if (!_f
5690: 69 65 6c 64 49 6e 64 65 78 65 73 2e 54 72 79 47  ieldIndexes.TryG
56a0: 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 6f 75  etValue(name, ou
56b0: 74 20 72 29 29 0a 20 20 20 20 20 20 7b 0a 20 20  t r)).      {.  
56c0: 20 20 20 20 20 20 20 20 72 20 3d 20 5f 61 63 74          r = _act
56d0: 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f 73 71  iveStatement._sq
56e0: 6c 2e 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 5f 61  l.ColumnIndex(_a
56f0: 63 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20  ctiveStatement, 
5700: 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  name);..        
5710: 20 20 69 66 20 28 72 20 3d 3d 20 2d 31 20 26 26    if (r == -1 &&
5720: 20 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c   _keyInfo != nul
5730: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20  l).          {. 
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d               r =
5750: 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 4f 72 64   _keyInfo.GetOrd
5760: 69 6e 61 6c 28 6e 61 6d 65 29 3b 0a 20 20 20 20  inal(name);.    
5770: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72 20            if (r 
5780: 3e 20 2d 31 29 20 72 20 2b 3d 20 56 69 73 69 62  > -1) r += Visib
5790: 6c 65 46 69 65 6c 64 43 6f 75 6e 74 3b 0a 20 20  leFieldCount;.  
57a0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
57b0: 20 20 20 20 20 5f 66 69 65 6c 64 49 6e 64 65 78       _fieldIndex
57c0: 65 73 2e 41 64 64 28 6e 61 6d 65 2c 20 72 29 3b  es.Add(name, r);
57d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
57e0: 72 65 74 75 72 6e 20 72 3b 0a 20 20 20 20 7d 0a  return r;.    }.
57f0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
5800: 79 3e 0a 20 20 20 20 2f 2f 2f 20 53 63 68 65 6d  y>.    /// Schem
5810: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  a information in
5820: 20 53 51 4c 69 74 65 20 69 73 20 64 69 66 66 69   SQLite is diffi
5830: 63 75 6c 74 20 74 6f 20 6d 61 70 20 69 6e 74 6f  cult to map into
5840: 20 2e 4e 45 54 20 63 6f 6e 76 65 6e 74 69 6f 6e   .NET convention
5850: 73 2c 20 73 6f 20 61 20 6c 6f 74 20 6f 66 20 77  s, so a lot of w
5860: 6f 72 6b 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  ork must be done
5870: 0a 20 20 20 20 2f 2f 2f 20 74 6f 20 67 61 74 68  .    /// to gath
5880: 65 72 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  er the necessary
5890: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
58a0: 69 74 20 63 61 6e 20 62 65 20 72 65 70 72 65 73  it can be repres
58b0: 65 6e 74 65 64 20 69 6e 20 61 6e 20 41 44 4f 2e  ented in an ADO.
58c0: 4e 45 54 20 6d 61 6e 6e 65 72 2e 0a 20 20 20 20  NET manner..    
58d0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
58e0: 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e     /// <returns>
58f0: 52 65 74 75 72 6e 73 20 61 20 44 61 74 61 54 61  Returns a DataTa
5900: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
5910: 68 65 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  he schema inform
5920: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 61 63  ation for the ac
5930: 74 69 76 65 20 53 45 4c 45 43 54 20 73 74 61 74  tive SELECT stat
5940: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 72 6f 63  ement being proc
5950: 65 73 73 65 64 2e 3c 2f 72 65 74 75 72 6e 73 3e  essed.</returns>
5960: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
5970: 72 69 64 65 20 44 61 74 61 54 61 62 6c 65 20 47  ride DataTable G
5980: 65 74 53 63 68 65 6d 61 54 61 62 6c 65 28 29 0a  etSchemaTable().
5990: 20 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63      {.      Chec
59a0: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 20 20 20  kDisposed();.   
59b0: 20 20 20 72 65 74 75 72 6e 20 47 65 74 53 63 68     return GetSch
59c0: 65 6d 61 54 61 62 6c 65 28 74 72 75 65 2c 20 66  emaTable(true, f
59d0: 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  alse);.    }..  
59e0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
59f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20  /////////////.. 
5a30: 20 20 20 23 72 65 67 69 6f 6e 20 43 6f 6c 75 6d     #region Colum
5a40: 6e 4e 61 6d 65 43 6f 6d 70 61 72 65 72 20 43 6c  nNameComparer Cl
5a50: 61 73 73 0a 20 20 20 20 70 72 69 76 61 74 65 20  ass.    private 
5a60: 73 65 61 6c 65 64 20 63 6c 61 73 73 20 43 6f 6c  sealed class Col
5a70: 75 6d 6e 4e 61 6d 65 43 6f 6d 70 61 72 65 72 20  umnNameComparer 
5a80: 3a 20 49 45 71 75 61 6c 69 74 79 43 6f 6d 70 61  : IEqualityCompa
5a90: 72 65 72 3c 73 74 72 69 6e 67 3e 0a 20 20 20 20  rer<string>.    
5aa0: 7b 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f  {.        #regio
5ab0: 6e 20 49 45 71 75 61 6c 69 74 79 43 6f 6d 70 61  n IEqualityCompa
5ac0: 72 65 72 3c 73 74 72 69 6e 67 3e 20 4d 65 6d 62  rer<string> Memb
5ad0: 65 72 73 0a 20 20 20 20 20 20 20 20 70 75 62 6c  ers.        publ
5ae0: 69 63 20 62 6f 6f 6c 20 45 71 75 61 6c 73 28 73  ic bool Equals(s
5af0: 74 72 69 6e 67 20 78 2c 20 73 74 72 69 6e 67 20  tring x, string 
5b00: 79 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  y).        {.   
5b10: 20 20 20 20 20 20 20 20 20 69 66 20 28 28 78 20           if ((x 
5b20: 3d 3d 20 6e 75 6c 6c 29 20 26 26 20 28 79 20 3d  == null) && (y =
5b30: 3d 20 6e 75 6c 6c 29 29 0a 20 20 20 20 20 20 20  = null)).       
5b40: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
5b50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
5b60: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
5b70: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  }.            el
5b80: 73 65 20 69 66 20 28 28 78 20 3d 3d 20 6e 75 6c  se if ((x == nul
5b90: 6c 29 20 7c 7c 20 28 79 20 3d 3d 20 6e 75 6c 6c  l) || (y == null
5ba0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )).            {
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5bc0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
5bd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5be0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20           else.  
5bf0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5c10: 72 6e 20 53 74 72 69 6e 67 2e 45 71 75 61 6c 73  rn String.Equals
5c20: 28 78 2c 20 79 2c 20 53 74 72 69 6e 67 43 6f 6d  (x, y, StringCom
5c30: 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49  parison.OrdinalI
5c40: 67 6e 6f 72 65 43 61 73 65 29 3b 0a 20 20 20 20  gnoreCase);.    
5c50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5c60: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 2f    }..        ///
5c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5cb0: 2f 2f 2f 2f 0a 0a 20 20 20 20 20 20 20 20 70 75  ////..        pu
5cc0: 62 6c 69 63 20 69 6e 74 20 47 65 74 48 61 73 68  blic int GetHash
5cd0: 43 6f 64 65 28 73 74 72 69 6e 67 20 6f 62 6a 29  Code(string obj)
5ce0: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
5cf0: 20 20 20 20 20 20 20 69 66 20 28 6f 62 6a 20 3d         if (obj =
5d00: 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20  = null).        
5d10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
5d20: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
5d30: 65 74 75 72 6e 20 6f 62 6a 2e 47 65 74 48 61 73  eturn obj.GetHas
5d40: 68 43 6f 64 65 28 29 3b 0a 20 20 20 20 20 20 20  hCode();.       
5d50: 20 7d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72   }.        #endr
5d60: 65 67 69 6f 6e 0a 20 20 20 20 7d 0a 20 20 20 20  egion.    }.    
5d70: 23 65 6e 64 72 65 67 69 6f 6e 0a 0a 20 20 20 20  #endregion..    
5d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20 20 20  ///////////..   
5dd0: 20 23 72 65 67 69 6f 6e 20 43 6f 6c 75 6d 6e 50   #region ColumnP
5de0: 61 72 65 6e 74 20 43 6c 61 73 73 0a 20 20 20 20  arent Class.    
5df0: 70 72 69 76 61 74 65 20 73 65 61 6c 65 64 20 63  private sealed c
5e00: 6c 61 73 73 20 43 6f 6c 75 6d 6e 50 61 72 65 6e  lass ColumnParen
5e10: 74 20 3a 20 49 45 71 75 61 6c 69 74 79 43 6f 6d  t : IEqualityCom
5e20: 70 61 72 65 72 3c 43 6f 6c 75 6d 6e 50 61 72 65  parer<ColumnPare
5e30: 6e 74 3e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  nt>.    {.      
5e40: 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63    #region Public
5e50: 20 46 69 65 6c 64 73 0a 20 20 20 20 20 20 20 20   Fields.        
5e60: 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 44 61  public string Da
5e70: 74 61 62 61 73 65 4e 61 6d 65 3b 0a 20 20 20 20  tabaseName;.    
5e80: 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e      public strin
5e90: 67 20 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 20  g TableName;.   
5ea0: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69       public stri
5eb0: 6e 67 20 43 6f 6c 75 6d 6e 4e 61 6d 65 3b 0a 20  ng ColumnName;. 
5ec0: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
5ed0: 6e 0a 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  n..        /////
5ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f20: 2f 2f 0a 0a 20 20 20 20 20 20 20 20 23 72 65 67  //..        #reg
5f30: 69 6f 6e 20 50 75 62 6c 69 63 20 43 6f 6e 73 74  ion Public Const
5f40: 72 75 63 74 6f 72 73 0a 20 20 20 20 20 20 20 20  ructors.        
5f50: 70 75 62 6c 69 63 20 43 6f 6c 75 6d 6e 50 61 72  public ColumnPar
5f60: 65 6e 74 28 29 0a 20 20 20 20 20 20 20 20 7b 0a  ent().        {.
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
5f80: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 20 20 20  o nothing..     
5f90: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f     }..        //
5fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5fe0: 2f 2f 2f 2f 2f 0a 0a 20 20 20 20 20 20 20 20 70  /////..        p
5ff0: 75 62 6c 69 63 20 43 6f 6c 75 6d 6e 50 61 72 65  ublic ColumnPare
6000: 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt(.            
6010: 73 74 72 69 6e 67 20 64 61 74 61 62 61 73 65 4e  string databaseN
6020: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
6030: 20 73 74 72 69 6e 67 20 74 61 62 6c 65 4e 61 6d   string tableNam
6040: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e,.            s
6050: 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 4e 61 6d 65  tring columnName
6060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0a 20  .            ). 
6070: 20 20 20 20 20 20 20 20 20 20 20 3a 20 74 68 69             : thi
6080: 73 28 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  s().        {.  
6090: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 44            this.D
60a0: 61 74 61 62 61 73 65 4e 61 6d 65 20 3d 20 64 61  atabaseName = da
60b0: 74 61 62 61 73 65 4e 61 6d 65 3b 0a 20 20 20 20  tabaseName;.    
60c0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 54 61 62          this.Tab
60d0: 6c 65 4e 61 6d 65 20 3d 20 74 61 62 6c 65 4e 61  leName = tableNa
60e0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
60f0: 74 68 69 73 2e 43 6f 6c 75 6d 6e 4e 61 6d 65 20  this.ColumnName 
6100: 3d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 3b 0a 20 20  = columnName;.  
6110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6120: 23 65 6e 64 72 65 67 69 6f 6e 0a 0a 20 20 20 20  #endregion..    
6130: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
6140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20 20 20  ///////////..   
6180: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 49 45 71       #region IEq
6190: 75 61 6c 69 74 79 43 6f 6d 70 61 72 65 72 3c 43  ualityComparer<C
61a0: 6f 6c 75 6d 6e 50 61 72 65 6e 74 3e 20 4d 65 6d  olumnParent> Mem
61b0: 62 65 72 73 0a 20 20 20 20 20 20 20 20 70 75 62  bers.        pub
61c0: 6c 69 63 20 62 6f 6f 6c 20 45 71 75 61 6c 73 28  lic bool Equals(
61d0: 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 20 78 2c 20  ColumnParent x, 
61e0: 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 20 79 29 0a  ColumnParent y).
61f0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
6200: 20 20 20 20 20 20 69 66 20 28 28 78 20 3d 3d 20        if ((x == 
6210: 6e 75 6c 6c 29 20 26 26 20 28 79 20 3d 3d 20 6e  null) && (y == n
6220: 75 6c 6c 29 29 0a 20 20 20 20 20 20 20 20 20 20  ull)).          
6230: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
6240: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
6250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6260: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
6270: 69 66 20 28 28 78 20 3d 3d 20 6e 75 6c 6c 29 20  if ((x == null) 
6280: 7c 7c 20 28 79 20 3d 3d 20 6e 75 6c 6c 29 29 0a  || (y == null)).
6290: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
62b0: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
62c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
62d0: 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20        else.     
62e0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
62f0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74           if (!St
6300: 72 69 6e 67 2e 45 71 75 61 6c 73 28 78 2e 44 61  ring.Equals(x.Da
6310: 74 61 62 61 73 65 4e 61 6d 65 2c 20 79 2e 44 61  tabaseName, y.Da
6320: 74 61 62 61 73 65 4e 61 6d 65 2c 0a 20 20 20 20  tabaseName,.    
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 20 53 74 72 69 6e 67 43 6f 6d 70 61 72      StringCompar
6350: 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f  ison.OrdinalIgno
6360: 72 65 43 61 73 65 29 29 0a 20 20 20 20 20 20 20  reCase)).       
6370: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6390: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 69 66 20 28 21 53 74 72 69 6e 67 2e 45 71 75 61  if (!String.Equa
63d0: 6c 73 28 78 2e 54 61 62 6c 65 4e 61 6d 65 2c 20  ls(x.TableName, 
63e0: 79 2e 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20  y.TableName,.   
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 20 20 20 53 74 72 69 6e 67 43 6f 6d 70 61       StringCompa
6410: 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e  rison.OrdinalIgn
6420: 6f 72 65 43 61 73 65 29 29 0a 20 20 20 20 20 20  oreCase)).      
6430: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6480: 20 69 66 20 28 21 53 74 72 69 6e 67 2e 45 71 75   if (!String.Equ
6490: 61 6c 73 28 78 2e 43 6f 6c 75 6d 6e 4e 61 6d 65  als(x.ColumnName
64a0: 2c 20 79 2e 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 0a  , y.ColumnName,.
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 43 6f          StringCo
64d0: 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c  mparison.Ordinal
64e0: 49 67 6e 6f 72 65 43 61 73 65 29 29 0a 20 20 20  IgnoreCase)).   
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20               {. 
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
6520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6530: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
6540: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
6550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6560: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
6570: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
6580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
65a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
65b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20 20 20 20 20  /////////..     
65c0: 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 47 65     public int Ge
65d0: 74 48 61 73 68 43 6f 64 65 28 43 6f 6c 75 6d 6e  tHashCode(Column
65e0: 50 61 72 65 6e 74 20 6f 62 6a 29 0a 20 20 20 20  Parent obj).    
65f0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
6600: 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30    int result = 0
6610: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
6620: 66 20 28 28 6f 62 6a 20 21 3d 20 6e 75 6c 6c 29  f ((obj != null)
6630: 20 26 26 20 28 6f 62 6a 2e 44 61 74 61 62 61 73   && (obj.Databas
6640: 65 4e 61 6d 65 20 21 3d 20 6e 75 6c 6c 29 29 0a  eName != null)).
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 72 65 73 75 6c 74 20 5e 3d 20 6f 62 6a 2e 44 61  result ^= obj.Da
6670: 74 61 62 61 73 65 4e 61 6d 65 2e 47 65 74 48 61  tabaseName.GetHa
6680: 73 68 43 6f 64 65 28 29 3b 0a 0a 20 20 20 20 20  shCode();..     
6690: 20 20 20 20 20 20 20 69 66 20 28 28 6f 62 6a 20         if ((obj 
66a0: 21 3d 20 6e 75 6c 6c 29 20 26 26 20 28 6f 62 6a  != null) && (obj
66b0: 2e 54 61 62 6c 65 4e 61 6d 65 20 21 3d 20 6e 75  .TableName != nu
66c0: 6c 6c 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ll)).           
66d0: 20 20 20 20 20 72 65 73 75 6c 74 20 5e 3d 20 6f       result ^= o
66e0: 62 6a 2e 54 61 62 6c 65 4e 61 6d 65 2e 47 65 74  bj.TableName.Get
66f0: 48 61 73 68 43 6f 64 65 28 29 3b 0a 0a 20 20 20  HashCode();..   
6700: 20 20 20 20 20 20 20 20 20 69 66 20 28 28 6f 62           if ((ob
6710: 6a 20 21 3d 20 6e 75 6c 6c 29 20 26 26 20 28 6f  j != null) && (o
6720: 62 6a 2e 43 6f 6c 75 6d 6e 4e 61 6d 65 20 21 3d  bj.ColumnName !=
6730: 20 6e 75 6c 6c 29 29 0a 20 20 20 20 20 20 20 20   null)).        
6740: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 5e          result ^
6750: 3d 20 6f 62 6a 2e 43 6f 6c 75 6d 6e 4e 61 6d 65  = obj.ColumnName
6760: 2e 47 65 74 48 61 73 68 43 6f 64 65 28 29 3b 0a  .GetHashCode();.
6770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
6780: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 20 20 20 20  urn result;.    
6790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 23 65      }.        #e
67a0: 6e 64 72 65 67 69 6f 6e 0a 20 20 20 20 7d 0a 20  ndregion.    }. 
67b0: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0a 0a 20     #endregion.. 
67c0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
67d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
67e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
67f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a  //////////////..
6810: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
6820: 69 63 20 76 6f 69 64 20 47 65 74 53 74 61 74 65  ic void GetState
6830: 6d 65 6e 74 43 6f 6c 75 6d 6e 50 61 72 65 6e 74  mentColumnParent
6840: 73 28 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  s(.        SQLit
6850: 65 42 61 73 65 20 73 71 6c 2c 0a 20 20 20 20 20  eBase sql,.     
6860: 20 20 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65     SQLiteStateme
6870: 6e 74 20 73 74 6d 74 2c 0a 20 20 20 20 20 20 20  nt stmt,.       
6880: 20 69 6e 74 20 66 69 65 6c 64 43 6f 75 6e 74 2c   int fieldCount,
6890: 0a 20 20 20 20 20 20 20 20 72 65 66 20 44 69 63  .        ref Dic
68a0: 74 69 6f 6e 61 72 79 3c 43 6f 6c 75 6d 6e 50 61  tionary<ColumnPa
68b0: 72 65 6e 74 2c 20 4c 69 73 74 3c 69 6e 74 3e 3e  rent, List<int>>
68c0: 20 70 61 72 65 6e 74 54 6f 43 6f 6c 75 6d 6e 73   parentToColumns
68d0: 2c 0a 20 20 20 20 20 20 20 20 72 65 66 20 44 69  ,.        ref Di
68e0: 63 74 69 6f 6e 61 72 79 3c 69 6e 74 2c 20 43 6f  ctionary<int, Co
68f0: 6c 75 6d 6e 50 61 72 65 6e 74 3e 20 63 6f 6c 75  lumnParent> colu
6900: 6d 6e 54 6f 50 61 72 65 6e 74 0a 20 20 20 20 20  mnToParent.     
6910: 20 20 20 29 0a 20 20 20 20 7b 0a 20 20 20 20 20     ).    {.     
6920: 20 20 20 69 66 20 28 70 61 72 65 6e 74 54 6f 43     if (parentToC
6930: 6f 6c 75 6d 6e 73 20 3d 3d 20 6e 75 6c 6c 29 0a  olumns == null).
6940: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72 65              pare
6950: 6e 74 54 6f 43 6f 6c 75 6d 6e 73 20 3d 20 6e 65  ntToColumns = ne
6960: 77 20 44 69 63 74 69 6f 6e 61 72 79 3c 43 6f 6c  w Dictionary<Col
6970: 75 6d 6e 50 61 72 65 6e 74 2c 20 4c 69 73 74 3c  umnParent, List<
6980: 69 6e 74 3e 3e 28 0a 20 20 20 20 20 20 20 20 20  int>>(.         
6990: 20 20 20 20 20 20 20 6e 65 77 20 43 6f 6c 75 6d         new Colum
69a0: 6e 50 61 72 65 6e 74 28 29 29 3b 0a 0a 20 20 20  nParent());..   
69b0: 20 20 20 20 20 69 66 20 28 63 6f 6c 75 6d 6e 54       if (columnT
69c0: 6f 50 61 72 65 6e 74 20 3d 3d 20 6e 75 6c 6c 29  oParent == null)
69d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .            col
69e0: 75 6d 6e 54 6f 50 61 72 65 6e 74 20 3d 20 6e 65  umnToParent = ne
69f0: 77 20 44 69 63 74 69 6f 6e 61 72 79 3c 69 6e 74  w Dictionary<int
6a00: 2c 20 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 3e 28  , ColumnParent>(
6a10: 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20  );..        for 
6a20: 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20  (int n = 0; n < 
6a30: 66 69 65 6c 64 43 6f 75 6e 74 3b 20 6e 2b 2b 29  fieldCount; n++)
6a40: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
6a50: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 61         string da
6a60: 74 61 62 61 73 65 4e 61 6d 65 20 3d 20 73 71 6c  tabaseName = sql
6a70: 2e 43 6f 6c 75 6d 6e 44 61 74 61 62 61 73 65 4e  .ColumnDatabaseN
6a80: 61 6d 65 28 73 74 6d 74 2c 20 6e 29 3b 0a 20 20  ame(stmt, n);.  
6a90: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
6aa0: 20 74 61 62 6c 65 4e 61 6d 65 20 3d 20 73 71 6c   tableName = sql
6ab0: 2e 43 6f 6c 75 6d 6e 54 61 62 6c 65 4e 61 6d 65  .ColumnTableName
6ac0: 28 73 74 6d 74 2c 20 6e 29 3b 0a 20 20 20 20 20  (stmt, n);.     
6ad0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 6f         string co
6ae0: 6c 75 6d 6e 4e 61 6d 65 20 3d 20 73 71 6c 2e 43  lumnName = sql.C
6af0: 6f 6c 75 6d 6e 4f 72 69 67 69 6e 61 6c 4e 61 6d  olumnOriginalNam
6b00: 65 28 73 74 6d 74 2c 20 6e 29 3b 0a 0a 20 20 20  e(stmt, n);..   
6b10: 20 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 50           ColumnP
6b20: 61 72 65 6e 74 20 6b 65 79 20 3d 20 6e 65 77 20  arent key = new 
6b30: 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 28 64 61 74  ColumnParent(dat
6b40: 61 62 61 73 65 4e 61 6d 65 2c 20 74 61 62 6c 65  abaseName, table
6b50: 4e 61 6d 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  Name, null);.   
6b60: 20 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 50           ColumnP
6b70: 61 72 65 6e 74 20 76 61 6c 75 65 20 3d 20 6e 65  arent value = ne
6b80: 77 20 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 28 64  w ColumnParent(d
6b90: 61 74 61 62 61 73 65 4e 61 6d 65 2c 20 74 61 62  atabaseName, tab
6ba0: 6c 65 4e 61 6d 65 2c 20 63 6f 6c 75 6d 6e 4e 61  leName, columnNa
6bb0: 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  me);..          
6bc0: 20 20 69 66 20 28 21 70 61 72 65 6e 74 54 6f 43    if (!parentToC
6bd0: 6f 6c 75 6d 6e 73 2e 43 6f 6e 74 61 69 6e 73 4b  olumns.ContainsK
6be0: 65 79 28 6b 65 79 29 29 0a 20 20 20 20 20 20 20  ey(key)).       
6bf0: 20 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 54           parentT
6c00: 6f 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 6b 65 79  oColumns.Add(key
6c10: 2c 20 6e 65 77 20 4c 69 73 74 3c 69 6e 74 3e 28  , new List<int>(
6c20: 6e 65 77 20 69 6e 74 5b 5d 20 7b 20 6e 20 7d 29  new int[] { n })
6c30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
6c40: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  lse.            
6c50: 20 20 20 20 70 61 72 65 6e 74 54 6f 43 6f 6c 75      parentToColu
6c60: 6d 6e 73 5b 6b 65 79 5d 2e 41 64 64 28 6e 29 3b  mns[key].Add(n);
6c70: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ..            co
6c80: 6c 75 6d 6e 54 6f 50 61 72 65 6e 74 2e 41 64 64  lumnToParent.Add
6c90: 28 6e 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  (n, value);.    
6ca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
6cb0: 20 69 6e 74 65 72 6e 61 6c 20 44 61 74 61 54 61   internal DataTa
6cc0: 62 6c 65 20 47 65 74 53 63 68 65 6d 61 54 61 62  ble GetSchemaTab
6cd0: 6c 65 28 62 6f 6f 6c 20 77 61 6e 74 55 6e 69 71  le(bool wantUniq
6ce0: 75 65 49 6e 66 6f 2c 20 62 6f 6f 6c 20 77 61 6e  ueInfo, bool wan
6cf0: 74 44 65 66 61 75 6c 74 56 61 6c 75 65 29 0a 20  tDefaultValue). 
6d00: 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b     {.      Check
6d10: 43 6c 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20  Closed();.      
6d20: 69 66 20 28 5f 74 68 72 6f 77 4f 6e 44 69 73 70  if (_throwOnDisp
6d30: 6f 73 65 64 29 20 53 51 4c 69 74 65 43 6f 6d 6d  osed) SQLiteComm
6d40: 61 6e 64 2e 43 68 65 63 6b 28 5f 63 6f 6d 6d 61  and.Check(_comma
6d50: 6e 64 29 3b 0a 0a 20 20 20 20 20 2f 2f 0a 20 20  nd);..     //.  
6d60: 20 20 20 2f 2f 20 42 55 47 46 49 58 3a 20 57 65     // BUGFIX: We
6d70: 20 6e 65 65 64 20 74 6f 20 71 75 69 63 6b 6c 79   need to quickly
6d80: 20 73 63 61 6e 20 61 6c 6c 20 74 68 65 20 66 69   scan all the fi
6d90: 65 6c 64 73 20 69 6e 20 74 68 65 20 63 75 72 72  elds in the curr
6da0: 65 6e 74 0a 20 20 20 20 20 2f 2f 20 20 20 20 20  ent.     //     
6db0: 20 20 20 20 22 72 65 73 75 6c 74 20 73 65 74 22      "result set"
6dc0: 20 74 6f 20 73 65 65 20 68 6f 77 20 6d 61 6e 79   to see how many
6dd0: 20 64 69 73 74 69 6e 63 74 20 74 61 62 6c 65 73   distinct tables
6de0: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20   are actually.  
6df0: 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20 69 6e     //         in
6e00: 76 6f 6c 76 65 64 2e 20 20 54 68 69 73 20 69 6e  volved.  This in
6e10: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
6e20: 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 73  essary so that s
6e30: 6f 6d 65 0a 20 20 20 20 20 2f 2f 20 20 20 20 20  ome.     //     
6e40: 20 20 20 20 69 6e 74 65 6c 6c 69 67 65 6e 74 20      intelligent 
6e50: 64 65 63 69 73 69 6f 6e 73 20 63 61 6e 20 62 65  decisions can be
6e60: 20 6d 61 64 65 20 77 68 65 6e 20 63 6f 6e 73 74   made when const
6e70: 72 75 63 74 69 6e 67 20 74 68 65 0a 20 20 20 20  ructing the.    
6e80: 20 2f 2f 20 20 20 20 20 20 20 20 20 6d 65 74 61   //         meta
6e90: 64 61 74 61 20 62 65 6c 6f 77 2e 20 20 46 6f 72  data below.  For
6ea0: 20 65 78 61 6d 70 6c 65 2c 20 77 65 20 6e 65 65   example, we nee
6eb0: 64 20 74 6f 20 62 65 20 76 65 72 79 20 63 61 72  d to be very car
6ec0: 65 66 75 6c 0a 20 20 20 20 20 2f 2f 20 20 20 20  eful.     //    
6ed0: 20 20 20 20 20 61 62 6f 75 74 20 66 6c 61 67 67       about flagg
6ee0: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
6ef0: 20 63 6f 6c 75 6d 6e 20 61 73 20 22 75 6e 69 71   column as "uniq
6f00: 75 65 22 20 6a 75 73 74 0a 20 20 20 20 20 2f 2f  ue" just.     //
6f10: 20 20 20 20 20 20 20 20 20 62 65 63 61 75 73 65           because
6f20: 20 69 74 20 77 61 73 20 69 6e 20 69 74 73 20 6f   it was in its o
6f30: 72 69 67 69 6e 61 6c 20 75 6e 64 65 72 6c 79 69  riginal underlyi
6f40: 6e 67 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ng database tabl
6f50: 65 0a 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20  e.     //       
6f60: 20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e    if there are n
6f70: 6f 77 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  ow multiple tabl
6f80: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
6f90: 68 65 0a 20 20 20 20 20 2f 2f 20 20 20 20 20 20  he.     //      
6fa0: 20 20 20 22 72 65 73 75 6c 74 20 73 65 74 22 2e     "result set".
6fb0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 37 65    See ticket [7e
6fc0: 33 66 61 39 33 37 34 34 5d 20 66 6f 72 20 6d 6f  3fa93744] for mo
6fd0: 72 65 20 64 65 74 61 69 6c 65 64 0a 20 20 20 20  re detailed.    
6fe0: 20 2f 2f 20 20 20 20 20 20 20 20 20 69 6e 66 6f   //         info
6ff0: 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 20 2f 2f  rmation..     //
7000: 0a 20 20 20 20 20 20 44 69 63 74 69 6f 6e 61 72  .      Dictionar
7010: 79 3c 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 2c 20  y<ColumnParent, 
7020: 4c 69 73 74 3c 69 6e 74 3e 3e 20 70 61 72 65 6e  List<int>> paren
7030: 74 54 6f 43 6f 6c 75 6d 6e 73 20 3d 20 6e 75 6c  tToColumns = nul
7040: 6c 3b 0a 20 20 20 20 20 20 44 69 63 74 69 6f 6e  l;.      Diction
7050: 61 72 79 3c 69 6e 74 2c 20 43 6f 6c 75 6d 6e 50  ary<int, ColumnP
7060: 61 72 65 6e 74 3e 20 63 6f 6c 75 6d 6e 54 6f 50  arent> columnToP
7070: 61 72 65 6e 74 20 3d 20 6e 75 6c 6c 3b 0a 0a 20  arent = null;.. 
7080: 20 20 20 20 20 47 65 74 53 74 61 74 65 6d 65 6e       GetStatemen
7090: 74 43 6f 6c 75 6d 6e 50 61 72 65 6e 74 73 28 0a  tColumnParents(.
70a0: 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61            _comma
70b0: 6e 64 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e 5f 73  nd.Connection._s
70c0: 71 6c 2c 20 5f 61 63 74 69 76 65 53 74 61 74 65  ql, _activeState
70d0: 6d 65 6e 74 2c 20 5f 66 69 65 6c 64 43 6f 75 6e  ment, _fieldCoun
70e0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 72 65 66  t,.          ref
70f0: 20 70 61 72 65 6e 74 54 6f 43 6f 6c 75 6d 6e 73   parentToColumns
7100: 2c 20 72 65 66 20 63 6f 6c 75 6d 6e 54 6f 50 61  , ref columnToPa
7110: 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 44 61  rent);..      Da
7120: 74 61 54 61 62 6c 65 20 74 62 6c 20 3d 20 6e 65  taTable tbl = ne
7130: 77 20 44 61 74 61 54 61 62 6c 65 28 22 53 63 68  w DataTable("Sch
7140: 65 6d 61 54 61 62 6c 65 22 29 3b 0a 20 20 20 20  emaTable");.    
7150: 20 20 44 61 74 61 54 61 62 6c 65 20 74 62 6c 49    DataTable tblI
7160: 6e 64 65 78 65 73 20 3d 20 6e 75 6c 6c 3b 0a 20  ndexes = null;. 
7170: 20 20 20 20 20 44 61 74 61 54 61 62 6c 65 20 74       DataTable t
7180: 62 6c 49 6e 64 65 78 43 6f 6c 75 6d 6e 73 3b 0a  blIndexColumns;.
7190: 20 20 20 20 20 20 44 61 74 61 52 6f 77 20 72 6f        DataRow ro
71a0: 77 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 20  w;.      string 
71b0: 74 65 6d 70 3b 0a 20 20 20 20 20 20 73 74 72 69  temp;.      stri
71c0: 6e 67 20 73 74 72 43 61 74 61 6c 6f 67 20 3d 20  ng strCatalog = 
71d0: 22 22 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67  "";.      string
71e0: 20 73 74 72 54 61 62 6c 65 20 3d 20 22 22 3b 0a   strTable = "";.
71f0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 74 72        string str
7200: 43 6f 6c 75 6d 6e 20 3d 20 22 22 3b 0a 0a 20 20  Column = "";..  
7210: 20 20 20 20 74 62 6c 2e 4c 6f 63 61 6c 65 20 3d      tbl.Locale =
7220: 20 43 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76   CultureInfo.Inv
7230: 61 72 69 61 6e 74 43 75 6c 74 75 72 65 3b 0a 20  ariantCulture;. 
7240: 20 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73       tbl.Columns
7250: 2e 41 64 64 28 53 63 68 65 6d 61 54 61 62 6c 65  .Add(SchemaTable
7260: 43 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e 4e 61 6d  Column.ColumnNam
7270: 65 2c 20 74 79 70 65 6f 66 28 53 74 72 69 6e 67  e, typeof(String
7280: 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43 6f  ));.      tbl.Co
7290: 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d 61  lumns.Add(Schema
72a0: 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 43 6f 6c 75  TableColumn.Colu
72b0: 6d 6e 4f 72 64 69 6e 61 6c 2c 20 74 79 70 65 6f  mnOrdinal, typeo
72c0: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 74  f(int));.      t
72d0: 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 53  bl.Columns.Add(S
72e0: 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e  chemaTableColumn
72f0: 2e 43 6f 6c 75 6d 6e 53 69 7a 65 2c 20 74 79 70  .ColumnSize, typ
7300: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
7310: 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64   tbl.Columns.Add
7320: 28 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75  (SchemaTableColu
7330: 6d 6e 2e 4e 75 6d 65 72 69 63 50 72 65 63 69 73  mn.NumericPrecis
7340: 69 6f 6e 2c 20 74 79 70 65 6f 66 28 73 68 6f 72  ion, typeof(shor
7350: 74 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43  t));.      tbl.C
7360: 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d  olumns.Add(Schem
7370: 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 4e 75 6d  aTableColumn.Num
7380: 65 72 69 63 53 63 61 6c 65 2c 20 74 79 70 65 6f  ericScale, typeo
7390: 66 28 73 68 6f 72 74 29 29 3b 0a 20 20 20 20 20  f(short));.     
73a0: 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64   tbl.Columns.Add
73b0: 28 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75  (SchemaTableColu
73c0: 6d 6e 2e 49 73 55 6e 69 71 75 65 2c 20 74 79 70  mn.IsUnique, typ
73d0: 65 6f 66 28 42 6f 6f 6c 65 61 6e 29 29 3b 0a 20  eof(Boolean));. 
73e0: 20 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73       tbl.Columns
73f0: 2e 41 64 64 28 53 63 68 65 6d 61 54 61 62 6c 65  .Add(SchemaTable
7400: 43 6f 6c 75 6d 6e 2e 49 73 4b 65 79 2c 20 74 79  Column.IsKey, ty
7410: 70 65 6f 66 28 42 6f 6f 6c 65 61 6e 29 29 3b 0a  peof(Boolean));.
7420: 20 20 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e        tbl.Column
7430: 73 2e 41 64 64 28 53 63 68 65 6d 61 54 61 62 6c  s.Add(SchemaTabl
7440: 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e  eOptionalColumn.
7450: 42 61 73 65 53 65 72 76 65 72 4e 61 6d 65 2c 20  BaseServerName, 
7460: 74 79 70 65 6f 66 28 73 74 72 69 6e 67 29 29 3b  typeof(string));
7470: 0a 20 20 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d  .      tbl.Colum
7480: 6e 73 2e 41 64 64 28 53 63 68 65 6d 61 54 61 62  ns.Add(SchemaTab
7490: 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e  leOptionalColumn
74a0: 2e 42 61 73 65 43 61 74 61 6c 6f 67 4e 61 6d 65  .BaseCatalogName
74b0: 2c 20 74 79 70 65 6f 66 28 53 74 72 69 6e 67 29  , typeof(String)
74c0: 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43 6f 6c  );.      tbl.Col
74d0: 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d 61 54  umns.Add(SchemaT
74e0: 61 62 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65 43  ableColumn.BaseC
74f0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 74 79 70 65 6f  olumnName, typeo
7500: 66 28 53 74 72 69 6e 67 29 29 3b 0a 20 20 20 20  f(String));.    
7510: 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64    tbl.Columns.Ad
7520: 64 28 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  d(SchemaTableCol
7530: 75 6d 6e 2e 42 61 73 65 53 63 68 65 6d 61 4e 61  umn.BaseSchemaNa
7540: 6d 65 2c 20 74 79 70 65 6f 66 28 53 74 72 69 6e  me, typeof(Strin
7550: 67 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43  g));.      tbl.C
7560: 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d  olumns.Add(Schem
7570: 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73  aTableColumn.Bas
7580: 65 54 61 62 6c 65 4e 61 6d 65 2c 20 74 79 70 65  eTableName, type
7590: 6f 66 28 53 74 72 69 6e 67 29 29 3b 0a 20 20 20  of(String));.   
75a0: 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41     tbl.Columns.A
75b0: 64 64 28 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  dd(SchemaTableCo
75c0: 6c 75 6d 6e 2e 44 61 74 61 54 79 70 65 2c 20 74  lumn.DataType, t
75d0: 79 70 65 6f 66 28 54 79 70 65 29 29 3b 0a 20 20  ypeof(Type));.  
75e0: 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e      tbl.Columns.
75f0: 41 64 64 28 53 63 68 65 6d 61 54 61 62 6c 65 43  Add(SchemaTableC
7600: 6f 6c 75 6d 6e 2e 41 6c 6c 6f 77 44 42 4e 75 6c  olumn.AllowDBNul
7610: 6c 2c 20 74 79 70 65 6f 66 28 42 6f 6f 6c 65 61  l, typeof(Boolea
7620: 6e 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43  n));.      tbl.C
7630: 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d  olumns.Add(Schem
7640: 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 50 72 6f  aTableColumn.Pro
7650: 76 69 64 65 72 54 79 70 65 2c 20 74 79 70 65 6f  viderType, typeo
7660: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 74  f(int));.      t
7670: 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 53  bl.Columns.Add(S
7680: 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e  chemaTableColumn
7690: 2e 49 73 41 6c 69 61 73 65 64 2c 20 74 79 70 65  .IsAliased, type
76a0: 6f 66 28 42 6f 6f 6c 65 61 6e 29 29 3b 0a 20 20  of(Boolean));.  
76b0: 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e      tbl.Columns.
76c0: 41 64 64 28 53 63 68 65 6d 61 54 61 62 6c 65 43  Add(SchemaTableC
76d0: 6f 6c 75 6d 6e 2e 49 73 45 78 70 72 65 73 73 69  olumn.IsExpressi
76e0: 6f 6e 2c 20 74 79 70 65 6f 66 28 42 6f 6f 6c 65  on, typeof(Boole
76f0: 61 6e 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e  an));.      tbl.
7700: 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65  Columns.Add(Sche
7710: 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43  maTableOptionalC
7720: 6f 6c 75 6d 6e 2e 49 73 41 75 74 6f 49 6e 63 72  olumn.IsAutoIncr
7730: 65 6d 65 6e 74 2c 20 74 79 70 65 6f 66 28 42 6f  ement, typeof(Bo
7740: 6f 6c 65 61 6e 29 29 3b 0a 20 20 20 20 20 20 74  olean));.      t
7750: 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 53  bl.Columns.Add(S
7760: 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e  chemaTableOption
7770: 61 6c 43 6f 6c 75 6d 6e 2e 49 73 52 6f 77 56 65  alColumn.IsRowVe
7780: 72 73 69 6f 6e 2c 20 74 79 70 65 6f 66 28 42 6f  rsion, typeof(Bo
7790: 6f 6c 65 61 6e 29 29 3b 0a 20 20 20 20 20 20 74  olean));.      t
77a0: 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 53  bl.Columns.Add(S
77b0: 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e  chemaTableOption
77c0: 61 6c 43 6f 6c 75 6d 6e 2e 49 73 48 69 64 64 65  alColumn.IsHidde
77d0: 6e 2c 20 74 79 70 65 6f 66 28 42 6f 6f 6c 65 61  n, typeof(Boolea
77e0: 6e 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43  n));.      tbl.C
77f0: 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d  olumns.Add(Schem
7800: 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49 73 4c  aTableColumn.IsL
7810: 6f 6e 67 2c 20 74 79 70 65 6f 66 28 42 6f 6f 6c  ong, typeof(Bool
7820: 65 61 6e 29 29 3b 0a 20 20 20 20 20 20 74 62 6c  ean));.      tbl
7830: 2e 43 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68  .Columns.Add(Sch
7840: 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c  emaTableOptional
7850: 43 6f 6c 75 6d 6e 2e 49 73 52 65 61 64 4f 6e 6c  Column.IsReadOnl
7860: 79 2c 20 74 79 70 65 6f 66 28 42 6f 6f 6c 65 61  y, typeof(Boolea
7870: 6e 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43  n));.      tbl.C
7880: 6f 6c 75 6d 6e 73 2e 41 64 64 28 53 63 68 65 6d  olumns.Add(Schem
7890: 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f  aTableOptionalCo
78a0: 6c 75 6d 6e 2e 50 72 6f 76 69 64 65 72 53 70 65  lumn.ProviderSpe
78b0: 63 69 66 69 63 44 61 74 61 54 79 70 65 2c 20 74  cificDataType, t
78c0: 79 70 65 6f 66 28 54 79 70 65 29 29 3b 0a 20 20  ypeof(Type));.  
78d0: 20 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e      tbl.Columns.
78e0: 41 64 64 28 53 63 68 65 6d 61 54 61 62 6c 65 4f  Add(SchemaTableO
78f0: 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 44 65  ptionalColumn.De
7900: 66 61 75 6c 74 56 61 6c 75 65 2c 20 74 79 70 65  faultValue, type
7910: 6f 66 28 6f 62 6a 65 63 74 29 29 3b 0a 20 20 20  of(object));.   
7920: 20 20 20 74 62 6c 2e 43 6f 6c 75 6d 6e 73 2e 41     tbl.Columns.A
7930: 64 64 28 22 44 61 74 61 54 79 70 65 4e 61 6d 65  dd("DataTypeName
7940: 22 2c 20 74 79 70 65 6f 66 28 73 74 72 69 6e 67  ", typeof(string
7950: 29 29 3b 0a 20 20 20 20 20 20 74 62 6c 2e 43 6f  ));.      tbl.Co
7960: 6c 75 6d 6e 73 2e 41 64 64 28 22 43 6f 6c 6c 61  lumns.Add("Colla
7970: 74 69 6f 6e 54 79 70 65 22 2c 20 74 79 70 65 6f  tionType", typeo
7980: 66 28 73 74 72 69 6e 67 29 29 3b 0a 20 20 20 20  f(string));.    
7990: 20 20 74 62 6c 2e 42 65 67 69 6e 4c 6f 61 64 44    tbl.BeginLoadD
79a0: 61 74 61 28 29 3b 0a 0a 20 20 20 20 20 20 66 6f  ata();..      fo
79b0: 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20  r (int n = 0; n 
79c0: 3c 20 5f 66 69 65 6c 64 43 6f 75 6e 74 3b 20 6e  < _fieldCount; n
79d0: 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ++).      {.    
79e0: 20 20 20 20 53 51 4c 69 74 65 54 79 70 65 20 73      SQLiteType s
79f0: 71 6c 54 79 70 65 20 3d 20 47 65 74 53 51 4c 69  qlType = GetSQLi
7a00: 74 65 54 79 70 65 28 6e 29 3b 0a 0a 20 20 20 20  teType(n);..    
7a10: 20 20 20 20 72 6f 77 20 3d 20 74 62 6c 2e 4e 65      row = tbl.Ne
7a20: 77 52 6f 77 28 29 3b 0a 0a 20 20 20 20 20 20 20  wRow();..       
7a30: 20 44 62 54 79 70 65 20 74 79 70 20 3d 20 73 71   DbType typ = sq
7a40: 6c 54 79 70 65 2e 54 79 70 65 3b 0a 0a 20 20 20  lType.Type;..   
7a50: 20 20 20 20 20 2f 2f 20 44 65 66 61 75 6c 74 20       // Default 
7a60: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 74 68 65  settings for the
7a70: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20   column.        
7a80: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43  row[SchemaTableC
7a90: 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e 4e 61 6d 65  olumn.ColumnName
7aa0: 5d 20 3d 20 47 65 74 4e 61 6d 65 28 6e 29 3b 0a  ] = GetName(n);.
7ab0: 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65          row[Sche
7ac0: 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 43 6f  maTableColumn.Co
7ad0: 6c 75 6d 6e 4f 72 64 69 6e 61 6c 5d 20 3d 20 6e  lumnOrdinal] = n
7ae0: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63  ;.        row[Sc
7af0: 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e  hemaTableColumn.
7b00: 43 6f 6c 75 6d 6e 53 69 7a 65 5d 20 3d 20 53 51  ColumnSize] = SQ
7b10: 4c 69 74 65 43 6f 6e 76 65 72 74 2e 44 62 54 79  LiteConvert.DbTy
7b20: 70 65 54 6f 43 6f 6c 75 6d 6e 53 69 7a 65 28 74  peToColumnSize(t
7b30: 79 70 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 77  yp);.        row
7b40: 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75  [SchemaTableColu
7b50: 6d 6e 2e 4e 75 6d 65 72 69 63 50 72 65 63 69 73  mn.NumericPrecis
7b60: 69 6f 6e 5d 20 3d 20 53 51 4c 69 74 65 43 6f 6e  ion] = SQLiteCon
7b70: 76 65 72 74 2e 44 62 54 79 70 65 54 6f 4e 75 6d  vert.DbTypeToNum
7b80: 65 72 69 63 50 72 65 63 69 73 69 6f 6e 28 74 79  ericPrecision(ty
7b90: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 5b  p);.        row[
7ba0: 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d  SchemaTableColum
7bb0: 6e 2e 4e 75 6d 65 72 69 63 53 63 61 6c 65 5d 20  n.NumericScale] 
7bc0: 3d 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 2e  = SQLiteConvert.
7bd0: 44 62 54 79 70 65 54 6f 4e 75 6d 65 72 69 63 53  DbTypeToNumericS
7be0: 63 61 6c 65 28 74 79 70 29 3b 0a 20 20 20 20 20  cale(typ);.     
7bf0: 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62     row[SchemaTab
7c00: 6c 65 43 6f 6c 75 6d 6e 2e 50 72 6f 76 69 64 65  leColumn.Provide
7c10: 72 54 79 70 65 5d 20 3d 20 73 71 6c 54 79 70 65  rType] = sqlType
7c20: 2e 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 72  .Type;.        r
7c30: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
7c40: 6c 75 6d 6e 2e 49 73 4c 6f 6e 67 5d 20 3d 20 66  lumn.IsLong] = f
7c50: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 72 6f  alse;.        ro
7c60: 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  w[SchemaTableCol
7c70: 75 6d 6e 2e 41 6c 6c 6f 77 44 42 4e 75 6c 6c 5d  umn.AllowDBNull]
7c80: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
7c90: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
7ca0: 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 49  OptionalColumn.I
7cb0: 73 52 65 61 64 4f 6e 6c 79 5d 20 3d 20 66 61 6c  sReadOnly] = fal
7cc0: 73 65 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 5b  se;.        row[
7cd0: 53 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f  SchemaTableOptio
7ce0: 6e 61 6c 43 6f 6c 75 6d 6e 2e 49 73 52 6f 77 56  nalColumn.IsRowV
7cf0: 65 72 73 69 6f 6e 5d 20 3d 20 66 61 6c 73 65 3b  ersion] = false;
7d00: 0a 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68  .        row[Sch
7d10: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49  emaTableColumn.I
7d20: 73 55 6e 69 71 75 65 5d 20 3d 20 66 61 6c 73 65  sUnique] = false
7d30: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63  ;.        row[Sc
7d40: 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e  hemaTableColumn.
7d50: 49 73 4b 65 79 5d 20 3d 20 66 61 6c 73 65 3b 0a  IsKey] = false;.
7d60: 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65          row[Sche
7d70: 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43  maTableOptionalC
7d80: 6f 6c 75 6d 6e 2e 49 73 41 75 74 6f 49 6e 63 72  olumn.IsAutoIncr
7d90: 65 6d 65 6e 74 5d 20 3d 20 66 61 6c 73 65 3b 0a  ement] = false;.
7da0: 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65          row[Sche
7db0: 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 44 61  maTableColumn.Da
7dc0: 74 61 54 79 70 65 5d 20 3d 20 47 65 74 46 69 65  taType] = GetFie
7dd0: 6c 64 54 79 70 65 28 6e 29 3b 0a 20 20 20 20 20  ldType(n);.     
7de0: 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62     row[SchemaTab
7df0: 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e  leOptionalColumn
7e00: 2e 49 73 48 69 64 64 65 6e 5d 20 3d 20 66 61 6c  .IsHidden] = fal
7e10: 73 65 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 5b  se;.        row[
7e20: 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d  SchemaTableColum
7e30: 6e 2e 42 61 73 65 53 63 68 65 6d 61 4e 61 6d 65  n.BaseSchemaName
7e40: 5d 20 3d 20 5f 62 61 73 65 53 63 68 65 6d 61 4e  ] = _baseSchemaN
7e50: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 73 74  ame;..        st
7e60: 72 43 6f 6c 75 6d 6e 20 3d 20 63 6f 6c 75 6d 6e  rColumn = column
7e70: 54 6f 50 61 72 65 6e 74 5b 6e 5d 2e 43 6f 6c 75  ToParent[n].Colu
7e80: 6d 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  mnName;.        
7e90: 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c  if (String.IsNul
7ea0: 6c 4f 72 45 6d 70 74 79 28 73 74 72 43 6f 6c 75  lOrEmpty(strColu
7eb0: 6d 6e 29 20 3d 3d 20 66 61 6c 73 65 29 20 72 6f  mn) == false) ro
7ec0: 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  w[SchemaTableCol
7ed0: 75 6d 6e 2e 42 61 73 65 43 6f 6c 75 6d 6e 4e 61  umn.BaseColumnNa
7ee0: 6d 65 5d 20 3d 20 73 74 72 43 6f 6c 75 6d 6e 3b  me] = strColumn;
7ef0: 0a 0a 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63  ..        row[Sc
7f00: 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e  hemaTableColumn.
7f10: 49 73 45 78 70 72 65 73 73 69 6f 6e 5d 20 3d 20  IsExpression] = 
7f20: 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  String.IsNullOrE
7f30: 6d 70 74 79 28 73 74 72 43 6f 6c 75 6d 6e 29 3b  mpty(strColumn);
7f40: 0a 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68  .        row[Sch
7f50: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49  emaTableColumn.I
7f60: 73 41 6c 69 61 73 65 64 5d 20 3d 20 28 53 74 72  sAliased] = (Str
7f70: 69 6e 67 2e 43 6f 6d 70 61 72 65 28 47 65 74 4e  ing.Compare(GetN
7f80: 61 6d 65 28 6e 29 2c 20 73 74 72 43 6f 6c 75 6d  ame(n), strColum
7f90: 6e 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69  n, StringCompari
7fa0: 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72  son.OrdinalIgnor
7fb0: 65 43 61 73 65 29 20 21 3d 20 30 29 3b 0a 0a 20  eCase) != 0);.. 
7fc0: 20 20 20 20 20 20 20 74 65 6d 70 20 3d 20 63 6f         temp = co
7fd0: 6c 75 6d 6e 54 6f 50 61 72 65 6e 74 5b 6e 5d 2e  lumnToParent[n].
7fe0: 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 20 20 20  TableName;.     
7ff0: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
8000: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 74 65 6d 70  NullOrEmpty(temp
8010: 29 20 3d 3d 20 66 61 6c 73 65 29 20 72 6f 77 5b  ) == false) row[
8020: 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d  SchemaTableColum
8030: 6e 2e 42 61 73 65 54 61 62 6c 65 4e 61 6d 65 5d  n.BaseTableName]
8040: 20 3d 20 74 65 6d 70 3b 0a 0a 20 20 20 20 20 20   = temp;..      
8050: 20 20 74 65 6d 70 20 3d 20 63 6f 6c 75 6d 6e 54    temp = columnT
8060: 6f 50 61 72 65 6e 74 5b 6e 5d 2e 44 61 74 61 62  oParent[n].Datab
8070: 61 73 65 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  aseName;.       
8080: 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75   if (String.IsNu
8090: 6c 6c 4f 72 45 6d 70 74 79 28 74 65 6d 70 29 20  llOrEmpty(temp) 
80a0: 3d 3d 20 66 61 6c 73 65 29 20 72 6f 77 5b 53 63  == false) row[Sc
80b0: 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61  hemaTableOptiona
80c0: 6c 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 61 74 61  lColumn.BaseCata
80d0: 6c 6f 67 4e 61 6d 65 5d 20 3d 20 74 65 6d 70 3b  logName] = temp;
80e0: 0a 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67  ..        string
80f0: 20 64 61 74 61 54 79 70 65 20 3d 20 6e 75 6c 6c   dataType = null
8100: 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20  ;.        // If 
8110: 77 65 20 68 61 76 65 20 61 20 74 61 62 6c 65 2d  we have a table-
8120: 62 6f 75 6e 64 20 63 6f 6c 75 6d 6e 2c 20 65 78  bound column, ex
8130: 74 72 61 63 74 20 74 68 65 20 65 78 74 72 61 20  tract the extra 
8140: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
8150: 20 69 74 0a 20 20 20 20 20 20 20 20 69 66 20 28   it.        if (
8160: 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  String.IsNullOrE
8170: 6d 70 74 79 28 73 74 72 43 6f 6c 75 6d 6e 29 20  mpty(strColumn) 
8180: 3d 3d 20 66 61 6c 73 65 29 0a 20 20 20 20 20 20  == false).      
8190: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74    {.          st
81a0: 72 69 6e 67 20 63 6f 6c 6c 53 65 71 3b 0a 20 20  ring collSeq;.  
81b0: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 62 4e 6f          bool bNo
81c0: 74 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tNull;.         
81d0: 20 62 6f 6f 6c 20 62 50 72 69 6d 61 72 79 4b 65   bool bPrimaryKe
81e0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6f 6f  y;.          boo
81f0: 6c 20 62 41 75 74 6f 49 6e 63 72 65 6d 65 6e 74  l bAutoIncrement
8200: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69  ;.          stri
8210: 6e 67 5b 5d 20 61 72 53 69 7a 65 3b 0a 0a 20 20  ng[] arSize;..  
8220: 20 20 20 20 20 20 20 20 2f 2f 20 47 65 74 20 74          // Get t
8230: 68 65 20 63 6f 6c 75 6d 6e 20 6d 65 74 61 20 64  he column meta d
8240: 61 74 61 0a 20 20 20 20 20 20 20 20 20 20 5f 63  ata.          _c
8250: 6f 6d 6d 61 6e 64 2e 43 6f 6e 6e 65 63 74 69 6f  ommand.Connectio
8260: 6e 2e 5f 73 71 6c 2e 43 6f 6c 75 6d 6e 4d 65 74  n._sql.ColumnMet
8270: 61 44 61 74 61 28 0a 20 20 20 20 20 20 20 20 20  aData(.         
8280: 20 20 20 28 73 74 72 69 6e 67 29 72 6f 77 5b 53     (string)row[S
8290: 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e  chemaTableOption
82a0: 61 6c 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 61 74  alColumn.BaseCat
82b0: 61 6c 6f 67 4e 61 6d 65 5d 2c 0a 20 20 20 20 20  alogName],.     
82c0: 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 29 72         (string)r
82d0: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
82e0: 6c 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65 4e 61  lumn.BaseTableNa
82f0: 6d 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me],.           
8300: 20 73 74 72 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20   strColumn,.    
8310: 20 20 20 20 20 20 20 20 6f 75 74 20 64 61 74 61          out data
8320: 54 79 70 65 2c 20 6f 75 74 20 63 6f 6c 6c 53 65  Type, out collSe
8330: 71 2c 20 6f 75 74 20 62 4e 6f 74 4e 75 6c 6c 2c  q, out bNotNull,
8340: 20 6f 75 74 20 62 50 72 69 6d 61 72 79 4b 65 79   out bPrimaryKey
8350: 2c 20 6f 75 74 20 62 41 75 74 6f 49 6e 63 72 65  , out bAutoIncre
8360: 6d 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  ment);..        
8370: 20 20 69 66 20 28 62 4e 6f 74 4e 75 6c 6c 20 7c    if (bNotNull |
8380: 7c 20 62 50 72 69 6d 61 72 79 4b 65 79 29 20 72  | bPrimaryKey) r
8390: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
83a0: 6c 75 6d 6e 2e 41 6c 6c 6f 77 44 42 4e 75 6c 6c  lumn.AllowDBNull
83b0: 5d 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20  ] = false;..    
83c0: 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65 6d 61        row[Schema
83d0: 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49 73 4b 65  TableColumn.IsKe
83e0: 79 5d 20 3d 20 62 50 72 69 6d 61 72 79 4b 65 79  y] = bPrimaryKey
83f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b  ;.          row[
8400: 53 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f  SchemaTableOptio
8410: 6e 61 6c 43 6f 6c 75 6d 6e 2e 49 73 41 75 74 6f  nalColumn.IsAuto
8420: 49 6e 63 72 65 6d 65 6e 74 5d 20 3d 20 62 41 75  Increment] = bAu
8430: 74 6f 49 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20  toIncrement;.   
8440: 20 20 20 20 20 20 20 72 6f 77 5b 22 43 6f 6c 6c         row["Coll
8450: 61 74 69 6f 6e 54 79 70 65 22 5d 20 3d 20 63 6f  ationType"] = co
8460: 6c 6c 53 65 71 3b 0a 0a 20 20 20 20 20 20 20 20  llSeq;..        
8470: 20 20 2f 2f 20 46 6f 72 20 74 79 70 65 73 20 6c    // For types l
8480: 69 6b 65 20 76 61 72 63 68 61 72 28 35 30 29 20  ike varchar(50) 
8490: 61 6e 64 20 73 75 63 68 2c 20 65 78 74 72 61 63  and such, extrac
84a0: 74 20 74 68 65 20 73 69 7a 65 0a 20 20 20 20 20  t the size.     
84b0: 20 20 20 20 20 61 72 53 69 7a 65 20 3d 20 64 61       arSize = da
84c0: 74 61 54 79 70 65 2e 53 70 6c 69 74 28 27 28 27  taType.Split('('
84d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  );.          if 
84e0: 28 61 72 53 69 7a 65 2e 4c 65 6e 67 74 68 20 3e  (arSize.Length >
84f0: 20 31 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a   1).          {.
8500: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
8510: 54 79 70 65 20 3d 20 61 72 53 69 7a 65 5b 30 5d  Type = arSize[0]
8520: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ;.            ar
8530: 53 69 7a 65 20 3d 20 61 72 53 69 7a 65 5b 31 5d  Size = arSize[1]
8540: 2e 53 70 6c 69 74 28 27 29 27 29 3b 0a 20 20 20  .Split(')');.   
8550: 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72 53           if (arS
8560: 69 7a 65 2e 4c 65 6e 67 74 68 20 3e 20 31 29 0a  ize.Length > 1).
8570: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 53 69              arSi
8590: 7a 65 20 3d 20 61 72 53 69 7a 65 5b 30 5d 2e 53  ze = arSize[0].S
85a0: 70 6c 69 74 28 27 2c 27 2c 20 27 2e 27 29 3b 0a  plit(',', '.');.
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
85c0: 20 28 73 71 6c 54 79 70 65 2e 54 79 70 65 20 3d   (sqlType.Type =
85d0: 3d 20 44 62 54 79 70 65 2e 42 69 6e 61 72 79 20  = DbType.Binary 
85e0: 7c 7c 20 73 71 6c 54 79 70 65 2e 54 79 70 65 20  || sqlType.Type 
85f0: 3d 3d 20 44 62 54 79 70 65 2e 53 74 72 69 6e 67  == DbType.String
8600: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
8610: 20 20 20 20 20 20 73 71 6c 54 79 70 65 2e 54 79        sqlType.Ty
8620: 70 65 20 3d 3d 20 44 62 54 79 70 65 2e 41 6e 73  pe == DbType.Ans
8630: 69 53 74 72 69 6e 67 46 69 78 65 64 4c 65 6e 67  iStringFixedLeng
8640: 74 68 20 7c 7c 20 73 71 6c 54 79 70 65 2e 54 79  th || sqlType.Ty
8650: 70 65 20 3d 3d 20 44 62 54 79 70 65 2e 53 74 72  pe == DbType.Str
8660: 69 6e 67 46 69 78 65 64 4c 65 6e 67 74 68 29 0a  ingFixedLength).
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43  row[SchemaTableC
86a0: 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e 53 69 7a 65  olumn.ColumnSize
86b0: 5d 20 3d 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e  ] = Convert.ToIn
86c0: 74 33 32 28 61 72 53 69 7a 65 5b 30 5d 2c 20 43  t32(arSize[0], C
86d0: 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72  ultureInfo.Invar
86e0: 69 61 6e 74 43 75 6c 74 75 72 65 29 3b 0a 20 20  iantCulture);.  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
8710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
8720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8730: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
8740: 43 6f 6c 75 6d 6e 2e 4e 75 6d 65 72 69 63 50 72  Column.NumericPr
8750: 65 63 69 73 69 6f 6e 5d 20 3d 20 43 6f 6e 76 65  ecision] = Conve
8760: 72 74 2e 54 6f 49 6e 74 33 32 28 61 72 53 69 7a  rt.ToInt32(arSiz
8770: 65 5b 30 5d 2c 20 43 75 6c 74 75 72 65 49 6e 66  e[0], CultureInf
8780: 6f 2e 49 6e 76 61 72 69 61 6e 74 43 75 6c 74 75  o.InvariantCultu
8790: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  re);.           
87a0: 20 20 20 20 20 69 66 20 28 61 72 53 69 7a 65 2e       if (arSize.
87b0: 4c 65 6e 67 74 68 20 3e 20 31 29 0a 20 20 20 20  Length > 1).    
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
87d0: 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  w[SchemaTableCol
87e0: 75 6d 6e 2e 4e 75 6d 65 72 69 63 53 63 61 6c 65  umn.NumericScale
87f0: 5d 20 3d 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e  ] = Convert.ToIn
8800: 74 33 32 28 61 72 53 69 7a 65 5b 31 5d 2c 20 43  t32(arSize[1], C
8810: 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72  ultureInfo.Invar
8820: 69 61 6e 74 43 75 6c 74 75 72 65 29 3b 0a 20 20  iantCulture);.  
8830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8840: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8850: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
8860: 20 20 20 69 66 20 28 77 61 6e 74 44 65 66 61 75     if (wantDefau
8870: 6c 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20  ltValue).       
8880: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
8890: 20 2f 2f 20 44 65 74 65 72 6d 69 6e 65 20 74 68   // Determine th
88a0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
88b0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20  for the column, 
88c0: 77 68 69 63 68 20 73 75 63 6b 73 20 62 65 63 61  which sucks beca
88d0: 75 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 71  use we have to q
88e0: 75 65 72 79 20 74 68 65 20 73 63 68 65 6d 61 20  uery the schema 
88f0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
8900: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
8910: 67 20 28 53 51 4c 69 74 65 43 6f 6d 6d 61 6e 64  g (SQLiteCommand
8920: 20 63 6d 64 54 61 62 6c 65 20 3d 20 6e 65 77 20   cmdTable = new 
8930: 53 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 28 53 74  SQLiteCommand(St
8940: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 43 75 6c 74  ring.Format(Cult
8950: 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e  ureInfo.Invarian
8960: 74 43 75 6c 74 75 72 65 2c 20 22 50 52 41 47 4d  tCulture, "PRAGM
8970: 41 20 5b 7b 30 7d 5d 2e 54 41 42 4c 45 5f 49 4e  A [{0}].TABLE_IN
8980: 46 4f 28 5b 7b 31 7d 5d 29 22 2c 0a 20 20 20 20  FO([{1}])",.    
8990: 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63            row[Sc
89a0: 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61  hemaTableOptiona
89b0: 6c 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 61 74 61  lColumn.BaseCata
89c0: 6c 6f 67 4e 61 6d 65 5d 2c 0a 20 20 20 20 20 20  logName],.      
89d0: 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65          row[Sche
89e0: 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 42 61  maTableColumn.Ba
89f0: 73 65 54 61 62 6c 65 4e 61 6d 65 5d 0a 20 20 20  seTableName].   
8a00: 20 20 20 20 20 20 20 20 20 20 20 29 2c 20 5f 63             ), _c
8a10: 6f 6d 6d 61 6e 64 2e 43 6f 6e 6e 65 63 74 69 6f  ommand.Connectio
8a20: 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)).            
8a30: 75 73 69 6e 67 20 28 44 62 44 61 74 61 52 65 61  using (DbDataRea
8a40: 64 65 72 20 72 64 54 61 62 6c 65 20 3d 20 63 6d  der rdTable = cm
8a50: 64 54 61 62 6c 65 2e 45 78 65 63 75 74 65 52 65  dTable.ExecuteRe
8a60: 61 64 65 72 28 29 29 0a 20 20 20 20 20 20 20 20  ader()).        
8a70: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
8a80: 20 20 20 20 2f 2f 20 46 69 6e 64 20 74 68 65 20      // Find the 
8a90: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 0a  matching column.
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
8ab0: 69 6c 65 20 28 72 64 54 61 62 6c 65 2e 52 65 61  ile (rdTable.Rea
8ac0: 64 28 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  d()).           
8ad0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
8ae0: 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
8af0: 43 6f 6d 70 61 72 65 28 28 73 74 72 69 6e 67 29  Compare((string)
8b00: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43  row[SchemaTableC
8b10: 6f 6c 75 6d 6e 2e 42 61 73 65 43 6f 6c 75 6d 6e  olumn.BaseColumn
8b20: 4e 61 6d 65 5d 2c 20 72 64 54 61 62 6c 65 2e 47  Name], rdTable.G
8b30: 65 74 53 74 72 69 6e 67 28 31 29 2c 20 53 74 72  etString(1), Str
8b40: 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72  ingComparison.Or
8b50: 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29  dinalIgnoreCase)
8b60: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20   == 0).         
8b70: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
8b80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
8b90: 64 54 61 62 6c 65 2e 49 73 44 42 4e 75 6c 6c 28  dTable.IsDBNull(
8ba0: 34 29 20 3d 3d 20 66 61 6c 73 65 29 0a 20 20 20  4) == false).   
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
8bd0: 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 44  OptionalColumn.D
8be0: 65 66 61 75 6c 74 56 61 6c 75 65 5d 20 3d 20 72  efaultValue] = r
8bf0: 64 54 61 62 6c 65 5b 34 5d 3b 0a 0a 20 20 20 20  dTable[4];..    
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
8c10: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8c20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8c40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
8c50: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 44  ..          // D
8c60: 65 74 65 72 6d 69 6e 65 20 49 73 55 6e 69 71 75  etermine IsUniqu
8c70: 65 20 70 72 6f 70 65 72 6c 79 2c 20 77 68 69 63  e properly, whic
8c80: 68 20 69 73 20 61 20 70 61 69 6e 20 69 6e 20 74  h is a pain in t
8c90: 68 65 20 62 75 74 74 21 0a 20 20 20 20 20 20 20  he butt!.       
8ca0: 20 20 20 69 66 20 28 77 61 6e 74 55 6e 69 71 75     if (wantUniqu
8cb0: 65 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  eInfo).         
8cc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
8cd0: 66 20 28 28 73 74 72 69 6e 67 29 72 6f 77 5b 53  f ((string)row[S
8ce0: 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e  chemaTableOption
8cf0: 61 6c 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 61 74  alColumn.BaseCat
8d00: 61 6c 6f 67 4e 61 6d 65 5d 20 21 3d 20 73 74 72  alogName] != str
8d10: 43 61 74 61 6c 6f 67 0a 20 20 20 20 20 20 20 20  Catalog.        
8d20: 20 20 20 20 20 20 7c 7c 20 28 73 74 72 69 6e 67        || (string
8d30: 29 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65  )row[SchemaTable
8d40: 43 6f 6c 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65  Column.BaseTable
8d50: 4e 61 6d 65 5d 20 21 3d 20 73 74 72 54 61 62 6c  Name] != strTabl
8d60: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e).            {
8d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8d80: 74 72 43 61 74 61 6c 6f 67 20 3d 20 28 73 74 72  trCatalog = (str
8d90: 69 6e 67 29 72 6f 77 5b 53 63 68 65 6d 61 54 61  ing)row[SchemaTa
8da0: 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d  bleOptionalColum
8db0: 6e 2e 42 61 73 65 43 61 74 61 6c 6f 67 4e 61 6d  n.BaseCatalogNam
8dc0: 65 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e];.            
8dd0: 20 20 73 74 72 54 61 62 6c 65 20 3d 20 28 73 74    strTable = (st
8de0: 72 69 6e 67 29 72 6f 77 5b 53 63 68 65 6d 61 54  ring)row[SchemaT
8df0: 61 62 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65 54  ableColumn.BaseT
8e00: 61 62 6c 65 4e 61 6d 65 5d 3b 0a 0a 20 20 20 20  ableName];..    
8e10: 20 20 20 20 20 20 20 20 20 20 74 62 6c 49 6e 64            tblInd
8e20: 65 78 65 73 20 3d 20 5f 63 6f 6d 6d 61 6e 64 2e  exes = _command.
8e30: 43 6f 6e 6e 65 63 74 69 6f 6e 2e 47 65 74 53 63  Connection.GetSc
8e40: 68 65 6d 61 28 22 49 6e 64 65 78 65 73 22 2c 20  hema("Indexes", 
8e50: 6e 65 77 20 73 74 72 69 6e 67 5b 5d 20 7b 0a 20  new string[] {. 
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8e70: 73 74 72 69 6e 67 29 72 6f 77 5b 53 63 68 65 6d  string)row[Schem
8e80: 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f  aTableOptionalCo
8e90: 6c 75 6d 6e 2e 42 61 73 65 43 61 74 61 6c 6f 67  lumn.BaseCatalog
8ea0: 4e 61 6d 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Name],.         
8eb0: 20 20 20 20 20 20 20 6e 75 6c 6c 2c 0a 20 20 20         null,.   
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 74               (st
8ed0: 72 69 6e 67 29 72 6f 77 5b 53 63 68 65 6d 61 54  ring)row[SchemaT
8ee0: 61 62 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65 54  ableColumn.BaseT
8ef0: 61 62 6c 65 4e 61 6d 65 5d 2c 0a 20 20 20 20 20  ableName],.     
8f00: 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 20             null 
8f10: 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  });.            
8f20: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  }..            f
8f30: 6f 72 65 61 63 68 20 28 44 61 74 61 52 6f 77 20  oreach (DataRow 
8f40: 72 6f 77 49 6e 64 65 78 65 73 20 69 6e 20 74 62  rowIndexes in tb
8f50: 6c 49 6e 64 65 78 65 73 2e 52 6f 77 73 29 0a 20  lIndexes.Rows). 
8f60: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
8f70: 20 20 20 20 20 20 20 20 20 20 20 74 62 6c 49 6e             tblIn
8f80: 64 65 78 43 6f 6c 75 6d 6e 73 20 3d 20 5f 63 6f  dexColumns = _co
8f90: 6d 6d 61 6e 64 2e 43 6f 6e 6e 65 63 74 69 6f 6e  mmand.Connection
8fa0: 2e 47 65 74 53 63 68 65 6d 61 28 22 49 6e 64 65  .GetSchema("Inde
8fb0: 78 43 6f 6c 75 6d 6e 73 22 2c 20 6e 65 77 20 73  xColumns", new s
8fc0: 74 72 69 6e 67 5b 5d 20 7b 0a 20 20 20 20 20 20  tring[] {.      
8fd0: 20 20 20 20 20 20 20 20 20 20 28 73 74 72 69 6e            (strin
8fe0: 67 29 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c  g)row[SchemaTabl
8ff0: 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e  eOptionalColumn.
9000: 42 61 73 65 43 61 74 61 6c 6f 67 4e 61 6d 65 5d  BaseCatalogName]
9010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9020: 20 20 6e 75 6c 6c 2c 0a 20 20 20 20 20 20 20 20    null,.        
9030: 20 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 29          (string)
9040: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43  row[SchemaTableC
9050: 6f 6c 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65 4e  olumn.BaseTableN
9060: 61 6d 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ame],.          
9070: 20 20 20 20 20 20 28 73 74 72 69 6e 67 29 72 6f        (string)ro
9080: 77 49 6e 64 65 78 65 73 5b 22 49 4e 44 45 58 5f  wIndexes["INDEX_
9090: 4e 41 4d 45 22 5d 2c 0a 20 20 20 20 20 20 20 20  NAME"],.        
90a0: 20 20 20 20 20 20 20 20 6e 75 6c 6c 0a 20 20 20          null.   
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 3b               });
90c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
90d0: 6f 72 65 61 63 68 20 28 44 61 74 61 52 6f 77 20  oreach (DataRow 
90e0: 72 6f 77 43 6f 6c 75 6d 6e 49 6e 64 65 78 20 69  rowColumnIndex i
90f0: 6e 20 74 62 6c 49 6e 64 65 78 43 6f 6c 75 6d 6e  n tblIndexColumn
9100: 73 2e 52 6f 77 73 29 0a 20 20 20 20 20 20 20 20  s.Rows).        
9110: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
9120: 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69          if (Stri
9130: 6e 67 2e 43 6f 6d 70 61 72 65 28 28 73 74 72 69  ng.Compare((stri
9140: 6e 67 29 72 6f 77 43 6f 6c 75 6d 6e 49 6e 64 65  ng)rowColumnInde
9150: 78 5b 22 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 22 5d  x["COLUMN_NAME"]
9160: 2c 20 73 74 72 43 6f 6c 75 6d 6e 2c 20 53 74 72  , strColumn, Str
9170: 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72  ingComparison.Or
9180: 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29  dinalIgnoreCase)
9190: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20 20 20   == 0).         
91a0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
91b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0a 20 20             //.  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 2f 2f 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20  // BUGFIX: Make 
91e0: 73 75 72 65 20 74 68 61 74 20 77 65 20 6f 6e 6c  sure that we onl
91f0: 79 20 66 6c 61 67 20 74 68 69 73 20 63 6f 6c 75  y flag this colu
9200: 6d 6e 20 61 73 20 22 75 6e 69 71 75 65 22 0a 20  mn as "unique". 
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 2f 2f 20 20 20 20 20 20 20 20 20 69 66 20 77   //         if w
9230: 65 20 61 72 65 20 6e 6f 74 20 70 72 6f 63 65 73  e are not proces
9240: 73 69 6e 67 20 6f 66 20 73 6f 6d 65 20 6b 69 6e  sing of some kin
9250: 64 20 6f 66 20 6d 75 6c 74 69 2d 74 61 62 6c 65  d of multi-table
9260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9270: 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20 63 6f     //         co
9280: 6e 73 74 72 75 63 74 20 28 69 2e 65 2e 20 61 20  nstruct (i.e. a 
9290: 6a 6f 69 6e 29 20 62 65 63 61 75 73 65 20 69 6e  join) because in
92a0: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 6d 75   that case we mu
92b0: 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
92c0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20       //         
92d0: 61 6c 6c 6f 77 20 64 75 70 6c 69 63 61 74 65 20  allow duplicate 
92e0: 76 61 6c 75 65 73 20 28 72 65 66 65 72 20 74 6f  values (refer to
92f0: 20 74 69 63 6b 65 74 20 5b 37 65 33 66 61 39 33   ticket [7e3fa93
9300: 37 34 34 5d 29 2e 0a 20 20 20 20 20 20 20 20 20  744])..         
9310: 20 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20           //.    
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9330: 20 28 70 61 72 65 6e 74 54 6f 43 6f 6c 75 6d 6e   (parentToColumn
9340: 73 2e 43 6f 75 6e 74 20 3d 3d 20 31 20 26 26 20  s.Count == 1 && 
9350: 74 62 6c 49 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e  tblIndexColumns.
9360: 52 6f 77 73 2e 43 6f 75 6e 74 20 3d 3d 20 31 20  Rows.Count == 1 
9370: 26 26 20 28 62 6f 6f 6c 29 72 6f 77 5b 53 63 68  && (bool)row[Sch
9380: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 41  emaTableColumn.A
9390: 6c 6c 6f 77 44 42 4e 75 6c 6c 5d 20 3d 3d 20 66  llowDBNull] == f
93a0: 61 6c 73 65 29 0a 20 20 20 20 20 20 20 20 20 20  alse).          
93b0: 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63            row[Sc
93c0: 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e  hemaTableColumn.
93d0: 49 73 55 6e 69 71 75 65 5d 20 3d 20 72 6f 77 49  IsUnique] = rowI
93e0: 6e 64 65 78 65 73 5b 22 55 4e 49 51 55 45 22 5d  ndexes["UNIQUE"]
93f0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
9400: 20 20 20 20 20 2f 2f 20 49 66 20 69 74 73 20 61       // If its a
9410: 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72  n integer primar
9420: 79 20 6b 65 79 20 61 6e 64 20 74 68 65 20 6f 6e  y key and the on
9430: 6c 79 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  ly primary key i
9440: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 74 68 65  n the table, the
9450: 6e 20 69 74 73 20 61 20 72 6f 77 69 64 20 61 6c  n its a rowid al
9460: 69 61 73 20 61 6e 64 20 69 73 20 61 75 74 6f 69  ias and is autoi
9470: 6e 63 72 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  ncrement.       
9480: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
9490: 54 45 3a 20 20 43 75 72 72 65 6e 74 6c 79 20 63  TE:  Currently c
94a0: 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 62 65 63  ommented out bec
94b0: 61 75 73 65 20 74 68 69 73 20 69 73 20 6e 6f 74  ause this is not
94c0: 20 61 6c 77 61 79 73 20 74 68 65 20 64 65 73 69   always the desi
94d0: 72 65 64 20 62 65 68 61 76 69 6f 72 2e 20 20 46  red behavior.  F
94e0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 20 31 3a  or example, a 1:
94f0: 31 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 77  1 relationship w
9500: 69 74 68 0a 20 20 20 20 20 20 20 20 20 20 20 20  ith.            
9510: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20        //        
9520: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 2c 20 77  another table, w
9530: 68 65 72 65 20 74 68 65 20 6f 74 68 65 72 20 74  here the other t
9540: 61 62 6c 65 20 69 73 20 61 75 74 6f 69 6e 63 72  able is autoincr
9550: 65 6d 65 6e 74 2c 20 62 75 74 20 74 68 69 73 20  ement, but this 
9560: 6f 6e 65 20 69 73 20 6e 6f 74 2c 20 61 6e 64 20  one is not, and 
9570: 75 73 65 73 20 74 68 65 20 72 6f 77 69 64 20 66  uses the rowid f
9580: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  rom the other.. 
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 2f 2f 20 20 20 20 20 20 20 20 49 74 20 69 73   //        It is
95b0: 20 73 61 66 65 72 20 74 6f 20 6f 6e 6c 79 20 73   safer to only s
95c0: 65 74 20 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  et Autoincrement
95d0: 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65   on tables where
95e0: 20 77 65 27 72 65 20 53 55 52 45 20 74 68 65 20   we're SURE the 
95f0: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 41  user specified A
9600: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 2c 20 65 76  UTOINCREMENT, ev
9610: 65 6e 20 69 66 20 69 74 73 20 61 20 72 6f 77 69  en if its a rowi
9620: 64 20 63 6f 6c 75 6d 6e 2e 0a 0a 20 20 20 20 20  d column...     
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9640: 28 74 62 6c 49 6e 64 65 78 43 6f 6c 75 6d 6e 73  (tblIndexColumns
9650: 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 3d 3d 20 31  .Rows.Count == 1
9660: 20 26 26 20 28 62 6f 6f 6c 29 72 6f 77 49 6e 64   && (bool)rowInd
9670: 65 78 65 73 5b 22 50 52 49 4d 41 52 59 5f 4b 45  exes["PRIMARY_KE
9680: 59 22 5d 20 3d 3d 20 74 72 75 65 20 26 26 20 53  Y"] == true && S
9690: 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d  tring.IsNullOrEm
96a0: 70 74 79 28 64 61 74 61 54 79 70 65 29 20 3d 3d  pty(dataType) ==
96b0: 20 66 61 6c 73 65 20 26 26 0a 20 20 20 20 20 20   false &&.      
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
96d0: 72 69 6e 67 2e 43 6f 6d 70 61 72 65 28 64 61 74  ring.Compare(dat
96e0: 61 54 79 70 65 2c 20 22 69 6e 74 65 67 65 72 22  aType, "integer"
96f0: 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73  , StringComparis
9700: 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e 6f 72 65  on.OrdinalIgnore
9710: 43 61 73 65 29 20 3d 3d 20 30 29 0a 20 20 20 20  Case) == 0).    
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 20 2f 2f 20 20 72 6f 77 5b 53 63 68 65      //  row[Sche
9750: 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43  maTableOptionalC
9760: 6f 6c 75 6d 6e 2e 49 73 41 75 74 6f 49 6e 63 72  olumn.IsAutoIncr
9770: 65 6d 65 6e 74 5d 20 3d 20 74 72 75 65 3b 0a 20  ement] = true;. 
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
97a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
97d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97e0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
97f0: 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49      if (String.I
9800: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 61 74  sNullOrEmpty(dat
9810: 61 54 79 70 65 29 29 0a 20 20 20 20 20 20 20 20  aType)).        
9820: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
9830: 54 79 70 65 41 66 66 69 6e 69 74 79 20 61 66 66  TypeAffinity aff
9840: 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  in;.            
9850: 64 61 74 61 54 79 70 65 20 3d 20 5f 61 63 74 69  dataType = _acti
9860: 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c  veStatement._sql
9870: 2e 43 6f 6c 75 6d 6e 54 79 70 65 28 5f 61 63 74  .ColumnType(_act
9880: 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20 6e 2c  iveStatement, n,
9890: 20 6f 75 74 20 61 66 66 69 6e 29 3b 0a 20 20 20   out affin);.   
98a0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
98b0: 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49      if (String.I
98c0: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 61 74  sNullOrEmpty(dat
98d0: 61 54 79 70 65 29 20 3d 3d 20 66 61 6c 73 65 29  aType) == false)
98e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77  .            row
98f0: 5b 22 44 61 74 61 54 79 70 65 4e 61 6d 65 22 5d  ["DataTypeName"]
9900: 20 3d 20 64 61 74 61 54 79 70 65 3b 0a 20 20 20   = dataType;.   
9910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
9920: 62 6c 2e 52 6f 77 73 2e 41 64 64 28 72 6f 77 29  bl.Rows.Add(row)
9930: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
9940: 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 20 21 3d   if (_keyInfo !=
9950: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 5f   null).        _
9960: 6b 65 79 49 6e 66 6f 2e 41 70 70 65 6e 64 53 63  keyInfo.AppendSc
9970: 68 65 6d 61 54 61 62 6c 65 28 74 62 6c 29 3b 0a  hemaTable(tbl);.
9980: 0a 20 20 20 20 20 20 74 62 6c 2e 41 63 63 65 70  .      tbl.Accep
9990: 74 43 68 61 6e 67 65 73 28 29 3b 0a 20 20 20 20  tChanges();.    
99a0: 20 20 74 62 6c 2e 45 6e 64 4c 6f 61 64 44 61 74    tbl.EndLoadDat
99b0: 61 28 29 3b 0a 0a 20 20 20 20 20 20 72 65 74 75  a();..      retu
99c0: 72 6e 20 74 62 6c 3b 0a 20 20 20 20 7d 0a 0a 20  rn tbl;.    }.. 
99d0: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
99e0: 0a 20 20 20 20 2f 2f 2f 20 52 65 74 72 69 65 76  .    /// Retriev
99f0: 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 73  es the column as
9a00: 20 61 20 73 74 72 69 6e 67 0a 20 20 20 20 2f 2f   a string.    //
9a10: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
9a20: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
9a30: 3d 22 69 22 3e 54 68 65 20 69 6e 64 65 78 20 6f  ="i">The index o
9a40: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20  f the column to 
9a50: 72 65 74 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e  retrieve</param>
9a60: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
9a70: 73 3e 73 74 72 69 6e 67 3c 2f 72 65 74 75 72 6e  s>string</return
9a80: 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  s>.    public ov
9a90: 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 47 65  erride string Ge
9aa0: 74 53 74 72 69 6e 67 28 69 6e 74 20 69 29 0a 20  tString(int i). 
9ab0: 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b     {.      Check
9ac0: 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20  Disposed();..   
9ad0: 20 20 20 69 66 20 28 69 20 3e 3d 20 56 69 73 69     if (i >= Visi
9ae0: 62 6c 65 46 69 65 6c 64 43 6f 75 6e 74 20 26 26  bleFieldCount &&
9af0: 20 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c   _keyInfo != nul
9b00: 6c 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  l).        retur
9b10: 6e 20 5f 6b 65 79 49 6e 66 6f 2e 47 65 74 53 74  n _keyInfo.GetSt
9b20: 72 69 6e 67 28 69 20 2d 20 56 69 73 69 62 6c 65  ring(i - Visible
9b30: 46 69 65 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20 20  FieldCount);..  
9b40: 20 20 20 20 56 65 72 69 66 79 54 79 70 65 28 69      VerifyType(i
9b50: 2c 20 44 62 54 79 70 65 2e 53 74 72 69 6e 67 29  , DbType.String)
9b60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f  ;.      return _
9b70: 61 63 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2e  activeStatement.
9b80: 5f 73 71 6c 2e 47 65 74 54 65 78 74 28 5f 61 63  _sql.GetText(_ac
9b90: 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2c 20 69  tiveStatement, i
9ba0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  );.    }..    //
9bb0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
9bc0: 2f 2f 2f 20 52 65 74 72 69 65 76 65 73 20 74 68  /// Retrieves th
9bd0: 65 20 63 6f 6c 75 6d 6e 20 61 73 20 61 6e 20 6f  e column as an o
9be0: 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
9bf0: 69 6e 67 20 74 6f 20 74 68 65 20 75 6e 64 65 72  ing to the under
9c00: 6c 79 69 6e 67 20 64 61 74 61 74 79 70 65 20 6f  lying datatype o
9c10: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  f the column.   
9c20: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
9c30: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
9c40: 61 6d 65 3d 22 69 22 3e 54 68 65 20 69 6e 64 65  ame="i">The inde
9c50: 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
9c60: 74 6f 20 72 65 74 72 69 65 76 65 3c 2f 70 61 72  to retrieve</par
9c70: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  am>.    /// <ret
9c80: 75 72 6e 73 3e 6f 62 6a 65 63 74 3c 2f 72 65 74  urns>object</ret
9c90: 75 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69 63  urns>.    public
9ca0: 20 6f 76 65 72 72 69 64 65 20 6f 62 6a 65 63 74   override object
9cb0: 20 47 65 74 56 61 6c 75 65 28 69 6e 74 20 69 29   GetValue(int i)
9cc0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 43 68 65  .    {.      Che
9cd0: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 20 20  ckDisposed();.  
9ce0: 20 20 20 20 43 68 65 63 6b 56 61 6c 69 64 52 6f      CheckValidRo
9cf0: 77 28 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28  w();..      if (
9d00: 69 20 3e 3d 20 56 69 73 69 62 6c 65 46 69 65 6c  i >= VisibleFiel
9d10: 64 43 6f 75 6e 74 20 26 26 20 5f 6b 65 79 49 6e  dCount && _keyIn
9d20: 66 6f 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  fo != null).    
9d30: 20 20 20 20 72 65 74 75 72 6e 20 5f 6b 65 79 49      return _keyI
9d40: 6e 66 6f 2e 47 65 74 56 61 6c 75 65 28 69 20 2d  nfo.GetValue(i -
9d50: 20 56 69 73 69 62 6c 65 46 69 65 6c 64 43 6f 75   VisibleFieldCou
9d60: 6e 74 29 3b 0a 0a 20 20 20 20 20 20 53 51 4c 69  nt);..      SQLi
9d70: 74 65 54 79 70 65 20 74 79 70 20 3d 20 47 65 74  teType typ = Get
9d80: 53 51 4c 69 74 65 54 79 70 65 28 69 29 3b 0a 0a  SQLiteType(i);..
9d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 61 63        return _ac
9da0: 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f 73  tiveStatement._s
9db0: 71 6c 2e 47 65 74 56 61 6c 75 65 28 0a 20 20 20  ql.GetValue(.   
9dc0: 20 20 20 20 20 20 20 5f 61 63 74 69 76 65 53 74         _activeSt
9dd0: 61 74 65 6d 65 6e 74 2c 20 53 51 4c 69 74 65 43  atement, SQLiteC
9de0: 6f 6d 6d 61 6e 64 2e 47 65 74 46 6c 61 67 73 28  ommand.GetFlags(
9df0: 5f 63 6f 6d 6d 61 6e 64 29 2c 20 69 2c 20 74 79  _command), i, ty
9e00: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
9e10: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20  // <summary>.   
9e20: 20 2f 2f 2f 20 52 65 74 72 65 69 76 65 73 20 74   /// Retreives t
9e30: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 6d 75 6c  he values of mul
9e40: 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2c 20 75  tiple columns, u
9e50: 70 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  p to the size of
9e60: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
9e70: 72 61 79 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ray.    /// </su
9e80: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c  mmary>.    /// <
9e90: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 76 61 6c 75  param name="valu
9ea0: 65 73 22 3e 54 68 65 20 61 72 72 61 79 20 74 6f  es">The array to
9eb0: 20 66 69 6c 6c 20 77 69 74 68 20 76 61 6c 75 65   fill with value
9ec0: 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d  s from the colum
9ed0: 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
9ee0: 74 20 72 65 73 75 6c 74 73 65 74 3c 2f 70 61 72  t resultset</par
9ef0: 61 6d 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  am>.    /// <ret
9f00: 75 72 6e 73 3e 54 68 65 20 6e 75 6d 62 65 72 20  urns>The number 
9f10: 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 72 69  of columns retri
9f20: 65 76 65 64 3c 2f 72 65 74 75 72 6e 73 3e 0a 20  eved</returns>. 
9f30: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
9f40: 64 65 20 69 6e 74 20 47 65 74 56 61 6c 75 65 73  de int GetValues
9f50: 28 6f 62 6a 65 63 74 5b 5d 20 76 61 6c 75 65 73  (object[] values
9f60: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 43 68  ).    {.      Ch
9f70: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a  eckDisposed();..
9f80: 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 78 20 3d        int nMax =
9f90: 20 46 69 65 6c 64 43 6f 75 6e 74 3b 0a 20 20 20   FieldCount;.   
9fa0: 20 20 20 69 66 20 28 76 61 6c 75 65 73 2e 4c 65     if (values.Le
9fb0: 6e 67 74 68 20 3c 20 6e 4d 61 78 29 20 6e 4d 61  ngth < nMax) nMa
9fc0: 78 20 3d 20 76 61 6c 75 65 73 2e 4c 65 6e 67 74  x = values.Lengt
9fd0: 68 3b 0a 0a 20 20 20 20 20 20 66 6f 72 20 28 69  h;..      for (i
9fe0: 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 6e 4d  nt n = 0; n < nM
9ff0: 61 78 3b 20 6e 2b 2b 29 0a 20 20 20 20 20 20 7b  ax; n++).      {
a000: 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65 73 5b  .        values[
a010: 6e 5d 20 3d 20 47 65 74 56 61 6c 75 65 28 6e 29  n] = GetValue(n)
a020: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
a030: 20 72 65 74 75 72 6e 20 6e 4d 61 78 3b 0a 20 20   return nMax;.  
a040: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75    }..    /// <su
a050: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52  mmary>.    /// R
a060: 65 74 75 72 6e 73 20 61 20 63 6f 6c 6c 65 63 74  eturns a collect
a070: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ion containing a
a080: 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ll the column na
a090: 6d 65 73 20 61 6e 64 20 76 61 6c 75 65 73 20 66  mes and values f
a0a0: 6f 72 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20 63  or the.    /// c
a0b0: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 64 61  urrent row of da
a0c0: 74 61 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ta in the curren
a0d0: 74 20 72 65 73 75 6c 74 73 65 74 2c 20 69 66 20  t resultset, if 
a0e0: 61 6e 79 2e 20 20 49 66 20 74 68 65 72 65 20 69  any.  If there i
a0f0: 73 20 6e 6f 0a 20 20 20 20 2f 2f 2f 20 63 75 72  s no.    /// cur
a100: 72 65 6e 74 20 72 6f 77 20 6f 72 20 6e 6f 20 63  rent row or no c
a110: 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 65 74  urrent resultset
a120: 2c 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 6d  , an exception m
a130: 61 79 20 62 65 20 74 68 72 6f 77 6e 2e 0a 20 20  ay be thrown..  
a140: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
a150: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
a160: 73 3e 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 63  s>.    /// The c
a170: 6f 6c 6c 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69  ollection contai
a180: 6e 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ning the column 
a190: 6e 61 6d 65 20 61 6e 64 20 76 61 6c 75 65 20 69  name and value i
a1a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
a1b0: 68 65 0a 20 20 20 20 2f 2f 2f 20 63 75 72 72 65  he.    /// curre
a1c0: 6e 74 20 72 6f 77 20 6f 66 20 64 61 74 61 20 69  nt row of data i
a1d0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  n the current re
a1e0: 73 75 6c 74 73 65 74 20 6f 72 20 6e 75 6c 6c 20  sultset or null 
a1f0: 69 66 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  if this informat
a200: 69 6f 6e 0a 20 20 20 20 2f 2f 2f 20 63 61 6e 6e  ion.    /// cann
a210: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
a220: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e      /// </return
a230: 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 4e 61  s>.    public Na
a240: 6d 65 56 61 6c 75 65 43 6f 6c 6c 65 63 74 69 6f  meValueCollectio
a250: 6e 20 47 65 74 56 61 6c 75 65 73 28 29 0a 20 20  n GetValues().  
a260: 20 20 7b 0a 20 20 20 20 20 20 20 20 43 68 65 63    {.        Chec
a270: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20  kDisposed();..  
a280: 20 20 20 20 20 20 69 66 20 28 28 5f 61 63 74 69        if ((_acti
a290: 76 65 53 74 61 74 65 6d 65 6e 74 20 3d 3d 20 6e  veStatement == n
a2a0: 75 6c 6c 29 20 7c 7c 20 28 5f 61 63 74 69 76 65  ull) || (_active
a2b0: 53 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c 20 3d  Statement._sql =
a2c0: 3d 20 6e 75 6c 6c 29 29 0a 20 20 20 20 20 20 20  = null)).       
a2d0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49       throw new I
a2e0: 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45  nvalidOperationE
a2f0: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 0a 20 20 20  xception();..   
a300: 20 20 20 20 20 69 6e 74 20 6e 4d 61 78 20 3d 20       int nMax = 
a310: 56 69 73 69 62 6c 65 46 69 65 6c 64 43 6f 75 6e  VisibleFieldCoun
a320: 74 3b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 56  t;.        NameV
a330: 61 6c 75 65 43 6f 6c 6c 65 63 74 69 6f 6e 20 72  alueCollection r
a340: 65 73 75 6c 74 20 3d 20 6e 65 77 20 4e 61 6d 65  esult = new Name
a350: 56 61 6c 75 65 43 6f 6c 6c 65 63 74 69 6f 6e 28  ValueCollection(
a360: 6e 4d 61 78 29 3b 0a 0a 20 20 20 20 20 20 20 20  nMax);..        
a370: 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20  for (int n = 0; 
a380: 6e 20 3c 20 6e 4d 61 78 3b 20 6e 2b 2b 29 0a 20  n < nMax; n++). 
a390: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
a3a0: 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65       string name
a3b0: 20 3d 20 5f 61 63 74 69 76 65 53 74 61 74 65 6d   = _activeStatem
a3c0: 65 6e 74 2e 5f 73 71 6c 2e 43 6f 6c 75 6d 6e 4e  ent._sql.ColumnN
a3d0: 61 6d 65 28 5f 61 63 74 69 76 65 53 74 61 74 65  ame(_activeState
a3e0: 6d 65 6e 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ment, n);.      
a3f0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 76 61 6c        string val
a400: 75 65 20 3d 20 5f 61 63 74 69 76 65 53 74 61 74  ue = _activeStat
a410: 65 6d 65 6e 74 2e 5f 73 71 6c 2e 47 65 74 54 65  ement._sql.GetTe
a420: 78 74 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d  xt(_activeStatem
a430: 65 6e 74 2c 20 6e 29 3b 0a 0a 20 20 20 20 20 20  ent, n);..      
a440: 20 20 20 20 20 20 72 65 73 75 6c 74 2e 41 64 64        result.Add
a450: 28 6e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 20  (name, value);. 
a460: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
a470: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
a480: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
a490: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  <summary>.    //
a4a0: 2f 20 52 65 74 75 72 6e 73 20 54 72 75 65 20 69  / Returns True i
a4b0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 65 74 20  f the resultset 
a4c0: 68 61 73 20 72 6f 77 73 20 74 68 61 74 20 63 61  has rows that ca
a4d0: 6e 20 62 65 20 66 65 74 63 68 65 64 0a 20 20 20  n be fetched.   
a4e0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
a4f0: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
a500: 69 64 65 20 62 6f 6f 6c 20 48 61 73 52 6f 77 73  ide bool HasRows
a510: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65 74  .    {.      get
a520: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
a530: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
a540: 3b 0a 20 20 20 20 20 20 20 20 43 68 65 63 6b 43  ;.        CheckC
a550: 6c 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 20  losed();.       
a560: 20 72 65 74 75 72 6e 20 28 5f 72 65 61 64 69 6e   return (_readin
a570: 67 53 74 61 74 65 20 21 3d 20 31 29 3b 0a 20 20  gState != 1);.  
a580: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a590: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
a5a0: 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 54     /// Returns T
a5b0: 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 20  rue if the data 
a5c0: 72 65 61 64 65 72 20 69 73 20 63 6c 6f 73 65 64  reader is closed
a5d0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
a5e0: 72 79 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  ry>.    public o
a5f0: 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 43  verride bool IsC
a600: 6c 6f 73 65 64 0a 20 20 20 20 7b 0a 20 20 20 20  losed.    {.    
a610: 20 20 67 65 74 20 7b 20 43 68 65 63 6b 44 69 73    get { CheckDis
a620: 70 6f 73 65 64 28 29 3b 20 72 65 74 75 72 6e 20  posed(); return 
a630: 28 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 6e 75 6c  (_command == nul
a640: 6c 29 3b 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  l); }.    }..   
a650: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
a660: 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20 54     /// Returns T
a670: 72 75 65 20 69 66 20 74 68 65 20 73 70 65 63 69  rue if the speci
a680: 66 69 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  fied column is n
a690: 75 6c 6c 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75  ull.    /// </su
a6a0: 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c  mmary>.    /// <
a6b0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69 22 3e 54  param name="i">T
a6c0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
a6d0: 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69 65  column to retrie
a6e0: 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f  ve</param>.    /
a6f0: 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 54 72 75 65  // <returns>True
a700: 20 6f 72 20 46 61 6c 73 65 3c 2f 72 65 74 75 72   or False</retur
a710: 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  ns>.    public o
a720: 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 49 73 44  verride bool IsD
a730: 42 4e 75 6c 6c 28 69 6e 74 20 69 29 0a 20 20 20  BNull(int i).   
a740: 20 7b 0a 20 20 20 20 20 20 43 68 65 63 6b 44 69   {.      CheckDi
a750: 73 70 6f 73 65 64 28 29 3b 0a 0a 20 20 20 20 20  sposed();..     
a760: 20 69 66 20 28 69 20 3e 3d 20 56 69 73 69 62 6c   if (i >= Visibl
a770: 65 46 69 65 6c 64 43 6f 75 6e 74 20 26 26 20 5f  eFieldCount && _
a780: 6b 65 79 49 6e 66 6f 20 21 3d 20 6e 75 6c 6c 29  keyInfo != null)
a790: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a7a0: 5f 6b 65 79 49 6e 66 6f 2e 49 73 44 42 4e 75 6c  _keyInfo.IsDBNul
a7b0: 6c 28 69 20 2d 20 56 69 73 69 62 6c 65 46 69 65  l(i - VisibleFie
a7c0: 6c 64 43 6f 75 6e 74 29 3b 0a 0a 20 20 20 20 20  ldCount);..     
a7d0: 20 72 65 74 75 72 6e 20 5f 61 63 74 69 76 65 53   return _activeS
a7e0: 74 61 74 65 6d 65 6e 74 2e 5f 73 71 6c 2e 49 73  tatement._sql.Is
a7f0: 4e 75 6c 6c 28 5f 61 63 74 69 76 65 53 74 61 74  Null(_activeStat
a800: 65 6d 65 6e 74 2c 20 69 29 3b 0a 20 20 20 20 7d  ement, i);.    }
a810: 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61  ..    /// <summa
a820: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 4d 6f 76 65  ry>.    /// Move
a830: 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 65  s to the next re
a840: 73 75 6c 74 73 65 74 20 69 6e 20 6d 75 6c 74 69  sultset in multi
a850: 70 6c 65 20 72 6f 77 2d 72 65 74 75 72 6e 69 6e  ple row-returnin
a860: 67 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 20  g SQL command.. 
a870: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
a880: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72  >.    /// <retur
a890: 6e 73 3e 54 72 75 65 20 69 66 20 74 68 65 20 63  ns>True if the c
a8a0: 6f 6d 6d 61 6e 64 20 77 61 73 20 73 75 63 63 65  ommand was succe
a8b0: 73 73 66 75 6c 20 61 6e 64 20 61 20 6e 65 77 20  ssful and a new 
a8c0: 72 65 73 75 6c 74 73 65 74 20 69 73 20 61 76 61  resultset is ava
a8d0: 69 6c 61 62 6c 65 2c 20 46 61 6c 73 65 20 6f 74  ilable, False ot
a8e0: 68 65 72 77 69 73 65 2e 3c 2f 72 65 74 75 72 6e  herwise.</return
a8f0: 73 3e 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  s>.    public ov
a900: 65 72 72 69 64 65 20 62 6f 6f 6c 20 4e 65 78 74  erride bool Next
a910: 52 65 73 75 6c 74 28 29 0a 20 20 20 20 7b 0a 20  Result().    {. 
a920: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
a930: 65 64 28 29 3b 0a 20 20 20 20 20 20 43 68 65 63  ed();.      Chec
a940: 6b 43 6c 6f 73 65 64 28 29 3b 0a 20 20 20 20 20  kClosed();.     
a950: 20 69 66 20 28 5f 74 68 72 6f 77 4f 6e 44 69 73   if (_throwOnDis
a960: 70 6f 73 65 64 29 20 53 51 4c 69 74 65 43 6f 6d  posed) SQLiteCom
a970: 6d 61 6e 64 2e 43 68 65 63 6b 28 5f 63 6f 6d 6d  mand.Check(_comm
a980: 61 6e 64 29 3b 0a 0a 20 20 20 20 20 20 53 51 4c  and);..      SQL
a990: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 6d  iteStatement stm
a9a0: 74 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  t = null;.      
a9b0: 69 6e 74 20 66 69 65 6c 64 43 6f 75 6e 74 3b 0a  int fieldCount;.
a9c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 20 28 74 72  .      while (tr
a9d0: 75 65 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ue).      {.    
a9e0: 20 20 20 20 69 66 20 28 73 74 6d 74 20 3d 3d 20      if (stmt == 
a9f0: 6e 75 6c 6c 20 26 26 20 5f 61 63 74 69 76 65 53  null && _activeS
aa00: 74 61 74 65 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c  tatement != null
aa10: 20 26 26 20 5f 61 63 74 69 76 65 53 74 61 74 65   && _activeState
aa20: 6d 65 6e 74 2e 5f 73 71 6c 20 21 3d 20 6e 75 6c  ment._sql != nul
aa30: 6c 20 26 26 20 5f 61 63 74 69 76 65 53 74 61 74  l && _activeStat
aa40: 65 6d 65 6e 74 2e 5f 73 71 6c 2e 49 73 4f 70 65  ement._sql.IsOpe
aa50: 6e 28 29 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  n()).        {. 
aa60: 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 73 65           // Rese
aa70: 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  t the previously
aa80: 2d 65 78 65 63 75 74 65 64 20 73 74 61 74 65 6d  -executed statem
aa90: 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 5f 61  ent.          _a
aaa0: 63 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f  ctiveStatement._
aab0: 73 71 6c 2e 52 65 73 65 74 28 5f 61 63 74 69 76  sql.Reset(_activ
aac0: 65 53 74 61 74 65 6d 65 6e 74 29 3b 0a 0a 20 20  eStatement);..  
aad0: 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 77 65          // If we
aae0: 27 72 65 20 6f 6e 6c 79 20 73 75 70 70 6f 73 65  're only suppose
aaf0: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 73 69  d to return a si
ab00: 6e 67 6c 65 20 72 6f 77 73 65 74 2c 20 73 74 65  ngle rowset, ste
ab10: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 65  p through all re
ab20: 6d 61 69 6e 69 6e 67 20 73 74 61 74 65 6d 65 6e  maining statemen
ab30: 74 73 20 6f 6e 63 65 20 75 6e 74 69 6c 0a 20 20  ts once until.  
ab40: 20 20 20 20 20 20 20 20 2f 2f 20 74 68 65 79 20          // they 
ab50: 61 72 65 20 61 6c 6c 20 64 6f 6e 65 20 61 6e 64  are all done and
ab60: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 74 6f   return false to
ab70: 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 6d 6f 72   indicate no mor
ab80: 65 20 72 65 73 75 6c 74 73 65 74 73 20 65 78 69  e resultsets exi
ab90: 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 69 66  st..          if
aba0: 20 28 28 5f 63 6f 6d 6d 61 6e 64 42 65 68 61 76   ((_commandBehav
abb0: 69 6f 72 20 26 20 43 6f 6d 6d 61 6e 64 42 65 68  ior & CommandBeh
abc0: 61 76 69 6f 72 2e 53 69 6e 67 6c 65 52 65 73 75  avior.SingleResu
abd0: 6c 74 29 20 21 3d 20 30 29 0a 20 20 20 20 20 20  lt) != 0).      
abe0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
abf0: 20 20 66 6f 72 20 28 3b 20 3b 20 29 0a 20 20 20    for (; ; ).   
ac00: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
ac10: 20 20 20 20 20 20 20 20 20 73 74 6d 74 20 3d 20           stmt = 
ac20: 5f 63 6f 6d 6d 61 6e 64 2e 47 65 74 53 74 61 74  _command.GetStat
ac30: 65 6d 65 6e 74 28 5f 61 63 74 69 76 65 53 74 61  ement(_activeSta
ac40: 74 65 6d 65 6e 74 49 6e 64 65 78 20 2b 20 31 29  tementIndex + 1)
ac50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ac60: 69 66 20 28 73 74 6d 74 20 3d 3d 20 6e 75 6c 6c  if (stmt == null
ac70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
ac80: 20 20 20 20 20 20 20 5f 61 63 74 69 76 65 53 74         _activeSt
ac90: 61 74 65 6d 65 6e 74 49 6e 64 65 78 2b 2b 3b 0a  atementIndex++;.
aca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
acb0: 74 6d 74 2e 5f 73 71 6c 2e 53 74 65 70 28 73 74  tmt._sql.Step(st
acc0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mt);.           
acd0: 20 20 20 69 66 20 28 73 74 6d 74 2e 5f 73 71 6c     if (stmt._sql
ace0: 2e 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 73 74 6d  .ColumnCount(stm
acf0: 74 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20  t) == 0).       
ad00: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
ad10: 20 20 20 20 20 20 20 20 20 69 66 20 28 5f 72 6f           if (_ro
ad20: 77 73 41 66 66 65 63 74 65 64 20 3d 3d 20 2d 31  wsAffected == -1
ad30: 29 20 5f 72 6f 77 73 41 66 66 65 63 74 65 64 20  ) _rowsAffected 
ad40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
ad50: 20 20 20 20 20 69 6e 74 20 63 68 61 6e 67 65 73       int changes
ad60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ad70: 20 20 20 20 20 20 69 66 20 28 73 74 6d 74 2e 54        if (stmt.T
ad80: 72 79 47 65 74 43 68 61 6e 67 65 73 28 72 65 66  ryGetChanges(ref
ad90: 20 63 68 61 6e 67 65 73 29 29 0a 20 20 20 20 20   changes)).     
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
adb0: 72 6f 77 73 41 66 66 65 63 74 65 64 20 2b 3d 20  rowsAffected += 
adc0: 63 68 61 6e 67 65 73 3b 0a 20 20 20 20 20 20 20  changes;.       
add0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20           else.  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
ae20: 6d 74 2e 5f 73 71 6c 2e 52 65 73 65 74 28 73 74  mt._sql.Reset(st
ae30: 6d 74 29 3b 20 2f 2f 20 47 6f 74 74 61 20 72 65  mt); // Gotta re
ae40: 73 65 74 20 61 66 74 65 72 20 65 76 65 72 79 20  set after every 
ae50: 73 74 65 70 20 74 6f 20 72 65 6c 65 61 73 65 20  step to release 
ae60: 61 6e 79 20 6c 6f 63 6b 73 20 61 6e 64 20 73 75  any locks and su
ae70: 63 68 21 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch!.            
ae80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
ae90: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
aea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aeb0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 47 65  }..        // Ge
aec0: 74 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 65  t the next state
aed0: 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 0a  ment to execute.
aee0: 20 20 20 20 20 20 20 20 73 74 6d 74 20 3d 20 5f          stmt = _
aef0: 63 6f 6d 6d 61 6e 64 2e 47 65 74 53 74 61 74 65  command.GetState
af00: 6d 65 6e 74 28 5f 61 63 74 69 76 65 53 74 61 74  ment(_activeStat
af10: 65 6d 65 6e 74 49 6e 64 65 78 20 2b 20 31 29 3b  ementIndex + 1);
af20: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20  ..        // If 
af30: 77 65 27 76 65 20 72 65 61 63 68 65 64 20 74 68  we've reached th
af40: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61  e end of the sta
af50: 74 65 6d 65 6e 74 73 2c 20 72 65 74 75 72 6e 20  tements, return 
af60: 66 61 6c 73 65 2c 20 6e 6f 20 6d 6f 72 65 20 72  false, no more r
af70: 65 73 75 6c 74 73 65 74 73 0a 20 20 20 20 20 20  esultsets.      
af80: 20 20 69 66 20 28 73 74 6d 74 20 3d 3d 20 6e 75    if (stmt == nu
af90: 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 72 65  ll).          re
afa0: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 0a 20 20 20  turn false;..   
afb0: 20 20 20 20 20 2f 2f 20 49 66 20 77 65 20 77 65       // If we we
afc0: 72 65 20 6f 6e 20 61 20 63 75 72 72 65 6e 74 20  re on a current 
afd0: 72 65 73 75 6c 74 73 65 74 2c 20 73 65 74 20 74  resultset, set t
afe0: 68 65 20 73 74 61 74 65 20 74 6f 20 22 64 6f 6e  he state to "don
aff0: 65 20 72 65 61 64 69 6e 67 22 20 66 6f 72 20 69  e reading" for i
b000: 74 0a 20 20 20 20 20 20 20 20 69 66 20 28 5f 72  t.        if (_r
b010: 65 61 64 69 6e 67 53 74 61 74 65 20 3c 20 31 29  eadingState < 1)
b020: 0a 20 20 20 20 20 20 20 20 20 20 5f 72 65 61 64  .          _read
b030: 69 6e 67 53 74 61 74 65 20 3d 20 31 3b 0a 0a 20  ingState = 1;.. 
b040: 20 20 20 20 20 20 20 5f 61 63 74 69 76 65 53 74         _activeSt
b050: 61 74 65 6d 65 6e 74 49 6e 64 65 78 2b 2b 3b 0a  atementIndex++;.
b060: 0a 20 20 20 20 20 20 20 20 66 69 65 6c 64 43 6f  .        fieldCo
b070: 75 6e 74 20 3d 20 73 74 6d 74 2e 5f 73 71 6c 2e  unt = stmt._sql.
b080: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 73 74 6d 74  ColumnCount(stmt
b090: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 49  );..        // I
b0a0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
b0b0: 69 73 20 6e 6f 74 20 61 20 73 65 6c 65 63 74 20  is not a select 
b0c0: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 77 65 27  statement or we'
b0d0: 72 65 20 6e 6f 74 20 72 65 74 72 69 65 76 69 6e  re not retrievin
b0e0: 67 20 73 63 68 65 6d 61 20 6f 6e 6c 79 2c 20 74  g schema only, t
b0f0: 68 65 6e 20 70 65 72 66 6f 72 6d 20 74 68 65 20  hen perform the 
b100: 69 6e 69 74 69 61 6c 20 73 74 65 70 0a 20 20 20  initial step.   
b110: 20 20 20 20 20 69 66 20 28 28 5f 63 6f 6d 6d 61       if ((_comma
b120: 6e 64 42 65 68 61 76 69 6f 72 20 26 20 43 6f 6d  ndBehavior & Com
b130: 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 53 63 68  mandBehavior.Sch
b140: 65 6d 61 4f 6e 6c 79 29 20 3d 3d 20 30 20 7c 7c  emaOnly) == 0 ||
b150: 20 66 69 65 6c 64 43 6f 75 6e 74 20 3d 3d 20 30   fieldCount == 0
b160: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ).        {.    
b170: 20 20 20 20 20 20 69 66 20 28 73 74 6d 74 2e 5f        if (stmt._
b180: 73 71 6c 2e 53 74 65 70 28 73 74 6d 74 29 29 0a  sql.Step(stmt)).
b190: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
b1a0: 20 20 20 20 20 20 20 20 5f 72 65 61 64 69 6e 67          _reading
b1b0: 53 74 61 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20  State = -1;.    
b1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b1d0: 20 20 65 6c 73 65 20 69 66 20 28 66 69 65 6c 64    else if (field
b1e0: 43 6f 75 6e 74 20 3d 3d 20 30 29 20 2f 2f 20 4e  Count == 0) // N
b1f0: 6f 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 2c  o rows returned,
b200: 20 69 66 20 66 69 65 6c 64 43 6f 75 6e 74 20 69   if fieldCount i
b210: 73 20 7a 65 72 6f 2c 20 73 6b 69 70 20 74 6f 20  s zero, skip to 
b220: 74 68 65 20 6e 65 78 74 20 73 74 61 74 65 6d 65  the next stateme
b230: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20  nt.          {. 
b240: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f             if (_
b250: 72 6f 77 73 41 66 66 65 63 74 65 64 20 3d 3d 20  rowsAffected == 
b260: 2d 31 29 20 5f 72 6f 77 73 41 66 66 65 63 74 65  -1) _rowsAffecte
b270: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
b280: 20 20 20 69 6e 74 20 63 68 61 6e 67 65 73 20 3d     int changes =
b290: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
b2a0: 69 66 20 28 73 74 6d 74 2e 54 72 79 47 65 74 43  if (stmt.TryGetC
b2b0: 68 61 6e 67 65 73 28 72 65 66 20 63 68 61 6e 67  hanges(ref chang
b2c0: 65 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  es)).           
b2d0: 20 20 20 20 20 5f 72 6f 77 73 41 66 66 65 63 74       _rowsAffect
b2e0: 65 64 20 2b 3d 20 63 68 61 6e 67 65 73 3b 0a 20  ed += changes;. 
b2f0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a             else.
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
b320: 20 20 20 20 20 20 20 20 20 20 73 74 6d 74 2e 5f            stmt._
b330: 73 71 6c 2e 52 65 73 65 74 28 73 74 6d 74 29 3b  sql.Reset(stmt);
b340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
b350: 74 69 6e 75 65 3b 20 2f 2f 20 53 6b 69 70 20 74  tinue; // Skip t
b360: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  his command and 
b370: 6d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  move to the next
b380: 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 61 20 72  , it was not a r
b390: 6f 77 2d 72 65 74 75 72 6e 69 6e 67 20 72 65 73  ow-returning res
b3a0: 75 6c 74 73 65 74 0a 20 20 20 20 20 20 20 20 20  ultset.         
b3b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
b3c0: 65 20 2f 2f 20 4e 6f 20 72 6f 77 73 2c 20 66 69  e // No rows, fi
b3d0: 65 6c 64 43 6f 75 6e 74 20 69 73 20 6e 6f 6e 2d  eldCount is non-
b3e0: 7a 65 72 6f 20 73 6f 20 73 74 6f 70 20 68 65 72  zero so stop her
b3f0: 65 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  e.          {.  
b400: 20 20 20 20 20 20 20 20 20 20 5f 72 65 61 64 69            _readi
b410: 6e 67 53 74 61 74 65 20 3d 20 31 3b 20 2f 2f 20  ngState = 1; // 
b420: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74  This command ret
b430: 75 72 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 62 75  urned columns bu
b440: 74 20 6e 6f 20 72 6f 77 73 2c 20 73 6f 20 72 65  t no rows, so re
b450: 74 75 72 6e 20 74 72 75 65 2c 20 62 75 74 20 48  turn true, but H
b460: 61 73 52 6f 77 73 20 3d 20 66 61 6c 73 65 20 61  asRows = false a
b470: 6e 64 20 52 65 61 64 28 29 20 72 65 74 75 72 6e  nd Read() return
b480: 73 20 66 61 6c 73 65 0a 20 20 20 20 20 20 20 20  s false.        
b490: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
b4a0: 20 20 20 20 20 20 20 2f 2f 20 41 68 68 2c 20 77         // Ahh, w
b4b0: 65 20 66 6f 75 6e 64 20 61 20 72 6f 77 2d 72 65  e found a row-re
b4c0: 74 75 72 6e 69 6e 67 20 72 65 73 75 6c 74 73 65  turning resultse
b4d0: 74 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  t eligible to be
b4e0: 20 72 65 74 75 72 6e 65 64 21 0a 20 20 20 20 20   returned!.     
b4f0: 20 20 20 5f 61 63 74 69 76 65 53 74 61 74 65 6d     _activeStatem
b500: 65 6e 74 20 3d 20 73 74 6d 74 3b 0a 20 20 20 20  ent = stmt;.    
b510: 20 20 20 20 5f 66 69 65 6c 64 43 6f 75 6e 74 20      _fieldCount 
b520: 3d 20 66 69 65 6c 64 43 6f 75 6e 74 3b 0a 20 20  = fieldCount;.  
b530: 20 20 20 20 20 20 5f 66 69 65 6c 64 49 6e 64 65        _fieldInde
b540: 78 65 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  xes = null;.    
b550: 20 20 20 20 5f 66 69 65 6c 64 54 79 70 65 41 72      _fieldTypeAr
b560: 72 61 79 20 3d 20 6e 75 6c 6c 3b 0a 0a 20 20 20  ray = null;..   
b570: 20 20 20 20 20 69 66 20 28 28 5f 63 6f 6d 6d 61       if ((_comma
b580: 6e 64 42 65 68 61 76 69 6f 72 20 26 20 43 6f 6d  ndBehavior & Com
b590: 6d 61 6e 64 42 65 68 61 76 69 6f 72 2e 4b 65 79  mandBehavior.Key
b5a0: 49 6e 66 6f 29 20 21 3d 20 30 29 0a 20 20 20 20  Info) != 0).    
b5b0: 20 20 20 20 20 20 4c 6f 61 64 4b 65 79 49 6e 66        LoadKeyInf
b5c0: 6f 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 72 65  o();..        re
b5d0: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20  turn true;.     
b5e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
b5f0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
b600: 2f 2f 2f 20 52 65 74 72 69 65 76 65 73 20 74 68  /// Retrieves th
b610: 65 20 53 51 4c 69 74 65 54 79 70 65 20 66 6f 72  e SQLiteType for
b620: 20 61 20 67 69 76 65 6e 20 63 6f 6c 75 6d 6e 2c   a given column,
b630: 20 61 6e 64 20 63 61 63 68 65 73 20 69 74 20 74   and caches it t
b640: 6f 20 61 76 6f 69 64 20 72 65 70 65 74 65 74 69  o avoid repeteti
b650: 76 65 20 69 6e 74 65 72 6f 70 20 63 61 6c 6c 73  ve interop calls
b660: 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d  ..    /// </summ
b670: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  ary>.    /// <pa
b680: 72 61 6d 20 6e 61 6d 65 3d 22 69 22 3e 54 68 65  ram name="i">The
b690: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   index of the co
b6a0: 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69 65 76 65  lumn to retrieve
b6b0: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f  </param>.    ///
b6c0: 20 3c 72 65 74 75 72 6e 73 3e 41 20 53 51 4c 69   <returns>A SQLi
b6d0: 74 65 54 79 70 65 20 73 74 72 75 63 74 75 72 65  teType structure
b6e0: 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 70  </returns>.    p
b6f0: 72 69 76 61 74 65 20 53 51 4c 69 74 65 54 79 70  rivate SQLiteTyp
b700: 65 20 47 65 74 53 51 4c 69 74 65 54 79 70 65 28  e GetSQLiteType(
b710: 69 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20  int i).    {.   
b720: 20 20 20 53 51 4c 69 74 65 54 79 70 65 20 74 79     SQLiteType ty
b730: 70 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 49 6e 69  p;..      // Ini
b740: 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 65 6c  tialize the fiel
b750: 64 20 74 79 70 65 73 20 61 72 72 61 79 20 69 66  d types array if
b760: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 69   not already ini
b770: 74 69 61 6c 69 7a 65 64 0a 20 20 20 20 20 20 69  tialized.      i
b780: 66 20 28 5f 66 69 65 6c 64 54 79 70 65 41 72 72  f (_fieldTypeArr
b790: 61 79 20 3d 3d 20 6e 75 6c 6c 29 0a 20 20 20 20  ay == null).    
b7a0: 20 20 20 20 5f 66 69 65 6c 64 54 79 70 65 41 72      _fieldTypeAr
b7b0: 72 61 79 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  ray = new SQLite
b7c0: 54 79 70 65 5b 56 69 73 69 62 6c 65 46 69 65 6c  Type[VisibleFiel
b7d0: 64 43 6f 75 6e 74 5d 3b 0a 0a 20 20 20 20 20 20  dCount];..      
b7e0: 2f 2f 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  // Initialize th
b7f0: 69 73 20 63 6f 6c 75 6d 6e 27 73 20 66 69 65 6c  is column's fiel
b800: 64 20 74 79 70 65 20 69 6e 73 74 61 6e 63 65 0a  d type instance.
b810: 20 20 20 20 20 20 69 66 20 28 5f 66 69 65 6c 64        if (_field
b820: 54 79 70 65 41 72 72 61 79 5b 69 5d 20 3d 3d 20  TypeArray[i] == 
b830: 6e 75 6c 6c 29 20 5f 66 69 65 6c 64 54 79 70 65  null) _fieldType
b840: 41 72 72 61 79 5b 69 5d 20 3d 20 6e 65 77 20 53  Array[i] = new S
b850: 51 4c 69 74 65 54 79 70 65 28 29 3b 0a 0a 20 20  QLiteType();..  
b860: 20 20 20 20 74 79 70 20 3d 20 5f 66 69 65 6c 64      typ = _field
b870: 54 79 70 65 41 72 72 61 79 5b 69 5d 3b 0a 0a 20  TypeArray[i];.. 
b880: 20 20 20 20 20 2f 2f 20 49 66 20 6e 6f 74 20 69       // If not i
b890: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
b8a0: 20 66 65 74 63 68 20 74 68 65 20 64 65 63 6c 61   fetch the decla
b8b0: 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74 61 74  red column datat
b8c0: 79 70 65 20 61 6e 64 20 61 74 74 65 6d 70 74 20  ype and attempt 
b8d0: 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 0a 20 20  to convert it.  
b8e0: 20 20 20 20 2f 2f 20 74 6f 20 61 20 6b 6e 6f 77      // to a know
b8f0: 6e 20 44 62 54 79 70 65 2e 0a 20 20 20 20 20 20  n DbType..      
b900: 69 66 20 28 74 79 70 2e 41 66 66 69 6e 69 74 79  if (typ.Affinity
b910: 20 3d 3d 20 54 79 70 65 41 66 66 69 6e 69 74 79   == TypeAffinity
b920: 2e 55 6e 69 6e 69 74 69 61 6c 69 7a 65 64 29 0a  .Uninitialized).
b930: 20 20 20 20 20 20 20 20 74 79 70 2e 54 79 70 65          typ.Type
b940: 20 3d 20 53 51 4c 69 74 65 43 6f 6e 76 65 72 74   = SQLiteConvert
b950: 2e 54 79 70 65 4e 61 6d 65 54 6f 44 62 54 79 70  .TypeNameToDbTyp
b960: 65 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65  e(_activeStateme
b970: 6e 74 2e 5f 73 71 6c 2e 43 6f 6c 75 6d 6e 54 79  nt._sql.ColumnTy
b980: 70 65 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d  pe(_activeStatem
b990: 65 6e 74 2c 20 69 2c 20 6f 75 74 20 74 79 70 2e  ent, i, out typ.
b9a0: 41 66 66 69 6e 69 74 79 29 29 3b 0a 20 20 20 20  Affinity));.    
b9b0: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 74    else.        t
b9c0: 79 70 2e 41 66 66 69 6e 69 74 79 20 3d 20 5f 61  yp.Affinity = _a
b9d0: 63 74 69 76 65 53 74 61 74 65 6d 65 6e 74 2e 5f  ctiveStatement._
b9e0: 73 71 6c 2e 43 6f 6c 75 6d 6e 41 66 66 69 6e 69  sql.ColumnAffini
b9f0: 74 79 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d  ty(_activeStatem
ba00: 65 6e 74 2c 20 69 29 3b 0a 0a 20 20 20 20 20 20  ent, i);..      
ba10: 72 65 74 75 72 6e 20 74 79 70 3b 0a 20 20 20 20  return typ;.    
ba20: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d  }..    /// <summ
ba30: 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 52 65 61  ary>.    /// Rea
ba40: 64 73 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  ds the next row 
ba50: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
ba60: 65 74 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  et.    /// </sum
ba70: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 72  mary>.    /// <r
ba80: 65 74 75 72 6e 73 3e 54 72 75 65 20 69 66 20 61  eturns>True if a
ba90: 20 6e 65 77 20 72 6f 77 20 77 61 73 20 73 75 63   new row was suc
baa0: 63 65 73 73 66 75 6c 6c 79 20 6c 6f 61 64 65 64  cessfully loaded
bab0: 20 61 6e 64 20 69 73 20 72 65 61 64 79 20 66 6f   and is ready fo
bac0: 72 20 70 72 6f 63 65 73 73 69 6e 67 3c 2f 72 65  r processing</re
bad0: 74 75 72 6e 73 3e 0a 20 20 20 20 70 75 62 6c 69  turns>.    publi
bae0: 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20  c override bool 
baf0: 52 65 61 64 28 29 0a 20 20 20 20 7b 0a 20 20 20  Read().    {.   
bb00: 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64     CheckDisposed
bb10: 28 29 3b 0a 20 20 20 20 20 20 43 68 65 63 6b 43  ();.      CheckC
bb20: 6c 6f 73 65 64 28 29 3b 0a 20 20 20 20 20 20 69  losed();.      i
bb30: 66 20 28 5f 74 68 72 6f 77 4f 6e 44 69 73 70 6f  f (_throwOnDispo
bb40: 73 65 64 29 20 53 51 4c 69 74 65 43 6f 6d 6d 61  sed) SQLiteComma
bb50: 6e 64 2e 43 68 65 63 6b 28 5f 63 6f 6d 6d 61 6e  nd.Check(_comman
bb60: 64 29 3b 0a 0a 20 20 20 20 20 20 69 66 20 28 5f  d);..      if (_
bb70: 72 65 61 64 69 6e 67 53 74 61 74 65 20 3d 3d 20  readingState == 
bb80: 2d 31 29 20 2f 2f 20 46 69 72 73 74 20 73 74 65  -1) // First ste
bb90: 70 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f  p was already do
bba0: 6e 65 20 61 74 20 74 68 65 20 4e 65 78 74 52 65  ne at the NextRe
bbb0: 73 75 6c 74 28 29 20 6c 65 76 65 6c 2c 20 73 6f  sult() level, so
bbc0: 20 64 6f 6e 27 74 20 73 74 65 70 20 61 67 61 69   don't step agai
bbd0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  n, just return t
bbe0: 72 75 65 2e 0a 20 20 20 20 20 20 7b 0a 20 20 20  rue..      {.   
bbf0: 20 20 20 20 20 5f 72 65 61 64 69 6e 67 53 74 61       _readingSta
bc00: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
bc10: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
bc20: 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
bc30: 69 66 20 28 5f 72 65 61 64 69 6e 67 53 74 61 74  if (_readingStat
bc40: 65 20 3d 3d 20 30 29 20 2f 2f 20 41 63 74 69 76  e == 0) // Activ
bc50: 65 6c 79 20 72 65 61 64 69 6e 67 20 72 6f 77 73  ely reading rows
bc60: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
bc70: 20 2f 2f 20 44 6f 6e 27 74 20 72 65 61 64 20 61   // Don't read a
bc80: 20 6e 65 77 20 72 6f 77 20 69 66 20 74 68 65 20   new row if the 
bc90: 63 6f 6d 6d 61 6e 64 20 62 65 68 61 76 69 6f 72  command behavior
bca0: 20 64 69 63 74 61 74 65 73 20 53 69 6e 67 6c 65   dictates Single
bcb0: 52 6f 77 2e 20 20 57 65 27 76 65 20 61 6c 72 65  Row.  We've alre
bcc0: 61 64 79 20 72 65 61 64 20 74 68 65 20 66 69 72  ady read the fir
bcd0: 73 74 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20  st row..        
bce0: 69 66 20 28 28 5f 63 6f 6d 6d 61 6e 64 42 65 68  if ((_commandBeh
bcf0: 61 76 69 6f 72 20 26 20 43 6f 6d 6d 61 6e 64 42  avior & CommandB
bd00: 65 68 61 76 69 6f 72 2e 53 69 6e 67 6c 65 52 6f  ehavior.SingleRo
bd10: 77 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 20  w) == 0).       
bd20: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20   {.          if 
bd30: 28 5f 61 63 74 69 76 65 53 74 61 74 65 6d 65 6e  (_activeStatemen
bd40: 74 2e 5f 73 71 6c 2e 53 74 65 70 28 5f 61 63 74  t._sql.Step(_act
bd50: 69 76 65 53 74 61 74 65 6d 65 6e 74 29 20 3d 3d  iveStatement) ==
bd60: 20 74 72 75 65 29 0a 20 20 20 20 20 20 20 20 20   true).         
bd70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
bd80: 66 20 28 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e  f (_keyInfo != n
bd90: 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20  ull).           
bda0: 20 20 20 5f 6b 65 79 49 6e 66 6f 2e 52 65 73 65     _keyInfo.Rese
bdb0: 74 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  t();..          
bdc0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
bdd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
bde0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 5f 72     }..        _r
bdf0: 65 61 64 69 6e 67 53 74 61 74 65 20 3d 20 31 3b  eadingState = 1;
be00: 20 2f 2f 20 46 69 6e 69 73 68 65 64 20 72 65 61   // Finished rea
be10: 64 69 6e 67 20 72 6f 77 73 0a 20 20 20 20 20 20  ding rows.      
be20: 7d 0a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  }..      return 
be30: 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  false;.    }..  
be40: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
be50: 20 20 20 20 2f 2f 2f 20 52 65 74 72 69 65 76 65      /// Retrieve
be60: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 65   the count of re
be70: 63 6f 72 64 73 20 61 66 66 65 63 74 65 64 20 62  cords affected b
be80: 79 20 61 6e 20 75 70 64 61 74 65 2f 69 6e 73 65  y an update/inse
be90: 72 74 20 63 6f 6d 6d 61 6e 64 2e 20 20 4f 6e 6c  rt command.  Onl
bea0: 79 20 76 61 6c 69 64 20 6f 6e 63 65 20 74 68 65  y valid once the
beb0: 20 64 61 74 61 20 72 65 61 64 65 72 20 69 73 20   data reader is 
bec0: 63 6c 6f 73 65 64 21 0a 20 20 20 20 2f 2f 2f 20  closed!.    /// 
bed0: 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70  </summary>.    p
bee0: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 69  ublic override i
bef0: 6e 74 20 52 65 63 6f 72 64 73 41 66 66 65 63 74  nt RecordsAffect
bf00: 65 64 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67  ed.    {.      g
bf10: 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73  et { CheckDispos
bf20: 65 64 28 29 3b 20 72 65 74 75 72 6e 20 28 5f 72  ed(); return (_r
bf30: 6f 77 73 41 66 66 65 63 74 65 64 20 3c 20 30 29  owsAffected < 0)
bf40: 20 3f 20 30 20 3a 20 5f 72 6f 77 73 41 66 66 65   ? 0 : _rowsAffe
bf50: 63 74 65 64 3b 20 7d 0a 20 20 20 20 7d 0a 0a 20  cted; }.    }.. 
bf60: 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e     /// <summary>
bf70: 0a 20 20 20 20 2f 2f 2f 20 49 6e 64 65 78 65 72  .    /// Indexer
bf80: 20 74 6f 20 72 65 74 72 69 65 76 65 20 64 61 74   to retrieve dat
bf90: 61 20 66 72 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20  a from a column 
bfa0: 67 69 76 65 6e 20 69 74 73 20 6e 61 6d 65 0a 20  given its name. 
bfb0: 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79     /// </summary
bfc0: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  >.    /// <param
bfd0: 20 6e 61 6d 65 3d 22 6e 61 6d 65 22 3e 54 68 65   name="name">The
bfe0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
bff0: 75 6d 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  umn to retrieve 
c000: 64 61 74 61 20 66 6f 72 3c 2f 70 61 72 61 6d 3e  data for</param>
c010: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
c020: 73 3e 54 68 65 20 76 61 6c 75 65 20 63 6f 6e 74  s>The value cont
c030: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 6f 6c  ained in the col
c040: 75 6d 6e 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20  umn</returns>.  
c050: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
c060: 65 20 6f 62 6a 65 63 74 20 74 68 69 73 5b 73 74  e object this[st
c070: 72 69 6e 67 20 6e 61 6d 65 5d 0a 20 20 20 20 7b  ring name].    {
c080: 0a 20 20 20 20 20 20 67 65 74 20 7b 20 43 68 65  .      get { Che
c090: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 72 65  ckDisposed(); re
c0a0: 74 75 72 6e 20 47 65 74 56 61 6c 75 65 28 47 65  turn GetValue(Ge
c0b0: 74 4f 72 64 69 6e 61 6c 28 6e 61 6d 65 29 29 3b  tOrdinal(name));
c0c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
c0d0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
c0e0: 2f 2f 2f 20 49 6e 64 65 78 65 72 20 74 6f 20 72  /// Indexer to r
c0f0: 65 74 72 69 65 76 65 20 64 61 74 61 20 66 72 6f  etrieve data fro
c100: 6d 20 61 20 63 6f 6c 75 6d 6e 20 67 69 76 65 6e  m a column given
c110: 20 69 74 73 20 69 0a 20 20 20 20 2f 2f 2f 20 3c   its i.    /// <
c120: 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  /summary>.    //
c130: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 69  / <param name="i
c140: 22 3e 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74  ">The index of t
c150: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74  he column to ret
c160: 72 69 65 76 65 3c 2f 70 61 72 61 6d 3e 0a 20 20  rieve</param>.  
c170: 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e 73 3e 54    /// <returns>T
c180: 68 65 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e  he value contain
c190: 65 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  ed in the column
c1a0: 3c 2f 72 65 74 75 72 6e 73 3e 0a 20 20 20 20 70  </returns>.    p
c1b0: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 6f  ublic override o
c1c0: 62 6a 65 63 74 20 74 68 69 73 5b 69 6e 74 20 69  bject this[int i
c1d0: 5d 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 67 65  ].    {.      ge
c1e0: 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73 65  t { CheckDispose
c1f0: 64 28 29 3b 20 72 65 74 75 72 6e 20 47 65 74 56  d(); return GetV
c200: 61 6c 75 65 28 69 29 3b 20 7d 0a 20 20 20 20 7d  alue(i); }.    }
c210: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  ..    private vo
c220: 69 64 20 4c 6f 61 64 4b 65 79 49 6e 66 6f 28 29  id LoadKeyInfo()
c230: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69  .    {.        i
c240: 66 20 28 5f 6b 65 79 49 6e 66 6f 20 21 3d 20 6e  f (_keyInfo != n
c250: 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  ull).        {. 
c260: 20 20 20 20 20 20 20 20 20 20 20 5f 6b 65 79 49             _keyI
c270: 6e 66 6f 2e 44 69 73 70 6f 73 65 28 29 3b 0a 20  nfo.Dispose();. 
c280: 20 20 20 20 20 20 20 20 20 20 20 5f 6b 65 79 49             _keyI
c290: 6e 66 6f 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  nfo = null;.    
c2a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 5f      }..        _
c2b0: 6b 65 79 49 6e 66 6f 20 3d 20 6e 65 77 20 53 51  keyInfo = new SQ
c2c0: 4c 69 74 65 4b 65 79 52 65 61 64 65 72 28 5f 63  LiteKeyReader(_c
c2d0: 6f 6d 6d 61 6e 64 2e 43 6f 6e 6e 65 63 74 69 6f  ommand.Connectio
c2e0: 6e 2c 20 74 68 69 73 2c 20 5f 61 63 74 69 76 65  n, this, _active
c2f0: 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  Statement);.    
c300: 7d 0a 20 20 7d 0a 7d 0a                          }.  }.}.