System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 8cd749ae51bc38a2097403b83336331a1b8150f4:


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 20 0a 20 2a 20 52  ft.com). * . * R
00b0: 65 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70  eleased to the p
00c0: 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73  ublic domain, us
00d0: 65 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69  e at your own ri
00e0: 73 6b 21 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  sk!. ***********
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
0120: 6e 61 6d 65 73 70 61 63 65 20 53 79 73 74 65 6d  namespace System
0130: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0a 7b 0a 20  .Data.SQLite.{. 
0140: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 3b 0a 20   using System;. 
0150: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61   using System.Da
0160: 74 61 3b 0a 20 20 75 73 69 6e 67 20 53 79 73 74  ta;.  using Syst
0170: 65 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f 6e 3b 0a  em.Data.Common;.
0180: 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 43    using System.C
0190: 6f 6c 6c 65 63 74 69 6f 6e 73 2e 47 65 6e 65 72  ollections.Gener
01a0: 69 63 3b 0a 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d  ic;..  /// <summ
01b0: 61 72 79 3e 0a 20 20 2f 2f 2f 20 54 68 69 73 20  ary>.  /// This 
01c0: 63 6c 61 73 73 20 70 72 6f 76 69 64 65 73 20 6b  class provides k
01d0: 65 79 20 69 6e 66 6f 20 66 6f 72 20 61 20 67 69  ey info for a gi
01e0: 76 65 6e 20 53 51 4c 69 74 65 20 73 74 61 74 65  ven SQLite state
01f0: 6d 65 6e 74 2e 0a 20 20 2f 2f 2f 20 3c 72 65 6d  ment..  /// <rem
0200: 61 72 6b 73 3e 0a 20 20 2f 2f 2f 20 50 72 6f 76  arks>.  /// Prov
0210: 69 64 69 6e 67 20 6b 65 79 20 69 6e 66 6f 72 6d  iding key inform
0220: 61 74 69 6f 6e 20 66 6f 72 20 61 20 67 69 76 65  ation for a give
0230: 6e 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6e  n statement is n
0240: 6f 6e 2d 74 72 69 76 69 61 6c 20 3a 28 0a 20 20  on-trivial :(.  
0250: 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0a 20  /// </remarks>. 
0260: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
0270: 20 20 69 6e 74 65 72 6e 61 6c 20 73 65 61 6c 65    internal seale
0280: 64 20 63 6c 61 73 73 20 53 51 4c 69 74 65 4b 65  d class SQLiteKe
0290: 79 52 65 61 64 65 72 20 3a 20 49 44 69 73 70 6f  yReader : IDispo
02a0: 73 61 62 6c 65 0a 20 20 7b 0a 20 20 20 20 70 72  sable.  {.    pr
02b0: 69 76 61 74 65 20 4b 65 79 49 6e 66 6f 5b 5d 20  ivate KeyInfo[] 
02c0: 5f 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 72  _keyInfo;.    pr
02d0: 69 76 61 74 65 20 53 51 4c 69 74 65 53 74 61 74  ivate SQLiteStat
02e0: 65 6d 65 6e 74 20 5f 73 74 6d 74 3b 0a 20 20 20  ement _stmt;.   
02f0: 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 5f 69   private bool _i
0300: 73 56 61 6c 69 64 3b 0a 0a 20 20 20 20 2f 2f 2f  sValid;..    ///
0310: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
0320: 2f 2f 20 55 73 65 64 20 74 6f 20 73 75 70 70 6f  // Used to suppo
0330: 72 74 20 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69  rt CommandBehavi
0340: 6f 72 2e 4b 65 79 49 6e 66 6f 0a 20 20 20 20 2f  or.KeyInfo.    /
0350: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
0360: 20 20 70 72 69 76 61 74 65 20 73 74 72 75 63 74    private struct
0370: 20 4b 65 79 49 6e 66 6f 0a 20 20 20 20 7b 0a 20   KeyInfo.    {. 
0380: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74       internal st
0390: 72 69 6e 67 20 64 61 74 61 62 61 73 65 4e 61 6d  ring databaseNam
03a0: 65 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61  e;.      interna
03b0: 6c 20 73 74 72 69 6e 67 20 74 61 62 6c 65 4e 61  l string tableNa
03c0: 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e  me;.      intern
03d0: 61 6c 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e  al string column
03e0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 65  Name;.      inte
03f0: 72 6e 61 6c 20 69 6e 74 20 64 61 74 61 62 61 73  rnal int databas
0400: 65 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61  e;.      interna
0410: 6c 20 69 6e 74 20 72 6f 6f 74 50 61 67 65 3b 0a  l int rootPage;.
0420: 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69        internal i
0430: 6e 74 20 63 75 72 73 6f 72 3b 0a 20 20 20 20 20  nt cursor;.     
0440: 20 69 6e 74 65 72 6e 61 6c 20 4b 65 79 51 75 65   internal KeyQue
0450: 72 79 20 71 75 65 72 79 3b 0a 20 20 20 20 20 20  ry query;.      
0460: 69 6e 74 65 72 6e 61 6c 20 69 6e 74 20 63 6f 6c  internal int col
0470: 75 6d 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  umn;.    }..    
0480: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20  /// <summary>.  
0490: 20 20 2f 2f 2f 20 41 20 73 69 6e 67 6c 65 20 73    /// A single s
04a0: 75 62 2d 71 75 65 72 79 20 66 6f 72 20 61 20 67  ub-query for a g
04b0: 69 76 65 6e 20 74 61 62 6c 65 2f 64 61 74 61 62  iven table/datab
04c0: 61 73 65 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  ase..    /// </s
04d0: 75 6d 6d 61 72 79 3e 0a 20 20 20 20 70 72 69 76  ummary>.    priv
04e0: 61 74 65 20 73 65 61 6c 65 64 20 63 6c 61 73 73  ate sealed class
04f0: 20 4b 65 79 51 75 65 72 79 20 3a 20 49 44 69 73   KeyQuery : IDis
0500: 70 6f 73 61 62 6c 65 0a 20 20 20 20 7b 0a 20 20  posable.    {.  
0510: 20 20 20 20 70 72 69 76 61 74 65 20 53 51 4c 69      private SQLi
0520: 74 65 43 6f 6d 6d 61 6e 64 20 5f 63 6f 6d 6d 61  teCommand _comma
0530: 6e 64 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e  nd;.      intern
0540: 61 6c 20 53 51 4c 69 74 65 44 61 74 61 52 65 61  al SQLiteDataRea
0550: 64 65 72 20 5f 72 65 61 64 65 72 3b 0a 0a 20 20  der _reader;..  
0560: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 4b 65 79      internal Key
0570: 51 75 65 72 79 28 53 51 4c 69 74 65 43 6f 6e 6e  Query(SQLiteConn
0580: 65 63 74 69 6f 6e 20 63 6e 6e 2c 20 73 74 72 69  ection cnn, stri
0590: 6e 67 20 64 61 74 61 62 61 73 65 2c 20 73 74 72  ng database, str
05a0: 69 6e 67 20 74 61 62 6c 65 2c 20 70 61 72 61 6d  ing table, param
05b0: 73 20 73 74 72 69 6e 67 5b 5d 20 63 6f 6c 75 6d  s string[] colum
05c0: 6e 73 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ns).      {.    
05d0: 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c 69 74      using (SQLit
05e0: 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65 72 20  eCommandBuilder 
05f0: 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20 53 51  builder = new SQ
0600: 4c 69 74 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64  LiteCommandBuild
0610: 65 72 28 29 29 0a 20 20 20 20 20 20 20 20 7b 0a  er()).        {.
0620: 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61            _comma
0630: 6e 64 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43  nd = cnn.CreateC
0640: 6f 6d 6d 61 6e 64 28 29 3b 0a 20 20 20 20 20 20  ommand();.      
0650: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d      for (int n =
0660: 20 30 3b 20 6e 20 3c 20 63 6f 6c 75 6d 6e 73 2e   0; n < columns.
0670: 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20 20 20  Length; n++).   
0680: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
0690: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 5b 6e 5d 20       columns[n] 
06a0: 3d 20 62 75 69 6c 64 65 72 2e 51 75 6f 74 65 49  = builder.QuoteI
06b0: 64 65 6e 74 69 66 69 65 72 28 63 6f 6c 75 6d 6e  dentifier(column
06c0: 73 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  s[n]);.         
06d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
06e0: 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64 2e 43 6f       _command.Co
06f0: 6d 6d 61 6e 64 54 65 78 74 20 3d 20 53 74 72 69  mmandText = Stri
0700: 6e 67 2e 46 6f 72 6d 61 74 28 22 53 45 4c 45 43  ng.Format("SELEC
0710: 54 20 7b 30 7d 20 46 52 4f 4d 20 5b 7b 31 7d 5d  T {0} FROM [{1}]
0720: 2e 5b 7b 32 7d 5d 20 57 48 45 52 45 20 52 4f 57  .[{2}] WHERE ROW
0730: 49 44 20 3d 20 3f 22 2c 20 53 74 72 69 6e 67 2e  ID = ?", String.
0740: 4a 6f 69 6e 28 22 2c 22 2c 20 63 6f 6c 75 6d 6e  Join(",", column
0750: 73 29 2c 20 64 61 74 61 62 61 73 65 2c 20 74 61  s), database, ta
0760: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 5f 63  ble);.        _c
0770: 6f 6d 6d 61 6e 64 2e 50 61 72 61 6d 65 74 65 72  ommand.Parameter
0780: 73 2e 41 64 64 57 69 74 68 56 61 6c 75 65 28 6e  s.AddWithValue(n
0790: 75 6c 6c 2c 20 28 6c 6f 6e 67 29 30 29 3b 0a 20  ull, (long)0);. 
07a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 6e       }..      in
07b0: 74 65 72 6e 61 6c 20 62 6f 6f 6c 20 49 73 56 61  ternal bool IsVa
07c0: 6c 69 64 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  lid.      {.    
07d0: 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
07e0: 20 28 5f 72 65 61 64 65 72 20 21 3d 20 6e 75 6c   (_reader != nul
07f0: 6c 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 73 65  l); }.        se
0800: 74 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  t.        {.    
0810: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
0820: 21 3d 20 66 61 6c 73 65 29 20 74 68 72 6f 77 20  != false) throw 
0830: 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65  new ArgumentExce
0840: 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20  ption();.       
0850: 20 20 20 69 66 20 28 5f 72 65 61 64 65 72 20 21     if (_reader !
0860: 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20  = null).        
0870: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
0880: 5f 72 65 61 64 65 72 2e 44 69 73 70 6f 73 65 28  _reader.Dispose(
0890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f  );.            _
08a0: 72 65 61 64 65 72 20 3d 20 6e 75 6c 6c 3b 0a 20  reader = null;. 
08b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
08c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
08d0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
08e0: 64 20 53 79 6e 63 28 6c 6f 6e 67 20 72 6f 77 69  d Sync(long rowi
08f0: 64 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  d).      {.     
0900: 20 20 20 49 73 56 61 6c 69 64 20 3d 20 66 61 6c     IsValid = fal
0910: 73 65 3b 0a 20 20 20 20 20 20 20 20 5f 63 6f 6d  se;.        _com
0920: 6d 61 6e 64 2e 50 61 72 61 6d 65 74 65 72 73 5b  mand.Parameters[
0930: 30 5d 2e 56 61 6c 75 65 20 3d 20 72 6f 77 69 64  0].Value = rowid
0940: 3b 0a 20 20 20 20 20 20 20 20 5f 72 65 61 64 65  ;.        _reade
0950: 72 20 3d 20 5f 63 6f 6d 6d 61 6e 64 2e 45 78 65  r = _command.Exe
0960: 63 75 74 65 52 65 61 64 65 72 28 29 3b 0a 20 20  cuteReader();.  
0970: 20 20 20 20 20 20 5f 72 65 61 64 65 72 2e 52 65        _reader.Re
0980: 61 64 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ad();.      }.. 
0990: 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64       public void
09a0: 20 44 69 73 70 6f 73 65 28 29 0a 20 20 20 20 20   Dispose().     
09b0: 20 7b 0a 20 20 20 20 20 20 20 20 49 73 56 61 6c   {.        IsVal
09c0: 69 64 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20  id = false;..   
09d0: 20 20 20 20 20 69 66 20 28 5f 63 6f 6d 6d 61 6e       if (_comman
09e0: 64 20 21 3d 20 6e 75 6c 6c 29 20 5f 63 6f 6d 6d  d != null) _comm
09f0: 61 6e 64 2e 44 69 73 70 6f 73 65 28 29 3b 0a 20  and.Dispose();. 
0a00: 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64 20         _command 
0a10: 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  = null;.      }.
0a20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c      }..    /// <
0a30: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
0a40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
0a50: 6f 65 73 20 61 6c 6c 20 74 68 65 20 6e 61 73 74  oes all the nast
0a60: 79 20 77 6f 72 6b 20 61 74 20 64 65 74 65 72 6d  y work at determ
0a70: 69 6e 69 6e 67 20 77 68 61 74 20 6b 65 79 73 20  ining what keys 
0a80: 6e 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  need to be retur
0a90: 6e 65 64 20 66 6f 72 0a 20 20 20 20 2f 2f 2f 20  ned for.    /// 
0aa0: 61 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e  a given statemen
0ab0: 74 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  t..    /// </sum
0ac0: 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70  mary>.    /// <p
0ad0: 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6e 6e 22 3e  aram name="cnn">
0ae0: 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20 2f 2f 2f  </param>.    ///
0af0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 72 65   <param name="re
0b00: 61 64 65 72 22 3e 3c 2f 70 61 72 61 6d 3e 0a 20  ader"></param>. 
0b10: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
0b20: 6d 65 3d 22 73 74 6d 74 22 3e 3c 2f 70 61 72 61  me="stmt"></para
0b30: 6d 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  m>.    internal 
0b40: 53 51 4c 69 74 65 4b 65 79 52 65 61 64 65 72 28  SQLiteKeyReader(
0b50: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
0b60: 20 63 6e 6e 2c 20 53 51 4c 69 74 65 44 61 74 61   cnn, SQLiteData
0b70: 52 65 61 64 65 72 20 72 65 61 64 65 72 2c 20 53  Reader reader, S
0b80: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
0b90: 74 6d 74 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  tmt).    {.     
0ba0: 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69   Dictionary<stri
0bb0: 6e 67 2c 20 69 6e 74 3e 20 63 61 74 61 6c 6f 67  ng, int> catalog
0bc0: 73 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61  s = new Dictiona
0bd0: 72 79 3c 73 74 72 69 6e 67 2c 20 69 6e 74 3e 28  ry<string, int>(
0be0: 29 3b 0a 20 20 20 20 20 20 44 69 63 74 69 6f 6e  );.      Diction
0bf0: 61 72 79 3c 73 74 72 69 6e 67 2c 20 4c 69 73 74  ary<string, List
0c00: 3c 73 74 72 69 6e 67 3e 3e 20 74 61 62 6c 65 73  <string>> tables
0c10: 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61 72   = new Dictionar
0c20: 79 3c 73 74 72 69 6e 67 2c 20 4c 69 73 74 3c 73  y<string, List<s
0c30: 74 72 69 6e 67 3e 3e 28 29 3b 0a 20 20 20 20 20  tring>>();.     
0c40: 20 4c 69 73 74 3c 73 74 72 69 6e 67 3e 20 6c 69   List<string> li
0c50: 73 74 3b 0a 20 20 20 20 20 20 4c 69 73 74 3c 4b  st;.      List<K
0c60: 65 79 49 6e 66 6f 3e 20 6b 65 79 73 20 3d 20 6e  eyInfo> keys = n
0c70: 65 77 20 4c 69 73 74 3c 4b 65 79 49 6e 66 6f 3e  ew List<KeyInfo>
0c80: 28 29 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 52 65  ();..      // Re
0c90: 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 6d 65  cord the stateme
0ca0: 6e 74 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  nt so we can use
0cb0: 20 69 74 20 6c 61 74 65 72 20 66 6f 72 20 73 79   it later for sy
0cc0: 6e 63 27 69 6e 67 0a 20 20 20 20 20 20 5f 73 74  nc'ing.      _st
0cd0: 6d 74 20 3d 20 73 74 6d 74 3b 0a 0a 20 20 20 20  mt = stmt;..    
0ce0: 20 20 2f 2f 20 46 65 74 63 68 20 61 6c 6c 20 74    // Fetch all t
0cf0: 68 65 20 61 74 74 61 63 68 65 64 20 64 61 74 61  he attached data
0d00: 62 61 73 65 73 20 6f 6e 20 74 68 69 73 20 63 6f  bases on this co
0d10: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 75  nnection.      u
0d20: 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20  sing (DataTable 
0d30: 74 62 6c 20 3d 20 63 6e 6e 2e 47 65 74 53 63 68  tbl = cnn.GetSch
0d40: 65 6d 61 28 22 43 61 74 61 6c 6f 67 73 22 29 29  ema("Catalogs"))
0d50: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
0d60: 20 66 6f 72 65 61 63 68 20 28 44 61 74 61 52 6f   foreach (DataRo
0d70: 77 20 72 6f 77 20 69 6e 20 74 62 6c 2e 52 6f 77  w row in tbl.Row
0d80: 73 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  s).        {.   
0d90: 20 20 20 20 20 20 20 63 61 74 61 6c 6f 67 73 2e         catalogs.
0da0: 41 64 64 28 28 73 74 72 69 6e 67 29 72 6f 77 5b  Add((string)row[
0db0: 22 43 41 54 41 4c 4f 47 5f 4e 41 4d 45 22 5d 2c  "CATALOG_NAME"],
0dc0: 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32   Convert.ToInt32
0dd0: 28 72 6f 77 5b 22 49 44 22 5d 29 29 3b 0a 20 20  (row["ID"]));.  
0de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
0df0: 0a 20 20 20 20 20 20 2f 2f 20 46 65 74 63 68 20  .      // Fetch 
0e00: 61 6c 6c 20 74 68 65 20 75 6e 69 71 75 65 20 74  all the unique t
0e10: 61 62 6c 65 73 20 61 6e 64 20 63 61 74 61 6c 6f  ables and catalo
0e20: 67 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  gs used by the c
0e30: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
0e40: 0a 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 61  .      using (Da
0e50: 74 61 54 61 62 6c 65 20 73 63 68 65 6d 61 20 3d  taTable schema =
0e60: 20 72 65 61 64 65 72 2e 47 65 74 53 63 68 65 6d   reader.GetSchem
0e70: 61 54 61 62 6c 65 28 66 61 6c 73 65 2c 20 66 61  aTable(false, fa
0e80: 6c 73 65 29 29 0a 20 20 20 20 20 20 7b 0a 20 20  lse)).      {.  
0e90: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 44        foreach (D
0ea0: 61 74 61 52 6f 77 20 72 6f 77 20 69 6e 20 73 63  ataRow row in sc
0eb0: 68 65 6d 61 2e 52 6f 77 73 29 0a 20 20 20 20 20  hema.Rows).     
0ec0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
0ed0: 2f 20 43 68 65 63 6b 20 69 66 20 63 6f 6c 75 6d  / Check if colum
0ee0: 6e 20 69 73 20 62 61 63 6b 65 64 20 74 6f 20 61  n is backed to a
0ef0: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
0f00: 20 69 66 20 28 72 6f 77 5b 53 63 68 65 6d 61 54   if (row[SchemaT
0f10: 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75  ableOptionalColu
0f20: 6d 6e 2e 42 61 73 65 43 61 74 61 6c 6f 67 4e 61  mn.BaseCatalogNa
0f30: 6d 65 5d 20 3d 3d 20 44 42 4e 75 6c 6c 2e 56 61  me] == DBNull.Va
0f40: 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  lue).           
0f50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
0f60: 20 20 20 20 20 20 2f 2f 20 52 65 63 6f 72 64 20        // Record 
0f70: 74 68 65 20 75 6e 69 71 75 65 20 74 61 62 6c 65  the unique table
0f80: 20 73 6f 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20   so we can look 
0f90: 75 70 20 69 74 73 20 6b 65 79 73 0a 20 20 20 20  up its keys.    
0fa0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74        string cat
0fb0: 61 6c 6f 67 20 3d 20 28 73 74 72 69 6e 67 29 72  alog = (string)r
0fc0: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 4f 70  ow[SchemaTableOp
0fd0: 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 42 61 73  tionalColumn.Bas
0fe0: 65 43 61 74 61 6c 6f 67 4e 61 6d 65 5d 3b 0a 20  eCatalogName];. 
0ff0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1000: 74 61 62 6c 65 20 3d 20 28 73 74 72 69 6e 67 29  table = (string)
1010: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43  row[SchemaTableC
1020: 6f 6c 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65 4e  olumn.BaseTableN
1030: 61 6d 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20  ame];..         
1040: 20 69 66 20 28 74 61 62 6c 65 73 2e 43 6f 6e 74   if (tables.Cont
1050: 61 69 6e 73 4b 65 79 28 63 61 74 61 6c 6f 67 29  ainsKey(catalog)
1060: 20 3d 3d 20 66 61 6c 73 65 29 0a 20 20 20 20 20   == false).     
1070: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1080: 20 20 20 6c 69 73 74 20 3d 20 6e 65 77 20 4c 69     list = new Li
1090: 73 74 3c 73 74 72 69 6e 67 3e 28 29 3b 0a 20 20  st<string>();.  
10a0: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 73            tables
10b0: 2e 41 64 64 28 63 61 74 61 6c 6f 67 2c 20 6c 69  .Add(catalog, li
10c0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
10d0: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a  .          else.
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
10f0: 20 3d 20 74 61 62 6c 65 73 5b 63 61 74 61 6c 6f   = tables[catalo
1100: 67 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  g];..          i
1110: 66 20 28 6c 69 73 74 2e 43 6f 6e 74 61 69 6e 73  f (list.Contains
1120: 28 74 61 62 6c 65 29 20 3d 3d 20 66 61 6c 73 65  (table) == false
1130: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 69  ).            li
1140: 73 74 2e 41 64 64 28 74 61 62 6c 65 29 3b 0a 20  st.Add(table);. 
1150: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1160: 20 20 2f 2f 20 46 6f 72 20 65 61 63 68 20 63 61    // For each ca
1170: 74 61 6c 6f 67 20 61 6e 64 20 65 61 63 68 20 74  talog and each t
1180: 61 62 6c 65 2c 20 71 75 65 72 79 20 74 68 65 20  able, query the 
1190: 69 6e 64 65 78 65 73 20 66 6f 72 20 74 68 65 20  indexes for the 
11a0: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2f  table..        /
11b0: 2f 20 46 69 6e 64 20 61 20 70 72 69 6d 61 72 79  / Find a primary
11c0: 20 6b 65 79 20 69 6e 64 65 78 20 69 66 20 74 68   key index if th
11d0: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
11e0: 6e 6f 74 2c 20 66 69 6e 64 20 61 20 75 6e 69 71  not, find a uniq
11f0: 75 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  ue index instead
1200: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
1210: 20 28 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 73   (KeyValuePair<s
1220: 74 72 69 6e 67 2c 20 4c 69 73 74 3c 73 74 72 69  tring, List<stri
1230: 6e 67 3e 3e 20 70 61 69 72 20 69 6e 20 74 61 62  ng>> pair in tab
1240: 6c 65 73 29 0a 20 20 20 20 20 20 20 20 7b 0a 20  les).        {. 
1250: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
1260: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 70 61 69  t i = 0; i < pai
1270: 72 2e 56 61 6c 75 65 2e 43 6f 75 6e 74 3b 20 69  r.Value.Count; i
1280: 2b 2b 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a  ++).          {.
1290: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
12a0: 6e 67 20 74 61 62 6c 65 20 3d 20 70 61 69 72 2e  ng table = pair.
12b0: 56 61 6c 75 65 5b 69 5d 3b 0a 20 20 20 20 20 20  Value[i];.      
12c0: 20 20 20 20 20 20 44 61 74 61 52 6f 77 20 70 72        DataRow pr
12d0: 65 66 65 72 72 65 64 52 6f 77 20 3d 20 6e 75 6c  eferredRow = nul
12e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  l;.            u
12f0: 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20  sing (DataTable 
1300: 74 62 6c 20 3d 20 63 6e 6e 2e 47 65 74 53 63 68  tbl = cnn.GetSch
1310: 65 6d 61 28 22 49 6e 64 65 78 65 73 22 2c 20 6e  ema("Indexes", n
1320: 65 77 20 73 74 72 69 6e 67 5b 5d 20 7b 20 70 61  ew string[] { pa
1330: 69 72 2e 4b 65 79 2c 20 6e 75 6c 6c 2c 20 74 61  ir.Key, null, ta
1340: 62 6c 65 20 7d 29 29 0a 20 20 20 20 20 20 20 20  ble })).        
1350: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
1360: 20 20 20 20 2f 2f 20 4c 6f 6f 70 20 74 77 69 63      // Loop twic
1370: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  e.  The first ti
1380: 6d 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  me looking for a
1390: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
13a0: 65 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ex, .           
13b0: 20 20 20 2f 2f 20 74 68 65 20 73 65 63 6f 6e 64     // the second
13c0: 20 74 69 6d 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   time looking fo
13d0: 72 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  r a unique index
13e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
13f0: 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e  or (int n = 0; n
1400: 20 3c 20 32 20 26 26 20 70 72 65 66 65 72 72 65   < 2 && preferre
1410: 64 52 6f 77 20 3d 3d 20 6e 75 6c 6c 3b 20 6e 2b  dRow == null; n+
1420: 2b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +).             
1430: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1440: 20 20 20 66 6f 72 65 61 63 68 20 28 44 61 74 61     foreach (Data
1450: 52 6f 77 20 72 6f 77 20 69 6e 20 74 62 6c 2e 52  Row row in tbl.R
1460: 6f 77 73 29 0a 20 20 20 20 20 20 20 20 20 20 20  ows).           
1470: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1480: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d           if (n =
1490: 3d 20 30 20 26 26 20 28 62 6f 6f 6c 29 72 6f 77  = 0 && (bool)row
14a0: 5b 22 50 52 49 4d 41 52 59 5f 4b 45 59 22 5d 20  ["PRIMARY_KEY"] 
14b0: 3d 3d 20 74 72 75 65 29 0a 20 20 20 20 20 20 20  == true).       
14c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 70 72 65 66 65 72 72 65 64 52 6f 77 20 3d 20   preferredRow = 
14f0: 72 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  row;.           
1500: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1530: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e        else if (n
1540: 20 3d 3d 20 31 20 26 26 20 28 62 6f 6f 6c 29 72   == 1 && (bool)r
1550: 6f 77 5b 22 55 4e 49 51 55 45 22 5d 20 3d 3d 20  ow["UNIQUE"] == 
1560: 74 72 75 65 29 0a 20 20 20 20 20 20 20 20 20 20  true).          
1570: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1590: 65 66 65 72 72 65 64 52 6f 77 20 3d 20 72 6f 77  eferredRow = row
15a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
15d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
15f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1600: 20 69 66 20 28 70 72 65 66 65 72 72 65 64 52 6f   if (preferredRo
1610: 77 20 3d 3d 20 6e 75 6c 6c 29 20 2f 2f 20 55 6e  w == null) // Un
1620: 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 61 6e 79  able to find any
1630: 20 73 75 69 74 61 62 6c 65 20 69 6e 64 65 78 20   suitable index 
1640: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 73  for this table s
1650: 6f 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 20 20  o remove it.    
1660: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
1670: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 69 72              pair
1680: 2e 56 61 6c 75 65 2e 52 65 6d 6f 76 65 41 74 28  .Value.RemoveAt(
1690: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
16a0: 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20      i--;.       
16b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16c0: 20 20 20 20 20 20 20 65 6c 73 65 20 2f 2f 20 57         else // W
16d0: 65 20 66 6f 75 6e 64 20 61 20 75 73 61 62 6c 65  e found a usable
16e0: 20 69 6e 64 65 78 2c 20 73 6f 20 66 65 74 63 68   index, so fetch
16f0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 74   the necessary t
1700: 61 62 6c 65 20 64 65 74 61 69 6c 73 0a 20 20 20  able details.   
1710: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
1730: 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62  ng (DataTable tb
1740: 6c 54 61 62 6c 65 73 20 3d 20 63 6e 6e 2e 47 65  lTables = cnn.Ge
1750: 74 53 63 68 65 6d 61 28 22 54 61 62 6c 65 73 22  tSchema("Tables"
1760: 2c 20 6e 65 77 20 73 74 72 69 6e 67 5b 5d 20 7b  , new string[] {
1770: 20 70 61 69 72 2e 4b 65 79 2c 20 6e 75 6c 6c 2c   pair.Key, null,
1780: 20 74 61 62 6c 65 20 7d 29 29 0a 20 20 20 20 20   table })).     
1790: 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20             {.   
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b0: 2f 20 46 69 6e 64 20 74 68 65 20 72 6f 6f 74 20  / Find the root 
17c0: 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c  page of the tabl
17d0: 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
17e0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67   statement and g
17f0: 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  et the cursor th
1800: 61 74 27 73 20 69 74 65 72 61 74 69 6e 67 20 69  at's iterating i
1810: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
1820: 20 20 20 20 69 6e 74 20 64 61 74 61 62 61 73 65      int database
1830: 20 3d 20 63 61 74 61 6c 6f 67 73 5b 70 61 69 72   = catalogs[pair
1840: 2e 4b 65 79 5d 3b 0a 20 20 20 20 20 20 20 20 20  .Key];.         
1850: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 6f 6f           int roo
1860: 74 50 61 67 65 20 3d 20 43 6f 6e 76 65 72 74 2e  tPage = Convert.
1870: 54 6f 49 6e 74 33 32 28 74 62 6c 54 61 62 6c 65  ToInt32(tblTable
1880: 73 2e 52 6f 77 73 5b 30 5d 5b 22 54 41 42 4c 45  s.Rows[0]["TABLE
1890: 5f 52 4f 4f 54 50 41 47 45 22 5d 29 3b 0a 20 20  _ROOTPAGE"]);.  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 69 6e 74 20 63 75 72 73 6f 72 20 3d 20 73 74 6d  int cursor = stm
18c0: 74 2e 5f 73 71 6c 2e 47 65 74 43 75 72 73 6f 72  t._sql.GetCursor
18d0: 46 6f 72 54 61 62 6c 65 28 73 74 6d 74 2c 20 64  ForTable(stmt, d
18e0: 61 74 61 62 61 73 65 2c 20 72 6f 6f 74 50 61 67  atabase, rootPag
18f0: 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
1900: 20 20 20 20 20 20 20 2f 2f 20 4e 6f 77 20 65 6e         // Now en
1910: 75 6d 65 72 61 74 65 20 74 68 65 20 6d 65 6d 62  umerate the memb
1920: 65 72 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ers of the index
1930: 20 77 65 27 72 65 20 67 6f 69 6e 67 20 74 6f 20   we're going to 
1940: 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  use.            
1950: 20 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74        using (Dat
1960: 61 54 61 62 6c 65 20 69 6e 64 65 78 43 6f 6c 75  aTable indexColu
1970: 6d 6e 73 20 3d 20 63 6e 6e 2e 47 65 74 53 63 68  mns = cnn.GetSch
1980: 65 6d 61 28 22 49 6e 64 65 78 43 6f 6c 75 6d 6e  ema("IndexColumn
1990: 73 22 2c 20 6e 65 77 20 73 74 72 69 6e 67 5b 5d  s", new string[]
19a0: 20 7b 20 70 61 69 72 2e 4b 65 79 2c 20 6e 75 6c   { pair.Key, nul
19b0: 6c 2c 20 74 61 62 6c 65 2c 20 28 73 74 72 69 6e  l, table, (strin
19c0: 67 29 70 72 65 66 65 72 72 65 64 52 6f 77 5b 22  g)preferredRow["
19d0: 49 4e 44 45 58 5f 4e 41 4d 45 22 5d 20 7d 29 29  INDEX_NAME"] }))
19e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
1a00: 20 20 20 20 20 20 20 20 20 4b 65 79 51 75 65 72           KeyQuer
1a10: 79 20 71 75 65 72 79 20 3d 20 6e 75 6c 6c 3b 0a  y query = null;.
1a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a30: 20 20 20 20 20 4c 69 73 74 3c 73 74 72 69 6e 67       List<string
1a40: 3e 20 63 6f 6c 73 20 3d 20 6e 65 77 20 4c 69 73  > cols = new Lis
1a50: 74 3c 73 74 72 69 6e 67 3e 28 29 3b 0a 20 20 20  t<string>();.   
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 66 6f 72 20 28 69 6e 74 20 78 20 3d 20 30 3b   for (int x = 0;
1a80: 20 78 20 3c 20 69 6e 64 65 78 43 6f 6c 75 6d 6e   x < indexColumn
1a90: 73 2e 52 6f 77 73 2e 43 6f 75 6e 74 3b 20 78 2b  s.Rows.Count; x+
1aa0: 2b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +).             
1ab0: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1ad0: 6f 6f 6c 20 61 64 64 4b 65 79 20 3d 20 74 72 75  ool addKey = tru
1ae0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1af0: 20 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 74           // If t
1b00: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  he column in the
1b10: 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 61   index already a
1b20: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 71 75  ppears in the qu
1b30: 65 72 79 2c 20 73 6b 69 70 20 69 74 0a 20 20 20  ery, skip it.   
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 66 6f 72 65 61 63 68 20 28 44 61 74 61     foreach (Data
1b60: 52 6f 77 20 72 6f 77 20 69 6e 20 73 63 68 65 6d  Row row in schem
1b70: 61 2e 52 6f 77 73 29 0a 20 20 20 20 20 20 20 20  a.Rows).        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 69 66 20 28 72 6f 77 2e          if (row.
1bb0: 49 73 4e 75 6c 6c 28 53 63 68 65 6d 61 54 61 62  IsNull(SchemaTab
1bc0: 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 6f 6c  leColumn.BaseCol
1bd0: 75 6d 6e 4e 61 6d 65 29 29 0a 20 20 20 20 20 20  umnName)).      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20      continue;.. 
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 69 66 20 28 28 73 74 72 69         if ((stri
1c20: 6e 67 29 72 6f 77 5b 53 63 68 65 6d 61 54 61 62  ng)row[SchemaTab
1c30: 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 6f 6c  leColumn.BaseCol
1c40: 75 6d 6e 4e 61 6d 65 5d 20 3d 3d 20 28 73 74 72  umnName] == (str
1c50: 69 6e 67 29 69 6e 64 65 78 43 6f 6c 75 6d 6e 73  ing)indexColumns
1c60: 2e 52 6f 77 73 5b 78 5d 5b 22 43 4f 4c 55 4d 4e  .Rows[x]["COLUMN
1c70: 5f 4e 41 4d 45 22 5d 20 26 26 0a 20 20 20 20 20  _NAME"] &&.     
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 29 72         (string)r
1ca0: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
1cb0: 6c 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65 4e 61  lumn.BaseTableNa
1cc0: 6d 65 5d 20 3d 3d 20 74 61 62 6c 65 20 26 26 0a  me] == table &&.
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 74 72              (str
1cf0: 69 6e 67 29 72 6f 77 5b 53 63 68 65 6d 61 54 61  ing)row[SchemaTa
1d00: 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d  bleOptionalColum
1d10: 6e 2e 42 61 73 65 43 61 74 61 6c 6f 67 4e 61 6d  n.BaseCatalogNam
1d20: 65 5d 20 3d 3d 20 70 61 69 72 2e 4b 65 79 29 0a  e] == pair.Key).
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 73      indexColumns
1d70: 2e 52 6f 77 73 2e 52 65 6d 6f 76 65 41 74 28 78  .Rows.RemoveAt(x
1d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 2d 2d               x--
1da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 4b              addK
1dc0: 65 79 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  ey = false;.    
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 69 66 20 28 61 64 64 4b 65 79 20       if (addKey 
1e40: 3d 3d 20 74 72 75 65 29 0a 20 20 20 20 20 20 20  == true).       
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 63 6f 6c 73 2e 41 64 64 28 28 73 74 72 69 6e   cols.Add((strin
1e70: 67 29 69 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e 52  g)indexColumns.R
1e80: 6f 77 73 5b 78 5d 5b 22 43 4f 4c 55 4d 4e 5f 4e  ows[x]["COLUMN_N
1e90: 41 4d 45 22 5d 29 3b 0a 20 20 20 20 20 20 20 20  AME"]);.        
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 2f 2f 20 49 66 20 74 68 65 20 69 6e 64     // If the ind
1ed0: 65 78 20 69 73 20 6e 6f 74 20 61 20 72 6f 77 69  ex is not a rowi
1ee0: 64 20 61 6c 69 61 73 2c 20 72 65 63 6f 72 64 20  d alias, record 
1ef0: 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a  all the columns.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 2f 2f 20 6e 65 65 64 65 64 20 74 6f      // needed to
1f20: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 75 6e 69   make up the uni
1f30: 71 75 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  que index and co
1f40: 6e 73 74 72 75 63 74 20 61 20 53 51 4c 20 71 75  nstruct a SQL qu
1f50: 65 72 79 20 66 6f 72 20 69 74 0a 20 20 20 20 20  ery for it.     
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1f70: 66 20 28 28 73 74 72 69 6e 67 29 70 72 65 66 65  f ((string)prefe
1f80: 72 72 65 64 52 6f 77 5b 22 49 4e 44 45 58 5f 4e  rredRow["INDEX_N
1f90: 41 4d 45 22 5d 20 21 3d 20 22 73 71 6c 69 74 65  AME"] != "sqlite
1fa0: 5f 6d 61 73 74 65 72 5f 50 4b 5f 22 20 2b 20 74  _master_PK_" + t
1fb0: 61 62 6c 65 29 0a 20 20 20 20 20 20 20 20 20 20  able).          
1fc0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 2f 2f 20 57 68 61 74 65 76 65 72 20 72 65    // Whatever re
1ff0: 6d 61 69 6e 73 20 6f 66 20 74 68 65 20 63 6f 6c  mains of the col
2000: 75 6d 6e 73 20 77 65 20 6e 65 65 64 20 74 68 61  umns we need tha
2010: 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 69 6e  t make up the in
2020: 64 65 78 20 74 68 61 74 20 61 72 65 20 6e 6f 74  dex that are not
2030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2040: 20 20 20 20 20 20 20 2f 2f 20 61 6c 72 65 61 64         // alread
2050: 79 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 6e  y in the query n
2060: 65 65 64 20 74 6f 20 62 65 20 71 75 65 72 69 65  eed to be querie
2070: 64 20 73 65 70 61 72 61 74 65 6c 79 2c 20 73 6f  d separately, so
2080: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 75 62   construct a sub
2090: 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 20 20  query.          
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
20b0: 63 6f 6c 73 2e 43 6f 75 6e 74 20 3e 20 30 29 0a  cols.Count > 0).
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 73 74 72 69 6e 67 5b 5d 20 71 75 65 72 79 63 6f  string[] queryco
2100: 6c 73 20 3d 20 6e 65 77 20 73 74 72 69 6e 67 5b  ls = new string[
2110: 63 6f 6c 73 2e 43 6f 75 6e 74 5d 3b 0a 20 20 20  cols.Count];.   
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 63 6f 6c 73 2e 43 6f 70 79 54 6f       cols.CopyTo
2140: 28 71 75 65 72 79 63 6f 6c 73 29 3b 0a 20 20 20  (querycols);.   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 71 75 65 72 79 20 3d 20 6e 65 77       query = new
2170: 20 4b 65 79 51 75 65 72 79 28 63 6e 6e 2c 20 70   KeyQuery(cnn, p
2180: 61 69 72 2e 4b 65 79 2c 20 74 61 62 6c 65 2c 20  air.Key, table, 
2190: 71 75 65 72 79 63 6f 6c 73 29 3b 0a 20 20 20 20  querycols);.    
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
21c0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e0: 2f 20 43 72 65 61 74 65 20 61 20 4b 65 79 49 6e  / Create a KeyIn
21f0: 66 6f 20 73 74 72 75 63 74 20 66 6f 72 20 65 61  fo struct for ea
2200: 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
2210: 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20   index.         
2220: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
2230: 69 6e 74 20 78 20 3d 20 30 3b 20 78 20 3c 20 69  int x = 0; x < i
2240: 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e 52 6f 77 73  ndexColumns.Rows
2250: 2e 43 6f 75 6e 74 3b 20 78 2b 2b 29 0a 20 20 20  .Count; x++).   
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2280: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
2290: 63 6f 6c 75 6d 6e 4e 61 6d 65 20 3d 20 28 73 74  columnName = (st
22a0: 72 69 6e 67 29 69 6e 64 65 78 43 6f 6c 75 6d 6e  ring)indexColumn
22b0: 73 2e 52 6f 77 73 5b 78 5d 5b 22 43 4f 4c 55 4d  s.Rows[x]["COLUM
22c0: 4e 5f 4e 41 4d 45 22 5d 3b 0a 20 20 20 20 20 20  N_NAME"];.      
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 4b 65 79 49 6e 66 6f 20 6b 65 79 20 3d 20 6e 65  KeyInfo key = ne
22f0: 77 20 4b 65 79 49 6e 66 6f 28 29 3b 0a 0a 20 20  w KeyInfo();..  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 6b 65 79 2e 72 6f 6f 74 50 61 67 65      key.rootPage
2320: 20 3d 20 72 6f 6f 74 50 61 67 65 3b 0a 20 20 20   = rootPage;.   
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 6b 65 79 2e 63 75 72 73 6f 72 20 3d 20     key.cursor = 
2350: 63 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  cursor;.        
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
2370: 79 2e 64 61 74 61 62 61 73 65 20 3d 20 64 61 74  y.database = dat
2380: 61 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  abase;.         
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
23a0: 2e 64 61 74 61 62 61 73 65 4e 61 6d 65 20 3d 20  .databaseName = 
23b0: 70 61 69 72 2e 4b 65 79 3b 0a 20 20 20 20 20 20  pair.Key;.      
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 6b 65 79 2e 74 61 62 6c 65 4e 61 6d 65 20 3d 20  key.tableName = 
23e0: 74 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  table;.         
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
2400: 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 20 3d 20 63 6f  .columnName = co
2410: 6c 75 6d 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  lumnName;.      
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 6b 65 79 2e 71 75 65 72 79 20 3d 20 71 75 65 72  key.query = quer
2440: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
2450: 20 20 20 20 20 20 20 20 20 6b 65 79 2e 63 6f 6c           key.col
2460: 75 6d 6e 20 3d 20 78 3b 0a 0a 20 20 20 20 20 20  umn = x;..      
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 6b 65 79 73 2e 41 64 64 28 6b 65 79 29 3b 0a 20  keys.Add(key);. 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2500: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2f       }..      //
2510: 20 4e 6f 77 20 77 65 20 68 61 76 65 20 61 6c 6c   Now we have all
2520: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
2530: 63 6f 6c 75 6d 6e 73 20 77 65 20 68 61 76 65 20  columns we have 
2540: 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 6f 72 64  to return in ord
2550: 65 72 20 74 6f 20 73 75 70 70 6f 72 74 0a 20 20  er to support.  
2560: 20 20 20 20 2f 2f 20 43 6f 6d 6d 61 6e 64 42 65      // CommandBe
2570: 68 61 76 69 6f 72 2e 4b 65 79 49 6e 66 6f 0a 20  havior.KeyInfo. 
2580: 20 20 20 20 20 5f 6b 65 79 49 6e 66 6f 20 3d 20       _keyInfo = 
2590: 6e 65 77 20 4b 65 79 49 6e 66 6f 5b 6b 65 79 73  new KeyInfo[keys
25a0: 2e 43 6f 75 6e 74 5d 3b 0a 20 20 20 20 20 20 6b  .Count];.      k
25b0: 65 79 73 2e 43 6f 70 79 54 6f 28 5f 6b 65 79 49  eys.CopyTo(_keyI
25c0: 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nfo);.    }..   
25d0: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20   /// <summary>. 
25e0: 20 20 20 2f 2f 2f 20 48 6f 77 20 6d 61 6e 79 20     /// How many 
25f0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
2600: 6e 73 20 6f 66 20 6b 65 79 69 6e 66 6f 20 77 65  ns of keyinfo we
2610: 27 72 65 20 68 6f 6c 64 69 6e 67 0a 20 20 20 20  're holding.    
2620: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20  /// </summary>. 
2630: 20 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 20     internal int 
2640: 43 6f 75 6e 74 0a 20 20 20 20 7b 0a 20 20 20 20  Count.    {.    
2650: 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 28    get { return (
2660: 5f 6b 65 79 49 6e 66 6f 20 3d 3d 20 6e 75 6c 6c  _keyInfo == null
2670: 29 20 3f 20 30 20 3a 20 5f 6b 65 79 49 6e 66 6f  ) ? 0 : _keyInfo
2680: 2e 4c 65 6e 67 74 68 3b 20 7d 0a 20 20 20 20 7d  .Length; }.    }
2690: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76  ..    internal v
26a0: 6f 69 64 20 53 79 6e 63 28 69 6e 74 20 69 29 0a  oid Sync(int i).
26b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 53 79 6e 63      {.      Sync
26c0: 28 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b  ();.      if (_k
26d0: 65 79 49 6e 66 6f 5b 69 5d 2e 63 75 72 73 6f 72  eyInfo[i].cursor
26e0: 20 3d 3d 20 2d 31 29 0a 20 20 20 20 20 20 20 20   == -1).        
26f0: 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69  throw new Invali
2700: 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29  dCastException()
2710: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  ;.    }..    ///
2720: 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f   <summary>.    /
2730: 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  // Make sure all
2740: 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 20   the subqueries 
2750: 61 72 65 20 6f 70 65 6e 20 61 6e 64 20 72 65 61  are open and rea
2760: 64 79 20 61 6e 64 20 73 79 6e 63 27 64 20 77 69  dy and sync'd wi
2770: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  th the current r
2780: 6f 77 69 64 0a 20 20 20 20 2f 2f 2f 20 6f 66 20  owid.    /// of 
2790: 74 68 65 20 74 61 62 6c 65 20 74 68 65 79 27 72  the table they'r
27a0: 65 20 73 75 70 70 6f 72 74 69 6e 67 0a 20 20 20  e supporting.   
27b0: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a   /// </summary>.
27c0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
27d0: 64 20 53 79 6e 63 28 29 0a 20 20 20 20 7b 0a 20  d Sync().    {. 
27e0: 20 20 20 20 20 69 66 20 28 5f 69 73 56 61 6c 69       if (_isVali
27f0: 64 20 3d 3d 20 74 72 75 65 29 20 72 65 74 75 72  d == true) retur
2800: 6e 3b 0a 0a 20 20 20 20 20 20 4b 65 79 51 75 65  n;..      KeyQue
2810: 72 79 20 6c 61 73 74 20 3d 20 6e 75 6c 6c 3b 0a  ry last = null;.
2820: 0a 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20  .      for (int 
2830: 6e 20 3d 20 30 3b 20 6e 20 3c 20 5f 6b 65 79 49  n = 0; n < _keyI
2840: 6e 66 6f 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29  nfo.Length; n++)
2850: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2860: 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 6e 5d   if (_keyInfo[n]
2870: 2e 71 75 65 72 79 20 3d 3d 20 6e 75 6c 6c 20 7c  .query == null |
2880: 7c 20 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75  | _keyInfo[n].qu
2890: 65 72 79 20 21 3d 20 6c 61 73 74 29 0a 20 20 20  ery != last).   
28a0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
28b0: 20 6c 61 73 74 20 3d 20 5f 6b 65 79 49 6e 66 6f   last = _keyInfo
28c0: 5b 6e 5d 2e 71 75 65 72 79 3b 0a 0a 20 20 20 20  [n].query;..    
28d0: 20 20 20 20 20 20 69 66 20 28 6c 61 73 74 20 21        if (last !
28e0: 3d 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20  = null).        
28f0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
2900: 6c 61 73 74 2e 53 79 6e 63 28 5f 73 74 6d 74 2e  last.Sync(_stmt.
2910: 5f 73 71 6c 2e 47 65 74 52 6f 77 49 64 46 6f 72  _sql.GetRowIdFor
2920: 43 75 72 73 6f 72 28 5f 73 74 6d 74 2c 20 5f 6b  Cursor(_stmt, _k
2930: 65 79 49 6e 66 6f 5b 6e 5d 2e 63 75 72 73 6f 72  eyInfo[n].cursor
2940: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
2950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2960: 7d 0a 20 20 20 20 20 20 5f 69 73 56 61 6c 69 64  }.      _isValid
2970: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 0a   = true;.    }..
2980: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
2990: 3e 0a 20 20 20 20 2f 2f 2f 20 52 65 6c 65 61 73  >.    /// Releas
29a0: 65 20 61 6e 79 20 72 65 61 64 65 72 73 20 6f 6e  e any readers on
29b0: 20 61 6e 79 20 73 75 62 71 75 65 72 69 65 73 0a   any subqueries.
29c0: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
29d0: 79 3e 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  y>.    internal 
29e0: 76 6f 69 64 20 52 65 73 65 74 28 29 0a 20 20 20  void Reset().   
29f0: 20 7b 0a 20 20 20 20 20 20 5f 69 73 56 61 6c 69   {.      _isVali
2a00: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  d = false;.     
2a10: 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 20 3d 3d   if (_keyInfo ==
2a20: 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 3b 0a 0a   null) return;..
2a30: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e        for (int n
2a40: 20 3d 20 30 3b 20 6e 20 3c 20 5f 6b 65 79 49 6e   = 0; n < _keyIn
2a50: 66 6f 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a  fo.Length; n++).
2a60: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2a70: 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e  if (_keyInfo[n].
2a80: 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 0a 20  query != null). 
2a90: 20 20 20 20 20 20 20 20 20 5f 6b 65 79 49 6e 66           _keyInf
2aa0: 6f 5b 6e 5d 2e 71 75 65 72 79 2e 49 73 56 61 6c  o[n].query.IsVal
2ab0: 69 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  id = false;.    
2ac0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
2ad0: 75 62 6c 69 63 20 76 6f 69 64 20 44 69 73 70 6f  ublic void Dispo
2ae0: 73 65 28 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  se().    {.     
2af0: 20 5f 73 74 6d 74 20 3d 20 6e 75 6c 6c 3b 0a 0a   _stmt = null;..
2b00: 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e        if (_keyIn
2b10: 66 6f 20 3d 3d 20 6e 75 6c 6c 29 20 72 65 74 75  fo == null) retu
2b20: 72 6e 3b 0a 0a 20 20 20 20 20 20 66 6f 72 20 28  rn;..      for (
2b30: 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 5f  int n = 0; n < _
2b40: 6b 65 79 49 6e 66 6f 2e 4c 65 6e 67 74 68 3b 20  keyInfo.Length; 
2b50: 6e 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  n++).      {.   
2b60: 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66       if (_keyInf
2b70: 6f 5b 6e 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75  o[n].query != nu
2b80: 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20 5f 6b  ll).          _k
2b90: 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75 65 72 79 2e  eyInfo[n].query.
2ba0: 44 69 73 70 6f 73 65 28 29 3b 0a 20 20 20 20 20  Dispose();.     
2bb0: 20 7d 0a 20 20 20 20 20 20 5f 6b 65 79 49 6e 66   }.      _keyInf
2bc0: 6f 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  o = null;.    }.
2bd0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
2be0: 72 69 6e 67 20 47 65 74 44 61 74 61 54 79 70 65  ring GetDataType
2bf0: 4e 61 6d 65 28 69 6e 74 20 69 29 0a 20 20 20 20  Name(int i).    
2c00: 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 29 3b 0a  {.      Sync();.
2c10: 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e        if (_keyIn
2c20: 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e  fo[i].query != n
2c30: 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65 79  ull) return _key
2c40: 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72  Info[i].query._r
2c50: 65 61 64 65 72 2e 47 65 74 44 61 74 61 54 79 70  eader.GetDataTyp
2c60: 65 4e 61 6d 65 28 5f 6b 65 79 49 6e 66 6f 5b 69  eName(_keyInfo[i
2c70: 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  ].column);.     
2c80: 20 65 6c 73 65 20 72 65 74 75 72 6e 20 22 69 6e   else return "in
2c90: 74 65 67 65 72 22 3b 0a 20 20 20 20 7d 0a 0a 20  teger";.    }.. 
2ca0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 54 79 70 65     internal Type
2cb0: 20 47 65 74 46 69 65 6c 64 54 79 70 65 28 69 6e   GetFieldType(in
2cc0: 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  t i).    {.     
2cd0: 20 53 79 6e 63 28 29 3b 0a 20 20 20 20 20 20 69   Sync();.      i
2ce0: 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71  f (_keyInfo[i].q
2cf0: 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65  uery != null) re
2d00: 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d  turn _keyInfo[i]
2d10: 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47  .query._reader.G
2d20: 65 74 46 69 65 6c 64 54 79 70 65 28 5f 6b 65 79  etFieldType(_key
2d30: 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b  Info[i].column);
2d40: 0a 20 20 20 20 20 20 65 6c 73 65 20 72 65 74 75  .      else retu
2d50: 72 6e 20 74 79 70 65 6f 66 28 49 6e 74 36 34 29  rn typeof(Int64)
2d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
2d70: 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 47 65 74  ernal string Get
2d80: 4e 61 6d 65 28 69 6e 74 20 69 29 0a 20 20 20 20  Name(int i).    
2d90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f  {.      return _
2da0: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d  keyInfo[i].colum
2db0: 6e 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  nName;.    }..  
2dc0: 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 20 47    internal int G
2dd0: 65 74 4f 72 64 69 6e 61 6c 28 73 74 72 69 6e 67  etOrdinal(string
2de0: 20 6e 61 6d 65 29 0a 20 20 20 20 7b 0a 20 20 20   name).    {.   
2df0: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
2e00: 30 3b 20 6e 20 3c 20 5f 6b 65 79 49 6e 66 6f 2e  0; n < _keyInfo.
2e10: 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20 20 20  Length; n++).   
2e20: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20     {.        if 
2e30: 28 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65 28  (String.Compare(
2e40: 6e 61 6d 65 2c 20 5f 6b 65 79 49 6e 66 6f 5b 6e  name, _keyInfo[n
2e50: 5d 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 53 74  ].columnName, St
2e60: 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f  ringComparison.O
2e70: 72 64 69 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65  rdinalIgnoreCase
2e80: 29 20 3d 3d 20 30 29 20 72 65 74 75 72 6e 20 6e  ) == 0) return n
2e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ea0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
2eb0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 62  ..    internal b
2ec0: 6f 6f 6c 20 47 65 74 42 6f 6f 6c 65 61 6e 28 69  ool GetBoolean(i
2ed0: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
2ee0: 20 20 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20    Sync(i);.     
2ef0: 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d   if (_keyInfo[i]
2f00: 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20  .query != null) 
2f10: 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b  return _keyInfo[
2f20: 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72  i].query._reader
2f30: 2e 47 65 74 42 6f 6f 6c 65 61 6e 28 5f 6b 65 79  .GetBoolean(_key
2f40: 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b  Info[i].column);
2f50: 0a 20 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f  .      else thro
2f60: 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 43 61 73  w new InvalidCas
2f70: 74 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20  tException();.  
2f80: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
2f90: 6c 20 62 79 74 65 20 47 65 74 42 79 74 65 28 69  l byte GetByte(i
2fa0: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
2fb0: 20 20 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20    Sync(i);.     
2fc0: 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d   if (_keyInfo[i]
2fd0: 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20  .query != null) 
2fe0: 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b  return _keyInfo[
2ff0: 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72  i].query._reader
3000: 2e 47 65 74 42 79 74 65 28 5f 6b 65 79 49 6e 66  .GetByte(_keyInf
3010: 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20  o[i].column);.  
3020: 20 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e      else throw n
3030: 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78  ew InvalidCastEx
3040: 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d  ception();.    }
3050: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6c  ..    internal l
3060: 6f 6e 67 20 47 65 74 42 79 74 65 73 28 69 6e 74  ong GetBytes(int
3070: 20 69 2c 20 6c 6f 6e 67 20 66 69 65 6c 64 4f 66   i, long fieldOf
3080: 66 73 65 74 2c 20 62 79 74 65 5b 5d 20 62 75 66  fset, byte[] buf
3090: 66 65 72 2c 20 69 6e 74 20 62 75 66 66 65 72 6f  fer, int buffero
30a0: 66 66 73 65 74 2c 20 69 6e 74 20 6c 65 6e 67 74  ffset, int lengt
30b0: 68 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53  h).    {.      S
30c0: 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20 69 66  ync(i);.      if
30d0: 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75   (_keyInfo[i].qu
30e0: 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74  ery != null) ret
30f0: 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  urn _keyInfo[i].
3100: 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47 65  query._reader.Ge
3110: 74 42 79 74 65 73 28 5f 6b 65 79 49 6e 66 6f 5b  tBytes(_keyInfo[
3120: 69 5d 2e 63 6f 6c 75 6d 6e 2c 20 66 69 65 6c 64  i].column, field
3130: 4f 66 66 73 65 74 2c 20 62 75 66 66 65 72 2c 20  Offset, buffer, 
3140: 62 75 66 66 65 72 6f 66 66 73 65 74 2c 20 6c 65  bufferoffset, le
3150: 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 65 6c 73  ngth);.      els
3160: 65 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61  e throw new Inva
3170: 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e  lidCastException
3180: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ();.    }..    i
3190: 6e 74 65 72 6e 61 6c 20 63 68 61 72 20 47 65 74  nternal char Get
31a0: 43 68 61 72 28 69 6e 74 20 69 29 0a 20 20 20 20  Char(int i).    
31b0: 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29 3b  {.      Sync(i);
31c0: 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49  .      if (_keyI
31d0: 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20  nfo[i].query != 
31e0: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65  null) return _ke
31f0: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f  yInfo[i].query._
3200: 72 65 61 64 65 72 2e 47 65 74 43 68 61 72 28 5f  reader.GetChar(_
3210: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d  keyInfo[i].colum
3220: 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 74  n);.      else t
3230: 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64  hrow new Invalid
3240: 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  CastException();
3250: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
3260: 72 6e 61 6c 20 6c 6f 6e 67 20 47 65 74 43 68 61  rnal long GetCha
3270: 72 73 28 69 6e 74 20 69 2c 20 6c 6f 6e 67 20 66  rs(int i, long f
3280: 69 65 6c 64 4f 66 66 73 65 74 2c 20 63 68 61 72  ieldOffset, char
3290: 5b 5d 20 62 75 66 66 65 72 2c 20 69 6e 74 20 62  [] buffer, int b
32a0: 75 66 66 65 72 6f 66 66 73 65 74 2c 20 69 6e 74  ufferoffset, int
32b0: 20 6c 65 6e 67 74 68 29 0a 20 20 20 20 7b 0a 20   length).    {. 
32c0: 20 20 20 20 20 53 79 6e 63 28 69 29 3b 0a 20 20       Sync(i);.  
32d0: 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f      if (_keyInfo
32e0: 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c  [i].query != nul
32f0: 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e  l) return _keyIn
3300: 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61  fo[i].query._rea
3310: 64 65 72 2e 47 65 74 43 68 61 72 73 28 5f 6b 65  der.GetChars(_ke
3320: 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 2c  yInfo[i].column,
3330: 20 66 69 65 6c 64 4f 66 66 73 65 74 2c 20 62 75   fieldOffset, bu
3340: 66 66 65 72 2c 20 62 75 66 66 65 72 6f 66 66 73  ffer, bufferoffs
3350: 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20  et, length);.   
3360: 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e 65     else throw ne
3370: 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63  w InvalidCastExc
3380: 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a  eption();.    }.
3390: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 44 61  .    internal Da
33a0: 74 65 54 69 6d 65 20 47 65 74 44 61 74 65 54 69  teTime GetDateTi
33b0: 6d 65 28 69 6e 74 20 69 29 0a 20 20 20 20 7b 0a  me(int i).    {.
33c0: 20 20 20 20 20 20 53 79 6e 63 28 69 29 3b 0a 20        Sync(i);. 
33d0: 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66       if (_keyInf
33e0: 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75  o[i].query != nu
33f0: 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65 79 49  ll) return _keyI
3400: 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72 65  nfo[i].query._re
3410: 61 64 65 72 2e 47 65 74 44 61 74 65 54 69 6d 65  ader.GetDateTime
3420: 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c  (_keyInfo[i].col
3430: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  umn);.      else
3440: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
3450: 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28  idCastException(
3460: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
3470: 74 65 72 6e 61 6c 20 64 65 63 69 6d 61 6c 20 47  ternal decimal G
3480: 65 74 44 65 63 69 6d 61 6c 28 69 6e 74 20 69 29  etDecimal(int i)
3490: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53 79 6e  .    {.      Syn
34a0: 63 28 69 29 3b 0a 20 20 20 20 20 20 69 66 20 28  c(i);.      if (
34b0: 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72  _keyInfo[i].quer
34c0: 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72  y != null) retur
34d0: 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75  n _keyInfo[i].qu
34e0: 65 72 79 2e 5f 72 65 61 64 65 72 2e 47 65 74 44  ery._reader.GetD
34f0: 65 63 69 6d 61 6c 28 5f 6b 65 79 49 6e 66 6f 5b  ecimal(_keyInfo[
3500: 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  i].column);.    
3510: 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e 65 77    else throw new
3520: 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65   InvalidCastExce
3530: 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a  ption();.    }..
3540: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 64 6f 75      internal dou
3550: 62 6c 65 20 47 65 74 44 6f 75 62 6c 65 28 69 6e  ble GetDouble(in
3560: 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  t i).    {.     
3570: 20 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20   Sync(i);.      
3580: 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  if (_keyInfo[i].
3590: 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72  query != null) r
35a0: 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69  eturn _keyInfo[i
35b0: 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e  ].query._reader.
35c0: 47 65 74 44 6f 75 62 6c 65 28 5f 6b 65 79 49 6e  GetDouble(_keyIn
35d0: 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20  fo[i].column);. 
35e0: 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20       else throw 
35f0: 6e 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45  new InvalidCastE
3600: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20  xception();.    
3610: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3620: 66 6c 6f 61 74 20 47 65 74 46 6c 6f 61 74 28 69  float GetFloat(i
3630: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
3640: 20 20 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20    Sync(i);.     
3650: 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d   if (_keyInfo[i]
3660: 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20  .query != null) 
3670: 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b  return _keyInfo[
3680: 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72  i].query._reader
3690: 2e 47 65 74 46 6c 6f 61 74 28 5f 6b 65 79 49 6e  .GetFloat(_keyIn
36a0: 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20  fo[i].column);. 
36b0: 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20       else throw 
36c0: 6e 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45  new InvalidCastE
36d0: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20  xception();.    
36e0: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
36f0: 47 75 69 64 20 47 65 74 47 75 69 64 28 69 6e 74  Guid GetGuid(int
3700: 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   i).    {.      
3710: 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20 69  Sync(i);.      i
3720: 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71  f (_keyInfo[i].q
3730: 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65  uery != null) re
3740: 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d  turn _keyInfo[i]
3750: 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47  .query._reader.G
3760: 65 74 47 75 69 64 28 5f 6b 65 79 49 6e 66 6f 5b  etGuid(_keyInfo[
3770: 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  i].column);.    
3780: 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e 65 77    else throw new
3790: 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65   InvalidCastExce
37a0: 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a  ption();.    }..
37b0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 49 6e 74      internal Int
37c0: 31 36 20 47 65 74 49 6e 74 31 36 28 69 6e 74 20  16 GetInt16(int 
37d0: 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53  i).    {.      S
37e0: 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20 69 66  ync(i);.      if
37f0: 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75   (_keyInfo[i].qu
3800: 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74  ery != null) ret
3810: 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  urn _keyInfo[i].
3820: 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47 65  query._reader.Ge
3830: 74 49 6e 74 31 36 28 5f 6b 65 79 49 6e 66 6f 5b  tInt16(_keyInfo[
3840: 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  i].column);.    
3850: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20    else.      {. 
3860: 20 20 20 20 20 20 20 6c 6f 6e 67 20 72 6f 77 69         long rowi
3870: 64 20 3d 20 5f 73 74 6d 74 2e 5f 73 71 6c 2e 47  d = _stmt._sql.G
3880: 65 74 52 6f 77 49 64 46 6f 72 43 75 72 73 6f 72  etRowIdForCursor
3890: 28 5f 73 74 6d 74 2c 20 5f 6b 65 79 49 6e 66 6f  (_stmt, _keyInfo
38a0: 5b 69 5d 2e 63 75 72 73 6f 72 29 3b 0a 20 20 20  [i].cursor);.   
38b0: 20 20 20 20 20 69 66 20 28 72 6f 77 69 64 20 3d       if (rowid =
38c0: 3d 20 30 29 20 74 68 72 6f 77 20 6e 65 77 20 49  = 0) throw new I
38d0: 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65 70 74  nvalidCastExcept
38e0: 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ion();.        r
38f0: 65 74 75 72 6e 20 43 6f 6e 76 65 72 74 2e 54 6f  eturn Convert.To
3900: 49 6e 74 31 36 28 72 6f 77 69 64 29 3b 0a 20 20  Int16(rowid);.  
3910: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3920: 20 69 6e 74 65 72 6e 61 6c 20 49 6e 74 33 32 20   internal Int32 
3930: 47 65 74 49 6e 74 33 32 28 69 6e 74 20 69 29 0a  GetInt32(int i).
3940: 20 20 20 20 7b 0a 20 20 20 20 20 20 53 79 6e 63      {.      Sync
3950: 28 69 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f  (i);.      if (_
3960: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79  keyInfo[i].query
3970: 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   != null) return
3980: 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65   _keyInfo[i].que
3990: 72 79 2e 5f 72 65 61 64 65 72 2e 47 65 74 49 6e  ry._reader.GetIn
39a0: 74 33 32 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  t32(_keyInfo[i].
39b0: 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65  column);.      e
39c0: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  lse.      {.    
39d0: 20 20 20 20 6c 6f 6e 67 20 72 6f 77 69 64 20 3d      long rowid =
39e0: 20 5f 73 74 6d 74 2e 5f 73 71 6c 2e 47 65 74 52   _stmt._sql.GetR
39f0: 6f 77 49 64 46 6f 72 43 75 72 73 6f 72 28 5f 73  owIdForCursor(_s
3a00: 74 6d 74 2c 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d  tmt, _keyInfo[i]
3a10: 2e 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  .cursor);.      
3a20: 20 20 69 66 20 28 72 6f 77 69 64 20 3d 3d 20 30    if (rowid == 0
3a30: 29 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61  ) throw new Inva
3a40: 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e  lidCastException
3a50: 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
3a60: 72 6e 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74  rn Convert.ToInt
3a70: 33 32 28 72 6f 77 69 64 29 3b 0a 20 20 20 20 20  32(rowid);.     
3a80: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e   }.    }..    in
3a90: 74 65 72 6e 61 6c 20 49 6e 74 36 34 20 47 65 74  ternal Int64 Get
3aa0: 49 6e 74 36 34 28 69 6e 74 20 69 29 0a 20 20 20  Int64(int i).   
3ab0: 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29   {.      Sync(i)
3ac0: 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79  ;.      if (_key
3ad0: 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d  Info[i].query !=
3ae0: 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b   null) return _k
3af0: 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e  eyInfo[i].query.
3b00: 5f 72 65 61 64 65 72 2e 47 65 74 49 6e 74 36 34  _reader.GetInt64
3b10: 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c  (_keyInfo[i].col
3b20: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  umn);.      else
3b30: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
3b40: 20 6c 6f 6e 67 20 72 6f 77 69 64 20 3d 20 5f 73   long rowid = _s
3b50: 74 6d 74 2e 5f 73 71 6c 2e 47 65 74 52 6f 77 49  tmt._sql.GetRowI
3b60: 64 46 6f 72 43 75 72 73 6f 72 28 5f 73 74 6d 74  dForCursor(_stmt
3b70: 2c 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 75  , _keyInfo[i].cu
3b80: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rsor);.        i
3b90: 66 20 28 72 6f 77 69 64 20 3d 3d 20 30 29 20 74  f (rowid == 0) t
3ba0: 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64  hrow new Invalid
3bb0: 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  CastException();
3bc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3bd0: 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 36 34 28  Convert.ToInt64(
3be0: 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  rowid);.      }.
3bf0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
3c00: 6e 61 6c 20 73 74 72 69 6e 67 20 47 65 74 53 74  nal string GetSt
3c10: 72 69 6e 67 28 69 6e 74 20 69 29 0a 20 20 20 20  ring(int i).    
3c20: 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29 3b  {.      Sync(i);
3c30: 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49  .      if (_keyI
3c40: 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20  nfo[i].query != 
3c50: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65  null) return _ke
3c60: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f  yInfo[i].query._
3c70: 72 65 61 64 65 72 2e 47 65 74 53 74 72 69 6e 67  reader.GetString
3c80: 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c  (_keyInfo[i].col
3c90: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  umn);.      else
3ca0: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
3cb0: 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28  idCastException(
3cc0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
3cd0: 74 65 72 6e 61 6c 20 6f 62 6a 65 63 74 20 47 65  ternal object Ge
3ce0: 74 56 61 6c 75 65 28 69 6e 74 20 69 29 0a 20 20  tValue(int i).  
3cf0: 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b    {.      if (_k
3d00: 65 79 49 6e 66 6f 5b 69 5d 2e 63 75 72 73 6f 72  eyInfo[i].cursor
3d10: 20 3d 3d 20 2d 31 29 20 72 65 74 75 72 6e 20 44   == -1) return D
3d20: 42 4e 75 6c 6c 2e 56 61 6c 75 65 3b 0a 0a 20 20  BNull.Value;..  
3d30: 20 20 20 20 53 79 6e 63 28 69 29 3b 0a 20 20 20      Sync(i);.   
3d40: 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b     if (_keyInfo[
3d50: 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c  i].query != null
3d60: 29 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66  ) return _keyInf
3d70: 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64  o[i].query._read
3d80: 65 72 2e 47 65 74 56 61 6c 75 65 28 5f 6b 65 79  er.GetValue(_key
3d90: 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b  Info[i].column);
3da0: 0a 0a 20 20 20 20 20 20 69 66 20 28 49 73 44 42  ..      if (IsDB
3db0: 4e 75 6c 6c 28 69 29 20 3d 3d 20 74 72 75 65 29  Null(i) == true)
3dc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3dd0: 44 42 4e 75 6c 6c 2e 56 61 6c 75 65 3b 0a 20 20  DBNull.Value;.  
3de0: 20 20 20 20 65 6c 73 65 20 72 65 74 75 72 6e 20      else return 
3df0: 47 65 74 49 6e 74 36 34 28 69 29 3b 0a 20 20 20  GetInt64(i);.   
3e00: 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c   }..    internal
3e10: 20 62 6f 6f 6c 20 49 73 44 42 4e 75 6c 6c 28 69   bool IsDBNull(i
3e20: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
3e30: 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69    if (_keyInfo[i
3e40: 5d 2e 63 75 72 73 6f 72 20 3d 3d 20 2d 31 29 20  ].cursor == -1) 
3e50: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 0a 20 20  return true;..  
3e60: 20 20 20 20 53 79 6e 63 28 69 29 3b 0a 20 20 20      Sync(i);.   
3e70: 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b     if (_keyInfo[
3e80: 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c  i].query != null
3e90: 29 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66  ) return _keyInf
3ea0: 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64  o[i].query._read
3eb0: 65 72 2e 49 73 44 42 4e 75 6c 6c 28 5f 6b 65 79  er.IsDBNull(_key
3ec0: 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b  Info[i].column);
3ed0: 0a 20 20 20 20 20 20 65 6c 73 65 20 72 65 74 75  .      else retu
3ee0: 72 6e 20 5f 73 74 6d 74 2e 5f 73 71 6c 2e 47 65  rn _stmt._sql.Ge
3ef0: 74 52 6f 77 49 64 46 6f 72 43 75 72 73 6f 72 28  tRowIdForCursor(
3f00: 5f 73 74 6d 74 2c 20 5f 6b 65 79 49 6e 66 6f 5b  _stmt, _keyInfo[
3f10: 69 5d 2e 63 75 72 73 6f 72 29 20 3d 3d 20 30 3b  i].cursor) == 0;
3f20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20  .    }..    /// 
3f30: 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f  <summary>.    //
3f40: 2f 20 41 70 70 65 6e 64 20 61 6c 6c 20 74 68 65  / Append all the
3f50: 20 63 6f 6c 75 6d 6e 73 20 77 65 27 76 65 20 61   columns we've a
3f60: 64 64 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67  dded to the orig
3f70: 69 6e 61 6c 20 71 75 65 72 79 20 74 6f 20 74 68  inal query to th
3f80: 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2f 2f 2f  e schema.    ///
3f90: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
3fa0: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
3fb0: 22 74 62 6c 22 3e 3c 2f 70 61 72 61 6d 3e 0a 20  "tbl"></param>. 
3fc0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64     internal void
3fd0: 20 41 70 70 65 6e 64 53 63 68 65 6d 61 54 61 62   AppendSchemaTab
3fe0: 6c 65 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c  le(DataTable tbl
3ff0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 4b 65  ).    {.      Ke
4000: 79 51 75 65 72 79 20 6c 61 73 74 20 3d 20 6e 75  yQuery last = nu
4010: 6c 6c 3b 0a 0a 20 20 20 20 20 20 66 6f 72 20 28  ll;..      for (
4020: 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 5f  int n = 0; n < _
4030: 6b 65 79 49 6e 66 6f 2e 4c 65 6e 67 74 68 3b 20  keyInfo.Length; 
4040: 6e 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  n++).      {.   
4050: 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66       if (_keyInf
4060: 6f 5b 6e 5d 2e 71 75 65 72 79 20 3d 3d 20 6e 75  o[n].query == nu
4070: 6c 6c 20 7c 7c 20 5f 6b 65 79 49 6e 66 6f 5b 6e  ll || _keyInfo[n
4080: 5d 2e 71 75 65 72 79 20 21 3d 20 6c 61 73 74 29  ].query != last)
4090: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
40a0: 20 20 20 20 20 6c 61 73 74 20 3d 20 5f 6b 65 79       last = _key
40b0: 49 6e 66 6f 5b 6e 5d 2e 71 75 65 72 79 3b 0a 0a  Info[n].query;..
40c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 61            if (la
40d0: 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 2f 2f 20 52  st == null) // R
40e0: 4f 57 49 44 20 61 6c 69 61 73 65 73 20 61 72 65  OWID aliases are
40f0: 20 74 72 65 61 74 65 64 20 73 70 65 63 69 61 6c   treated special
4100: 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20  .          {.   
4110: 20 20 20 20 20 20 20 20 20 44 61 74 61 52 6f 77           DataRow
4120: 20 72 6f 77 20 3d 20 74 62 6c 2e 4e 65 77 52 6f   row = tbl.NewRo
4130: 77 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  w();.           
4140: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
4150: 43 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e 4e 61 6d  Column.ColumnNam
4160: 65 5d 20 3d 20 5f 6b 65 79 49 6e 66 6f 5b 6e 5d  e] = _keyInfo[n]
4170: 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 3b 0a 20 20 20  .columnName;.   
4180: 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68           row[Sch
4190: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 43  emaTableColumn.C
41a0: 6f 6c 75 6d 6e 4f 72 64 69 6e 61 6c 5d 20 3d 20  olumnOrdinal] = 
41b0: 74 62 6c 2e 52 6f 77 73 2e 43 6f 75 6e 74 3b 0a  tbl.Rows.Count;.
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b              row[
41d0: 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d  SchemaTableColum
41e0: 6e 2e 43 6f 6c 75 6d 6e 53 69 7a 65 5d 20 3d 20  n.ColumnSize] = 
41f0: 38 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  8;.            r
4200: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
4210: 6c 75 6d 6e 2e 4e 75 6d 65 72 69 63 50 72 65 63  lumn.NumericPrec
4220: 69 73 69 6f 6e 5d 20 3d 20 32 35 35 3b 0a 20 20  ision] = 255;.  
4230: 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63            row[Sc
4240: 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e  hemaTableColumn.
4250: 4e 75 6d 65 72 69 63 53 63 61 6c 65 5d 20 3d 20  NumericScale] = 
4260: 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20  255;.           
4270: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
4280: 43 6f 6c 75 6d 6e 2e 50 72 6f 76 69 64 65 72 54  Column.ProviderT
4290: 79 70 65 5d 20 3d 20 44 62 54 79 70 65 2e 49 6e  ype] = DbType.In
42a0: 74 36 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t64;.           
42b0: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
42c0: 43 6f 6c 75 6d 6e 2e 49 73 4c 6f 6e 67 5d 20 3d  Column.IsLong] =
42d0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
42e0: 20 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61      row[SchemaTa
42f0: 62 6c 65 43 6f 6c 75 6d 6e 2e 41 6c 6c 6f 77 44  bleColumn.AllowD
4300: 42 4e 75 6c 6c 5d 20 3d 20 66 61 6c 73 65 3b 0a  BNull] = false;.
4310: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b              row[
4320: 53 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f  SchemaTableOptio
4330: 6e 61 6c 43 6f 6c 75 6d 6e 2e 49 73 52 65 61 64  nalColumn.IsRead
4340: 4f 6e 6c 79 5d 20 3d 20 66 61 6c 73 65 3b 0a 20  Only] = false;. 
4350: 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53             row[S
4360: 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e  chemaTableOption
4370: 61 6c 43 6f 6c 75 6d 6e 2e 49 73 52 6f 77 56 65  alColumn.IsRowVe
4380: 72 73 69 6f 6e 5d 20 3d 20 66 61 6c 73 65 3b 0a  rsion] = false;.
4390: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b              row[
43a0: 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d  SchemaTableColum
43b0: 6e 2e 49 73 55 6e 69 71 75 65 5d 20 3d 20 66 61  n.IsUnique] = fa
43c0: 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lse;.           
43d0: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
43e0: 43 6f 6c 75 6d 6e 2e 49 73 4b 65 79 5d 20 3d 20  Column.IsKey] = 
43f0: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
4400: 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c    row[SchemaTabl
4410: 65 43 6f 6c 75 6d 6e 2e 44 61 74 61 54 79 70 65  eColumn.DataType
4420: 5d 20 3d 20 74 79 70 65 6f 66 28 49 6e 74 36 34  ] = typeof(Int64
4430: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
4440: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 4f 70  ow[SchemaTableOp
4450: 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 49 73 48  tionalColumn.IsH
4460: 69 64 64 65 6e 5d 20 3d 20 74 72 75 65 3b 0a 20  idden] = true;. 
4470: 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53             row[S
4480: 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e  chemaTableColumn
4490: 2e 42 61 73 65 43 6f 6c 75 6d 6e 4e 61 6d 65 5d  .BaseColumnName]
44a0: 20 3d 20 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 63   = _keyInfo[n].c
44b0: 6f 6c 75 6d 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  olumnName;.     
44c0: 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65 6d         row[Schem
44d0: 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49 73 45  aTableColumn.IsE
44e0: 78 70 72 65 73 73 69 6f 6e 5d 20 3d 20 66 61 6c  xpression] = fal
44f0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
4500: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43  row[SchemaTableC
4510: 6f 6c 75 6d 6e 2e 49 73 41 6c 69 61 73 65 64 5d  olumn.IsAliased]
4520: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
4530: 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65 6d 61        row[Schema
4540: 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65  TableColumn.Base
4550: 54 61 62 6c 65 4e 61 6d 65 5d 20 3d 20 5f 6b 65  TableName] = _ke
4560: 79 49 6e 66 6f 5b 6e 5d 2e 74 61 62 6c 65 4e 61  yInfo[n].tableNa
4570: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
4580: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 4f  row[SchemaTableO
4590: 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 42 61  ptionalColumn.Ba
45a0: 73 65 43 61 74 61 6c 6f 67 4e 61 6d 65 5d 20 3d  seCatalogName] =
45b0: 20 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 64 61 74   _keyInfo[n].dat
45c0: 61 62 61 73 65 4e 61 6d 65 3b 0a 20 20 20 20 20  abaseName;.     
45d0: 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65 6d         row[Schem
45e0: 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f  aTableOptionalCo
45f0: 6c 75 6d 6e 2e 49 73 41 75 74 6f 49 6e 63 72 65  lumn.IsAutoIncre
4600: 6d 65 6e 74 5d 20 3d 20 74 72 75 65 3b 0a 20 20  ment] = true;.  
4610: 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 22 44            row["D
4620: 61 74 61 54 79 70 65 4e 61 6d 65 22 5d 20 3d 20  ataTypeName"] = 
4630: 22 69 6e 74 65 67 65 72 22 3b 0a 0a 20 20 20 20  "integer";..    
4640: 20 20 20 20 20 20 20 20 74 62 6c 2e 52 6f 77 73          tbl.Rows
4650: 2e 41 64 64 28 72 6f 77 29 3b 0a 20 20 20 20 20  .Add(row);.     
4660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4670: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20   else.          
4680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  {.            la
4690: 73 74 2e 53 79 6e 63 28 30 29 3b 0a 20 20 20 20  st.Sync(0);.    
46a0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 44          using (D
46b0: 61 74 61 54 61 62 6c 65 20 74 62 6c 53 75 62 20  ataTable tblSub 
46c0: 3d 20 6c 61 73 74 2e 5f 72 65 61 64 65 72 2e 47  = last._reader.G
46d0: 65 74 53 63 68 65 6d 61 54 61 62 6c 65 28 29 29  etSchemaTable())
46e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4700: 65 61 63 68 20 28 44 61 74 61 52 6f 77 20 72 6f  each (DataRow ro
4710: 77 20 69 6e 20 74 62 6c 53 75 62 2e 52 6f 77 73  w in tblSub.Rows
4720: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4730: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4740: 20 20 6f 62 6a 65 63 74 5b 5d 20 6f 20 3d 20 72    object[] o = r
4750: 6f 77 2e 49 74 65 6d 41 72 72 61 79 3b 0a 20 20  ow.ItemArray;.  
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 61                Da
4770: 74 61 52 6f 77 20 6e 65 77 72 6f 77 20 3d 20 74  taRow newrow = t
4780: 62 6c 2e 52 6f 77 73 2e 41 64 64 28 6f 29 3b 0a  bl.Rows.Add(o);.
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 6e 65 77 72 6f 77 5b 53 63 68 65 6d 61 54 61 62  newrow[SchemaTab
47b0: 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e  leOptionalColumn
47c0: 2e 49 73 48 69 64 64 65 6e 5d 20 3d 20 74 72 75  .IsHidden] = tru
47d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
47e0: 20 20 20 6e 65 77 72 6f 77 5b 53 63 68 65 6d 61     newrow[Schema
47f0: 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 43 6f 6c 75  TableColumn.Colu
4800: 6d 6e 4f 72 64 69 6e 61 6c 5d 20 3d 20 74 62 6c  mnOrdinal] = tbl
4810: 2e 52 6f 77 73 2e 43 6f 75 6e 74 20 2d 20 31 3b  .Rows.Count - 1;
4820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
4830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
4840: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4850: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4860: 20 7d 0a 20 20 7d 0a 7d 0a                        }.  }.}.