System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 99269fc0a9f029ecb6575565903974c237efeb92:


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 20 20 75 73 69 6e 67 20 53 79 73 74  ic;.  using Syst
01b0: 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e  em.Globalization
01c0: 3b 0a 0a 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  ;..  /// <summar
01d0: 79 3e 0a 20 20 2f 2f 2f 20 54 68 69 73 20 63 6c  y>.  /// This cl
01e0: 61 73 73 20 70 72 6f 76 69 64 65 73 20 6b 65 79  ass provides key
01f0: 20 69 6e 66 6f 20 66 6f 72 20 61 20 67 69 76 65   info for a give
0200: 6e 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  n SQLite stateme
0210: 6e 74 2e 0a 20 20 2f 2f 2f 20 3c 72 65 6d 61 72  nt..  /// <remar
0220: 6b 73 3e 0a 20 20 2f 2f 2f 20 50 72 6f 76 69 64  ks>.  /// Provid
0230: 69 6e 67 20 6b 65 79 20 69 6e 66 6f 72 6d 61 74  ing key informat
0240: 69 6f 6e 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ion for a given 
0250: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6e 6f 6e  statement is non
0260: 2d 74 72 69 76 69 61 6c 20 3a 28 0a 20 20 2f 2f  -trivial :(.  //
0270: 2f 20 3c 2f 72 65 6d 61 72 6b 73 3e 0a 20 20 2f  / </remarks>.  /
0280: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
0290: 69 6e 74 65 72 6e 61 6c 20 73 65 61 6c 65 64 20  internal sealed 
02a0: 63 6c 61 73 73 20 53 51 4c 69 74 65 4b 65 79 52  class SQLiteKeyR
02b0: 65 61 64 65 72 20 3a 20 49 44 69 73 70 6f 73 61  eader : IDisposa
02c0: 62 6c 65 0a 20 20 7b 0a 20 20 20 20 70 72 69 76  ble.  {.    priv
02d0: 61 74 65 20 4b 65 79 49 6e 66 6f 5b 5d 20 5f 6b  ate KeyInfo[] _k
02e0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 72 69 76  eyInfo;.    priv
02f0: 61 74 65 20 53 51 4c 69 74 65 53 74 61 74 65 6d  ate SQLiteStatem
0300: 65 6e 74 20 5f 73 74 6d 74 3b 0a 20 20 20 20 70  ent _stmt;.    p
0310: 72 69 76 61 74 65 20 62 6f 6f 6c 20 5f 69 73 56  rivate bool _isV
0320: 61 6c 69 64 3b 0a 0a 20 20 20 20 2f 2f 2f 20 3c  alid;..    /// <
0330: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
0340: 20 55 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74   Used to support
0350: 20 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69 6f 72   CommandBehavior
0360: 2e 4b 65 79 49 6e 66 6f 0a 20 20 20 20 2f 2f 2f  .KeyInfo.    ///
0370: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20   </summary>.    
0380: 70 72 69 76 61 74 65 20 73 74 72 75 63 74 20 4b  private struct K
0390: 65 79 49 6e 66 6f 0a 20 20 20 20 7b 0a 20 20 20  eyInfo.    {.   
03a0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69     internal stri
03b0: 6e 67 20 64 61 74 61 62 61 73 65 4e 61 6d 65 3b  ng databaseName;
03c0: 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  .      internal 
03d0: 73 74 72 69 6e 67 20 74 61 62 6c 65 4e 61 6d 65  string tableName
03e0: 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c  ;.      internal
03f0: 20 73 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 4e 61   string columnNa
0400: 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 6e  me;.      intern
0410: 61 6c 20 69 6e 74 20 64 61 74 61 62 61 73 65 3b  al int database;
0420: 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  .      internal 
0430: 69 6e 74 20 72 6f 6f 74 50 61 67 65 3b 0a 20 20  int rootPage;.  
0440: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74      internal int
0450: 20 63 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 69   cursor;.      i
0460: 6e 74 65 72 6e 61 6c 20 4b 65 79 51 75 65 72 79  nternal KeyQuery
0470: 20 71 75 65 72 79 3b 0a 20 20 20 20 20 20 69 6e   query;.      in
0480: 74 65 72 6e 61 6c 20 69 6e 74 20 63 6f 6c 75 6d  ternal int colum
0490: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  n;.    }..    //
04a0: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
04b0: 2f 2f 2f 20 41 20 73 69 6e 67 6c 65 20 73 75 62  /// A single sub
04c0: 2d 71 75 65 72 79 20 66 6f 72 20 61 20 67 69 76  -query for a giv
04d0: 65 6e 20 74 61 62 6c 65 2f 64 61 74 61 62 61 73  en table/databas
04e0: 65 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  e..    /// </sum
04f0: 6d 61 72 79 3e 0d 0a 20 20 20 20 70 72 69 76 61  mary>..    priva
0500: 74 65 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20  te sealed class 
0510: 4b 65 79 51 75 65 72 79 20 3a 20 49 44 69 73 70  KeyQuery : IDisp
0520: 6f 73 61 62 6c 65 0d 0a 20 20 20 20 7b 0d 0a 20  osable..    {.. 
0530: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 53         private S
0540: 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 20 5f 63 6f  QLiteCommand _co
0550: 6d 6d 61 6e 64 3b 0d 0a 20 20 20 20 20 20 20 20  mmand;..        
0560: 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 44  internal SQLiteD
0570: 61 74 61 52 65 61 64 65 72 20 5f 72 65 61 64 65  ataReader _reade
0580: 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e  r;....        in
0590: 74 65 72 6e 61 6c 20 4b 65 79 51 75 65 72 79 28  ternal KeyQuery(
05a0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
05b0: 20 63 6e 6e 2c 20 73 74 72 69 6e 67 20 64 61 74   cnn, string dat
05c0: 61 62 61 73 65 2c 20 73 74 72 69 6e 67 20 74 61  abase, string ta
05d0: 62 6c 65 2c 20 70 61 72 61 6d 73 20 73 74 72 69  ble, params stri
05e0: 6e 67 5b 5d 20 63 6f 6c 75 6d 6e 73 29 0d 0a 20  ng[] columns).. 
05f0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0600: 20 20 20 20 20 20 75 73 69 6e 67 20 28 53 51 4c        using (SQL
0610: 69 74 65 43 6f 6d 6d 61 6e 64 42 75 69 6c 64 65  iteCommandBuilde
0620: 72 20 62 75 69 6c 64 65 72 20 3d 20 6e 65 77 20  r builder = new 
0630: 53 51 4c 69 74 65 43 6f 6d 6d 61 6e 64 42 75 69  SQLiteCommandBui
0640: 6c 64 65 72 28 29 29 0d 0a 20 20 20 20 20 20 20  lder())..       
0650: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0660: 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64          _command
0670: 20 3d 20 63 6e 6e 2e 43 72 65 61 74 65 43 6f 6d   = cnn.CreateCom
0680: 6d 61 6e 64 28 29 3b 0d 0a 20 20 20 20 20 20 20  mand();..       
0690: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
06a0: 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 63 6f 6c  t n = 0; n < col
06b0: 75 6d 6e 73 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b  umns.Length; n++
06c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
06d0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
06e0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
06f0: 73 5b 6e 5d 20 3d 20 62 75 69 6c 64 65 72 2e 51  s[n] = builder.Q
0700: 75 6f 74 65 49 64 65 6e 74 69 66 69 65 72 28 63  uoteIdentifier(c
0710: 6f 6c 75 6d 6e 73 5b 6e 5d 29 3b 0d 0a 20 20 20  olumns[n]);..   
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
0730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
0740: 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d             _comm
0750: 61 6e 64 2e 43 6f 6d 6d 61 6e 64 54 65 78 74 20  and.CommandText 
0760: 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
0770: 43 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61  CultureInfo.Inva
0780: 72 69 61 6e 74 43 75 6c 74 75 72 65 2c 20 22 53  riantCulture, "S
0790: 45 4c 45 43 54 20 7b 30 7d 20 46 52 4f 4d 20 5b  ELECT {0} FROM [
07a0: 7b 31 7d 5d 2e 5b 7b 32 7d 5d 20 57 48 45 52 45  {1}].[{2}] WHERE
07b0: 20 52 4f 57 49 44 20 3d 20 3f 22 2c 20 53 74 72   ROWID = ?", Str
07c0: 69 6e 67 2e 4a 6f 69 6e 28 22 2c 22 2c 20 63 6f  ing.Join(",", co
07d0: 6c 75 6d 6e 73 29 2c 20 64 61 74 61 62 61 73 65  lumns), database
07e0: 2c 20 74 61 62 6c 65 29 3b 0d 0a 20 20 20 20 20  , table);..     
07f0: 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64 2e         _command.
0800: 50 61 72 61 6d 65 74 65 72 73 2e 41 64 64 57 69  Parameters.AddWi
0810: 74 68 56 61 6c 75 65 28 6e 75 6c 6c 2c 20 28 6c  thValue(null, (l
0820: 6f 6e 67 29 30 29 3b 0d 0a 20 20 20 20 20 20 20  ong)0);..       
0830: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e   }....        in
0840: 74 65 72 6e 61 6c 20 62 6f 6f 6c 20 49 73 56 61  ternal bool IsVa
0850: 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  lid..        {..
0860: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 0d              set.
0870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 69 66 20 28 76 61 6c 75 65 20 21 3d 20 66 61 6c  if (value != fal
08a0: 73 65 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72  se) throw new Ar
08b0: 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28  gumentException(
08c0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
08d0: 20 20 20 20 69 66 20 28 5f 72 65 61 64 65 72 20      if (_reader 
08e0: 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
08f0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 5f 72 65 61 64 65 72 2e 44 69 73 70 6f 73 65   _reader.Dispose
0920: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
0930: 20 20 20 20 20 20 20 20 20 5f 72 65 61 64 65 72           _reader
0940: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
0950: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
0960: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
0970: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
0980: 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20 53   internal void S
0990: 79 6e 63 28 6c 6f 6e 67 20 72 6f 77 69 64 29 0d  ync(long rowid).
09a0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
09b0: 20 20 20 20 20 20 20 20 49 73 56 61 6c 69 64 20          IsValid 
09c0: 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  = false;..      
09d0: 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64 2e 50        _command.P
09e0: 61 72 61 6d 65 74 65 72 73 5b 30 5d 2e 56 61 6c  arameters[0].Val
09f0: 75 65 20 3d 20 72 6f 77 69 64 3b 0d 0a 20 20 20  ue = rowid;..   
0a00: 20 20 20 20 20 20 20 20 20 5f 72 65 61 64 65 72           _reader
0a10: 20 3d 20 5f 63 6f 6d 6d 61 6e 64 2e 45 78 65 63   = _command.Exec
0a20: 75 74 65 52 65 61 64 65 72 28 29 3b 0d 0a 20 20  uteReader();..  
0a30: 20 20 20 20 20 20 20 20 20 20 5f 72 65 61 64 65            _reade
0a40: 72 2e 52 65 61 64 28 29 3b 0d 0a 20 20 20 20 20  r.Read();..     
0a50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
0a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
0ac0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69  ...        #regi
0ad0: 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 4d  on IDisposable M
0ae0: 65 6d 62 65 72 73 0d 0a 20 20 20 20 20 20 20 20  embers..        
0af0: 70 75 62 6c 69 63 20 76 6f 69 64 20 44 69 73 70  public void Disp
0b00: 6f 73 65 28 29 0d 0a 20 20 20 20 20 20 20 20 7b  ose()..        {
0b10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 69  ..            Di
0b20: 73 70 6f 73 65 28 74 72 75 65 29 3b 0d 0a 20 20  spose(true);..  
0b30: 20 20 20 20 20 20 20 20 20 20 47 43 2e 53 75 70            GC.Sup
0b40: 70 72 65 73 73 46 69 6e 61 6c 69 7a 65 28 74 68  pressFinalize(th
0b50: 69 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  is);..        }.
0b60: 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
0b70: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ion....        /
0b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
0be0: 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f  ..        #regio
0bf0: 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22 50  n IDisposable "P
0c00: 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73 0d  attern" Members.
0c10: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
0c20: 20 62 6f 6f 6c 20 64 69 73 70 6f 73 65 64 3b 0d   bool disposed;.
0c30: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
0c40: 20 76 6f 69 64 20 43 68 65 63 6b 44 69 73 70 6f   void CheckDispo
0c50: 73 65 64 28 29 20 2f 2a 20 74 68 72 6f 77 20 2a  sed() /* throw *
0c60: 2f 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 23 69  /..        {..#i
0c70: 66 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f  f THROW_ON_DISPO
0c80: 53 45 44 0d 0a 20 20 20 20 20 20 20 20 20 20 20  SED..           
0c90: 20 69 66 20 28 64 69 73 70 6f 73 65 64 29 0d 0a   if (disposed)..
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 74 68 72 6f 77 20 6e 65 77 20 4f 62 6a 65 63 74  throw new Object
0cc0: 44 69 73 70 6f 73 65 64 45 78 63 65 70 74 69 6f  DisposedExceptio
0cd0: 6e 28 74 79 70 65 6f 66 28 4b 65 79 51 75 65 72  n(typeof(KeyQuer
0ce0: 79 29 2e 4e 61 6d 65 29 3b 0d 0a 23 65 6e 64 69  y).Name);..#endi
0cf0: 66 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  f..        }....
0d00: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
0d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d60: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
0d70: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
0d80: 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20 64 69 73  Dispose(bool dis
0d90: 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 20 20 20  posing)..       
0da0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0db0: 69 66 20 28 21 64 69 73 70 6f 73 65 64 29 0d 0a  if (!disposed)..
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
0de0: 66 20 28 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20  f (disposing).. 
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
0e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0e10: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
0e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20  //////////..    
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 2f 2f 20 64 69 73 70 6f 73 65 20 6d 61 6e 61 67  // dispose manag
0e60: 65 64 20 72 65 73 6f 75 72 63 65 73 20 68 65 72  ed resources her
0e70: 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  e.....          
0e80: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
0e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0ec0: 20 20 20 20 20 20 49 73 56 61 6c 69 64 20 3d 20        IsValid = 
0ed0: 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
0ef0: 20 28 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 6e 75   (_command != nu
0f00: 6c 6c 29 20 5f 63 6f 6d 6d 61 6e 64 2e 44 69 73  ll) _command.Dis
0f10: 70 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  pose();..       
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 63 6f               _co
0f30: 6d 6d 61 6e 64 20 3d 20 6e 75 6c 6c 3b 0d 0a 20  mmand = null;.. 
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
0f50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0f60: 20 20 20 20 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 0d 0a 20 20 20 20  //////////..    
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72              // r
0fa0: 65 6c 65 61 73 65 20 75 6e 6d 61 6e 61 67 65 64  elease unmanaged
0fb0: 20 72 65 73 6f 75 72 63 65 73 20 68 65 72 65 2e   resources here.
0fc0: 2e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0fd0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
0fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1010: 73 70 6f 73 65 64 20 3d 20 74 72 75 65 3b 0d 0a  sposed = true;..
1020: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1030: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1040: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
1050: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10b0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
10c0: 20 20 20 23 72 65 67 69 6f 6e 20 44 65 73 74 72     #region Destr
10d0: 75 63 74 6f 72 0d 0a 20 20 20 20 20 20 20 20 7e  uctor..        ~
10e0: 4b 65 79 51 75 65 72 79 28 29 0d 0a 20 20 20 20  KeyQuery()..    
10f0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1100: 20 20 20 44 69 73 70 6f 73 65 28 66 61 6c 73 65     Dispose(false
1110: 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  );..        }.. 
1120: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
1130: 6e 0d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  n..    }..    //
1140: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20  / <summary>.    
1150: 2f 2f 2f 20 54 68 69 73 20 66 75 6e 63 74 69 6f  /// This functio
1160: 6e 20 64 6f 65 73 20 61 6c 6c 20 74 68 65 20 6e  n does all the n
1170: 61 73 74 79 20 77 6f 72 6b 20 61 74 20 64 65 74  asty work at det
1180: 65 72 6d 69 6e 69 6e 67 20 77 68 61 74 20 6b 65  ermining what ke
1190: 79 73 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ys need to be re
11a0: 74 75 72 6e 65 64 20 66 6f 72 0a 20 20 20 20 2f  turned for.    /
11b0: 2f 2f 20 61 20 67 69 76 65 6e 20 73 74 61 74 65  // a given state
11c0: 6d 65 6e 74 2e 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ment..    /// </
11d0: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
11e0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6e   <param name="cn
11f0: 6e 22 3e 3c 2f 70 61 72 61 6d 3e 0a 20 20 20 20  n"></param>.    
1200: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1210: 22 72 65 61 64 65 72 22 3e 3c 2f 70 61 72 61 6d  "reader"></param
1220: 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  >.    /// <param
1230: 20 6e 61 6d 65 3d 22 73 74 6d 74 22 3e 3c 2f 70   name="stmt"></p
1240: 61 72 61 6d 3e 0a 20 20 20 20 69 6e 74 65 72 6e  aram>.    intern
1250: 61 6c 20 53 51 4c 69 74 65 4b 65 79 52 65 61 64  al SQLiteKeyRead
1260: 65 72 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  er(SQLiteConnect
1270: 69 6f 6e 20 63 6e 6e 2c 20 53 51 4c 69 74 65 44  ion cnn, SQLiteD
1280: 61 74 61 52 65 61 64 65 72 20 72 65 61 64 65 72  ataReader reader
1290: 2c 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  , SQLiteStatemen
12a0: 74 20 73 74 6d 74 29 0a 20 20 20 20 7b 0d 0a 20  t stmt).    {.. 
12b0: 20 20 20 20 20 73 74 6d 74 2e 43 68 65 63 6b 44       stmt.CheckD
12c0: 69 73 70 6f 73 65 64 28 29 3b 0a 20 20 20 20 20  isposed();.     
12d0: 20 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69   Dictionary<stri
12e0: 6e 67 2c 20 69 6e 74 3e 20 63 61 74 61 6c 6f 67  ng, int> catalog
12f0: 73 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61  s = new Dictiona
1300: 72 79 3c 73 74 72 69 6e 67 2c 20 69 6e 74 3e 28  ry<string, int>(
1310: 29 3b 0a 20 20 20 20 20 20 44 69 63 74 69 6f 6e  );.      Diction
1320: 61 72 79 3c 73 74 72 69 6e 67 2c 20 4c 69 73 74  ary<string, List
1330: 3c 73 74 72 69 6e 67 3e 3e 20 74 61 62 6c 65 73  <string>> tables
1340: 20 3d 20 6e 65 77 20 44 69 63 74 69 6f 6e 61 72   = new Dictionar
1350: 79 3c 73 74 72 69 6e 67 2c 20 4c 69 73 74 3c 73  y<string, List<s
1360: 74 72 69 6e 67 3e 3e 28 29 3b 0a 20 20 20 20 20  tring>>();.     
1370: 20 4c 69 73 74 3c 73 74 72 69 6e 67 3e 20 6c 69   List<string> li
1380: 73 74 3b 0a 20 20 20 20 20 20 4c 69 73 74 3c 4b  st;.      List<K
1390: 65 79 49 6e 66 6f 3e 20 6b 65 79 73 20 3d 20 6e  eyInfo> keys = n
13a0: 65 77 20 4c 69 73 74 3c 4b 65 79 49 6e 66 6f 3e  ew List<KeyInfo>
13b0: 28 29 3b 0a 0a 20 20 20 20 20 20 2f 2f 20 52 65  ();..      // Re
13c0: 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 6d 65  cord the stateme
13d0: 6e 74 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  nt so we can use
13e0: 20 69 74 20 6c 61 74 65 72 20 66 6f 72 20 73 79   it later for sy
13f0: 6e 63 27 69 6e 67 0a 20 20 20 20 20 20 5f 73 74  nc'ing.      _st
1400: 6d 74 20 3d 20 73 74 6d 74 3b 0a 0a 20 20 20 20  mt = stmt;..    
1410: 20 20 2f 2f 20 46 65 74 63 68 20 61 6c 6c 20 74    // Fetch all t
1420: 68 65 20 61 74 74 61 63 68 65 64 20 64 61 74 61  he attached data
1430: 62 61 73 65 73 20 6f 6e 20 74 68 69 73 20 63 6f  bases on this co
1440: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 75  nnection.      u
1450: 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20  sing (DataTable 
1460: 74 62 6c 20 3d 20 63 6e 6e 2e 47 65 74 53 63 68  tbl = cnn.GetSch
1470: 65 6d 61 28 22 43 61 74 61 6c 6f 67 73 22 29 29  ema("Catalogs"))
1480: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1490: 20 66 6f 72 65 61 63 68 20 28 44 61 74 61 52 6f   foreach (DataRo
14a0: 77 20 72 6f 77 20 69 6e 20 74 62 6c 2e 52 6f 77  w row in tbl.Row
14b0: 73 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  s).        {.   
14c0: 20 20 20 20 20 20 20 63 61 74 61 6c 6f 67 73 2e         catalogs.
14d0: 41 64 64 28 28 73 74 72 69 6e 67 29 72 6f 77 5b  Add((string)row[
14e0: 22 43 41 54 41 4c 4f 47 5f 4e 41 4d 45 22 5d 2c  "CATALOG_NAME"],
14f0: 20 43 6f 6e 76 65 72 74 2e 54 6f 49 6e 74 33 32   Convert.ToInt32
1500: 28 72 6f 77 5b 22 49 44 22 5d 2c 20 43 75 6c 74  (row["ID"], Cult
1510: 75 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e  ureInfo.Invarian
1520: 74 43 75 6c 74 75 72 65 29 29 3b 0a 20 20 20 20  tCulture));.    
1530: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1540: 20 20 20 20 20 2f 2f 20 46 65 74 63 68 20 61 6c       // Fetch al
1550: 6c 20 74 68 65 20 75 6e 69 71 75 65 20 74 61 62  l the unique tab
1560: 6c 65 73 20 61 6e 64 20 63 61 74 61 6c 6f 67 73  les and catalogs
1570: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 75 72   used by the cur
1580: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
1590: 20 20 20 20 20 75 73 69 6e 67 20 28 44 61 74 61       using (Data
15a0: 54 61 62 6c 65 20 73 63 68 65 6d 61 20 3d 20 72  Table schema = r
15b0: 65 61 64 65 72 2e 47 65 74 53 63 68 65 6d 61 54  eader.GetSchemaT
15c0: 61 62 6c 65 28 66 61 6c 73 65 2c 20 66 61 6c 73  able(false, fals
15d0: 65 29 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  e)).      {.    
15e0: 20 20 20 20 66 6f 72 65 61 63 68 20 28 44 61 74      foreach (Dat
15f0: 61 52 6f 77 20 72 6f 77 20 69 6e 20 73 63 68 65  aRow row in sche
1600: 6d 61 2e 52 6f 77 73 29 0a 20 20 20 20 20 20 20  ma.Rows).       
1610: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20   {.          // 
1620: 43 68 65 63 6b 20 69 66 20 63 6f 6c 75 6d 6e 20  Check if column 
1630: 69 73 20 62 61 63 6b 65 64 20 74 6f 20 61 20 74  is backed to a t
1640: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 69  able.          i
1650: 66 20 28 72 6f 77 5b 53 63 68 65 6d 61 54 61 62  f (row[SchemaTab
1660: 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e  leOptionalColumn
1670: 2e 42 61 73 65 43 61 74 61 6c 6f 67 4e 61 6d 65  .BaseCatalogName
1680: 5d 20 3d 3d 20 44 42 4e 75 6c 6c 2e 56 61 6c 75  ] == DBNull.Valu
1690: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e).            c
16a0: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
16b0: 20 20 20 20 2f 2f 20 52 65 63 6f 72 64 20 74 68      // Record th
16c0: 65 20 75 6e 69 71 75 65 20 74 61 62 6c 65 20 73  e unique table s
16d0: 6f 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20 75 70  o we can look up
16e0: 20 69 74 73 20 6b 65 79 73 0a 20 20 20 20 20 20   its keys.      
16f0: 20 20 20 20 73 74 72 69 6e 67 20 63 61 74 61 6c      string catal
1700: 6f 67 20 3d 20 28 73 74 72 69 6e 67 29 72 6f 77  og = (string)row
1710: 5b 53 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69  [SchemaTableOpti
1720: 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 42 61 73 65 43  onalColumn.BaseC
1730: 61 74 61 6c 6f 67 4e 61 6d 65 5d 3b 0a 20 20 20  atalogName];.   
1740: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 74 61         string ta
1750: 62 6c 65 20 3d 20 28 73 74 72 69 6e 67 29 72 6f  ble = (string)ro
1760: 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  w[SchemaTableCol
1770: 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65 4e 61 6d  umn.BaseTableNam
1780: 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  e];..          i
1790: 66 20 28 74 61 62 6c 65 73 2e 43 6f 6e 74 61 69  f (tables.Contai
17a0: 6e 73 4b 65 79 28 63 61 74 61 6c 6f 67 29 20 3d  nsKey(catalog) =
17b0: 3d 20 66 61 6c 73 65 29 0a 20 20 20 20 20 20 20  = false).       
17c0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
17d0: 20 6c 69 73 74 20 3d 20 6e 65 77 20 4c 69 73 74   list = new List
17e0: 3c 73 74 72 69 6e 67 3e 28 29 3b 0a 20 20 20 20  <string>();.    
17f0: 20 20 20 20 20 20 20 20 74 61 62 6c 65 73 2e 41          tables.A
1800: 64 64 28 63 61 74 61 6c 6f 67 2c 20 6c 69 73 74  dd(catalog, list
1810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1820: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20           else.  
1830: 20 20 20 20 20 20 20 20 20 20 6c 69 73 74 20 3d            list =
1840: 20 74 61 62 6c 65 73 5b 63 61 74 61 6c 6f 67 5d   tables[catalog]
1850: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ;..          if 
1860: 28 6c 69 73 74 2e 43 6f 6e 74 61 69 6e 73 28 74  (list.Contains(t
1870: 61 62 6c 65 29 20 3d 3d 20 66 61 6c 73 65 29 0a  able) == false).
1880: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74              list
1890: 2e 41 64 64 28 74 61 62 6c 65 29 3b 0a 20 20 20  .Add(table);.   
18a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18b0: 2f 2f 20 46 6f 72 20 65 61 63 68 20 63 61 74 61  // For each cata
18c0: 6c 6f 67 20 61 6e 64 20 65 61 63 68 20 74 61 62  log and each tab
18d0: 6c 65 2c 20 71 75 65 72 79 20 74 68 65 20 69 6e  le, query the in
18e0: 64 65 78 65 73 20 66 6f 72 20 74 68 65 20 74 61  dexes for the ta
18f0: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20  ble..        // 
1900: 46 69 6e 64 20 61 20 70 72 69 6d 61 72 79 20 6b  Find a primary k
1910: 65 79 20 69 6e 64 65 78 20 69 66 20 74 68 65 72  ey index if ther
1920: 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 6e 6f  e is one.  If no
1930: 74 2c 20 66 69 6e 64 20 61 20 75 6e 69 71 75 65  t, find a unique
1940: 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 0a 20   index instead. 
1950: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
1960: 4b 65 79 56 61 6c 75 65 50 61 69 72 3c 73 74 72  KeyValuePair<str
1970: 69 6e 67 2c 20 4c 69 73 74 3c 73 74 72 69 6e 67  ing, List<string
1980: 3e 3e 20 70 61 69 72 20 69 6e 20 74 61 62 6c 65  >> pair in table
1990: 73 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  s).        {.   
19a0: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
19b0: 69 20 3d 20 30 3b 20 69 20 3c 20 70 61 69 72 2e  i = 0; i < pair.
19c0: 56 61 6c 75 65 2e 43 6f 75 6e 74 3b 20 69 2b 2b  Value.Count; i++
19d0: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20  ).          {.  
19e0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
19f0: 20 74 61 62 6c 65 20 3d 20 70 61 69 72 2e 56 61   table = pair.Va
1a00: 6c 75 65 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  lue[i];.        
1a10: 20 20 20 20 44 61 74 61 52 6f 77 20 70 72 65 66      DataRow pref
1a20: 65 72 72 65 64 52 6f 77 20 3d 20 6e 75 6c 6c 3b  erredRow = null;
1a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69  .            usi
1a40: 6e 67 20 28 44 61 74 61 54 61 62 6c 65 20 74 62  ng (DataTable tb
1a50: 6c 20 3d 20 63 6e 6e 2e 47 65 74 53 63 68 65 6d  l = cnn.GetSchem
1a60: 61 28 22 49 6e 64 65 78 65 73 22 2c 20 6e 65 77  a("Indexes", new
1a70: 20 73 74 72 69 6e 67 5b 5d 20 7b 20 70 61 69 72   string[] { pair
1a80: 2e 4b 65 79 2c 20 6e 75 6c 6c 2c 20 74 61 62 6c  .Key, null, tabl
1a90: 65 20 7d 29 29 0a 20 20 20 20 20 20 20 20 20 20  e })).          
1aa0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
1ab0: 20 20 2f 2f 20 4c 6f 6f 70 20 74 77 69 63 65 2e    // Loop twice.
1ac0: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
1ad0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 70   looking for a p
1ae0: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
1af0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1b00: 20 2f 2f 20 74 68 65 20 73 65 63 6f 6e 64 20 74   // the second t
1b10: 69 6d 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ime looking for 
1b20: 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 0a 20  a unique index. 
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1b40: 20 28 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c   (int n = 0; n <
1b50: 20 32 20 26 26 20 70 72 65 66 65 72 72 65 64 52   2 && preferredR
1b60: 6f 77 20 3d 3d 20 6e 75 6c 6c 3b 20 6e 2b 2b 29  ow == null; n++)
1b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
1b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b90: 20 66 6f 72 65 61 63 68 20 28 44 61 74 61 52 6f   foreach (DataRo
1ba0: 77 20 72 6f 77 20 69 6e 20 74 62 6c 2e 52 6f 77  w row in tbl.Row
1bb0: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
1bc0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
1bd0: 20 20 20 20 20 20 20 69 66 20 28 6e 20 3d 3d 20         if (n == 
1be0: 30 20 26 26 20 28 62 6f 6f 6c 29 72 6f 77 5b 22  0 && (bool)row["
1bf0: 50 52 49 4d 41 52 59 5f 4b 45 59 22 5d 20 3d 3d  PRIMARY_KEY"] ==
1c00: 20 74 72 75 65 29 0a 20 20 20 20 20 20 20 20 20   true).         
1c10: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c30: 72 65 66 65 72 72 65 64 52 6f 77 20 3d 20 72 6f  referredRow = ro
1c40: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w;.             
1c50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1c80: 20 20 20 20 65 6c 73 65 20 69 66 20 28 6e 20 3d      else if (n =
1c90: 3d 20 31 20 26 26 20 28 62 6f 6f 6c 29 72 6f 77  = 1 && (bool)row
1ca0: 5b 22 55 4e 49 51 55 45 22 5d 20 3d 3d 20 74 72  ["UNIQUE"] == tr
1cb0: 75 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue).            
1cc0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
1ce0: 65 72 72 65 64 52 6f 77 20 3d 20 72 6f 77 3b 0a  erredRow = row;.
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d50: 66 20 28 70 72 65 66 65 72 72 65 64 52 6f 77 20  f (preferredRow 
1d60: 3d 3d 20 6e 75 6c 6c 29 20 2f 2f 20 55 6e 61 62  == null) // Unab
1d70: 6c 65 20 74 6f 20 66 69 6e 64 20 61 6e 79 20 73  le to find any s
1d80: 75 69 74 61 62 6c 65 20 69 6e 64 65 78 20 66 6f  uitable index fo
1d90: 72 20 74 68 69 73 20 74 61 62 6c 65 20 73 6f 20  r this table so 
1da0: 72 65 6d 6f 76 65 20 69 74 0a 20 20 20 20 20 20  remove it.      
1db0: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1dc0: 20 20 20 20 20 20 20 20 20 20 70 61 69 72 2e 56            pair.V
1dd0: 61 6c 75 65 2e 52 65 6d 6f 76 65 41 74 28 69 29  alue.RemoveAt(i)
1de0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1df0: 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20    i--;.         
1e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e10: 20 20 20 20 20 65 6c 73 65 20 2f 2f 20 57 65 20       else // We 
1e20: 66 6f 75 6e 64 20 61 20 75 73 61 62 6c 65 20 69  found a usable i
1e30: 6e 64 65 78 2c 20 73 6f 20 66 65 74 63 68 20 74  ndex, so fetch t
1e40: 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 61 62  he necessary tab
1e50: 6c 65 20 64 65 74 61 69 6c 73 0a 20 20 20 20 20  le details.     
1e60: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1e70: 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
1e80: 20 28 44 61 74 61 54 61 62 6c 65 20 74 62 6c 54   (DataTable tblT
1e90: 61 62 6c 65 73 20 3d 20 63 6e 6e 2e 47 65 74 53  ables = cnn.GetS
1ea0: 63 68 65 6d 61 28 22 54 61 62 6c 65 73 22 2c 20  chema("Tables", 
1eb0: 6e 65 77 20 73 74 72 69 6e 67 5b 5d 20 7b 20 70  new string[] { p
1ec0: 61 69 72 2e 4b 65 79 2c 20 6e 75 6c 6c 2c 20 74  air.Key, null, t
1ed0: 61 62 6c 65 20 7d 29 29 0a 20 20 20 20 20 20 20  able })).       
1ee0: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20           {.     
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1f00: 46 69 6e 64 20 74 68 65 20 72 6f 6f 74 20 70 61  Find the root pa
1f10: 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ge of the table 
1f20: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  in the current s
1f30: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 67 65 74  tatement and get
1f40: 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 61 74   the cursor that
1f50: 27 73 20 69 74 65 72 61 74 69 6e 67 20 69 74 0a  's iterating it.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 69 6e 74 20 64 61 74 61 62 61 73 65 20 3d    int database =
1f80: 20 63 61 74 61 6c 6f 67 73 5b 70 61 69 72 2e 4b   catalogs[pair.K
1f90: 65 79 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey];.           
1fa0: 20 20 20 20 20 20 20 69 6e 74 20 72 6f 6f 74 50         int rootP
1fb0: 61 67 65 20 3d 20 43 6f 6e 76 65 72 74 2e 54 6f  age = Convert.To
1fc0: 49 6e 74 33 32 28 74 62 6c 54 61 62 6c 65 73 2e  Int32(tblTables.
1fd0: 52 6f 77 73 5b 30 5d 5b 22 54 41 42 4c 45 5f 52  Rows[0]["TABLE_R
1fe0: 4f 4f 54 50 41 47 45 22 5d 2c 20 43 75 6c 74 75  OOTPAGE"], Cultu
1ff0: 72 65 49 6e 66 6f 2e 49 6e 76 61 72 69 61 6e 74  reInfo.Invariant
2000: 43 75 6c 74 75 72 65 29 3b 0a 20 20 20 20 20 20  Culture);.      
2010: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2020: 63 75 72 73 6f 72 20 3d 20 73 74 6d 74 2e 5f 73  cursor = stmt._s
2030: 71 6c 2e 47 65 74 43 75 72 73 6f 72 46 6f 72 54  ql.GetCursorForT
2040: 61 62 6c 65 28 73 74 6d 74 2c 20 64 61 74 61 62  able(stmt, datab
2050: 61 73 65 2c 20 72 6f 6f 74 50 61 67 65 29 3b 0a  ase, rootPage);.
2060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2070: 20 20 20 2f 2f 20 4e 6f 77 20 65 6e 75 6d 65 72     // Now enumer
2080: 61 74 65 20 74 68 65 20 6d 65 6d 62 65 72 73 20  ate the members 
2090: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 77 65 27  of the index we'
20a0: 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 0a  re going to use.
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 75 73 69 6e 67 20 28 44 61 74 61 54 61 62    using (DataTab
20d0: 6c 65 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 73 20  le indexColumns 
20e0: 3d 20 63 6e 6e 2e 47 65 74 53 63 68 65 6d 61 28  = cnn.GetSchema(
20f0: 22 49 6e 64 65 78 43 6f 6c 75 6d 6e 73 22 2c 20  "IndexColumns", 
2100: 6e 65 77 20 73 74 72 69 6e 67 5b 5d 20 7b 20 70  new string[] { p
2110: 61 69 72 2e 4b 65 79 2c 20 6e 75 6c 6c 2c 20 74  air.Key, null, t
2120: 61 62 6c 65 2c 20 28 73 74 72 69 6e 67 29 70 72  able, (string)pr
2130: 65 66 65 72 72 65 64 52 6f 77 5b 22 49 4e 44 45  eferredRow["INDE
2140: 58 5f 4e 41 4d 45 22 5d 20 7d 29 29 0a 20 20 20  X_NAME"] })).   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2170: 20 20 20 20 20 4b 65 79 51 75 65 72 79 20 71 75       KeyQuery qu
2180: 65 72 79 20 3d 20 6e 75 6c 6c 3b 0a 0a 20 20 20  ery = null;..   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 4c 69 73 74 3c 73 74 72 69 6e 67 3e 20 63 6f   List<string> co
21b0: 6c 73 20 3d 20 6e 65 77 20 4c 69 73 74 3c 73 74  ls = new List<st
21c0: 72 69 6e 67 3e 28 29 3b 0a 20 20 20 20 20 20 20  ring>();.       
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21e0: 20 28 69 6e 74 20 78 20 3d 20 30 3b 20 78 20 3c   (int x = 0; x <
21f0: 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e 52 6f   indexColumns.Ro
2200: 77 73 2e 43 6f 75 6e 74 3b 20 78 2b 2b 29 0a 20  ws.Count; x++). 
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
2230: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
2240: 61 64 64 4b 65 79 20 3d 20 74 72 75 65 3b 0a 20  addKey = true;. 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 2f 2f 20 49 66 20 74 68 65 20 63       // If the c
2270: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64  olumn in the ind
2280: 65 78 20 61 6c 72 65 61 64 79 20 61 70 70 65 61  ex already appea
2290: 72 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c  rs in the query,
22a0: 20 73 6b 69 70 20 69 74 0a 20 20 20 20 20 20 20   skip it.       
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
22c0: 6f 72 65 61 63 68 20 28 44 61 74 61 52 6f 77 20  oreach (DataRow 
22d0: 72 6f 77 20 69 6e 20 73 63 68 65 6d 61 2e 52 6f  row in schema.Ro
22e0: 77 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws).            
22f0: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20            {.    
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 69 66 20 28 72 6f 77 2e 49 73 4e 75      if (row.IsNu
2320: 6c 6c 28 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ll(SchemaTableCo
2330: 6c 75 6d 6e 2e 42 61 73 65 43 6f 6c 75 6d 6e 4e  lumn.BaseColumnN
2340: 61 6d 65 29 29 0a 20 20 20 20 20 20 20 20 20 20  ame)).          
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 69 66 20 28 28 73 74 72 69 6e 67 29 72     if ((string)r
2390: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
23a0: 6c 75 6d 6e 2e 42 61 73 65 43 6f 6c 75 6d 6e 4e  lumn.BaseColumnN
23b0: 61 6d 65 5d 20 3d 3d 20 28 73 74 72 69 6e 67 29  ame] == (string)
23c0: 69 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e 52 6f 77  indexColumns.Row
23d0: 73 5b 78 5d 5b 22 43 4f 4c 55 4d 4e 5f 4e 41 4d  s[x]["COLUMN_NAM
23e0: 45 22 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20  E"] &&.         
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 28 73 74 72 69 6e 67 29 72 6f 77 5b 53     (string)row[S
2410: 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e  chemaTableColumn
2420: 2e 42 61 73 65 54 61 62 6c 65 4e 61 6d 65 5d 20  .BaseTableName] 
2430: 3d 3d 20 74 61 62 6c 65 20 26 26 0a 20 20 20 20  == table &&.    
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 29          (string)
2460: 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 4f  row[SchemaTableO
2470: 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 42 61  ptionalColumn.Ba
2480: 73 65 43 61 74 61 6c 6f 67 4e 61 6d 65 5d 20 3d  seCatalogName] =
2490: 3d 20 70 61 69 72 2e 4b 65 79 29 0a 20 20 20 20  = pair.Key).    
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 69 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e 52 6f 77  indexColumns.Row
24e0: 73 2e 52 65 6d 6f 76 65 41 74 28 78 29 3b 0a 20  s.RemoveAt(x);. 
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 20 20 20 78 2d 2d 3b 0a 20 20           x--;.  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 20 20 20 61 64 64 4b 65 79 20 3d          addKey =
2530: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2580: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 69 66 20 28 61 64 64 4b 65 79 20 3d 3d 20 74   if (addKey == t
25b0: 72 75 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  rue).           
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
25d0: 73 2e 41 64 64 28 28 73 74 72 69 6e 67 29 69 6e  s.Add((string)in
25e0: 64 65 78 43 6f 6c 75 6d 6e 73 2e 52 6f 77 73 5b  dexColumns.Rows[
25f0: 78 5d 5b 22 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 22  x]["COLUMN_NAME"
2600: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2610: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2630: 2f 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  / If the index i
2640: 73 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 61 6c  s not a rowid al
2650: 69 61 73 2c 20 72 65 63 6f 72 64 20 61 6c 6c 20  ias, record all 
2660: 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20  the columns.    
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 2f 2f 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b  // needed to mak
2690: 65 20 75 70 20 74 68 65 20 75 6e 69 71 75 65 20  e up the unique 
26a0: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6e 73 74 72  index and constr
26b0: 75 63 74 20 61 20 53 51 4c 20 71 75 65 72 79 20  uct a SQL query 
26c0: 66 6f 72 20 69 74 0a 20 20 20 20 20 20 20 20 20  for it.         
26d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
26e0: 73 74 72 69 6e 67 29 70 72 65 66 65 72 72 65 64  string)preferred
26f0: 52 6f 77 5b 22 49 4e 44 45 58 5f 4e 41 4d 45 22  Row["INDEX_NAME"
2700: 5d 20 21 3d 20 22 73 71 6c 69 74 65 5f 6d 61 73  ] != "sqlite_mas
2710: 74 65 72 5f 50 4b 5f 22 20 2b 20 74 61 62 6c 65  ter_PK_" + table
2720: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2730: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2750: 20 57 68 61 74 65 76 65 72 20 72 65 6d 61 69 6e   Whatever remain
2760: 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
2770: 20 77 65 20 6e 65 65 64 20 74 68 61 74 20 6d 61   we need that ma
2780: 6b 65 20 75 70 20 74 68 65 20 69 6e 64 65 78 20  ke up the index 
2790: 74 68 61 74 20 61 72 65 20 6e 6f 74 0a 20 20 20  that are not.   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 2f 2f 20 61 6c 72 65 61 64 79 20 69 6e     // already in
27c0: 20 74 68 65 20 71 75 65 72 79 20 6e 65 65 64 20   the query need 
27d0: 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 73 65  to be queried se
27e0: 70 61 72 61 74 65 6c 79 2c 20 73 6f 20 63 6f 6e  parately, so con
27f0: 73 74 72 75 63 74 20 61 20 73 75 62 71 75 65 72  struct a subquer
2800: 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
2810: 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6c 73          if (cols
2820: 2e 43 6f 75 6e 74 20 3e 20 30 29 0a 20 20 20 20  .Count > 0).    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
2850: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
2860: 6e 67 5b 5d 20 71 75 65 72 79 63 6f 6c 73 20 3d  ng[] querycols =
2870: 20 6e 65 77 20 73 74 72 69 6e 67 5b 63 6f 6c 73   new string[cols
2880: 2e 43 6f 75 6e 74 5d 3b 0a 20 20 20 20 20 20 20  .Count];.       
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 63 6f 6c 73 2e 43 6f 70 79 54 6f 28 71 75 65   cols.CopyTo(que
28b0: 72 79 63 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20  rycols);.       
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 71 75 65 72 79 20 3d 20 6e 65 77 20 4b 65 79   query = new Key
28e0: 51 75 65 72 79 28 63 6e 6e 2c 20 70 61 69 72 2e  Query(cnn, pair.
28f0: 4b 65 79 2c 20 74 61 62 6c 65 2c 20 71 75 65 72  Key, table, quer
2900: 79 63 6f 6c 73 29 3b 0a 20 20 20 20 20 20 20 20  ycols);.        
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
2940: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 72             // Cr
2950: 65 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  eate a KeyInfo s
2960: 74 72 75 63 74 20 66 6f 72 20 65 61 63 68 20 63  truct for each c
2970: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
2980: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
2990: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
29a0: 78 20 3d 20 30 3b 20 78 20 3c 20 69 6e 64 65 78  x = 0; x < index
29b0: 43 6f 6c 75 6d 6e 73 2e 52 6f 77 73 2e 43 6f 75  Columns.Rows.Cou
29c0: 6e 74 3b 20 78 2b 2b 29 0a 20 20 20 20 20 20 20  nt; x++).       
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20               {. 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 73 74 72 69 6e 67 20 63 6f 6c 75       string colu
2a00: 6d 6e 4e 61 6d 65 20 3d 20 28 73 74 72 69 6e 67  mnName = (string
2a10: 29 69 6e 64 65 78 43 6f 6c 75 6d 6e 73 2e 52 6f  )indexColumns.Ro
2a20: 77 73 5b 78 5d 5b 22 43 4f 4c 55 4d 4e 5f 4e 41  ws[x]["COLUMN_NA
2a30: 4d 45 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  ME"];.          
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 4b 65 79 49              KeyI
2a50: 6e 66 6f 20 6b 65 79 20 3d 20 6e 65 77 20 4b 65  nfo key = new Ke
2a60: 79 49 6e 66 6f 28 29 3b 0a 0a 20 20 20 20 20 20  yInfo();..      
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 6b 65 79 2e 72 6f 6f 74 50 61 67 65 20 3d 20 72  key.rootPage = r
2a90: 6f 6f 74 50 61 67 65 3b 0a 20 20 20 20 20 20 20  ootPage;.       
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
2ab0: 65 79 2e 63 75 72 73 6f 72 20 3d 20 63 75 72 73  ey.cursor = curs
2ac0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
2ad0: 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 64 61            key.da
2ae0: 74 61 62 61 73 65 20 3d 20 64 61 74 61 62 61 73  tabase = databas
2af0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2b00: 20 20 20 20 20 20 20 20 20 6b 65 79 2e 64 61 74           key.dat
2b10: 61 62 61 73 65 4e 61 6d 65 20 3d 20 70 61 69 72  abaseName = pair
2b20: 2e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  .Key;.          
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e              key.
2b40: 74 61 62 6c 65 4e 61 6d 65 20 3d 20 74 61 62 6c  tableName = tabl
2b50: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2b60: 20 20 20 20 20 20 20 20 20 6b 65 79 2e 63 6f 6c           key.col
2b70: 75 6d 6e 4e 61 6d 65 20 3d 20 63 6f 6c 75 6d 6e  umnName = column
2b80: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e              key.
2ba0: 71 75 65 72 79 20 3d 20 71 75 65 72 79 3b 0a 20  query = query;. 
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 20 6b 65 79 2e 63 6f 6c 75 6d 6e 20       key.column 
2bd0: 3d 20 78 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = x;..          
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 73              keys
2bf0: 2e 41 64 64 28 6b 65 79 29 3b 0a 20 20 20 20 20  .Add(key);.     
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2c60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c70: 20 7d 0a 0a 20 20 20 20 20 20 2f 2f 20 4e 6f 77   }..      // Now
2c80: 20 77 65 20 68 61 76 65 20 61 6c 6c 20 74 68 65   we have all the
2c90: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
2ca0: 6d 6e 73 20 77 65 20 68 61 76 65 20 74 6f 20 72  mns we have to r
2cb0: 65 74 75 72 6e 20 69 6e 20 6f 72 64 65 72 20 74  eturn in order t
2cc0: 6f 20 73 75 70 70 6f 72 74 0a 20 20 20 20 20 20  o support.      
2cd0: 2f 2f 20 43 6f 6d 6d 61 6e 64 42 65 68 61 76 69  // CommandBehavi
2ce0: 6f 72 2e 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  or.KeyInfo.     
2cf0: 20 5f 6b 65 79 49 6e 66 6f 20 3d 20 6e 65 77 20   _keyInfo = new 
2d00: 4b 65 79 49 6e 66 6f 5b 6b 65 79 73 2e 43 6f 75  KeyInfo[keys.Cou
2d10: 6e 74 5d 3b 0a 20 20 20 20 20 20 6b 65 79 73 2e  nt];.      keys.
2d20: 43 6f 70 79 54 6f 28 5f 6b 65 79 49 6e 66 6f 29  CopyTo(_keyInfo)
2d30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  ;.    }..    ///
2d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2da0: 20 20 20 20 23 72 65 67 69 6f 6e 20 49 44 69 73      #region IDis
2db0: 70 6f 73 61 62 6c 65 20 4d 65 6d 62 65 72 73 0d  posable Members.
2dc0: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
2dd0: 20 44 69 73 70 6f 73 65 28 29 0d 0a 20 20 20 20   Dispose()..    
2de0: 7b 0d 0a 20 20 20 20 20 20 20 20 44 69 73 70 6f  {..        Dispo
2df0: 73 65 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 20  se(true);..     
2e00: 20 20 20 47 43 2e 53 75 70 70 72 65 73 73 46 69     GC.SuppressFi
2e10: 6e 61 6c 69 7a 65 28 74 68 69 73 29 3b 0d 0a 20  nalize(this);.. 
2e20: 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65     }..    #endre
2e30: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f  gion....    ////
2e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
2ea0: 20 20 20 23 72 65 67 69 6f 6e 20 49 44 69 73 70     #region IDisp
2eb0: 6f 73 61 62 6c 65 20 22 50 61 74 74 65 72 6e 22  osable "Pattern"
2ec0: 20 4d 65 6d 62 65 72 73 0d 0a 20 20 20 20 70 72   Members..    pr
2ed0: 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f  ivate bool dispo
2ee0: 73 65 64 3b 0d 0a 20 20 20 20 70 72 69 76 61 74  sed;..    privat
2ef0: 65 20 76 6f 69 64 20 43 68 65 63 6b 44 69 73 70  e void CheckDisp
2f00: 6f 73 65 64 28 29 20 2f 2a 20 74 68 72 6f 77 20  osed() /* throw 
2f10: 2a 2f 0d 0a 20 20 20 20 7b 0d 0a 23 69 66 20 54  */..    {..#if T
2f20: 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44  HROW_ON_DISPOSED
2f30: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 64 69  ..        if (di
2f40: 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20  sposed)..       
2f50: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4f       throw new O
2f60: 62 6a 65 63 74 44 69 73 70 6f 73 65 64 45 78 63  bjectDisposedExc
2f70: 65 70 74 69 6f 6e 28 74 79 70 65 6f 66 28 53 51  eption(typeof(SQ
2f80: 4c 69 74 65 4b 65 79 52 65 61 64 65 72 29 2e 4e  LiteKeyReader).N
2f90: 61 6d 65 29 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20  ame);..#endif.. 
2fa0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f     }....    ////
2fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
3010: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
3020: 44 69 73 70 6f 73 65 28 62 6f 6f 6c 20 64 69 73  Dispose(bool dis
3030: 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 7b 0d 0a  posing)..    {..
3040: 20 20 20 20 20 20 20 20 69 66 20 28 21 64 69 73          if (!dis
3050: 70 6f 73 65 64 29 0d 0a 20 20 20 20 20 20 20 20  posed)..        
3060: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
3070: 66 20 28 64 69 73 70 6f 73 69 6e 67 29 0d 0a 20  f (disposing).. 
3080: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
30a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
30b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
30c0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
30d0: 20 20 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d      // dispose m
30e0: 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65 73  anaged resources
30f0: 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20   here.....      
3100: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
3110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
3130: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3140: 20 20 5f 73 74 6d 74 20 3d 20 6e 75 6c 6c 3b 0d    _stmt = null;.
3150: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3160: 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 20     if (_keyInfo 
3170: 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
3180: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20 30 3b   for (int n = 0;
31b0: 20 6e 20 3c 20 5f 6b 65 79 49 6e 66 6f 2e 4c 65   n < _keyInfo.Le
31c0: 6e 67 74 68 3b 20 6e 2b 2b 29 0d 0a 20 20 20 20  ngth; n++)..    
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
31f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f             if (_
3200: 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75 65 72 79  keyInfo[n].query
3210: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 20 5f 6b 65 79 49 6e 66 6f 5b         _keyInfo[
3240: 6e 5d 2e 71 75 65 72 79 2e 44 69 73 70 6f 73 65  n].query.Dispose
3250: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
3260: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 5f 6b 65 79 49 6e 66 6f 20 3d 20 6e 75 6c    _keyInfo = nul
3290: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
32a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
32c0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
32d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20  /////////..     
32f0: 20 20 20 20 20 20 20 2f 2f 20 72 65 6c 65 61 73         // releas
3300: 65 20 75 6e 6d 61 6e 61 67 65 64 20 72 65 73 6f  e unmanaged reso
3310: 75 72 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20  urces here..... 
3320: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
3330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3350: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
3360: 20 64 69 73 70 6f 73 65 64 20 3d 20 74 72 75 65   disposed = true
3370: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
3380: 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 67    }..    #endreg
3390: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f  ion....    /////
33a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
3400: 20 20 23 72 65 67 69 6f 6e 20 44 65 73 74 72 75    #region Destru
3410: 63 74 6f 72 0d 0a 20 20 20 20 7e 53 51 4c 69 74  ctor..    ~SQLit
3420: 65 4b 65 79 52 65 61 64 65 72 28 29 0d 0a 20 20  eKeyReader()..  
3430: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 44 69 73    {..        Dis
3440: 70 6f 73 65 28 66 61 6c 73 65 29 3b 0d 0a 20 20  pose(false);..  
3450: 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64 72 65 67    }..    #endreg
3460: 69 6f 6e 0d 0a 0a 20 20 20 20 2f 2f 2f 2f 2f 2f  ion...    //////
3470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
34a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
34b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
34c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 20 20 20 20 2f  /////////..    /
34d0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a 20 20 20  // <summary>.   
34e0: 20 2f 2f 2f 20 48 6f 77 20 6d 61 6e 79 20 61 64   /// How many ad
34f0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
3500: 20 6f 66 20 6b 65 79 69 6e 66 6f 20 77 65 27 72   of keyinfo we'r
3510: 65 20 68 6f 6c 64 69 6e 67 0a 20 20 20 20 2f 2f  e holding.    //
3520: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20 20  / </summary>.   
3530: 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 20 43 6f   internal int Co
3540: 75 6e 74 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  unt.    {.      
3550: 67 65 74 20 7b 20 72 65 74 75 72 6e 20 28 5f 6b  get { return (_k
3560: 65 79 49 6e 66 6f 20 3d 3d 20 6e 75 6c 6c 29 20  eyInfo == null) 
3570: 3f 20 30 20 3a 20 5f 6b 65 79 49 6e 66 6f 2e 4c  ? 0 : _keyInfo.L
3580: 65 6e 67 74 68 3b 20 7d 0a 20 20 20 20 7d 0a 0a  ength; }.    }..
3590: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69      internal voi
35a0: 64 20 53 79 6e 63 28 69 6e 74 20 69 29 0a 20 20  d Sync(int i).  
35b0: 20 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 29    {.      Sync()
35c0: 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79  ;.      if (_key
35d0: 49 6e 66 6f 5b 69 5d 2e 63 75 72 73 6f 72 20 3d  Info[i].cursor =
35e0: 3d 20 2d 31 29 0a 20 20 20 20 20 20 20 20 74 68  = -1).        th
35f0: 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 43  row new InvalidC
3600: 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a  astException();.
3610: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 3c      }..    /// <
3620: 73 75 6d 6d 61 72 79 3e 0a 20 20 20 20 2f 2f 2f  summary>.    ///
3630: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   Make sure all t
3640: 68 65 20 73 75 62 71 75 65 72 69 65 73 20 61 72  he subqueries ar
3650: 65 20 6f 70 65 6e 20 61 6e 64 20 72 65 61 64 79  e open and ready
3660: 20 61 6e 64 20 73 79 6e 63 27 64 20 77 69 74 68   and sync'd with
3670: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
3680: 69 64 0a 20 20 20 20 2f 2f 2f 20 6f 66 20 74 68  id.    /// of th
3690: 65 20 74 61 62 6c 65 20 74 68 65 79 27 72 65 20  e table they're 
36a0: 73 75 70 70 6f 72 74 69 6e 67 0a 20 20 20 20 2f  supporting.    /
36b0: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0a 20 20  // </summary>.  
36c0: 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f 69 64 20    internal void 
36d0: 53 79 6e 63 28 29 0a 20 20 20 20 7b 0a 20 20 20  Sync().    {.   
36e0: 20 20 20 69 66 20 28 5f 69 73 56 61 6c 69 64 20     if (_isValid 
36f0: 3d 3d 20 74 72 75 65 29 20 72 65 74 75 72 6e 3b  == true) return;
3700: 0a 0a 20 20 20 20 20 20 4b 65 79 51 75 65 72 79  ..      KeyQuery
3710: 20 6c 61 73 74 20 3d 20 6e 75 6c 6c 3b 0a 0a 20   last = null;.. 
3720: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20       for (int n 
3730: 3d 20 30 3b 20 6e 20 3c 20 5f 6b 65 79 49 6e 66  = 0; n < _keyInf
3740: 6f 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20  o.Length; n++). 
3750: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
3760: 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 71  f (_keyInfo[n].q
3770: 75 65 72 79 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20  uery == null || 
3780: 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75 65 72  _keyInfo[n].quer
3790: 79 20 21 3d 20 6c 61 73 74 29 0a 20 20 20 20 20  y != last).     
37a0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6c     {.          l
37b0: 61 73 74 20 3d 20 5f 6b 65 79 49 6e 66 6f 5b 6e  ast = _keyInfo[n
37c0: 5d 2e 71 75 65 72 79 3b 0a 0a 20 20 20 20 20 20  ].query;..      
37d0: 20 20 20 20 69 66 20 28 6c 61 73 74 20 21 3d 20      if (last != 
37e0: 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20 20  null).          
37f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  {.            la
3800: 73 74 2e 53 79 6e 63 28 5f 73 74 6d 74 2e 5f 73  st.Sync(_stmt._s
3810: 71 6c 2e 47 65 74 52 6f 77 49 64 46 6f 72 43 75  ql.GetRowIdForCu
3820: 72 73 6f 72 28 5f 73 74 6d 74 2c 20 5f 6b 65 79  rsor(_stmt, _key
3830: 49 6e 66 6f 5b 6e 5d 2e 63 75 72 73 6f 72 29 29  Info[n].cursor))
3840: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3860: 20 20 20 20 20 20 5f 69 73 56 61 6c 69 64 20 3d        _isValid =
3870: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20   true;.    }..  
3880: 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0a    /// <summary>.
3890: 20 20 20 20 2f 2f 2f 20 52 65 6c 65 61 73 65 20      /// Release 
38a0: 61 6e 79 20 72 65 61 64 65 72 73 20 6f 6e 20 61  any readers on a
38b0: 6e 79 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  ny subqueries.  
38c0: 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e    /// </summary>
38d0: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 76 6f  .    internal vo
38e0: 69 64 20 52 65 73 65 74 28 29 0a 20 20 20 20 7b  id Reset().    {
38f0: 0a 20 20 20 20 20 20 5f 69 73 56 61 6c 69 64 20  .      _isValid 
3900: 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 69  = false;.      i
3910: 66 20 28 5f 6b 65 79 49 6e 66 6f 20 3d 3d 20 6e  f (_keyInfo == n
3920: 75 6c 6c 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ull) return;..  
3930: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d      for (int n =
3940: 20 30 3b 20 6e 20 3c 20 5f 6b 65 79 49 6e 66 6f   0; n < _keyInfo
3950: 2e 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20 20  .Length; n++).  
3960: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66      {.        if
3970: 20 28 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75   (_keyInfo[n].qu
3980: 65 72 79 20 21 3d 20 6e 75 6c 6c 29 0a 20 20 20  ery != null).   
3990: 20 20 20 20 20 20 20 5f 6b 65 79 49 6e 66 6f 5b         _keyInfo[
39a0: 6e 5d 2e 71 75 65 72 79 2e 49 73 56 61 6c 69 64  n].query.IsValid
39b0: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
39c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  }.    }..    int
39d0: 65 72 6e 61 6c 20 73 74 72 69 6e 67 20 47 65 74  ernal string Get
39e0: 44 61 74 61 54 79 70 65 4e 61 6d 65 28 69 6e 74  DataTypeName(int
39f0: 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   i).    {.      
3a00: 53 79 6e 63 28 29 3b 0a 20 20 20 20 20 20 69 66  Sync();.      if
3a10: 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75   (_keyInfo[i].qu
3a20: 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74  ery != null) ret
3a30: 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  urn _keyInfo[i].
3a40: 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47 65  query._reader.Ge
3a50: 74 44 61 74 61 54 79 70 65 4e 61 6d 65 28 5f 6b  tDataTypeName(_k
3a60: 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e  eyInfo[i].column
3a70: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 72 65  );.      else re
3a80: 74 75 72 6e 20 22 69 6e 74 65 67 65 72 22 3b 0a  turn "integer";.
3a90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72      }..    inter
3aa0: 6e 61 6c 20 54 79 70 65 20 47 65 74 46 69 65 6c  nal Type GetFiel
3ab0: 64 54 79 70 65 28 69 6e 74 20 69 29 0a 20 20 20  dType(int i).   
3ac0: 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 29 3b   {.      Sync();
3ad0: 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49  .      if (_keyI
3ae0: 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20  nfo[i].query != 
3af0: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65  null) return _ke
3b00: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f  yInfo[i].query._
3b10: 72 65 61 64 65 72 2e 47 65 74 46 69 65 6c 64 54  reader.GetFieldT
3b20: 79 70 65 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  ype(_keyInfo[i].
3b30: 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65  column);.      e
3b40: 6c 73 65 20 72 65 74 75 72 6e 20 74 79 70 65 6f  lse return typeo
3b50: 66 28 49 6e 74 36 34 29 3b 0a 20 20 20 20 7d 0a  f(Int64);.    }.
3b60: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
3b70: 72 69 6e 67 20 47 65 74 4e 61 6d 65 28 69 6e 74  ring GetName(int
3b80: 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   i).    {.      
3b90: 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b  return _keyInfo[
3ba0: 69 5d 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 3b 0a 20  i].columnName;. 
3bb0: 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e     }..    intern
3bc0: 61 6c 20 69 6e 74 20 47 65 74 4f 72 64 69 6e 61  al int GetOrdina
3bd0: 6c 28 73 74 72 69 6e 67 20 6e 61 6d 65 29 0a 20  l(string name). 
3be0: 20 20 20 7b 0a 20 20 20 20 20 20 66 6f 72 20 28     {.      for (
3bf0: 69 6e 74 20 6e 20 3d 20 30 3b 20 6e 20 3c 20 5f  int n = 0; n < _
3c00: 6b 65 79 49 6e 66 6f 2e 4c 65 6e 67 74 68 3b 20  keyInfo.Length; 
3c10: 6e 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  n++).      {.   
3c20: 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
3c30: 43 6f 6d 70 61 72 65 28 6e 61 6d 65 2c 20 5f 6b  Compare(name, _k
3c40: 65 79 49 6e 66 6f 5b 6e 5d 2e 63 6f 6c 75 6d 6e  eyInfo[n].column
3c50: 4e 61 6d 65 2c 20 53 74 72 69 6e 67 43 6f 6d 70  Name, StringComp
3c60: 61 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67  arison.OrdinalIg
3c70: 6e 6f 72 65 43 61 73 65 29 20 3d 3d 20 30 29 20  noreCase) == 0) 
3c80: 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 20 20  return n;.      
3c90: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  }.      return -
3ca0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  1;.    }..    in
3cb0: 74 65 72 6e 61 6c 20 62 6f 6f 6c 20 47 65 74 42  ternal bool GetB
3cc0: 6f 6f 6c 65 61 6e 28 69 6e 74 20 69 29 0a 20 20  oolean(int i).  
3cd0: 20 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69    {.      Sync(i
3ce0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65  );.      if (_ke
3cf0: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21  yInfo[i].query !
3d00: 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f  = null) return _
3d10: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79  keyInfo[i].query
3d20: 2e 5f 72 65 61 64 65 72 2e 47 65 74 42 6f 6f 6c  ._reader.GetBool
3d30: 65 61 6e 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  ean(_keyInfo[i].
3d40: 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65  column);.      e
3d50: 6c 73 65 20 74 68 72 6f 77 20 6e 65 77 20 49 6e  lse throw new In
3d60: 76 61 6c 69 64 43 61 73 74 45 78 63 65 70 74 69  validCastExcepti
3d70: 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  on();.    }..   
3d80: 20 69 6e 74 65 72 6e 61 6c 20 62 79 74 65 20 47   internal byte G
3d90: 65 74 42 79 74 65 28 69 6e 74 20 69 29 0a 20 20  etByte(int i).  
3da0: 20 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69    {.      Sync(i
3db0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65  );.      if (_ke
3dc0: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21  yInfo[i].query !
3dd0: 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f  = null) return _
3de0: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79  keyInfo[i].query
3df0: 2e 5f 72 65 61 64 65 72 2e 47 65 74 42 79 74 65  ._reader.GetByte
3e00: 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c  (_keyInfo[i].col
3e10: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  umn);.      else
3e20: 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c   throw new Inval
3e30: 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28  idCastException(
3e40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e  );.    }..    in
3e50: 74 65 72 6e 61 6c 20 6c 6f 6e 67 20 47 65 74 42  ternal long GetB
3e60: 79 74 65 73 28 69 6e 74 20 69 2c 20 6c 6f 6e 67  ytes(int i, long
3e70: 20 66 69 65 6c 64 4f 66 66 73 65 74 2c 20 62 79   fieldOffset, by
3e80: 74 65 5b 5d 20 62 75 66 66 65 72 2c 20 69 6e 74  te[] buffer, int
3e90: 20 62 75 66 66 65 72 6f 66 66 73 65 74 2c 20 69   bufferoffset, i
3ea0: 6e 74 20 6c 65 6e 67 74 68 29 0a 20 20 20 20 7b  nt length).    {
3eb0: 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29 3b 0a  .      Sync(i);.
3ec0: 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e        if (_keyIn
3ed0: 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e  fo[i].query != n
3ee0: 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65 79  ull) return _key
3ef0: 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72  Info[i].query._r
3f00: 65 61 64 65 72 2e 47 65 74 42 79 74 65 73 28 5f  eader.GetBytes(_
3f10: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d  keyInfo[i].colum
3f20: 6e 2c 20 66 69 65 6c 64 4f 66 66 73 65 74 2c 20  n, fieldOffset, 
3f30: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 6f 66  buffer, bufferof
3f40: 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  fset, length);. 
3f50: 20 20 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20       else throw 
3f60: 6e 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45  new InvalidCastE
3f70: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20  xception();.    
3f80: 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  }..    internal 
3f90: 63 68 61 72 20 47 65 74 43 68 61 72 28 69 6e 74  char GetChar(int
3fa0: 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   i).    {.      
3fb0: 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20 69  Sync(i);.      i
3fc0: 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71  f (_keyInfo[i].q
3fd0: 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65  uery != null) re
3fe0: 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d  turn _keyInfo[i]
3ff0: 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47  .query._reader.G
4000: 65 74 43 68 61 72 28 5f 6b 65 79 49 6e 66 6f 5b  etChar(_keyInfo[
4010: 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  i].column);.    
4020: 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e 65 77    else throw new
4030: 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65   InvalidCastExce
4040: 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a  ption();.    }..
4050: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 6e      internal lon
4060: 67 20 47 65 74 43 68 61 72 73 28 69 6e 74 20 69  g GetChars(int i
4070: 2c 20 6c 6f 6e 67 20 66 69 65 6c 64 4f 66 66 73  , long fieldOffs
4080: 65 74 2c 20 63 68 61 72 5b 5d 20 62 75 66 66 65  et, char[] buffe
4090: 72 2c 20 69 6e 74 20 62 75 66 66 65 72 6f 66 66  r, int bufferoff
40a0: 73 65 74 2c 20 69 6e 74 20 6c 65 6e 67 74 68 29  set, int length)
40b0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53 79 6e  .    {.      Syn
40c0: 63 28 69 29 3b 0a 20 20 20 20 20 20 69 66 20 28  c(i);.      if (
40d0: 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72  _keyInfo[i].quer
40e0: 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72  y != null) retur
40f0: 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75  n _keyInfo[i].qu
4100: 65 72 79 2e 5f 72 65 61 64 65 72 2e 47 65 74 43  ery._reader.GetC
4110: 68 61 72 73 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d  hars(_keyInfo[i]
4120: 2e 63 6f 6c 75 6d 6e 2c 20 66 69 65 6c 64 4f 66  .column, fieldOf
4130: 66 73 65 74 2c 20 62 75 66 66 65 72 2c 20 62 75  fset, buffer, bu
4140: 66 66 65 72 6f 66 66 73 65 74 2c 20 6c 65 6e 67  fferoffset, leng
4150: 74 68 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  th);.      else 
4160: 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69  throw new Invali
4170: 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29  dCastException()
4180: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74  ;.    }..    int
4190: 65 72 6e 61 6c 20 44 61 74 65 54 69 6d 65 20 47  ernal DateTime G
41a0: 65 74 44 61 74 65 54 69 6d 65 28 69 6e 74 20 69  etDateTime(int i
41b0: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53 79  ).    {.      Sy
41c0: 6e 63 28 69 29 3b 0a 20 20 20 20 20 20 69 66 20  nc(i);.      if 
41d0: 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65  (_keyInfo[i].que
41e0: 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74 75  ry != null) retu
41f0: 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71  rn _keyInfo[i].q
4200: 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47 65 74  uery._reader.Get
4210: 44 61 74 65 54 69 6d 65 28 5f 6b 65 79 49 6e 66  DateTime(_keyInf
4220: 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20  o[i].column);.  
4230: 20 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e      else throw n
4240: 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78  ew InvalidCastEx
4250: 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d  ception();.    }
4260: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 64  ..    internal d
4270: 65 63 69 6d 61 6c 20 47 65 74 44 65 63 69 6d 61  ecimal GetDecima
4280: 6c 28 69 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20  l(int i).    {. 
4290: 20 20 20 20 20 53 79 6e 63 28 69 29 3b 0a 20 20       Sync(i);.  
42a0: 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f      if (_keyInfo
42b0: 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c  [i].query != nul
42c0: 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e  l) return _keyIn
42d0: 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61  fo[i].query._rea
42e0: 64 65 72 2e 47 65 74 44 65 63 69 6d 61 6c 28 5f  der.GetDecimal(_
42f0: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d  keyInfo[i].colum
4300: 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 74  n);.      else t
4310: 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64  hrow new Invalid
4320: 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  CastException();
4330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
4340: 72 6e 61 6c 20 64 6f 75 62 6c 65 20 47 65 74 44  rnal double GetD
4350: 6f 75 62 6c 65 28 69 6e 74 20 69 29 0a 20 20 20  ouble(int i).   
4360: 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29   {.      Sync(i)
4370: 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79  ;.      if (_key
4380: 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d  Info[i].query !=
4390: 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b   null) return _k
43a0: 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e  eyInfo[i].query.
43b0: 5f 72 65 61 64 65 72 2e 47 65 74 44 6f 75 62 6c  _reader.GetDoubl
43c0: 65 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f  e(_keyInfo[i].co
43d0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73  lumn);.      els
43e0: 65 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61  e throw new Inva
43f0: 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e  lidCastException
4400: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ();.    }..    i
4410: 6e 74 65 72 6e 61 6c 20 66 6c 6f 61 74 20 47 65  nternal float Ge
4420: 74 46 6c 6f 61 74 28 69 6e 74 20 69 29 0a 20 20  tFloat(int i).  
4430: 20 20 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69    {.      Sync(i
4440: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65  );.      if (_ke
4450: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21  yInfo[i].query !
4460: 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f  = null) return _
4470: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79  keyInfo[i].query
4480: 2e 5f 72 65 61 64 65 72 2e 47 65 74 46 6c 6f 61  ._reader.GetFloa
4490: 74 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f  t(_keyInfo[i].co
44a0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73  lumn);.      els
44b0: 65 20 74 68 72 6f 77 20 6e 65 77 20 49 6e 76 61  e throw new Inva
44c0: 6c 69 64 43 61 73 74 45 78 63 65 70 74 69 6f 6e  lidCastException
44d0: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ();.    }..    i
44e0: 6e 74 65 72 6e 61 6c 20 47 75 69 64 20 47 65 74  nternal Guid Get
44f0: 47 75 69 64 28 69 6e 74 20 69 29 0a 20 20 20 20  Guid(int i).    
4500: 7b 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29 3b  {.      Sync(i);
4510: 0a 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49  .      if (_keyI
4520: 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20  nfo[i].query != 
4530: 6e 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65  null) return _ke
4540: 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f  yInfo[i].query._
4550: 72 65 61 64 65 72 2e 47 65 74 47 75 69 64 28 5f  reader.GetGuid(_
4560: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d  keyInfo[i].colum
4570: 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 74  n);.      else t
4580: 68 72 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64  hrow new Invalid
4590: 43 61 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b  CastException();
45a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65  .    }..    inte
45b0: 72 6e 61 6c 20 49 6e 74 31 36 20 47 65 74 49 6e  rnal Int16 GetIn
45c0: 74 31 36 28 69 6e 74 20 69 29 0a 20 20 20 20 7b  t16(int i).    {
45d0: 0a 20 20 20 20 20 20 53 79 6e 63 28 69 29 3b 0a  .      Sync(i);.
45e0: 20 20 20 20 20 20 69 66 20 28 5f 6b 65 79 49 6e        if (_keyIn
45f0: 66 6f 5b 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e  fo[i].query != n
4600: 75 6c 6c 29 20 72 65 74 75 72 6e 20 5f 6b 65 79  ull) return _key
4610: 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72  Info[i].query._r
4620: 65 61 64 65 72 2e 47 65 74 49 6e 74 31 36 28 5f  eader.GetInt16(_
4630: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d  keyInfo[i].colum
4640: 6e 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 0a 20  n);.      else. 
4650: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c       {.        l
4660: 6f 6e 67 20 72 6f 77 69 64 20 3d 20 5f 73 74 6d  ong rowid = _stm
4670: 74 2e 5f 73 71 6c 2e 47 65 74 52 6f 77 49 64 46  t._sql.GetRowIdF
4680: 6f 72 43 75 72 73 6f 72 28 5f 73 74 6d 74 2c 20  orCursor(_stmt, 
4690: 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 75 72 73  _keyInfo[i].curs
46a0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  or);.        if 
46b0: 28 72 6f 77 69 64 20 3d 3d 20 30 29 20 74 68 72  (rowid == 0) thr
46c0: 6f 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 43 61  ow new InvalidCa
46d0: 73 74 45 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20  stException();. 
46e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 43 6f         return Co
46f0: 6e 76 65 72 74 2e 54 6f 49 6e 74 31 36 28 72 6f  nvert.ToInt16(ro
4700: 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wid);.      }.  
4710: 20 20 7d 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61    }..    interna
4720: 6c 20 49 6e 74 33 32 20 47 65 74 49 6e 74 33 32  l Int32 GetInt32
4730: 28 69 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20  (int i).    {.  
4740: 20 20 20 20 53 79 6e 63 28 69 29 3b 0a 20 20 20      Sync(i);.   
4750: 20 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b     if (_keyInfo[
4760: 69 5d 2e 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c  i].query != null
4770: 29 20 72 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66  ) return _keyInf
4780: 6f 5b 69 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64  o[i].query._read
4790: 65 72 2e 47 65 74 49 6e 74 33 32 28 5f 6b 65 79  er.GetInt32(_key
47a0: 49 6e 66 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b  Info[i].column);
47b0: 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .      else.    
47c0: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67    {.        long
47d0: 20 72 6f 77 69 64 20 3d 20 5f 73 74 6d 74 2e 5f   rowid = _stmt._
47e0: 73 71 6c 2e 47 65 74 52 6f 77 49 64 46 6f 72 43  sql.GetRowIdForC
47f0: 75 72 73 6f 72 28 5f 73 74 6d 74 2c 20 5f 6b 65  ursor(_stmt, _ke
4800: 79 49 6e 66 6f 5b 69 5d 2e 63 75 72 73 6f 72 29  yInfo[i].cursor)
4810: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 72 6f  ;.        if (ro
4820: 77 69 64 20 3d 3d 20 30 29 20 74 68 72 6f 77 20  wid == 0) throw 
4830: 6e 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45  new InvalidCastE
4840: 78 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20  xception();.    
4850: 20 20 20 20 72 65 74 75 72 6e 20 43 6f 6e 76 65      return Conve
4860: 72 74 2e 54 6f 49 6e 74 33 32 28 72 6f 77 69 64  rt.ToInt32(rowid
4870: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4880: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 49  ..    internal I
4890: 6e 74 36 34 20 47 65 74 49 6e 74 36 34 28 69 6e  nt64 GetInt64(in
48a0: 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  t i).    {.     
48b0: 20 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20   Sync(i);.      
48c0: 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  if (_keyInfo[i].
48d0: 71 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72  query != null) r
48e0: 65 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69  eturn _keyInfo[i
48f0: 5d 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e  ].query._reader.
4900: 47 65 74 49 6e 74 36 34 28 5f 6b 65 79 49 6e 66  GetInt64(_keyInf
4910: 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20  o[i].column);.  
4920: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b      else.      {
4930: 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 72 6f  .        long ro
4940: 77 69 64 20 3d 20 5f 73 74 6d 74 2e 5f 73 71 6c  wid = _stmt._sql
4950: 2e 47 65 74 52 6f 77 49 64 46 6f 72 43 75 72 73  .GetRowIdForCurs
4960: 6f 72 28 5f 73 74 6d 74 2c 20 5f 6b 65 79 49 6e  or(_stmt, _keyIn
4970: 66 6f 5b 69 5d 2e 63 75 72 73 6f 72 29 3b 0a 20  fo[i].cursor);. 
4980: 20 20 20 20 20 20 20 69 66 20 28 72 6f 77 69 64         if (rowid
4990: 20 3d 3d 20 30 29 20 74 68 72 6f 77 20 6e 65 77   == 0) throw new
49a0: 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78 63 65   InvalidCastExce
49b0: 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20  ption();.       
49c0: 20 72 65 74 75 72 6e 20 43 6f 6e 76 65 72 74 2e   return Convert.
49d0: 54 6f 49 6e 74 36 34 28 72 6f 77 69 64 29 3b 0a  ToInt64(rowid);.
49e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
49f0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 69     internal stri
4a00: 6e 67 20 47 65 74 53 74 72 69 6e 67 28 69 6e 74  ng GetString(int
4a10: 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   i).    {.      
4a20: 53 79 6e 63 28 69 29 3b 0a 20 20 20 20 20 20 69  Sync(i);.      i
4a30: 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71  f (_keyInfo[i].q
4a40: 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 20 72 65  uery != null) re
4a50: 74 75 72 6e 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d  turn _keyInfo[i]
4a60: 2e 71 75 65 72 79 2e 5f 72 65 61 64 65 72 2e 47  .query._reader.G
4a70: 65 74 53 74 72 69 6e 67 28 5f 6b 65 79 49 6e 66  etString(_keyInf
4a80: 6f 5b 69 5d 2e 63 6f 6c 75 6d 6e 29 3b 0a 20 20  o[i].column);.  
4a90: 20 20 20 20 65 6c 73 65 20 74 68 72 6f 77 20 6e      else throw n
4aa0: 65 77 20 49 6e 76 61 6c 69 64 43 61 73 74 45 78  ew InvalidCastEx
4ab0: 63 65 70 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d  ception();.    }
4ac0: 0a 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 6f  ..    internal o
4ad0: 62 6a 65 63 74 20 47 65 74 56 61 6c 75 65 28 69  bject GetValue(i
4ae0: 6e 74 20 69 29 0a 20 20 20 20 7b 0a 20 20 20 20  nt i).    {.    
4af0: 20 20 69 66 20 28 5f 6b 65 79 49 6e 66 6f 5b 69    if (_keyInfo[i
4b00: 5d 2e 63 75 72 73 6f 72 20 3d 3d 20 2d 31 29 20  ].cursor == -1) 
4b10: 72 65 74 75 72 6e 20 44 42 4e 75 6c 6c 2e 56 61  return DBNull.Va
4b20: 6c 75 65 3b 0a 0a 20 20 20 20 20 20 53 79 6e 63  lue;..      Sync
4b30: 28 69 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f  (i);.      if (_
4b40: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79  keyInfo[i].query
4b50: 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   != null) return
4b60: 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65   _keyInfo[i].que
4b70: 72 79 2e 5f 72 65 61 64 65 72 2e 47 65 74 56 61  ry._reader.GetVa
4b80: 6c 75 65 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  lue(_keyInfo[i].
4b90: 63 6f 6c 75 6d 6e 29 3b 0a 0a 20 20 20 20 20 20  column);..      
4ba0: 69 66 20 28 49 73 44 42 4e 75 6c 6c 28 69 29 20  if (IsDBNull(i) 
4bb0: 3d 3d 20 74 72 75 65 29 0a 20 20 20 20 20 20 20  == true).       
4bc0: 20 72 65 74 75 72 6e 20 44 42 4e 75 6c 6c 2e 56   return DBNull.V
4bd0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 65 6c 73 65  alue;.      else
4be0: 20 72 65 74 75 72 6e 20 47 65 74 49 6e 74 36 34   return GetInt64
4bf0: 28 69 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (i);.    }..    
4c00: 69 6e 74 65 72 6e 61 6c 20 62 6f 6f 6c 20 49 73  internal bool Is
4c10: 44 42 4e 75 6c 6c 28 69 6e 74 20 69 29 0a 20 20  DBNull(int i).  
4c20: 20 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 6b    {.      if (_k
4c30: 65 79 49 6e 66 6f 5b 69 5d 2e 63 75 72 73 6f 72  eyInfo[i].cursor
4c40: 20 3d 3d 20 2d 31 29 20 72 65 74 75 72 6e 20 74   == -1) return t
4c50: 72 75 65 3b 0a 0a 20 20 20 20 20 20 53 79 6e 63  rue;..      Sync
4c60: 28 69 29 3b 0a 20 20 20 20 20 20 69 66 20 28 5f  (i);.      if (_
4c70: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65 72 79  keyInfo[i].query
4c80: 20 21 3d 20 6e 75 6c 6c 29 20 72 65 74 75 72 6e   != null) return
4c90: 20 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e 71 75 65   _keyInfo[i].que
4ca0: 72 79 2e 5f 72 65 61 64 65 72 2e 49 73 44 42 4e  ry._reader.IsDBN
4cb0: 75 6c 6c 28 5f 6b 65 79 49 6e 66 6f 5b 69 5d 2e  ull(_keyInfo[i].
4cc0: 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 65  column);.      e
4cd0: 6c 73 65 20 72 65 74 75 72 6e 20 5f 73 74 6d 74  lse return _stmt
4ce0: 2e 5f 73 71 6c 2e 47 65 74 52 6f 77 49 64 46 6f  ._sql.GetRowIdFo
4cf0: 72 43 75 72 73 6f 72 28 5f 73 74 6d 74 2c 20 5f  rCursor(_stmt, _
4d00: 6b 65 79 49 6e 66 6f 5b 69 5d 2e 63 75 72 73 6f  keyInfo[i].curso
4d10: 72 29 20 3d 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  r) == 0;.    }..
4d20: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
4d30: 3e 0a 20 20 20 20 2f 2f 2f 20 41 70 70 65 6e 64  >.    /// Append
4d40: 20 61 6c 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 73   all the columns
4d50: 20 77 65 27 76 65 20 61 64 64 65 64 20 74 6f 20   we've added to 
4d60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 65  the original que
4d70: 72 79 20 74 6f 20 74 68 65 20 73 63 68 65 6d 61  ry to the schema
4d80: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61  .    /// </summa
4d90: 72 79 3e 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  ry>.    /// <par
4da0: 61 6d 20 6e 61 6d 65 3d 22 74 62 6c 22 3e 3c 2f  am name="tbl"></
4db0: 70 61 72 61 6d 3e 0a 20 20 20 20 69 6e 74 65 72  param>.    inter
4dc0: 6e 61 6c 20 76 6f 69 64 20 41 70 70 65 6e 64 53  nal void AppendS
4dd0: 63 68 65 6d 61 54 61 62 6c 65 28 44 61 74 61 54  chemaTable(DataT
4de0: 61 62 6c 65 20 74 62 6c 29 0a 20 20 20 20 7b 0a  able tbl).    {.
4df0: 20 20 20 20 20 20 4b 65 79 51 75 65 72 79 20 6c        KeyQuery l
4e00: 61 73 74 20 3d 20 6e 75 6c 6c 3b 0a 0a 20 20 20  ast = null;..   
4e10: 20 20 20 66 6f 72 20 28 69 6e 74 20 6e 20 3d 20     for (int n = 
4e20: 30 3b 20 6e 20 3c 20 5f 6b 65 79 49 6e 66 6f 2e  0; n < _keyInfo.
4e30: 4c 65 6e 67 74 68 3b 20 6e 2b 2b 29 0a 20 20 20  Length; n++).   
4e40: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20     {.        if 
4e50: 28 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75 65  (_keyInfo[n].que
4e60: 72 79 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 5f 6b  ry == null || _k
4e70: 65 79 49 6e 66 6f 5b 6e 5d 2e 71 75 65 72 79 20  eyInfo[n].query 
4e80: 21 3d 20 6c 61 73 74 29 0a 20 20 20 20 20 20 20  != last).       
4e90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73   {.          las
4ea0: 74 20 3d 20 5f 6b 65 79 49 6e 66 6f 5b 6e 5d 2e  t = _keyInfo[n].
4eb0: 71 75 65 72 79 3b 0a 0a 20 20 20 20 20 20 20 20  query;..        
4ec0: 20 20 69 66 20 28 6c 61 73 74 20 3d 3d 20 6e 75    if (last == nu
4ed0: 6c 6c 29 20 2f 2f 20 52 4f 57 49 44 20 61 6c 69  ll) // ROWID ali
4ee0: 61 73 65 73 20 61 72 65 20 74 72 65 61 74 65 64  ases are treated
4ef0: 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20   special.       
4f00: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
4f10: 20 44 61 74 61 52 6f 77 20 72 6f 77 20 3d 20 74   DataRow row = t
4f20: 62 6c 2e 4e 65 77 52 6f 77 28 29 3b 0a 20 20 20  bl.NewRow();.   
4f30: 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68           row[Sch
4f40: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 43  emaTableColumn.C
4f50: 6f 6c 75 6d 6e 4e 61 6d 65 5d 20 3d 20 5f 6b 65  olumnName] = _ke
4f60: 79 49 6e 66 6f 5b 6e 5d 2e 63 6f 6c 75 6d 6e 4e  yInfo[n].columnN
4f70: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
4f80: 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65   row[SchemaTable
4f90: 43 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e 4f 72 64  Column.ColumnOrd
4fa0: 69 6e 61 6c 5d 20 3d 20 74 62 6c 2e 52 6f 77 73  inal] = tbl.Rows
4fb0: 2e 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20  .Count;.        
4fc0: 20 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61      row[SchemaTa
4fd0: 62 6c 65 43 6f 6c 75 6d 6e 2e 43 6f 6c 75 6d 6e  bleColumn.Column
4fe0: 53 69 7a 65 5d 20 3d 20 38 3b 0a 20 20 20 20 20  Size] = 8;.     
4ff0: 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65 6d         row[Schem
5000: 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 4e 75 6d  aTableColumn.Num
5010: 65 72 69 63 50 72 65 63 69 73 69 6f 6e 5d 20 3d  ericPrecision] =
5020: 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20   255;.          
5030: 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c    row[SchemaTabl
5040: 65 43 6f 6c 75 6d 6e 2e 4e 75 6d 65 72 69 63 53  eColumn.NumericS
5050: 63 61 6c 65 5d 20 3d 20 32 35 35 3b 0a 20 20 20  cale] = 255;.   
5060: 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68           row[Sch
5070: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 50  emaTableColumn.P
5080: 72 6f 76 69 64 65 72 54 79 70 65 5d 20 3d 20 44  roviderType] = D
5090: 62 54 79 70 65 2e 49 6e 74 36 34 3b 0a 20 20 20  bType.Int64;.   
50a0: 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68           row[Sch
50b0: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49  emaTableColumn.I
50c0: 73 4c 6f 6e 67 5d 20 3d 20 66 61 6c 73 65 3b 0a  sLong] = false;.
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b              row[
50e0: 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d  SchemaTableColum
50f0: 6e 2e 41 6c 6c 6f 77 44 42 4e 75 6c 6c 5d 20 3d  n.AllowDBNull] =
5100: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
5110: 20 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61      row[SchemaTa
5120: 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d  bleOptionalColum
5130: 6e 2e 49 73 52 65 61 64 4f 6e 6c 79 5d 20 3d 20  n.IsReadOnly] = 
5140: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20  false;.         
5150: 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62     row[SchemaTab
5160: 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e  leOptionalColumn
5170: 2e 49 73 52 6f 77 56 65 72 73 69 6f 6e 5d 20 3d  .IsRowVersion] =
5180: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
5190: 20 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61      row[SchemaTa
51a0: 62 6c 65 43 6f 6c 75 6d 6e 2e 49 73 55 6e 69 71  bleColumn.IsUniq
51b0: 75 65 5d 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  ue] = false;.   
51c0: 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68           row[Sch
51d0: 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49  emaTableColumn.I
51e0: 73 4b 65 79 5d 20 3d 20 74 72 75 65 3b 0a 20 20  sKey] = true;.  
51f0: 20 20 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63            row[Sc
5200: 68 65 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e  hemaTableColumn.
5210: 44 61 74 61 54 79 70 65 5d 20 3d 20 74 79 70 65  DataType] = type
5220: 6f 66 28 49 6e 74 36 34 29 3b 0a 20 20 20 20 20  of(Int64);.     
5230: 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65 6d         row[Schem
5240: 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43 6f  aTableOptionalCo
5250: 6c 75 6d 6e 2e 49 73 48 69 64 64 65 6e 5d 20 3d  lumn.IsHidden] =
5260: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
5270: 20 20 20 72 6f 77 5b 53 63 68 65 6d 61 54 61 62     row[SchemaTab
5280: 6c 65 43 6f 6c 75 6d 6e 2e 42 61 73 65 43 6f 6c  leColumn.BaseCol
5290: 75 6d 6e 4e 61 6d 65 5d 20 3d 20 5f 6b 65 79 49  umnName] = _keyI
52a0: 6e 66 6f 5b 6e 5d 2e 63 6f 6c 75 6d 6e 4e 61 6d  nfo[n].columnNam
52b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e;.            r
52c0: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f  ow[SchemaTableCo
52d0: 6c 75 6d 6e 2e 49 73 45 78 70 72 65 73 73 69 6f  lumn.IsExpressio
52e0: 6e 5d 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  n] = false;.    
52f0: 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65          row[Sche
5300: 6d 61 54 61 62 6c 65 43 6f 6c 75 6d 6e 2e 49 73  maTableColumn.Is
5310: 41 6c 69 61 73 65 64 5d 20 3d 20 66 61 6c 73 65  Aliased] = false
5320: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 6f  ;.            ro
5330: 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  w[SchemaTableCol
5340: 75 6d 6e 2e 42 61 73 65 54 61 62 6c 65 4e 61 6d  umn.BaseTableNam
5350: 65 5d 20 3d 20 5f 6b 65 79 49 6e 66 6f 5b 6e 5d  e] = _keyInfo[n]
5360: 2e 74 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 20 20  .tableName;.    
5370: 20 20 20 20 20 20 20 20 72 6f 77 5b 53 63 68 65          row[Sche
5380: 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e 61 6c 43  maTableOptionalC
5390: 6f 6c 75 6d 6e 2e 42 61 73 65 43 61 74 61 6c 6f  olumn.BaseCatalo
53a0: 67 4e 61 6d 65 5d 20 3d 20 5f 6b 65 79 49 6e 66  gName] = _keyInf
53b0: 6f 5b 6e 5d 2e 64 61 74 61 62 61 73 65 4e 61 6d  o[n].databaseNam
53c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e;.            r
53d0: 6f 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 4f 70  ow[SchemaTableOp
53e0: 74 69 6f 6e 61 6c 43 6f 6c 75 6d 6e 2e 49 73 41  tionalColumn.IsA
53f0: 75 74 6f 49 6e 63 72 65 6d 65 6e 74 5d 20 3d 20  utoIncrement] = 
5400: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
5410: 20 20 72 6f 77 5b 22 44 61 74 61 54 79 70 65 4e    row["DataTypeN
5420: 61 6d 65 22 5d 20 3d 20 22 69 6e 74 65 67 65 72  ame"] = "integer
5430: 22 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
5440: 74 62 6c 2e 52 6f 77 73 2e 41 64 64 28 72 6f 77  tbl.Rows.Add(row
5450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
5460: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0a 20 20           else.  
5470: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
5480: 20 20 20 20 20 20 6c 61 73 74 2e 53 79 6e 63 28        last.Sync(
5490: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
54a0: 75 73 69 6e 67 20 28 44 61 74 61 54 61 62 6c 65  using (DataTable
54b0: 20 74 62 6c 53 75 62 20 3d 20 6c 61 73 74 2e 5f   tblSub = last._
54c0: 72 65 61 64 65 72 2e 47 65 74 53 63 68 65 6d 61  reader.GetSchema
54d0: 54 61 62 6c 65 28 29 29 0a 20 20 20 20 20 20 20  Table()).       
54e0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
54f0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 44 61       foreach (Da
5500: 74 61 52 6f 77 20 72 6f 77 20 69 6e 20 74 62 6c  taRow row in tbl
5510: 53 75 62 2e 52 6f 77 73 29 0a 20 20 20 20 20 20  Sub.Rows).      
5520: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
5530: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
5540: 5b 5d 20 6f 20 3d 20 72 6f 77 2e 49 74 65 6d 41  [] o = row.ItemA
5550: 72 72 61 79 3b 0a 20 20 20 20 20 20 20 20 20 20  rray;.          
5560: 20 20 20 20 20 20 44 61 74 61 52 6f 77 20 6e 65        DataRow ne
5570: 77 72 6f 77 20 3d 20 74 62 6c 2e 52 6f 77 73 2e  wrow = tbl.Rows.
5580: 41 64 64 28 6f 29 3b 0a 20 20 20 20 20 20 20 20  Add(o);.        
5590: 20 20 20 20 20 20 20 20 6e 65 77 72 6f 77 5b 53          newrow[S
55a0: 63 68 65 6d 61 54 61 62 6c 65 4f 70 74 69 6f 6e  chemaTableOption
55b0: 61 6c 43 6f 6c 75 6d 6e 2e 49 73 48 69 64 64 65  alColumn.IsHidde
55c0: 6e 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  n] = true;.     
55d0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 72 6f             newro
55e0: 77 5b 53 63 68 65 6d 61 54 61 62 6c 65 43 6f 6c  w[SchemaTableCol
55f0: 75 6d 6e 2e 43 6f 6c 75 6d 6e 4f 72 64 69 6e 61  umn.ColumnOrdina
5600: 6c 5d 20 3d 20 74 62 6c 2e 52 6f 77 73 2e 43 6f  l] = tbl.Rows.Co
5610: 75 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  unt - 1;.       
5620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5640: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5650: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5660: 0a                                               .