System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7e02e7d37030292075dee473bed8448402ce09f4:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  etSQLiteDefineCo
0340: 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d 20  nstantPrefix {} 
0350: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0360: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
0370: 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e 73   the define cons
0380: 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74 74  tant prefix sett
0390: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
03a0: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
03b0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
03c0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
03d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
03e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
03f0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0400: 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61 6e  ::define_constan
0410: 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d 0a  t_prefix] && \..
0420: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
0430: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66 69  g length $::defi
0440: 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65 66  ne_constant_pref
0450: 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ix] > 0} then {.
0460: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0470: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0480: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 65  the specified de
0490: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  fine constant pr
04a0: 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23  efix...        #
04b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
04c0: 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74   $::define_const
04d0: 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20 20  ant_prefix..    
04e0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
04f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
0500: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0510: 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63 6f  efault define co
0520: 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d 0a  nstant prefix...
0530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0540: 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e 65     return define
0550: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
0560: 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20  Data.SQLite...  
0570: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
0580: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c  .    proc getSQL
0590: 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
05a0: 50 72 65 66 69 78 20 7b 7d 20 7b 0d 0a 20 20 20  Prefix {} {..   
05b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
05c0: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 63  TE: See if the c
05d0: 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72  ompile option pr
05e0: 65 66 69 78 20 73 65 74 74 69 6e 67 20 68 61 73  efix setting has
05f0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
0600: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0610: 62 79 20 74 68 65 20 75 73 65 72 20 28 65 2e 67  by the user (e.g
0620: 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  . on the command
0630: 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23   line)...      #
0640: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
0650: 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 70 69  o exists ::compi
0660: 6c 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78  le_option_prefix
0670: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0680: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
0690: 20 24 3a 3a 63 6f 6d 70 69 6c 65 5f 6f 70 74 69   $::compile_opti
06a0: 6f 6e 5f 70 72 65 66 69 78 5d 20 3e 20 30 7d 20  on_prefix] > 0} 
06b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
06c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
06d0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
06e0: 66 69 65 64 20 63 6f 6d 70 69 6c 65 20 6f 70 74  fied compile opt
06f0: 69 6f 6e 20 70 72 65 66 69 78 2e 0d 0a 20 20 20  ion prefix...   
0700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0710: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 70 69 6c  return $::compil
0720: 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78 0d  e_option_prefix.
0730: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
0740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0760: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6d 70  the default comp
0770: 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72 65 66 69  ile option prefi
0780: 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  x...        #.. 
0790: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f         return co
07a0: 6d 70 69 6c 65 4f 70 74 69 6f 6e 2e 53 51 4c 69  mpileOption.SQLi
07b0: 74 65 2e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  te...      }..  
07c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
07d0: 20 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e   haveSQLiteDefin
07e0: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 6e 61 6d 65  eConstant { name
07f0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
0800: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
0810: 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
0820: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
0830: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
0840: 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61 6d  tantPrefix] $nam
0850: 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  e]]..    }..... 
0860: 20 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c 69     proc haveSQLi
0870: 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  teCompileOption 
0880: 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  { name } {..    
0890: 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f    return [haveCo
08a0: 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
08b0: 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
08c0: 73 20 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70  s [getSQLiteComp
08d0: 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d  ileOptionPrefix]
08e0: 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d   $name]]..    }.
08f0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
0900: 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b 0d 0a  BuildYear {} {..
0910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0920: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
0930: 65 20 22 79 65 61 72 22 20 73 65 74 74 69 6e 67  e "year" setting
0940: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
0950: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
0960: 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 23 20   (e.g...      # 
0970: 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63 6f 6d        on the com
0980: 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69  mand line).  Thi
0990: 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20  s helps control 
09a0: 65 78 61 63 74 6c 79 20 77 68 69 63 68 20 73 65  exactly which se
09b0: 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  t of..      #   
09c0: 20 20 20 20 62 69 6e 61 72 69 65 73 20 77 65 20      binaries we 
09d0: 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74 68 6f  are testing, tho
09e0: 73 65 20 70 72 6f 64 75 63 65 64 20 75 73 69 6e  se produced usin
09f0: 67 20 74 68 65 20 56 69 73 75 61 6c 20 53 74 75  g the Visual Stu
0a00: 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20  dio..      #    
0a10: 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c 20 32     2005, 2008, 2
0a20: 30 31 30 2c 20 32 30 31 32 2c 20 32 30 31 33 2c  010, 2012, 2013,
0a30: 20 32 30 31 35 2c 20 6f 72 20 32 30 31 37 20 62   2015, or 2017 b
0a40: 75 69 6c 64 20 73 79 73 74 65 6d 73 2e 20 20 54  uild systems.  T
0a50: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
0a60: 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 76   override this v
0a70: 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d  alue via the com
0a80: 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72  mand line, enter
0a90: 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c   a command simil
0aa0: 61 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ar..      #     
0ab0: 20 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20    to one of the 
0ac0: 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f  following (all o
0ad0: 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20  n one line):..  
0ae0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0af0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0b00: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0b10: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0b20: 72 20 32 30 30 35 22 0d 0a 20 20 20 20 20 20 23  r 2005"..      #
0b30: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0b40: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0b50: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0b60: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0b70: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0b80: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0b90: 73 74 5f 79 65 61 72 20 32 30 30 38 22 0d 0a 20  st_year 2008".. 
0ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0bb0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0bc0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0bd0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0be0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0bf0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0c00: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0c10: 31 30 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  10"..      #    
0c20: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0c30: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0c50: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0c60: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0c70: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0c80: 65 61 72 20 32 30 31 32 22 0d 0a 20 20 20 20 20  ear 2012"..     
0c90: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0ca0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0cb0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0cc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0cd0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0ce0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0cf0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 33 22 0d  test_year 2013".
0d00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0d10: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0d20: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0d30: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0d40: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0d50: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0d60: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0d70: 32 30 31 35 22 0d 0a 20 20 20 20 20 20 23 20 20  2015"..      #  
0d80: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0d90: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0da0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0db0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0dc0: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0dd0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0de0: 5f 79 65 61 72 20 32 30 31 37 22 0d 0a 20 20 20  _year 2017"..   
0df0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0e00: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0e10: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0e20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0e30: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0e40: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 75 6e  nyInitialize "un
0e50: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
0e60: 74 65 73 74 5f 79 65 61 72 22 0d 0a 20 20 20 20  test_year"..    
0e70: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
0e80: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
0e90: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
0ea0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
0eb0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65  exists ::test_ye
0ec0: 61 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20 6c  ar] && [string l
0ed0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
0ee0: 61 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ar] > 0} then {.
0ef0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
0f00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
0f20: 73 74 20 79 65 61 72 2e 20 20 49 66 20 74 68 69  st year.  If thi
0f30: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  s variable is no
0f40: 74 20 73 65 74 2c 20 74 68 65 0d 0a 20 20 20 20  t set, the..    
0f50: 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61      #       defa
0f60: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
0f70: 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  e based on wheth
0f80: 65 72 20 6f 72 20 6e 6f 74 20 45 61 67 6c 65 20  er or not Eagle 
0f90: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
0fa0: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
0fb0: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43  ed against the C
0fc0: 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76  LR v2.0 or CLR v
0fd0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  4.0...        #.
0fe0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ff0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 0d 0a 20 20  $::test_year..  
1000: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1010: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1020: 20 23 20 4e 4f 54 45 3a 20 49 66 20 45 61 67 6c   # NOTE: If Eagl
1030: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1040: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1050: 43 4c 52 20 76 34 2e 30 2c 20 75 73 65 20 22 32  CLR v4.0, use "2
1060: 30 31 30 22 20 62 79 0d 0a 20 20 20 20 20 20 20  010" by..       
1070: 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c 74   #       default
1080: 20 28 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22   (we could use "
1090: 32 30 31 32 22 2c 20 22 32 30 31 33 22 2c 20 22  2012", "2013", "
10a0: 32 30 31 35 22 2c 20 6f 72 20 22 32 30 31 37 22  2015", or "2017"
10b0: 20 69 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20   in that..      
10c0: 20 20 23 20 20 20 20 20 20 20 63 61 73 65 20 61    #       case a
10d0: 73 20 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74  s well) as the t
10e0: 65 73 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77  est year; otherw
10f0: 69 73 65 2c 20 75 73 65 20 22 32 30 30 38 22 20  ise, use "2008" 
1100: 62 79 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  by default..    
1110: 20 20 20 20 23 20 20 20 20 20 20 20 28 77 65 20      #       (we 
1120: 63 6f 75 6c 64 20 75 73 65 20 22 32 30 30 35 22  could use "2005"
1130: 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 61 73   in that case as
1140: 20 77 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74   well).  If anot
1150: 68 65 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20  her major..     
1160: 20 20 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f     #       [inco
1170: 6d 70 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f  mpatible] versio
1180: 6e 20 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20  n of the CLR is 
1190: 72 65 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63  released, this c
11a0: 68 65 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20  heck will..     
11b0: 20 20 20 23 20 20 20 20 20 20 20 68 61 76 65 20     #       have 
11c0: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  to be changed.  
11d0: 54 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  The default test
11e0: 20 79 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72   year to use for
11f0: 20 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   a..        #   
1200: 20 20 20 20 70 61 72 74 69 63 75 6c 61 72 20 43      particular C
1210: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
1220: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  e overridden by 
1230: 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62  setting the glob
1240: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
1250: 20 20 20 20 76 61 72 69 61 62 6c 65 20 22 74 65      variable "te
1260: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22  st_year_clr_v$X"
1270: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1280: 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d   [currently] be.
1290: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12a0: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
12b0: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
12c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
12d0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
12e0: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
12f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1300: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1310: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
1320: 76 34 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  v4] && \..      
1330: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1340: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1350: 65 61 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d  ear_clr_v4] > 0}
1360: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1370: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1380: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1390: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
13a0: 73 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20  st year for the 
13b0: 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20  CLR v4.0...     
13c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
13e0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
13f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1400: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1410: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1420: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
1430: 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79 65   default test ye
1440: 61 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  ar for the CLR v
1450: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1460: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1470: 20 72 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20   return 2010; # 
1480: 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c  TODO: Good "fall
1490: 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a  back" default?..
14a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e           if {[in
14d0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
14e0: 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26  _year_clr_v2] &&
14f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1500: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1510: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
1520: 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20  r_v2] > 0} then 
1530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1550: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
1560: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
1570: 72 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  r for the CLR v2
1580: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1590: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
15a0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79  return $::test_y
15b0: 65 61 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  ear_clr_v2..    
15c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
15e0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
15f0: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1600: 6c 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72  lt test year for
1610: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a   the CLR v2.0...
1620: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1630: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1640: 6e 20 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20  n 2008; # TODO: 
1650: 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20  Good "fallback" 
1660: 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20  default?..      
1670: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1680: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1690: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
16a0: 74 42 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72  tBuildNativeYear
16b0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
16c0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
16d0: 74 65 73 74 5f 6e 61 74 69 76 65 5f 79 65 61 72  test_native_year
16e0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
16f0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1700: 20 24 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f   $::test_native_
1710: 79 65 61 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  year] > 0} then 
1720: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1740: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1750: 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 6e 61  test year for na
1760: 74 69 76 65 20 62 69 6e 61 72 69 65 73 2e 20 20  tive binaries.  
1770: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  If this..       
1780: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
1790: 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68  e is not set, th
17a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
17b0: 20 62 79 20 5b 67 65 74 42 75 69 6c 64 59 65 61   by [getBuildYea
17c0: 72 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  r]..        #   
17d0: 20 20 20 20 77 69 6c 6c 20 62 65 20 75 73 65 64      will be used
17e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1800: 74 65 73 74 5f 6e 61 74 69 76 65 5f 79 65 61 72  test_native_year
1810: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1820: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1830: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c       # NOTE: Fal
1840: 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20 28 6e 6f  lback on the (no
1850: 72 6d 61 6c 29 20 62 75 69 6c 64 20 79 65 61 72  rmal) build year
1860: 20 66 6f 72 20 6d 61 6e 61 67 65 64 20 62 69 6e   for managed bin
1870: 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  aries...        
1880: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1890: 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  n [getBuildYear]
18a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
18b0: 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  .....    #..    
18c0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
18d0: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
18e0: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
18f0: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
1900: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
1910: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1920: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
1930: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
1940: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1950: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
1960: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
1970: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1980: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1990: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
19a0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
19b0: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
19c0: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
19d0: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
19e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
19f0: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
1a00: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1a10: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
1a20: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
1a30: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1a40: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1a50: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1a60: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
1a70: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1a80: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1a90: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1aa0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1ab0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ac0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1ad0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
1ae0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
1af0: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
1b00: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
1b10: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
1b20: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
1b30: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
1b40: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
1b50: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
1b60: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
1b70: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1b80: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1b90: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1ba0: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1bb0: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
1bc0: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
1bd0: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
1be0: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
1bf0: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
1c00: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
1c10: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
1c20: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
1c30: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
1c40: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
1c50: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
1c60: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1c70: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1c80: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1c90: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1ca0: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1cb0: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1cc0: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1ce0: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1cf0: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1d00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d10: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1d20: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
1d30: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1d40: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1d50: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
1d60: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
1d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1d90: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1da0: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1db0: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1dc0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1dd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1de0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1df0: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1e00: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1e10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e20: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1e30: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
1e40: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
1e50: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
1e60: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e80: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1e90: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1ea0: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1eb0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ec0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ed0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1ee0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1ef0: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1f00: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1f10: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1f20: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
1f30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f50: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1f60: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1f70: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1f80: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1f90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1fb0: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1fc0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1fd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1ff0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
2000: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
2010: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
2020: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
2030: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2040: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
2050: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
2060: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
2070: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
2080: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
2090: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
20a0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
20b0: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
20c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
20d0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
20e0: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
20f0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2100: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
2110: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2120: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
2130: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
2140: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2150: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
2160: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
2170: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
2180: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
2190: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
21a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
21b0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
21c0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
21d0: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
21e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
21f0: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
2200: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2210: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2220: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
2230: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
2240: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
2250: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
2260: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
2270: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
2280: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
2290: 33 20 32 30 31 35 20 32 30 31 37 20 4e 65 74 53  3 2015 2017 NetS
22a0: 74 61 6e 64 61 72 64 32 30 5d 0d 0a 20 20 20 20  tandard20]..    
22b0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
22c0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
22d0: 4e 65 74 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20  NetFx {} {..    
22e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
22f0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 74 65  E: See if the te
2300: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
2310: 6b 20 73 65 74 74 69 6e 67 20 68 61 73 20 62 65  k setting has be
2320: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  en overridden by
2330: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2340: 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f  the user (e.g. o
2350: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
2360: 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne)...      #.. 
2370: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2380: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74  xists ::test_net
2390: 5f 66 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _fx] && \..     
23a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
23b0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f  gth $::test_net_
23c0: 66 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  fx] > 0} then {.
23d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
23f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2400: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
2410: 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  k...        #.. 
2420: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2430: 3a 74 65 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20  :test_net_fx..  
2440: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2450: 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b        set year [
2460: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20  getBuildYear].. 
2470: 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 56         set yearV
2480: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
2490: 67 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  gs ::test_net_fx
24a0: 5f 20 24 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20  _ $year]....    
24b0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24c0: 69 73 74 73 20 24 79 65 61 72 56 61 72 4e 61 6d  ists $yearVarNam
24d0: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
24e0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
24f0: 67 74 68 20 5b 73 65 74 20 24 79 65 61 72 56 61  gth [set $yearVa
2500: 72 4e 61 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65  rName]] > 0} the
2510: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
2520: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2530: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
2540: 69 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20  ified test .NET 
2550: 46 72 61 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64  Framework, based
2560: 20 6f 6e 20 74 68 65 20 62 75 69 6c 64 0d 0a 20   on the build.. 
2570: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2580: 20 79 65 61 72 2e 0d 0a 20 20 20 20 20 20 20 20   year...        
2590: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
25a0: 65 74 75 72 6e 20 5b 73 65 74 20 24 79 65 61 72  eturn [set $year
25b0: 56 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  VarName]..      
25c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
25d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25e0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
25f0: 61 63 6b 20 74 6f 20 74 68 65 20 22 77 65 6c 6c  ack to the "well
2600: 20 6b 6e 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61   known" .NET Fra
2610: 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74  mework version t
2620: 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hat..          #
2630: 20 20 20 20 20 20 20 69 73 20 6d 6f 73 74 20 63         is most c
2640: 6c 6f 73 65 6c 79 20 61 73 73 6f 63 69 61 74 65  losely associate
2650: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
2660: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a  lar version of..
2670: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2680: 20 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 2e    Visual Studio.
2690: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
26a0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
26b0: 2d 65 78 61 63 74 20 2d 2d 20 24 79 65 61 72 20  -exact -- $year 
26c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  {..            2
26d0: 30 30 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  005 {..         
26e0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
26f0: 78 32 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x20..           
2700: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2710: 32 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20  2008 {..        
2720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2730: 46 78 33 35 0d 0a 20 20 20 20 20 20 20 20 20 20  Fx35..          
2740: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2750: 20 32 30 31 30 20 7b 0d 0a 20 20 20 20 20 20 20   2010 {..       
2760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
2770: 74 46 78 34 30 0d 0a 20 20 20 20 20 20 20 20 20  tFx40..         
2780: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2790: 20 20 32 30 31 32 20 7b 0d 0a 20 20 20 20 20 20    2012 {..      
27a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
27b0: 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20 20  etFx45..        
27c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
27d0: 20 20 20 32 30 31 33 20 7b 0d 0a 20 20 20 20 20     2013 {..     
27e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27f0: 6e 65 74 46 78 34 35 31 3b 20 23 20 54 4f 44 4f  netFx451; # TODO
2800: 3a 20 4f 72 20 22 6e 65 74 46 78 34 35 32 22 3f  : Or "netFx452"?
2810: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
2830: 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 {..           
2840: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
2850: 36 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e  6; # TODO: Or "n
2860: 65 74 46 78 34 36 31 22 20 2f 20 22 6e 65 74 46  etFx461" / "netF
2870: 78 34 36 32 22 3f 0d 0a 20 20 20 20 20 20 20 20  x462"?..        
2880: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2890: 20 20 20 32 30 31 37 20 7b 0d 0a 20 20 20 20 20     2017 {..     
28a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28b0: 6e 65 74 46 78 34 37 3b 20 23 20 54 4f 44 4f 3a  netFx47; # TODO:
28c0: 20 4f 72 20 22 6e 65 74 46 78 34 37 31 22 20 2f   Or "netFx471" /
28d0: 20 22 6e 65 74 46 78 34 37 32 22 3f 0d 0a 20 20   "netFx472"?..  
28e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
28f0: 20 20 20 20 20 20 20 20 20 4e 65 74 53 74 61 6e           NetStan
2900: 64 61 72 64 32 30 20 7b 0d 0a 20 20 20 20 20 20  dard20 {..      
2910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
2920: 65 74 53 74 61 6e 64 61 72 64 32 30 0d 0a 20 20  etStandard20..  
2930: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2940: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
2950: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2960: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35    return netFx35
2970: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
2980: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
2990: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t?..            
29a0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
29b0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
29c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
29d0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
29e0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
29f0: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f  should return no
2a00: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63 6f  n-zero if the co
2a10: 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d 0a 20  nfigured test.. 
2a20: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
2a30: 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69 6b 65  orm is most like
2a40: 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ly the default f
2a50: 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 2e  or this machine.
2a60: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70 72 6f  ..    #..    pro
2a70: 63 20 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64  c isDefaultBuild
2a80: 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65 72 62  Platform { {verb
2a90: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
2aa0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2ab0: 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e  NOTE: Running on
2ac0: 20 57 6f 57 36 34 20 69 73 20 6e 65 76 65 72 20   WoW64 is never 
2ad0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74  the default plat
2ae0: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  form...      #..
2af0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e        if {[isRun
2b00: 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74 68 65 6e  ningWoW64]} then
2b10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
2b20: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
2b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
2b40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2b50: 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2b60: 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65     "---- detecte
2b70: 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 70 6c  d non-default pl
2b80: 61 74 66 6f 72 6d 20 28 57 6f 57 36 34 29 5c 6e  atform (WoW64)\n
2b90: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
2ba0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
2bb0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
2bc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2bd0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61 73  # NOTE: This has
2be0: 20 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20 6f   a good chance o
2bf0: 66 20 62 65 69 6e 67 20 74 68 65 20 64 65 66 61  f being the defa
2c00: 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20  ult platform... 
2c10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2c20: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
2c30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
2c40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2c50: 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64  l "---- detected
2c60: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
2c70: 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  m\n"..      }...
2c80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72  .      return tr
2c90: 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ue..    }.....  
2ca0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50    proc getBuildP
2cb0: 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65  latform { native
2cc0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
2cd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
2ce0: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26  est_platform] &&
2cf0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
2d00: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
2d10: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e  test_platform] >
2d20: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2d30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2d40: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2d50: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70 6c  pecified test pl
2d60: 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69 73  atform.  If this
2d70: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
2d80: 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 23   set,..        #
2d90: 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61 75         the defau
2da0: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
2db0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61   based on the ma
2dc0: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2dd0: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
2de0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2df0: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
2e00: 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d  $::test_platform
2e10: 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d   : ""}]..      }
2e20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
2e30: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63  xists ::test_mac
2e40: 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  hine] && \..    
2e50: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2e60: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63  ngth $::test_mac
2e70: 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  hine] > 0} then 
2e80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2e90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
2ea0: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
2eb0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
2ec0: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
2ed0: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
2ee0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2ef0: 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72 63  test machine arc
2f00: 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72  hitecture; other
2f10: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
2f20: 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 23  empty..        #
2f30: 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a         string...
2f40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f50: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
2f60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
2f70: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
2f80: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73  oPlatform $::tes
2f90: 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d  t_machine] : "".
2fa0: 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  .        }]..   
2fb0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
2fc0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
2fd0: 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
2fe0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2ff0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3000: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
3010: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
3020: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
3030: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
3040: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
3050: 20 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65       the machine
3060: 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f   architecture; o
3070: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
3080: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
3090: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
30b0: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
30c0: 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69  $native ? [machi
30d0: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
30e0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
30f0: 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20  hine)] : ""..   
3100: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d       }]..      }
3110: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
3120: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3130: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
3140: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
3150: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
3160: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
3170: 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
3180: 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61     It is importa
3190: 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  nt to return an 
31a0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72  empty string her
31b0: 65 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20  e because the.. 
31c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
31d0: 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72  esult of this pr
31e0: 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75  ocedure may be u
31f0: 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a  sed with [file j
3200: 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23  oin]...        #
3210: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
3220: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
3230: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3240: 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75   getBuildConfigu
3250: 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ration {} {..   
3260: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3270: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
3280: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73  configuration" s
3290: 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20  etting has been 
32a0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
32b0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
32c0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
32d0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
32e0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f  .  This helps co
32f0: 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20  ntrol exactly.. 
3300: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
3310: 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69  ch set of binari
3320: 65 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  es we are testin
3330: 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75  g (i.e. those bu
3340: 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ilt in the..    
3350: 20 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67    #       "Debug
3360: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62  " or "Release" b
3370: 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
3380: 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69  ons).  To overri
3390: 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  de this..      #
33a0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61         value via
33b0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
33c0: 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61  e, enter a comma
33d0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
33e0: 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e of..      #   
33f0: 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e      the followin
3400: 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  g (all on one li
3410: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
3420: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
3430: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
3440: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
3450: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3460: 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20  on Debug"..     
3470: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
3480: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
3490: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
34a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
34b0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
34c0: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
34d0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
34e0: 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20  on Release"..   
34f0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
3500: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
3510: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
3520: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
3530: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66  agleShell.exe -f
3540: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3550: 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74  l.eagle -preTest
3560: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3570: 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70    "unset -nocomp
3580: 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67  lain test_config
3590: 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20  uration"..      
35a0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
35b0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
35c0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20  _configuration] 
35d0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
35e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
35f0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
3600: 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tion] > 0} then 
3610: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3620: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
3630: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
3640: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
3650: 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  on.  The default
3660: 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20   value used..   
3670: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
3680: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
3690: 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c  s typically "Rel
36a0: 65 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79  ease", as set by
36b0: 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
36c0: 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
36d0: 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
36e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
36f0: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
3700: 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20  iguration..     
3710: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
3720: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3730: 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  NOTE: Normally, 
3740: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69  we will never hi
3750: 74 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61  t this case beca
3760: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
3770: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
3780: 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69        test confi
3790: 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c  guration variabl
37a0: 65 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  e is always set 
37b0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
37c0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
37d0: 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76     itself; howev
37e0: 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76  er, it can be ov
37f0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
3800: 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64  he unset command
3810: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3820: 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54    from the -preT
3830: 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68  est option to th
3840: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
3850: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3860: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c    return $::eagl
3870: 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69  e_platform(confi
3880: 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20  guration)..     
3890: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
38a0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
38b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d  onfigurations {}
38c0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
38d0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
38e0: 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65  f the list of te
38f0: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
3900: 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  s has been overr
3910: 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20  idden by..      
3920: 23 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72  #       the user
3930: 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f   (e.g. on the co
3940: 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20  mmand line)...  
3950: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3960: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3970: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
3980: 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ons] && \..     
3990: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
39a0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
39b0: 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ions] > 0} then 
39c0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
39d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
39e0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
39f0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3a00: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3a10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3a20: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
3a30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a  configurations..
3a40: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3a50: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3a60: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
3a70: 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20  he default list 
3a80: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
3a90: 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20  ations...       
3aa0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3ab0: 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52  rn [list Debug R
3ac0: 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d  elease]..      }
3ad0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3ae0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 45 78 74  proc getBuildExt
3af0: 72 61 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ra {} {..      i
3b00: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3b10: 3a 3a 74 65 73 74 5f 65 78 74 72 61 5d 20 26 26  ::test_extra] &&
3b20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3b30: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3b40: 74 65 73 74 5f 65 78 74 72 61 5d 20 3e 20 30 7d  test_extra] > 0}
3b50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3b60: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3b70: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
3b80: 69 66 69 65 64 20 65 78 74 72 61 20 6f 75 74 70  ified extra outp
3b90: 75 74 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20  ut directory... 
3ba0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3bb0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
3bc0: 5f 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 20  _extra..      } 
3bd0: 65 6c 73 65 69 66 20 7b 5b 69 73 44 6f 74 4e 65  elseif {[isDotNe
3be0: 74 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tCore]} then {..
3bf0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3c00: 20 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69     # NOTE: Runni
3c10: 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c  ng on .NET Core,
3c20: 20 75 73 65 20 74 68 65 20 65 78 74 72 61 20 6f   use the extra o
3c30: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20  utput directory 
3c40: 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  for..        #  
3c50: 20 20 20 20 20 6c 69 62 72 61 72 79 20 66 69 6c       library fil
3c60: 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
3c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
3c80: 65 74 73 74 61 6e 64 61 72 64 32 2e 30 0d 0a 20  etstandard2.0.. 
3c90: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
3ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3cb0: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 65 78 74    # NOTE: No ext
3cc0: 72 61 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ra output direct
3cd0: 6f 72 79 20 69 73 20 72 65 71 75 69 72 65 64 2e  ory is required.
3ce0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3cf0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
3d00: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
3d10: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
3d20: 75 69 6c 64 45 78 74 72 61 73 20 7b 7d 20 7b 0d  uildExtras {} {.
3d30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3d40: 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74  # NOTE: See if t
3d50: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74 72 61  he list of extra
3d60: 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
3d70: 69 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ies has been ove
3d80: 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23  rridden..      #
3d90: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73         by the us
3da0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
3db0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
3dc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
3dd0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3de0: 3a 3a 74 65 73 74 5f 65 78 74 72 61 73 5d 20 26  ::test_extras] &
3df0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3e00: 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f  llength $::test_
3e10: 65 78 74 72 61 73 5d 20 3e 20 30 7d 20 74 68 65  extras] > 0} the
3e20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3e30: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3e40: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
3e50: 64 20 6c 69 73 74 20 6f 66 20 65 78 74 72 61 20  d list of extra 
3e60: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 69  output directori
3e70: 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
3e80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
3e90: 3a 3a 74 65 73 74 5f 65 78 74 72 61 73 0d 0a 20  ::test_extras.. 
3ea0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
3eb0: 69 73 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74  isDotNetCore]} t
3ec0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
3ed0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3ee0: 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  : Running on .NE
3ef0: 54 20 43 6f 72 65 2c 20 70 72 69 6f 72 69 74 69  T Core, prioriti
3f00: 7a 65 20 69 74 73 20 65 78 74 72 61 20 6f 75 74  ze its extra out
3f10: 70 75 74 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  put directory.. 
3f20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
3f30: 6f 72 20 6c 69 62 72 61 72 79 20 66 69 6c 65 73  or library files
3f40: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3f50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
3f60: 73 74 20 6e 65 74 73 74 61 6e 64 61 72 64 32 2e  st netstandard2.
3f70: 30 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  0 ""]..      } e
3f80: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
3f90: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3fa0: 3a 20 55 73 65 20 64 65 66 61 75 6c 74 20 6c 69  : Use default li
3fb0: 73 74 20 6f 66 20 65 78 74 72 61 20 6f 75 74 70  st of extra outp
3fc0: 75 74 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20  ut directories, 
3fd0: 77 68 69 63 68 20 69 73 20 6f 6e 65 0d 0a 20 20  which is one..  
3fe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 6d        #       em
3ff0: 70 74 79 20 73 74 72 69 6e 67 20 28 6e 6f 2d 6f  pty string (no-o
4000: 70 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  p)...        #..
4010: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
4020: 6c 69 73 74 20 22 22 5d 0d 0a 20 20 20 20 20 20  list ""]..      
4030: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
4040: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61   proc getBuildBa
4050: 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  seDirectory {} {
4060: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4070: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
4080: 6f 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72  out the base dir
4090: 65 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c  ectory where all
40a0: 20 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75   the builds shou
40b0: 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ld be..      #  
40c0: 20 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54       located.  T
40d0: 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
40e0: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
40f0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75  ontains the actu
4100: 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  al..      #     
4110: 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64    build output d
4120: 69 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70  irectory (e.g. p
4130: 61 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e  arent of "bin").
4140: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4150: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4160: 73 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64  s ::build_base_d
4170: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
4180: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
4190: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c  g length $::buil
41a0: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
41b0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
41c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
41d0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
41e0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  cation of the bu
41f0: 69 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f  ild base directo
4200: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
4210: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
4220: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
4230: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
4240: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
4250: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4260: 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69  $::build_base_di
4270: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
4280: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
4290: 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64  xists ::common_d
42a0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
42b0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
42c0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d  g length $::comm
42d0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  on_directory] > 
42e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
42f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4300: 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c  NOTE: Next, fall
4310: 62 61 63 6b 20 74 6f 20 74 68 65 20 67 72 61 6e  back to the gran
4320: 64 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72  dparent director
4330: 79 20 6f 66 20 74 68 65 20 6f 6e 65 0d 0a 20 20  y of the one..  
4340: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
4350: 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
4360: 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e  le (i.e. "common
4370: 2e 65 61 67 6c 65 22 29 2c 20 69 66 20 61 76 61  .eagle"), if ava
4380: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
4390: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
43a0: 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  rn [file dirname
43b0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
43c0: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
43d0: 72 79 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ry]]..      } el
43e0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
43f0: 74 73 20 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d  ts ::path] && \.
4400: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4410: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74  ng length $::pat
4420: 68 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  h] > 0} then {..
4430: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4440: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c     # NOTE: Final
4450: 6c 79 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  ly, fallback to 
4460: 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
4470: 74 6f 72 79 20 6f 66 20 74 68 65 20 45 61 67 6c  tory of the Eagl
4480: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23  eTest..        #
4490: 20 20 20 20 20 20 20 70 61 74 68 2e 20 20 54 68         path.  Th
44a0: 65 20 45 61 67 6c 65 54 65 73 74 20 70 61 63 6b  e EagleTest pack
44b0: 61 67 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  age guarantees t
44c0: 68 61 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  hat this variabl
44d0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
44e0: 20 20 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74     will be set t
44f0: 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  o the directory 
4500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
4510: 69 72 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20  irst file to..  
4520: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
4530: 65 63 75 74 65 20 74 68 65 20 5b 72 75 6e 54 65  ecute the [runTe
4540: 73 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69  stPrologue] scri
4550: 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65  pt library proce
4560: 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  dure...        #
4570: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4580: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
4590: 3a 3a 70 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ::path]..      }
45a0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
45b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
45c0: 54 45 3a 20 4e 6f 20 70 61 74 68 20 69 73 20 61  TE: No path is a
45d0: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
45e0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
45f0: 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20  .  This point.. 
4600: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
4610: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 61  hould not be rea
4620: 63 68 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ched...        #
4630: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4640: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
4650: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4660: 20 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61   getSQLiteTestDa
4670: 74 61 50 61 74 68 20 7b 7d 20 7b 0d 0a 20 20 20  taPath {} {..   
4680: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4690: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
46a0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
46b0: 72 65 20 61 6c 6c 20 74 68 65 20 74 65 73 74 20  re all the test 
46c0: 64 61 74 61 20 66 69 6c 65 73 20 73 68 6f 75 6c  data files shoul
46d0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
46e0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 54 68   be located.  Th
46f0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  is should be the
4700: 20 22 64 61 74 61 22 20 64 69 72 65 63 74 6f 72   "data" director
4710: 79 20 62 65 6e 65 61 74 68 20 74 68 65 0d 0a 20  y beneath the.. 
4720: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
4730: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
4740: 67 20 74 68 65 20 61 63 74 75 61 6c 20 74 65 73  g the actual tes
4750: 74 20 73 63 72 69 70 74 73 2e 0d 0a 20 20 20 20  t scripts...    
4760: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
4770: 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a  n [file join $::
4780: 70 61 74 68 20 64 61 74 61 5d 0d 0a 20 20 20 20  path data]..    
4790: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
47a0: 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 20 7b 7d  sRunningWoW64 {}
47b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
47c0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
47d0: 6f 77 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65  ow, just use the
47e0: 20 65 78 69 73 74 69 6e 67 20 74 65 73 74 20 63   existing test c
47f0: 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 64 65  onstraint for de
4800: 74 65 63 74 69 6e 67 0d 0a 20 20 20 20 20 20 23  tecting..      #
4810: 20 20 20 20 20 20 20 61 20 57 6f 57 36 34 20 70         a WoW64 p
4820: 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23  rocess...      #
4830: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
4840: 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 77  haveConstraint w
4850: 6f 77 36 34 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ow64]..    }....
4860: 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65  .    proc isMixe
4870: 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20  dModeAssembly { 
4880: 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
4890: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
48a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
48b0: 3a 20 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75  : First, make su
48c0: 72 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74  re the test suit
48d0: 65 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  e infrastructure
48e0: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a   is allowed to..
48f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
4900: 65 20 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d  e the [exec] com
4910: 6d 61 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mand...      #..
4920: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
4930: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65   exists ::no(exe
4940: 63 29 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78  c)] && ![info ex
4950: 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61  ists ::no(corFla
4960: 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gs)]} then {..  
4970: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4980: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
4990: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46  location of CorF
49a0: 6c 61 67 73 20 69 73 20 70 72 65 73 65 6e 74 20  lags is present 
49b0: 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65  in the environme
49c0: 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nt,..        #  
49d0: 20 20 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68       use it; oth
49e0: 65 72 77 69 73 65 20 61 73 73 75 6d 65 20 69 74  erwise assume it
49f0: 20 69 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e   is in the PATH.
4a00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4a10: 20 20 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67       set corFlag
4a20: 73 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  s [expr {..     
4a30: 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74       [info exist
4a40: 73 20 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73  s ::env(CorFlags
4a50: 29 5d 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46  )] ? $::env(CorF
4a60: 6c 61 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67  lags) : "CorFlag
4a70: 73 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  s"..        }]..
4a80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4a90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
4aa0: 65 6d 70 74 20 74 6f 20 65 78 65 63 75 74 65 20  empt to execute 
4ab0: 43 6f 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20  CorFlags on the 
4ac0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d  specified file..
4ad0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4ae0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
4af0: 0d 0a 20 20 20 20 20 20 20 20 20 20 65 78 65 63  ..          exec
4b00: 20 2d 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66   -- $corFlags [f
4b10: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24  ile nativename $
4b20: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
4b30: 20 20 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d     } exec] == 0}
4b40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4b50: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4b60: 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65  # NOTE: If reque
4b70: 73 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  sted by our call
4b80: 65 72 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64  er, attempt to d
4b90: 65 74 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20  etermine the..  
4ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4bb0: 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65  platform for the
4bc0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
4bd0: 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20  as well...      
4be0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4bf0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
4c00: 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
4c10: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
4c20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4c30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
4c40: 6f 72 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ore the platform
4c50: 20 69 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61   in the named va
4c60: 72 69 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20  riable in the.. 
4c70: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
4c80: 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
4c90: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
4ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4cb0: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
4cc0: 61 72 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d  arName platform.
4cd0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
4ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
4cf0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
4d00: 20 65 78 74 72 61 63 74 20 74 68 65 20 50 45 20   extract the PE 
4d10: 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61  line from the ca
4d20: 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20  ptured..        
4d30: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
4d40: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
4d50: 75 65 20 69 73 20 22 50 45 33 32 22 20 6f 72 20  ue is "PE32" or 
4d60: 22 50 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20  "PE32+", the..  
4d70: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4d80: 20 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20    assembly file 
4d90: 69 73 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d  is 32-bit or 64-
4da0: 62 69 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  bit, respectivel
4db0: 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y;..            
4dc0: 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73  #       otherwis
4dd0: 65 2c 20 69 74 73 20 74 79 70 65 20 69 73 20 75  e, its type is u
4de0: 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20  nknown...       
4df0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4e00: 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20      set pattern 
4e10: 7b 5e 50 45 20 20 20 20 20 20 20 20 3a 20 28 50  {^PE        : (P
4e20: 45 33 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d  E32|PE32\+)\s+$}
4e30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4e40: 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e  if {[regexp -lin
4e50: 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65  e -- $pattern $e
4e60: 78 65 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d  xec dummy pe32]}
4e70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4e80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e90: 20 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20          # HACK: 
4ea0: 54 68 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73  This [switch] as
4eb0: 73 75 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69  sumes that 32-bi
4ec0: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
4ed0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
4ee0: 20 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20   #       always 
4ef0: 78 38 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d  x86 and that 64-
4f00: 62 69 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  bit executables 
4f10: 61 72 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20  are always..    
4f20: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4f30: 20 20 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20    x64...        
4f40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4f50: 20 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65         switch -e
4f60: 78 61 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d  xact -- $pe32 {.
4f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f80: 20 50 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20   PE32 {..       
4f90: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
4fa0: 6c 61 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20  latform Win32.. 
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4fd0: 20 20 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20    PE32+ {..     
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4ff0: 20 70 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20   platform x64.. 
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5020: 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20    default {..   
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5040: 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a  et platform ""..
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
5070: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
5080: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5090: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
50a0: 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20  form ""..       
50b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
50c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
50d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
50e0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
50f0: 20 65 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f   extract the ILO
5100: 4e 4c 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68  NLY line from th
5110: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
5120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 75        #       ou
5130: 74 70 75 74 2e 20 20 49 66 20 74 68 69 73 20 76  tput.  If this v
5140: 61 6c 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68  alue is zero, th
5150: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
5160: 20 6d 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20   must..         
5170: 20 23 20 20 20 20 20 20 20 62 65 20 61 20 6d 69   #       be a mi
5180: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
5190: 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74  y; otherwise, it
51a0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a   contains only..
51b0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
51c0: 20 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e    managed compon
51d0: 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ents...         
51e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
51f0: 74 20 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e  t pattern {^ILON
5200: 4c 59 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b  LY    : (0|1)\s+
5210: 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  $}....          
5220: 69 66 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69  if {![regexp -li
5230: 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24  ne -- $pattern $
5240: 65 78 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c  exec dummy ilOnl
5250: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
5260: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
5270: 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
5280: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
5290: 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65  f {!$ilOnly} the
52a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
52b0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
52c0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
52d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
52e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
52f0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74  # NOTE: If the t
5300: 65 73 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74  est suite cannot
5310: 20 75 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65   use [exec] or e
5320: 78 65 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46  xecution of CorF
5330: 6c 61 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20  lags..      #   
5340: 20 20 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75      failed, retu
5350: 72 6e 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20  rn false...     
5360: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
5370: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
5380: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 4e 61  ..    proc getNa
5390: 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
53a0: 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20  amesOnly {} {.. 
53b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
53c0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65  NOTE: First, che
53d0: 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f  ck if the list o
53e0: 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  f native library
53f0: 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20   file names has 
5400: 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
5410: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65      manually ove
5420: 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20  rridden...      
5430: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
5440: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 61 74 69  fo exists ::nati
5450: 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f  ve_library_file_
5460: 6e 61 6d 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20  names] && \..   
5470: 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20         [llength 
5480: 24 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72  $::native_librar
5490: 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20  y_file_names] > 
54a0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
54b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
54c0: 4e 4f 54 45 3a 20 54 68 65 20 6c 69 73 74 20 6f  NOTE: The list o
54d0: 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  f native library
54e0: 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20   file names has 
54f0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
5500: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5510: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
5520: 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20   it verbatim... 
5530: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5540: 20 20 72 65 74 75 72 6e 20 24 3a 3a 6e 61 74 69    return $::nati
5550: 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f  ve_library_file_
5560: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65  names..      } e
5570: 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77  lseif {[isWindow
5580: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
5590: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
55a0: 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65   NOTE: Otherwise
55b0: 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61 6c  , on Windows, al
55c0: 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65 66  ways use the def
55d0: 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d 0a  ault file name..
55e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
55f0: 22 73 71 6c 69 74 65 33 2e 64 6c 6c 22 2e 0d 0a  "sqlite3.dll"...
5600: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5610: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
5620: 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20  sqlite3.dll]..  
5630: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
5640: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5650: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
5660: 73 65 2c 20 72 65 74 75 72 6e 20 62 6f 74 68 20  se, return both 
5670: 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53 49  the generic POSI
5680: 58 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  X file name and 
5690: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
56a0: 20 20 20 20 20 4d 61 63 20 4f 53 20 58 20 66 69       Mac OS X fi
56b0: 6c 65 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20 77  le name, since w
56c0: 65 20 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e 74  e do not current
56d0: 6c 79 20 68 61 76 65 20 61 6e 20 65 61 73 79 0d  ly have an easy.
56e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
56f0: 20 77 61 79 20 74 6f 20 64 65 74 65 63 74 20 77   way to detect w
5700: 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 70 6c  hich of those pl
5710: 61 74 66 6f 72 6d 73 20 77 65 20 61 72 65 20 72  atforms we are r
5720: 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20 20  unning on...    
5730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5740: 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 73  eturn [list libs
5750: 71 6c 69 74 65 33 2e 64 79 6c 69 62 20 6c 69 62  qlite3.dylib lib
5760: 73 71 6c 69 74 65 33 2e 73 6f 5d 0d 0a 20 20 20  sqlite3.so]..   
5770: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
5780: 20 20 20 20 70 72 6f 63 20 67 65 74 49 6e 74 65      proc getInte
5790: 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e  ropAssemblyFileN
57a0: 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20  amesOnly {} {.. 
57b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
57c0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65  NOTE: First, che
57d0: 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f  ck if the list o
57e0: 66 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  f interop assemb
57f0: 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61  ly file names ha
5800: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
5810: 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f        manually o
5820: 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20  verridden...    
5830: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
5840: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 69 6e  info exists ::in
5850: 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66  terop_assembly_f
5860: 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d  ile_names] && \.
5870: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
5880: 67 74 68 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61  gth $::interop_a
5890: 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d  ssembly_file_nam
58a0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
58b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
58c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
58d0: 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70 20  list of interop 
58e0: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
58f0: 6d 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  mes has been ove
5900: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
5910: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
5920: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
5930: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
5940: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5950: 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73 65   $::interop_asse
5960: 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 0d  mbly_file_names.
5970: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
5980: 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68  {[isWindows]} th
5990: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
59a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
59b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 6f 6e 20 57   Otherwise, on W
59c0: 69 6e 64 6f 77 73 2c 20 61 6c 77 61 79 73 20 75  indows, always u
59d0: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  se the default f
59e0: 69 6c 65 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20  ile name..      
59f0: 20 20 23 20 20 20 20 20 20 20 22 53 51 4c 69 74    #       "SQLit
5a00: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 2e 0d  e.Interop.dll"..
5a10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5a20: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
5a30: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
5a40: 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  dll]..      } el
5a50: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
5a60: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
5a70: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
5a80: 72 6e 20 62 6f 74 68 20 74 68 65 20 67 65 6e 65  rn both the gene
5a90: 72 69 63 20 50 4f 53 49 58 20 66 69 6c 65 20 6e  ric POSIX file n
5aa0: 61 6d 65 20 61 6e 64 20 74 68 65 0d 0a 20 20 20  ame and the..   
5ab0: 20 20 20 20 20 23 20 20 20 20 20 20 20 4d 61 63       #       Mac
5ac0: 20 4f 53 20 58 20 66 69 6c 65 20 6e 61 6d 65 2c   OS X file name,
5ad0: 20 73 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   since we do not
5ae0: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20   currently have 
5af0: 61 6e 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  an easy..       
5b00: 20 23 20 20 20 20 20 20 20 77 61 79 20 74 6f 20   #       way to 
5b10: 64 65 74 65 63 74 20 77 68 69 63 68 20 6f 66 20  detect which of 
5b20: 74 68 6f 73 65 20 70 6c 61 74 66 6f 72 6d 73 20  those platforms 
5b30: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f  we are running o
5b40: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  n...        #.. 
5b50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
5b60: 69 73 74 20 6c 69 62 53 51 4c 69 74 65 2e 49 6e  ist libSQLite.In
5b70: 74 65 72 6f 70 2e 64 79 6c 69 62 20 6c 69 62 53  terop.dylib libS
5b80: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 73 6f  QLite.Interop.so
5b90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5ba0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5bb0: 65 74 43 6f 72 65 45 78 74 65 6e 73 69 6f 6e 42  etCoreExtensionB
5bc0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20  inaryFileName { 
5bd0: 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d 20 7b  {default ""} } {
5be0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
5bf0: 4e 61 6d 65 20 5b 67 65 74 43 6f 72 65 42 69 6e  Name [getCoreBin
5c00: 61 72 79 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  aryFileName]....
5c10: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5c20: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5c30: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5c40: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
5c50: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
5c60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65        return $de
5c70: 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  fault..    }....
5c80: 0a 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c  .    proc isBuil
5c90: 64 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74  dAvailable { nat
5ca0: 69 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76  ive directory {v
5cb0: 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
5cc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5cd0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
5ce0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5cf0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
5d00: 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d  he primary assem
5d10: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
5d20: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
5d30: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
5d40: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d  Lite managed com
5d50: 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20  ponents.  It..  
5d60: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
5d70: 6c 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74  ld be noted that
5d80: 20 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66   this assembly f
5d90: 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  ile may also con
5da0: 74 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  tain the..      
5db0: 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63  #       native c
5dc0: 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20  omponents, if a 
5dd0: 6e 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20  native build is 
5de0: 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23  in use...      #
5df0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
5e00: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
5e10: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5e20: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
5e30: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
5e40: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
5e50: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
5e60: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5e70: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5e80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5e90: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
5ea0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5eb0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
5ec0: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
5ed0: 79 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20  y detect if the 
5ee0: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
5ef0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5f00: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74  contains any nat
5f10: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
5f20: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20  if necessary... 
5f30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
5f40: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
5f50: 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20   $native] == 0} 
5f60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5f70: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5f80: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
5f90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5fa0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
5fb0: 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20  Name $varName.. 
5fc0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
5fd0: 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b      set native [
5fe0: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
5ff0: 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76  bly $fileName $v
6000: 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  arName]..      }
6010: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
6020: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
6030: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
6040: 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  ly also contains
6050: 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70   the native comp
6060: 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23  onents,..      #
6070: 20 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65         we have e
6080: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
6090: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
60a0: 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
60b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
60c0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
60d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
60e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
60f0: 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61  f the machine na
6100: 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  me is unavailabl
6110: 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  e, there is noth
6120: 69 6e 67 20 65 6c 73 65 20 77 65 0d 0a 20 20 20  ing else we..   
6130: 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 20 64     #       can d
6140: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
6150: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
6160: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
6170: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
6180: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
6190: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
61a0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
61b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
61c0: 68 61 74 20 69 73 20 74 68 65 20 61 72 63 68 69  hat is the archi
61d0: 74 65 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  tecture for this
61e0: 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20   machine?..     
61f0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72   #..      set ar
6200: 63 68 69 74 65 63 74 75 72 65 20 5b 6d 61 63 68  chitecture [mach
6210: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
6220: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
6230: 63 68 69 6e 65 29 20 74 72 75 65 5d 0d 0a 0d 0a  chine) true]....
6240: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6250: 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74   NOTE: What is t
6260: 68 65 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  he platform for 
6270: 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20  this machine?.. 
6280: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
6290: 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d 61 63 68  t platform [mach
62a0: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
62b0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
62c0: 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20 20  chine)]....     
62d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
62e0: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
62f0: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
6300: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 69 6e   name for the in
6310: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a  terop assembly..
6320: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
6330: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73  ntaining the Sys
6340: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
6350: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
6360: 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20  s.  If this..   
6370: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
6380: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
6390: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
63a0: 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20  g we need...    
63b0: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
63c0: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
63d0: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
63e0: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
63f0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ] {..        set
6400: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
6410: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
6420: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
6430: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6440: 24 61 72 63 68 69 74 65 63 74 75 72 65 20 24 66  $architecture $f
6450: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
6460: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
6470: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
6480: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
6490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
64a0: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
64b0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
64c0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
64d0: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
64e0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
64f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c  .            $pl
6500: 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65  atform $fileName
6510: 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Only]]....      
6520: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
6530: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
6540: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
6550: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
6560: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6570: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
6580: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6590: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
65a0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
65b0: 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f        $fileNameO
65c0: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
65d0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
65e0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
65f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
6600: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
6610: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
6620: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6630: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
6640: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
6650: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
6660: 72 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  r the SQLite cor
6670: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6680: 20 6c 69 62 72 61 72 79 2e 20 20 49 66 20 74 68   library.  If th
6690: 69 73 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  is file exists, 
66a0: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65  we should have e
66b0: 76 65 72 79 74 68 69 6e 67 20 77 65 0d 0a 20 20  verything we..  
66c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64      #       need
66d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
66e0: 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
66f0: 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76  meOnly [getNativ
6700: 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
6710: 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20  sOnly] {..      
6720: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
6730: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
6740: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
6750: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
6760: 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
6770: 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  re $fileNameOnly
6780: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
6790: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
67a0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
67b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
67c0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
67d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
67e0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
67f0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
6800: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
6810: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
6820: 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c    $platform $fil
6830: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
6840: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
6850: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
6860: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
6870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
6880: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
6890: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
68a0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
68b0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
68c0: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
68d0: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
68e0: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
68f0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
6900: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
6910: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
6920: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
6930: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
6940: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
6950: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f  .      # NOTE: O
6960: 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76  ne or more nativ
6970: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65  e components nee
6980: 64 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44 61  ded by System.Da
6990: 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ta.SQLite..     
69a0: 20 23 20 20 20 20 20 20 20 61 72 65 20 6d 69 73   #       are mis
69b0: 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sing...      #..
69c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
69d0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
69e0: 20 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73 65    proc isRelease
69f0: 41 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72 65  Available { dire
6a00: 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22  ctory {varName "
6a10: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  "} } {..      if
6a20: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
6a30: 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20   $varName] > 0} 
6a40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6a50: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
6a60: 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20   $varName..     
6a70: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
6a80: 72 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  rn [isBuildAvail
6a90: 61 62 6c 65 20 22 22 20 24 64 69 72 65 63 74 6f  able "" $directo
6aa0: 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  ry $varName]..  
6ab0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
6ac0: 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74   joinBuildDirect
6ad0: 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61 74  ory { native pat
6ae0: 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d 20  h year platform 
6af0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 65 78  configuration ex
6b00: 74 72 61 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  tra } {..      #
6b10: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6b20: 46 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74  Figure out and t
6b30: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66  hen return the f
6b40: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70  ully qualified p
6b50: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
6b60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6b70: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
6b80: 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d  on all the argum
6b90: 65 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79  ents provided by
6ba0: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
6bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6bc0: 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b  {$native} then {
6bd0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6be0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
6bf0: 68 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61  h bin $year $pla
6c00: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
6c10: 74 69 6f 6e 20 24 65 78 74 72 61 5d 0d 0a 20 20  tion $extra]..  
6c20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
6c30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
6c40: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69  le join $path bi
6c50: 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75  n $year $configu
6c60: 72 61 74 69 6f 6e 20 62 69 6e 20 24 65 78 74 72  ration bin $extr
6c70: 61 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  a]..      }..   
6c80: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6c90: 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
6ca0: 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  y { managedOnly 
6cb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
6cc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20      # NOTE: See 
6cd0: 69 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  if the "native" 
6ce0: 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68  runtime option h
6cf0: 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66  as been set.  If
6d00: 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20   so, use the..  
6d10: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
6d20: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69  ctory for the mi
6d30: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
6d40: 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61  y (a.k.a. the na
6d50: 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20  tive interop..  
6d60: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
6d70: 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c  mbly).  To enabl
6d80: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69  e this option vi
6d90: 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  a the command li
6da0: 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20  ne, enter a..   
6db0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
6dc0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
6dd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
6de0: 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c  ng (all on one l
6df0: 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a  ine):..      #..
6e00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
6e10: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e  gleShell.exe -in
6e20: 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d  itialize -runtim
6e30: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a  eOption native..
6e40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6e50: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
6e60: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
6e70: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
6e80: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
6e90: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
6ea0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69  command line pri
6eb0: 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74 61 20  or to the "beta 
6ec0: 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  16"..      #    
6ed0: 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61     release of Ea
6ee0: 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  gle, the followi
6ef0: 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ng command must 
6f00: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d  be used instead.
6f10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
6f20: 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20  also all on one 
6f30: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
6f40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
6f50: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69  agleShell.exe -i
6f60: 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49  nitialize -postI
6f70: 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20  nitialize..     
6f80: 20 23 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65   #         "obje
6f90: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
6fa0: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
6fb0: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
6fc0: 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20   native"..      
6fd0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
6fe0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
6ff0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
7000: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
7010: 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72  ists ::build_dir
7020: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
7030: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
7040: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
7050: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
7060: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7070: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7080: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
7090: 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  of the build dir
70a0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
70b0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
70c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
70d0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
70e0: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
70f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
7100: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72  urn $::build_dir
7110: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
7120: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7130: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7140: 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
7150: 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
7160: 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69  n is set, the mi
7170: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
7180: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
7190: 20 20 20 69 73 20 62 65 69 6e 67 20 74 65 73 74     is being test
71a0: 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ed.  In that cas
71b0: 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  e, the path to t
71c0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
71d0: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
71e0: 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e      will contain
71f0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
7200: 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62  me and all the b
7210: 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
7220: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
7230: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72      should be pr
7240: 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69  esent in that di
7250: 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65  rectory.  If the
7260: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
7270: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
7280: 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74     option is not
7290: 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20   set, the build 
72a0: 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62  directory will b
72b0: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
72c0: 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
72d0: 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65      "platform-ne
72e0: 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65  utral", with the
72f0: 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69   notable excepti
7300: 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65  on of any native
7310: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7320: 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e    assembly (e.g.
7330: 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70   "SQLite.Interop
7340: 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68  .dll") copied th
7350: 65 72 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a  ere during the..
7360: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7370: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74  build process it
7380: 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75  self.  If the bu
7390: 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65  ild process some
73a0: 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  how does not..  
73b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
73c0: 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 61 73  py the native as
73d0: 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20  sembly for this 
73e0: 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f  platform, most o
73f0: 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20  f the tests..   
7400: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
7410: 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73  the suite will s
7420: 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64  imply be skipped
7430: 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65  .  Generally spe
7440: 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20  aking, there..  
7450: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
7460: 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75  e two ways to bu
7470: 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69 65 73  ild the binaries
7480: 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
7490: 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20  to run the..    
74a0: 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
74b0: 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20   suite:..       
74c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
74d0: 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65      1. Build the
74e0: 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65   separate manage
74f0: 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73  d and native ass
7500: 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f  emblies using so
7510: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
7520: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20         commands 
7530: 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20  similar to:..   
7540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7550: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
7560: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
7570: 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79  tion}ManagedOnly
7580: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
7590: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
75a0: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
75b0: 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76  figuration}Nativ
75c0: 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  eOnly ${Platform
75d0: 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  }..        #..  
75e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
75f0: 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75   Where ${Configu
7600: 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65  ration} is eithe
7610: 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
7620: 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20  lease" and..    
7630: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24      #          $
7640: 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69  {Platform} is ei
7650: 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20  ther "Win32" or 
7660: 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20  "x64"...        
7670: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
7680: 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20     2. Build the 
7690: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
76a0: 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d  bly using a comm
76b0: 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  and similar to:.
76c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
76d0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
76e0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
76f0: 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74  guration} ${Plat
7700: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
7710: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7720: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
7730: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
7740: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
7750: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
7760: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7770: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
7780: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
7790: 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66 20 74   or "x64".  If t
77a0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a  his command is..
77b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
77c0: 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73     used, various
77d0: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
77e0: 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72  ire supplementar
77f0: 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  y managed..     
7800: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61 73     #          as
7810: 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c  semblies (e.g. L
7820: 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70  INQ) may be skip
7830: 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65  ped unless those
7840: 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20   binaries..     
7850: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61 72     #          ar
7860: 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63  e subsequently c
7870: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
7880: 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f 72 79  orrect directory
7890: 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20   (i.e. by..     
78a0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 22 74     #          "t
78b0: 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a  est_all.bat")...
78c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
78d0: 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20     #       Note 
78e0: 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20  that all of the 
78f0: 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61  build commands a
7900: 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c  bove will defaul
7910: 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20  t to using..    
7920: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
7930: 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f  latest version o
7940: 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61  f MSBuild availa
7950: 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74 65 73  ble and the "tes
7960: 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20  t_year" may..   
7970: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 65       #       nee
7980: 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  d to be adjusted
7990: 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20   accordingly to 
79a0: 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65  actually run the
79b0: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
79c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 52 65        #       Re
79d0: 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  fer to the comme
79e0: 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64  nts in [getBuild
79f0: 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69  Year] for more i
7a00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20  nformation on.. 
7a10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
7a20: 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73 20 76  ow to set this v
7a30: 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ariable...      
7a40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
7a50: 20 6e 61 74 69 76 65 20 5b 65 78 70 72 20 7b 21   native [expr {!
7a60: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 26 26 20  $managedOnly && 
7a70: 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
7a80: 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d 0a 0d 0a 20  n native]}].... 
7a90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
7aa0: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
7ab0: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
7ac0: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
7ad0: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
7ae0: 20 5b 65 78 70 72 20 7b 24 6d 61 6e 61 67 65 64   [expr {$managed
7af0: 4f 6e 6c 79 20 3f 20 5b 67 65 74 42 75 69 6c 64  Only ? [getBuild
7b00: 59 65 61 72 5d 20 3a 20 5b 67 65 74 42 75 69 6c  Year] : [getBuil
7b10: 64 4e 61 74 69 76 65 59 65 61 72 5d 7d 5d 20 5c  dNativeYear]}] \
7b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
7b30: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
7b40: 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42 75 69  $native] [getBui
7b50: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
7b60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7b70: 5b 65 78 70 72 20 7b 24 6d 61 6e 61 67 65 64 4f  [expr {$managedO
7b80: 6e 6c 79 20 3f 20 5b 67 65 74 42 75 69 6c 64 45  nly ? [getBuildE
7b90: 78 74 72 61 5d 20 3a 20 22 22 7d 5d 5d 0d 0a 20  xtra] : ""}]].. 
7ba0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
7bb0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 65  ..    proc getRe
7bc0: 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20  leaseVersion {} 
7bd0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
7be0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
7bf0: 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73 65   out the release
7c00: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65   version for use
7c10: 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64 20   with the build 
7c20: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
7c30: 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63 68   #       when ch
7c40: 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c  ecking for avail
7c50: 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a  able releases...
7c60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
7c70: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
7c80: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
7c90: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
7ca0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
7cb0: 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  h $::release_ver
7cc0: 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
7cd0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
7ce0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
7cf0: 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  e release versio
7d00: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  n has been overr
7d10: 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65  idden; therefore
7d20: 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  , use it..      
7d30: 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61 74    #       verbat
7d40: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
7d50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
7d60: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
7d70: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
7d80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
7d90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
7da0: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
7db0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
7dc0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
7dd0: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
7de0: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
7df0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
7e00: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
7e10: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
7e20: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
7e30: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
7e40: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
7e50: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
7e60: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
7e70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
7e80: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
7e90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7ea0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69   proc getBuildFi
7eb0: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
7ec0: 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70  e managedOnly {p
7ed0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
7ee0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7ef0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
7f00: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
7f10: 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74  le name as if it
7f20: 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e   were located in
7f30: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
7f40: 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63 74      build direct
7f50: 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20  ory, discarding 
7f60: 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e  any directory in
7f70: 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e  formation presen
7f80: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7f90: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d   in the file nam
7fa0: 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62 79  e as provided by
7fb0: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
7fc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
7fd0: 20 72 65 73 75 6c 74 20 5b 66 69 6c 65 20 6e 61   result [file na
7fe0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
7ff0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
8000: 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74   [getBuildDirect
8010: 6f 72 79 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79  ory $managedOnly
8020: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  ] $platform \.. 
8030: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
8040: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d  ail $fileName]]]
8050: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8060: 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20     # HACK: When 
8070: 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34  running on WoW64
8080: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 65 73  , assume the tes
8090: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
80a0: 65 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  e present..     
80b0: 20 23 20 20 20 20 20 20 20 77 69 74 68 20 74 68   #       with th
80c0: 65 20 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e  e "32" suffix on
80d0: 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d   them...      #.
80e0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75  .      if {[isRu
80f0: 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b  nningWoW64] && [
8100: 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24  file extension $
8110: 72 65 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65  result] eq ".exe
8120: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
8130: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61     set result [a
8140: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
8150: 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74  rootname $result
8160: 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20  ] 32.exe]..     
8170: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
8180: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
8190: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
81a0: 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74  etExternalDirect
81b0: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
81c0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
81d0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
81e0: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
81f0: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
8200: 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d  external binary.
8210: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
8220: 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64  iles are located
8230: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8240: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
8250: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
8260: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72         [file dir
8270: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
8280: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
8290: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d   [info binary]]]
82a0: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
82b0: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
82c0: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
82d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
82e0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
82f0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
8300: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
8310: 65 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69  e the test appli
8320: 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  cation..      # 
8330: 20 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e        itself (i.
8340: 65 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  e. the Eagle she
8350: 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20  ll) is located. 
8360: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73   This will be us
8370: 65 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20  ed as..      #  
8380: 20 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61       the destina
8390: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70  tion for the cop
83a0: 69 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ied System.Data.
83b0: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e  SQLite native an
83c0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
83d0: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
83e0: 69 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73  ies (i.e. becaus
83f0: 65 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66  e this is one of
8400: 20 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d   the few places.
8410: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
8420: 68 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c  here the CLR wil
8430: 6c 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20  l actually find 
8440: 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72  and load them pr
8450: 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20  operly)...      
8460: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
8470: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61  fo exists ::bina
8480: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
8490: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
84a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
84b0: 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79  binary_directory
84c0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
84d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
84e0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
84f0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69  cation of the bi
8500: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68  nary directory h
8510: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
8520: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
8530: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
8540: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
8550: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8560: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62       return $::b
8570: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  inary_directory.
8580: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
8590: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
85a0: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20  [info binary].. 
85b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
85c0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78  ..    proc getEx
85d0: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b  ternalFileName {
85e0: 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20   fileName } {.. 
85f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
8600: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
8610: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
8620: 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77   name as if it w
8630: 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74  ere located in t
8640: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
8650: 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74    directory cont
8660: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72  aining the exter
8670: 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20  nal binaries... 
8680: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
8690: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
86a0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
86b0: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72   [getExternalDir
86c0: 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d  ectory] $fileNam
86d0: 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  e]]..    }..... 
86e0: 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72     proc getBinar
86f0: 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  yFileName { file
8700: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
8710: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
8720: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
8730: 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69  eturns the speci
8740: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61  fied file name a
8750: 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63  s if it were loc
8760: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
8770: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
8780: 79 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  y directory, dis
8790: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
87a0: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
87b0: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
87c0: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
87d0: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
87e0: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
87f0: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
8800: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
8810: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
8820: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8830: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
8840: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
8850: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
8860: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20  fileName]]]..   
8870: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8880: 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c  getCoreBinaryFil
8890: 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72  eName { {platfor
88a0: 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20  m ""} {standard 
88b0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
88c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
88d0: 52 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c  Returns the full
88e0: 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69   path for the fi
88f0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
8900: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20  e SQLite core.. 
8910: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
8920: 69 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65  ive library code
8930: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
8940: 72 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63  rm.  First, chec
8950: 6b 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20  k and see if..  
8960: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
8970: 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69  SQLite core nati
8980: 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61  ve library has a
8990: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
89a0: 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20  ed.  Next,..    
89b0: 20 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61    #       fallba
89c0: 63 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66  ck to what the f
89d0: 75 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20  ull path should 
89e0: 62 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65  be, based on whe
89f0: 74 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20  ther the..      
8a00: 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f  #       mixed-mo
8a10: 64 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62  de assembly is b
8a20: 65 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68  eing used and th
8a30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
8a40: 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  rrent..      #  
8a50: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a       platform...
8a60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8a70: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
8a80: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
8a90: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
8aa0: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
8ab0: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
8ac0: 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
8ad0: 69 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69  iveMethods _SQLi
8ae0: 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69  teNativeModuleFi
8af0: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20  leName..      } 
8b00: 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26  fileName] == 0 &
8b10: 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  & [string length
8b20: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d   $fileName] > 0}
8b30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8b40: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8b50: 54 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63  TE: The SQLite c
8b60: 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ore native libra
8b70: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ry has already b
8b80: 65 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a  een loaded via..
8b90: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8ba0: 74 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  the native libra
8bb0: 72 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20  ry pre-loader.  
8bc0: 52 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65  Return that file
8bd0: 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   name now...    
8be0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
8bf0: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
8c00: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8c10: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8c20: 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
8c30: 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
8c40: 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2c 20  n has been set, 
8c50: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  always return th
8c60: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8c70: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
8c80: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
8c90: 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 23  sembly...      #
8ca0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73  ..      if {[has
8cb0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
8cc0: 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
8cd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8ce0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
8cf0: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
8d00: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
8d10: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
8d20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
8d30: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
8d40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
8d50: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
8d60: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
8d70: 70 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e  platform System.
8d80: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
8d90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
8da0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8db0: 4f 54 45 3a 20 41 72 65 20 77 65 20 61 74 74 65  OTE: Are we atte
8dc0: 6d 70 74 69 6e 67 20 74 6f 20 61 75 74 6f 6d 61  mpting to automa
8dd0: 74 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 77  tically detect w
8de0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
8df0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8e00: 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
8e10: 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
8e20: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
8e30: 20 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20    set automatic 
8e40: 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c  [expr {[string l
8e50: 65 6e 67 74 68 20 24 73 74 61 6e 64 61 72 64 5d  ength $standard]
8e60: 20 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20 20 20 20   == 0}]....     
8e70: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8e80: 3a 20 46 69 72 73 74 2c 20 69 6e 20 65 69 74 68  : First, in eith
8e90: 65 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f  er "automatic" o
8ea0: 72 20 22 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 22  r "non-standard"
8eb0: 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d 70 74 0d   modes, attempt.
8ec0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
8ed0: 6f 20 66 69 6e 64 20 74 68 65 20 6e 61 74 69 76  o find the nativ
8ee0: 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61  e-only interop a
8ef0: 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
8f00: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75  #..      if {$au
8f10: 74 6f 6d 61 74 69 63 20 7c 7c 20 21 24 73 74 61  tomatic || !$sta
8f20: 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20  ndard} then {.. 
8f30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8f40: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
8f50: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  t to determine t
8f60: 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69  he native-only i
8f70: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
8f80: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  file..        # 
8f90: 20 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74        name for t
8fa0: 68 69 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64  his platform and
8fb0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e   then return it.
8fc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8fd0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
8fe0: 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 49 6e  eNameOnly [getIn
8ff0: 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c  teropAssemblyFil
9000: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
9010: 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
9020: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
9030: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
9040: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
9050: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
9060: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
9070: 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  m $fileNameOnly]
9080: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
9090: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
90a0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
90b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
90c0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
90d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
90e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
90f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9100: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 6e      # NOTE: Then
9110: 2c 20 69 6e 20 65 69 74 68 65 72 20 22 61 75 74  , in either "aut
9120: 6f 6d 61 74 69 63 22 20 6f 72 20 22 73 74 61 6e  omatic" or "stan
9130: 64 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74  dard" modes, att
9140: 65 6d 70 74 20 74 6f 0d 0a 20 20 20 20 20 20 23  empt to..      #
9150: 20 20 20 20 20 20 20 66 69 6e 64 20 74 68 65 20         find the 
9160: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
9170: 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20  library...      
9180: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 61 75  #..      if {$au
9190: 74 6f 6d 61 74 69 63 20 7c 7c 20 24 73 74 61 6e  tomatic || $stan
91a0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
91b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
91c0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
91d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
91e0: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74  e native-only st
91f0: 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69  andard SQLite li
9200: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  brary..        #
9210: 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65         file name
9220: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
9230: 72 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  rm and then retu
9240: 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  rn it...        
9250: 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
9260: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
9270: 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72  [getNativeLibrar
9280: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
9290: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
92a0: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
92b0: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
92d0: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
92e0: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
92f0: 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f  tform $fileNameO
9300: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
9310: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
9320: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
9330: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9340: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
9350: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
9360: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
9370: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
9380: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
9390: 57 61 73 20 74 68 65 20 6d 61 6e 61 67 65 64 20  Was the managed 
93a0: 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65  assembly compile
93b0: 64 20 65 78 70 65 63 74 69 6e 67 20 74 6f 20 64  d expecting to d
93c0: 65 61 6c 20 77 69 74 68 20 74 68 65 0d 0a 20 20  eal with the..  
93d0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 61 6e      #       stan
93e0: 64 61 72 64 20 63 6f 72 65 20 6c 69 62 72 61 72  dard core librar
93f0: 79 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y?..      #..   
9400: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
9410: 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
9420: 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44   SQLITE_STANDARD
9430: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
9440: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9450: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
9460: 6f 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  o returning the 
9470: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e  native-only stan
9480: 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72  dard SQLite libr
9490: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
94a0: 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66       file name f
94b0: 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 2e  or the platform.
94c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
94d0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
94e0: 65 73 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76  esOnly [getNativ
94f0: 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65  eLibraryFileName
9500: 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  sOnly]....      
9510: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
9520: 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d  fileNamesOnly] =
9530: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
9540: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
9550: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
9560: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
9570: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
9580: 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
9590: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
95a0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
95b0: 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20  latform [lindex 
95c0: 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30  $fileNamesOnly 0
95d0: 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ]]]..      } els
95e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
95f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9600: 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75  Fallback to retu
9610: 72 6e 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  rning the native
9620: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
9630: 73 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20  sembly file..   
9640: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
9650: 65 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  e for the platfo
9660: 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm...        #..
9670: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
9680: 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 49 6e  NamesOnly [getIn
9690: 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c  teropAssemblyFil
96a0: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20  eNamesOnly].... 
96b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
96c0: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e  gth $fileNamesOn
96d0: 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ly] == 0} then {
96e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
96f0: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d  rn ""..        }
9700: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
9710: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
9720: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
9730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
9740: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
9750: 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69  y] $platform [li
9760: 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f  ndex $fileNamesO
9770: 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20  nly 0]]]..      
9780: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
9790: 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44   proc getCommonD
97a0: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
97b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
97c0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
97d0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
97e0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
97f0: 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74   the test script
9800: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
9810: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
9820: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
9830: 20 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72   this just retur
9840: 6e 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  ns the Eagle..  
9850: 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61      #       bina
9860: 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20  ry directory... 
9870: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9880: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9890: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
98a0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
98b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
98c0: 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65  h $::common_dire
98d0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
98e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
98f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
9900: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
9910: 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74  he common direct
9920: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
9930: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
9940: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
9950: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
9960: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9970: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
9980: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
9990: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
99a0: 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  ts ::vendor_dire
99b0: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
99c0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
99d0: 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f  ength $::vendor_
99e0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
99f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9a00: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9a10: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
9a20: 6f 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69  of the vendor di
9a30: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
9a40: 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23   set;..        #
9a50: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
9a60: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
9a70: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
9a80: 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  turn $::vendor_d
9a90: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9aa0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
9ab0: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62  exists ::tcl_lib
9ac0: 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  rary] && \..    
9ad0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
9ae0: 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72  ngth $::tcl_libr
9af0: 61 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  ary] > 0 && \.. 
9b00: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69           [file i
9b10: 73 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63  sdirectory $::tc
9b20: 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e  l_library]} then
9b30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
9b40: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
9b50: 68 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68  he variable with
9b60: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
9b70: 20 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72   the script libr
9b80: 61 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20  ary is..        
9b90: 23 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20  #       set and 
9ba0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20  appears to be a 
9bb0: 72 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28  real directory (
9bc0: 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65  i.e. not embedde
9bd0: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
9be0: 20 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65     within a file
9bf0: 29 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73  ); therefore, us
9c00: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
9c10: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9c20: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d   $::tcl_library.
9c30: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
9c40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9c50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c      # NOTE: Fall
9c60: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65  back to the dire
9c70: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
9c80: 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e   the executable.
9c90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9ca0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66       return [inf
9cb0: 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20  o binary]..     
9cc0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9cd0: 20 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61    proc getDataba
9ce0: 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  seDirectory {} {
9cf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9d00: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
9d10: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
9d20: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
9d30: 65 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74  ere the test dat
9d40: 61 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20  abases..      # 
9d50: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
9d60: 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66  located.  By def
9d70: 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20  ault, this just 
9d80: 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61  uses the tempora
9d90: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
9da0: 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66    directory conf
9db0: 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20  igured for this 
9dc0: 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23  system...      #
9dd0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9de0: 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62  o exists ::datab
9df0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  ase_directory] &
9e00: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
9e10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
9e20: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
9e30: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
9e40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9e50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
9e60: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
9e70: 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
9e80: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
9e90: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
9ea0: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
9eb0: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
9ec0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9ed0: 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62   return $::datab
9ee0: 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ase_directory.. 
9ef0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
9f00: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63  info exists ::sc
9f10: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
9f20: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
9f30: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
9f40: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
9f50: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
9f60: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
9f70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
9f80: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
9f90: 65 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74  e scratch direct
9fa0: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
9fb0: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
9fc0: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
9fd0: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
9fe0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9ff0: 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74   return $::scrat
a000: 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ch_directory..  
a010: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
a020: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65        return [ge
a030: 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d  tTemporaryPath].
a040: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
a050: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
a060: 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
a070: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
a080: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
a090: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
a0a0: 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63  eturns the direc
a0b0: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74  tory where the t
a0c0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a  emporary files..
a0d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
a0e0: 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e  ould be located.
a0f0: 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68    By default, th
a100: 69 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65  is just uses the
a110: 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20   temporary..    
a120: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
a130: 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  ory configured f
a140: 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d  or this system..
a150: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a160: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
a170: 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72   ::temporary_dir
a180: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
a190: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
a1a0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72  length $::tempor
a1b0: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ary_directory] >
a1c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
a1d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
a1e0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
a1f0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ion of the tempo
a200: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68  rary directory h
a210: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
a220: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
a230: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
a240: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
a250: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
a260: 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  rn $::temporary_
a270: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
a280: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
a290: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
a2a0: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
a2b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
a2c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
a2d0: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
a2e0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
a2f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a300: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
a310: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
a320: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
a330: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
a340: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
a350: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
a360: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
a370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
a380: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
a390: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
a3a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a3b0: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
a3c0: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
a3d0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
a3e0: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 65 63      proc getExec
a3f0: 75 74 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d  uteOnSetup {} {.
a400: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
a410: 20 65 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74   exists ::execut
a420: 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c  e_on_setup] && \
a430: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
a440: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78  ing length $::ex
a450: 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20  ecute_on_setup] 
a460: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a480: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
a490: 68 65 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51  he configured SQ
a4a0: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72  L to execute dur
a4b0: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
a4c0: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
a4d0: 20 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64      setup proced
a4e0: 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76  ure (i.e. for ev
a4f0: 65 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73  ery test databas
a500: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a  e connection)...
a510: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a520: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65     return $::exe
a530: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20  cute_on_setup.. 
a540: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a550: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a560: 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66    # NOTE: By def
a570: 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e  ault, there is n
a580: 6f 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65  o SQL to execute
a590: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e   during the conn
a5a0: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
a5b0: 23 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72  #       setup pr
a5c0: 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f  ocedure (i.e. fo
a5d0: 72 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74  r every test dat
a5e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a5f0: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
a600: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
a610: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
a620: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
a630: 74 53 74 72 69 6e 67 4d 61 70 46 6f 72 54 63 6c  tStringMapForTcl
a640: 45 73 63 61 70 65 20 7b 7d 20 7b 0d 0a 20 20 20  Escape {} {..   
a650: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
a660: 5c 5c 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c 5c 5b 20  \\ \\\\ \[ \\\[ 
a670: 5c 5d 20 5c 5c 5c 5d 20 5c 24 20 5c 5c 5c 24 5d  \] \\\] \$ \\\$]
a680: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
a690: 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72  proc getTestOver
a6a0: 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20  ridesPreamble { 
a6b0: 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22  {extraVarNames "
a6c0: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
a6d0: 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74  t varNames [list
a6e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
a6f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61      # NOTE: If a
a700: 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20  vailable, start 
a710: 77 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20  with the master 
a720: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65  list of test ove
a730: 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20  rride..      #  
a740: 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d       variables..
a750: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a760: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
a770: 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65   ::test_override
a780: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
a790: 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74     [llength $::t
a7a0: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e  est_overrides] >
a7b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
a7c0: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
a7d0: 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73   varNames $::tes
a7e0: 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t_overrides..   
a7f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
a800: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
a810: 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f  f requested by o
a820: 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61  ur caller, add a
a830: 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61  ny additional va
a840: 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  riable..      # 
a850: 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63        names to c
a860: 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  opy now...      
a870: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  #..      if {[ll
a880: 65 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e  ength $extraVarN
a890: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
a8a0: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
a8b0: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
a8c0: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d   $extraVarNames.
a8d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a8e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a8f0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72  E: Build the scr
a900: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
a910: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  be returned by p
a920: 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a  rocessing each..
a930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
a940: 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20  riable name and 
a950: 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63  adding the necec
a960: 65 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72  essary script fr
a970: 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20  agments for..   
a980: 20 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20     #       each 
a990: 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  one...      #.. 
a9a0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
a9b0: 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  ""....      fore
a9c0: 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72  ach varName $var
a9d0: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
a9e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
a9f0: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75  TE: Build the qu
aa00: 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76  alified global v
aa10: 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ariable name... 
aa20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aa30: 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d    set fullVarNam
aa40: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
aa50: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20   $varName]....  
aa60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
aa70: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
aa80: 65 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  e variable exist
aa90: 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72   in this interpr
aaa0: 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20  eter context?.. 
aab0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aac0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
aad0: 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  ts $fullVarName]
aae0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
aaf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
ab00: 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20   # NOTE: Append 
ab10: 61 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  a script fragmen
ab20: 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  t to the result 
ab30: 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63  that will correc
ab40: 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tly..          #
ab50: 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20         copy any 
ab60: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20  contained value 
ab70: 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72  to another inter
ab80: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d  preter context..
ab90: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
aba0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
abb0: 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20  esult \n "set " 
abc0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c  $fullVarName " \
abd0: 7b 22 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5c  {" [string map \
abe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
abf0: 5b 67 65 74 53 74 72 69 6e 67 4d 61 70 46 6f 72  [getStringMapFor
ac00: 54 63 6c 45 73 63 61 70 65 5d 20 5b 73 65 74 20  TclEscape] [set 
ac10: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 5d 20 5c  $fullVarName]] \
ac20: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
ac30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
ac40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ac50: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  If the result co
ac60: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
ac70: 72 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  re script fragme
ac80: 6e 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20  nts, append a.. 
ac90: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77       #       new
aca0: 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  line...      #..
acb0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
acc0: 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74  g length $result
acd0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
ace0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
acf0: 73 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d  sult \n..      }
ad00: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
ad10: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
ad20: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76  ....    proc mov
ad30: 65 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  eSystemDataSQLit
ad40: 65 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 7b 72 65  eDllConfig { {re
ad50: 73 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76 65  store false} {ve
ad60: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
ad70: 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63  .      set direc
ad80: 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44  tory [getBinaryD
ad90: 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
ada0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
adb0: 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79  ength $directory
adc0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
add0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
ade0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
adf0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
ae00: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
ae10: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
ae20: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
ae30: 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20   skipped moving 
ae40: 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
ae50: 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c  Lite.dll.config\
ae60: 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ", " \..        
ae70: 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79        "no binary
ae80: 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a   directory\n"]..
ae90: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
aea0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
aeb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
aec0: 74 20 66 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66  t fileName(1) [f
aed0: 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d  ile normalize \.
aee0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
aef0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
af00: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
af10: 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d  ite.dll.config]]
af20: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69  ....      set fi
af30: 6c 65 4e 61 6d 65 28 32 29 20 5b 61 70 70 65 6e  leName(2) [appen
af40: 64 41 72 67 73 20 24 66 69 6c 65 4e 61 6d 65 28  dArgs $fileName(
af50: 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20  1) .moved]....  
af60: 20 20 20 20 69 66 20 7b 24 72 65 73 74 6f 72 65      if {$restore
af70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
af80: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
af90: 74 73 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d  ts $fileName(2)]
afa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
afb0: 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20      file rename 
afc0: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 24 66 69  $fileName(2) $fi
afd0: 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20  leName(1)....   
afe0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
aff0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b000: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b010: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b020: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b040: 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66  --- moved \"" $f
b050: 69 6c 65 4e 61 6d 65 28 32 29 20 22 5c 22 20 74  ileName(2) "\" t
b060: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
b070: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
b080: 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20  me(1) \"\n]..   
b090: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
b0a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b0b0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
b0c0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
b0d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
b0e0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
b0f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
b110: 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e  -- skipped movin
b120: 67 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28  g \"" $fileName(
b130: 32 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  2) \..          
b140: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
b150: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
b160: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
b170: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
b180: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b190: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
b1a0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d  ts $fileName(1)]
b1b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b1c0: 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20      file rename 
b1d0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 24 66 69  $fileName(1) $fi
b1e0: 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20  leName(2)....   
b1f0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b200: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b210: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b220: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b230: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b250: 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66  --- moved \"" $f
b260: 69 6c 65 4e 61 6d 65 28 31 29 20 22 5c 22 20 74  ileName(1) "\" t
b270: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
b280: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
b290: 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20  me(2) \"\n]..   
b2a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
b2b0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b2c0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
b2d0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
b2e0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
b2f0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
b300: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
b320: 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e  -- skipped movin
b330: 67 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28  g \"" $fileName(
b340: 31 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  1) \..          
b350: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
b360: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
b370: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
b380: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
b390: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
b3a0: 20 70 72 6f 63 20 77 72 69 74 65 53 79 73 74 65   proc writeSyste
b3b0: 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 43 6f  mDataSQLiteDllCo
b3c0: 6e 66 69 67 20 7b 20 64 61 74 61 20 7b 76 65 72  nfig { data {ver
b3d0: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
b3e0: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
b3f0: 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79 44 69  ory [getBinaryDi
b400: 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20  rectory]....    
b410: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
b420: 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d  ngth $directory]
b430: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
b440: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b450: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b460: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
b470: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
b480: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
b490: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b4a0: 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c  skipped moving \
b4b0: 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
b4c0: 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22  ite.dll.config\"
b4d0: 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  , " \..         
b4e0: 20 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20       "no binary 
b4f0: 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20  directory\n"].. 
b500: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b510: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
b520: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
b530: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
b540: 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20  normalize \..   
b550: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
b560: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 53 79 73  n $directory Sys
b570: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
b580: 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  dll.config]]....
b590: 20 20 20 20 20 20 77 72 69 74 65 46 69 6c 65 20        writeFile 
b5a0: 24 66 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d  $fileName $data.
b5b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65  ...      if {$ve
b5c0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b5d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
b5e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b600: 2d 20 77 72 6f 74 65 20 5c 22 53 79 73 74 65 6d  - wrote \"System
b610: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
b620: 2e 63 6f 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20 20  .config\"\n"..  
b630: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
b640: 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d  eturn $fileName.
b650: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
b660: 72 6f 63 20 6d 6f 76 65 45 61 67 6c 65 53 68 65  roc moveEagleShe
b670: 6c 6c 4d 64 61 43 6f 6e 66 69 67 20 7b 20 7b 72  llMdaConfig { {r
b680: 65 73 74 6f 72 65 20 66 61 6c 73 65 7d 20 7b 76  estore false} {v
b690: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
b6a0: 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69 72 65  ..      set dire
b6b0: 63 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72 79  ctory [getBinary
b6c0: 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20  Directory]....  
b6d0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
b6e0: 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f 72  length $director
b6f0: 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
b700: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
b710: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b720: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b730: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b740: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b750: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b760: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
b770: 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78   \"EagleShell.ex
b780: 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c 20  e.mda.config\", 
b790: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
b7a0: 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64 69     "no binary di
b7b0: 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20  rectory\n"]..   
b7c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b7d0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
b7e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  }....      set f
b7f0: 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65  ileName(1) [file
b800: 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20   normalize \..  
b810: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
b820: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 45 61  in $directory Ea
b830: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61  gleShell.exe.mda
b840: 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20  .config]]....   
b850: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28     set fileName(
b860: 32 29 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  2) [appendArgs $
b870: 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76  fileName(1) .mov
b880: 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ed]....      if 
b890: 7b 24 72 65 73 74 6f 72 65 7d 20 74 68 65 6e 20  {$restore} then 
b8a0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
b8b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
b8c0: 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20  eName(2)]} then 
b8d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
b8e0: 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61  e rename $fileNa
b8f0: 6d 65 28 32 29 20 24 66 69 6c 65 4e 61 6d 65 28  me(2) $fileName(
b900: 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  1)....          
b910: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
b920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b930: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
b940: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
b950: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
b960: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76         "---- mov
b970: 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  ed \"" $fileName
b980: 28 32 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  (2) "\" to \"" \
b990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b9a0: 20 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c    $fileName(1) \
b9b0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
b9c0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
b9d0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
b9e0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
b9f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
ba00: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
ba10: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
ba20: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ba30: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
ba40: 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24  ped moving \"" $
ba50: 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20  fileName(2) \.. 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ba70: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
ba80: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
ba90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
baa0: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
bab0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
bac0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
bad0: 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20  eName(1)]} then 
bae0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
baf0: 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61  e rename $fileNa
bb00: 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d 65 28  me(1) $fileName(
bb10: 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  2)....          
bb20: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
bb30: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
bb40: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bb50: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bb60: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bb70: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76         "---- mov
bb80: 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  ed \"" $fileName
bb90: 28 31 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  (1) "\" to \"" \
bba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bbb0: 20 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c    $fileName(2) \
bbc0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
bbd0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
bbe0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
bbf0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
bc00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
bc10: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
bc20: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
bc30: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
bc40: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
bc50: 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24  ped moving \"" $
bc60: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20  fileName(1) \.. 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
bc80: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
bc90: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
bca0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
bcb0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
bcc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 77  }.....    proc w
bcd0: 72 69 74 65 45 61 67 6c 65 53 68 65 6c 6c 4d 64  riteEagleShellMd
bce0: 61 43 6f 6e 66 69 67 20 7b 20 64 61 74 61 20 7b  aConfig { data {
bcf0: 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20  verbose true} } 
bd00: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69 72  {..      set dir
bd10: 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72  ectory [getBinar
bd20: 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  yDirectory].... 
bd30: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
bd40: 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f   length $directo
bd50: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
bd60: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
bd70: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
bd80: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
bd90: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
bda0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
bdc0: 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e  -- skipped movin
bdd0: 67 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e 65  g \"EagleShell.e
bde0: 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22 2c  xe.mda.config\",
bdf0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
be00: 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79 20 64      "no binary d
be10: 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20  irectory\n"]..  
be20: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
be30: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
be40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
be50: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
be60: 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20  ormalize \..    
be70: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
be80: 20 24 64 69 72 65 63 74 6f 72 79 20 45 61 67 6c   $directory Eagl
be90: 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
bea0: 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  onfig]]....     
beb0: 20 77 72 69 74 65 46 69 6c 65 20 24 66 69 6c 65   writeFile $file
bec0: 4e 61 6d 65 20 24 64 61 74 61 0d 0a 0d 0a 20 20  Name $data....  
bed0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
bee0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bef0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
bf00: 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
bf10: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f         "---- wro
bf20: 74 65 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c 2e  te \"EagleShell.
bf30: 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c 22  exe.mda.config\"
bf40: 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n"..      }....
bf50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
bf60: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c  leName..    }...
bf70: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70  ..    proc getAp
bf80: 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20  pDomainPreamble 
bf90: 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73  { {prefix ""} {s
bfa0: 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20  uffix ""} } {.. 
bfb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
bfc0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
bfd0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74  dure returns a t
bfe0: 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74  est setup script
bff0: 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62   fragment suitab
c000: 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  le for..      # 
c010: 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e        evaluation
c020: 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74   by an interpret
c030: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e  er created in an
c040: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
c050: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
c060: 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68       domain.  Th
c070: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
c080: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
c090: 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e   will be surroun
c0a0: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
c0b0: 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78        the prefix
c0c0: 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72   and suffix "scr
c0d0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73  ipt fragments" s
c0e0: 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
c0f0: 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23  caller,..      #
c100: 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20         if any.  
c110: 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70  The entire scrip
c120: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
c130: 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74   will be substit
c140: 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20  uted via..      
c150: 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c  #       [subst],
c160: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
c170: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62  of our caller, b
c180: 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75  efore being retu
c190: 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20  rned...      #  
c1a0: 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69       This step i
c1b0: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74  s necessary so t
c1c0: 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64  hat some limited
c1d0: 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61   context informa
c1e0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20  tion,..      #  
c1f0: 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72       primarily r
c200: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65  elated to the te
c210: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
c220: 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  s, can be transf
c230: 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20  erred..      #  
c240: 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
c250: 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69  rpreter in the i
c260: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
c270: 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69  ion domain, maki
c280: 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  ng it..      #  
c290: 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63       able to suc
c2a0: 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65  cessfully run te
c2b0: 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65  sts that require
c2c0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
c2d0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
c2e0: 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20     files in one 
c2f0: 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  of the testing d
c300: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c  irectories.  Cal
c310: 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70  lers should keep
c320: 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   in..      #    
c330: 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65     mind that the
c340: 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61   test script fra
c350: 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75  gment being retu
c360: 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79  rned cannot rely
c370: 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   on..      #    
c380: 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69     any script li
c390: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73  brary procedures
c3a0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72   that are not pr
c3b0: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61  ovided by the Ea
c3c0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  gle..      #    
c3d0: 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61     library packa
c3e0: 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65  ge (i.e. "init.e
c3f0: 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e  agle"), includin
c400: 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64  g those provided
c410: 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20   by..      #    
c420: 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73     the Eagle tes
c430: 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73  t package, unles
c440: 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  s the file conta
c450: 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f  ining them is lo
c460: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
c470: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61      manually via
c480: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68   some other mech
c490: 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69  anism (e.g. by i
c4a0: 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72  ncluding appropr
c4b0: 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  iate..      #   
c4c0: 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71      [package req
c4d0: 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65  uire] or [source
c4e0: 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68  ] commands in th
c4f0: 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66  e prefix or suff
c500: 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ix..      #     
c510: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
c520: 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ts).  Also, all 
c530: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
c540: 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74  ces and all nest
c550: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
c560: 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e    commands (i.e.
c570: 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65   those in square
c580: 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61   brackets) conta
c590: 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61  ined in the fina
c5a0: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
c5b0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
c5c0: 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69   will end up bei
c5d0: 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  ng evaluated in 
c5e0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  the context of t
c5f0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
c600: 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70    calling interp
c610: 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68  reter and not th
c620: 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72  e target interpr
c630: 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20  eter created in 
c640: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
c650: 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c     isolated appl
c660: 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75  ication domain u
c670: 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72  nless the dollar
c680: 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71   signs and/or sq
c690: 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  uare..      #   
c6a0: 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65      brackets are
c6b0: 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65   specially quote
c6c0: 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68  d with backslash
c6d0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
c6e0: 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
c6f0: 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73  vel 1 [list subs
c700: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  t [appendArgs $p
c710: 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20  refix {..       
c720: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
c730: 54 45 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74  TE: The \[object
c740: 5c 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62  \] command may b
c750: 65 20 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d  e missing in som
c760: 65 20 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20  e Eagle core..  
c770: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
c780: 62 72 61 72 79 20 63 6f 6e 66 69 67 75 72 61 74  brary configurat
c790: 69 6f 6e 73 2e 20 20 43 6c 6f 6e 69 6e 67 20 61  ions.  Cloning a
c7a0: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f  nd using the pro
c7b0: 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 20 20  cedure..        
c7c0: 23 20 20 20 20 20 20 20 5c 5b 63 68 61 6e 67 65  #       \[change
c7d0: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
c7e0: 69 6f 6e 5c 5d 20 6d 61 79 20 68 65 6c 70 20 74  ion\] may help t
c7f0: 6f 20 6d 69 74 69 67 61 74 65 20 74 68 69 73 2e  o mitigate this.
c800: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c810: 20 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65       proc change
c820: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
c830: 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
c840: 20 20 20 7b 5b 69 6e 66 6f 20 61 72 67 73 20 63     {[info args c
c850: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
c860: 6d 65 4f 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20 20  meOption]} \..  
c870: 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f            {[info
c880: 20 62 6f 64 79 20 63 68 61 6e 67 65 4e 61 74 69   body changeNati
c890: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d  veRuntimeOption]
c8a0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
c8b0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
c8c0: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
c8d0: 69 6d 65 4f 70 74 69 6f 6e 20 5b 68 61 73 52 75  imeOption [hasRu
c8e0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
c8f0: 76 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ve]..        }..
c900: 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74        } [getTest
c910: 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c  OverridesPreambl
c920: 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73  e [list path tes
c930: 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66  t_channel]] $suf
c940: 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  fix]]]..    }...
c950: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
c960: 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b  pyExternalFile {
c970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
c980: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
c990: 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d   ""} {newFileNam
c9a0: 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74  e ""} {verbose t
c9b0: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
c9c0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
c9d0: 6d 65 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 46  me [getExternalF
c9e0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
c9f0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
ca00: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73  ![file exists $s
ca10: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20  ourceFileName]} 
ca20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ca30: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
ca40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
ca50: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ca60: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ca70: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ca80: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
ca90: 20 63 6f 70 79 69 6e 67 20 65 78 74 65 72 6e 61   copying externa
caa0: 6c 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  l file \"" $sour
cab0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
cad0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
cae0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
caf0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
cb00: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
cb10: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
cb20: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
cb30: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
cb40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
cb50: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
cb60: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
cb70: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
cb80: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
cb90: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
cba0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
cbb0: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
cbc0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
cbd0: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
cbe0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
cbf0: 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74  set targetDirect
cc00: 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
cc10: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
cc20: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
cc30: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
cc40: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
cc50: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
cc60: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
cc70: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b           file mk
cc80: 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63  dir $targetDirec
cc90: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tory..        }.
cca0: 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  ...        file 
ccb0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
ccc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
ccd0: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
cce0: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
ccf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
cd00: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
cd10: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
cd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
cd30: 2d 2d 20 63 6f 70 69 65 64 20 65 78 74 65 72 6e  -- copied extern
cd40: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  al file from \""
cd50: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
cd60: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
cd70: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
cd80: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
cd90: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
cda0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
cdb0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
cdc0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
cdd0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
cde0: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
cdf0: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72  external file fr
ce00: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
ce10: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
ce20: 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22        "\" to \""
ce30: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
ce40: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
ce50: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
ce60: 72 6f 63 20 74 72 79 43 6f 70 79 42 69 6e 61 72  roc tryCopyBinar
ce70: 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20  yFile {..       
ce80: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61       fileName ma
ce90: 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66  nagedOnly {platf
cea0: 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65  orm ""} {newFile
ceb0: 4e 61 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20  Name ""}..      
cec0: 20 20 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74        {verbose t
ced0: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
cee0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
cef0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
cf00: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
cf10: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
cf20: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
cf30: 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c  xists $sourceFil
cf40: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
cf50: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
cf60: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
cf70: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
cf80: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
cf90: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
cfa0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
cfb0: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
cfc0: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
cfd0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
cfe0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cff0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
d000: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
d010: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d020: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
d030: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
d040: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
d050: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
d060: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d070: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
d080: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
d090: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
d0a0: 20 20 20 20 20 20 24 6e 65 77 46 69 6c 65 4e 61        $newFileNa
d0b0: 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  me $managedOnly 
d0c0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
d0d0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
d0e0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
d0f0: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64  leName [getBuild
d100: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
d110: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
d120: 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  e $managedOnly $
d130: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
d140: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
d150: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20  targetDirectory 
d160: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74  [file dirname $t
d170: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a  argetFileName]..
d180: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
d190: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  ch {..        if
d1a0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
d1b0: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
d1c0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d1d0: 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20       file mkdir 
d1e0: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
d1f0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d200: 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
d210: 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46   -force $sourceF
d220: 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46  ileName $targetF
d230: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
d240: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
d250: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
d260: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
d270: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d280: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
d290: 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c  opied binary fil
d2a0: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
d2b0: 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74  ceFileName "\" t
d2c0: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
d2d0: 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65       $targetFile
d2e0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
d2f0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
d300: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d310: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d320: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d330: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
d340: 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79  d to copy binary
d350: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
d360: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
d370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
d380: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
d390: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
d3a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
d3b0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
d3c0: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a  opyBuildFile {..
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
d3e0: 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79  Name managedOnly
d3f0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
d400: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d  newFileName ""}.
d410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 76 65  .            {ve
d420: 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d  rbose true} } {.
d430: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
d440: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  eFileName [getBu
d450: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
d460: 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e  eName $managedOn
d470: 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  ly $platform]...
d480: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
d490: 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65  e exists $source
d4a0: 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
d4b0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
d4c0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
d4e0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d4f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d510: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79  --- skipped copy
d520: 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ing build file \
d530: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
d540: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
d550: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
d560: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
d570: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d580: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
d590: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
d5a0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
d5b0: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e   $newFileName] >
d5c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d5d0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
d5e0: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
d5f0: 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69  yFileName $newFi
d600: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
d610: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
d620: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
d630: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
d640: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
d650: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
d660: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  form]..      }..
d670: 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67  ..      set targ
d680: 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  etDirectory [fil
d690: 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65  e dirname $targe
d6a0: 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  tFileName]....  
d6b0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
d6c0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
d6d0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72  file exists $tar
d6e0: 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74  getDirectory]} t
d6f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
d700: 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72   file mkdir $tar
d710: 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20  getDirectory..  
d720: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d730: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
d740: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
d750: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
d760: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ame..      }] ==
d770: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d780: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d790: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d7a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d7b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
d7c0: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f  d build file fro
d7d0: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
d7e0: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
d7f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d800: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
d810: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
d820: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
d830: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d840: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d850: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d860: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
d870: 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20  copy build file 
d880: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
d890: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
d8a0: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
d8b0: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
d8c0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
d8d0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d8e0: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
d8f0: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
d900: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
d910: 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65  "} {verbose true
d920: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
d930: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
d940: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
d950: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
d960: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
d970: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
d980: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
d990: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
d9a0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
d9b0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
d9c0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
d9d0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d9f0: 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  - skipped deleti
da00: 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ng binary file \
da10: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
da30: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
da40: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
da50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
da60: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
da70: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
da80: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
da90: 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30  $fileName}] == 0
daa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dab0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
dac0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
dad0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
dae0: 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64     "---- deleted
daf0: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
db00: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
db10: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
db20: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
db30: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
db40: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
db50: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
db60: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
db70: 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  e binary file \"
db80: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
db90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
dba0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
dbb0: 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
dbc0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
dbd0: 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65   fileName manage
dbe0: 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20  dOnly {platform 
dbf0: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ""} {verbose tru
dc00: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
dc10: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
dc20: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
dc30: 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f  leName $managedO
dc40: 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  nly $platform]..
dc50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
dc60: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
dc70: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
dc80: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
dc90: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
dca0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
dcb0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
dcc0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
dcd0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
dce0: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
dcf0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
dd00: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
dd10: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
dd20: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
dd30: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
dd40: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
dd50: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
dd60: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
dd70: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
dd80: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
dd90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
dda0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
ddb0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ddc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ddd0: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
dde0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
ddf0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
de00: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
de10: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
de20: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
de30: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
de40: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
de50: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
de60: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
de70: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
de80: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
de90: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
dea0: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
deb0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
dec0: 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c   managedOnly {pl
ded0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20  atform ""} {pdb 
dee0: 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74  true} {verbose t
def0: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
df00: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
df10: 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61   $fileName $mana
df20: 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  gedOnly $platfor
df30: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d  m "" $verbose...
df40: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
df50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
df60: 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
df70: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  e [appendArgs \.
df80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
df90: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c  le rootname $fil
dfa0: 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 6d 61  eName] .pdb] $ma
dfb0: 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66  nagedOnly $platf
dfc0: 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d  orm "" $verbose.
dfd0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
dfe0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
dff0: 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b  DeleteAssembly {
e000: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
e010: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
e020: 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20   ""} {pdb true} 
e030: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
e040: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
e050: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
e060: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
e070: 6d 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20  m $verbose....  
e080: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
e090: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
e0a0: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
e0b0: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  e [appendArgs \.
e0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
e0d0: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c  le rootname $fil
e0e0: 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c  eName] .pdb] $pl
e0f0: 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d  atform $verbose.
e100: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
e110: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
e120: 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66  LoadAssembly { f
e130: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
e140: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
e150: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67   set fileName [g
e160: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
e170: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
e180: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
e190: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
e1a0: 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c       set assembl
e1b0: 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d  y [object load -
e1c0: 6c 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61  loadtype File -a
e1d0: 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  lias $fileName].
e1e0: 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
e1f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e200: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e210: 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20  E: Now, add the 
e220: 6e 65 63 65 73 73 61 72 79 20 74 65 73 74 20 63  necessary test c
e230: 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20  onstraint...    
e240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
e250: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69  ddConstraint [fi
e260: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
e270: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
e280: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ]]....        #.
e290: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
e2a0: 20 47 72 61 62 20 74 68 65 20 69 6d 61 67 65 20   Grab the image 
e2b0: 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20  runtime version 
e2c0: 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c  from the assembl
e2d0: 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20  y because..     
e2e0: 20 20 20 23 20 20 20 20 20 20 20 73 65 76 65 72     #       sever
e2f0: 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e  al tests rely on
e300: 20 69 74 20 68 61 76 69 6e 67 20 61 20 63 65 72   it having a cer
e310: 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20  tain value...   
e320: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e330: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
e340: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
e350: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20  tail $fileName] 
e360: 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
e370: 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67   [$assembly Imag
e380: 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d  eRuntimeVersion]
e390: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
e3a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e3b0: 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
e3c0: 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64  path of the load
e3d0: 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  ed file...      
e3e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
e3f0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
e400: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e410: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
e420: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
e430: 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b  SQLiteReady {} {
e440: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e450: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
e460: 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72 65 74  ocedure must ret
e470: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c  urn non-zero onl
e480: 79 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  y if the SQLite 
e490: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20  native..      # 
e4a0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e        library an
e4b0: 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  d the System.Dat
e4c0: 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64  a.SQLite managed
e4d0: 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f   assembly are lo
e4e0: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
e4f0: 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f      and ready fo
e500: 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
e510: 74 20 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e  t suite.  Curren
e520: 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64  tly, this proced
e530: 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ure..      #    
e540: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c     should be cal
e550: 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74  led only after t
e560: 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d  he [tryLoadAssem
e570: 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68  bly] procedure h
e580: 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  as..      #     
e590: 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f    been called to
e5a0: 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53   probe for the S
e5b0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
e5c0: 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
e5d0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
e5e0: 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b    and the [check
e5f0: 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65  ForSQLite] proce
e600: 64 75 72 65 20 68 61 73 20 62 65 65 6e 20 63 61  dure has been ca
e610: 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f  lled to probe fo
e620: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
e630: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
e640: 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65  ve library; othe
e650: 72 77 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63  rwise, this proc
e660: 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c  edure will simpl
e670: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
e680: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a   always return z
e690: 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ero...      #.. 
e6a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
e6b0: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61  r {..        [ha
e6c0: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  veConstraint Sys
e6d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d  tem.Data.SQLite]
e6e0: 20 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61   && [haveConstra
e6f0: 69 6e 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20  int SQLite]..   
e700: 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d     }]..    }....
e710: 0a 20 20 20 20 70 72 6f 63 20 6d 61 74 63 68 50  .    proc matchP
e720: 6c 61 74 66 6f 72 6d 20 7b 20 70 6c 61 74 66 6f  latform { platfo
e730: 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  rm } {..      #.
e740: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
e750: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 66  n empty string f
e760: 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  or the platform 
e770: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 62  means that the b
e780: 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20  uild is not..   
e790: 20 20 20 23 20 20 20 20 20 20 20 5b 70 72 69 6d     #       [prim
e7a0: 61 72 69 6c 79 5d 20 61 20 6e 61 74 69 76 65 20  arily] a native 
e7b0: 62 75 69 6c 64 3b 20 74 68 65 72 65 66 6f 72 65  build; therefore
e7c0: 2c 20 69 74 20 61 6c 77 61 79 73 20 6d 61 74 63  , it always matc
e7d0: 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  hes...      #.. 
e7e0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
e7f0: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
e800: 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
e810: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e820: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
e830: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e840: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6d  # NOTE: If the m
e850: 61 63 68 69 6e 65 20 6e 61 6d 65 20 69 73 20 75  achine name is u
e860: 6e 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 72  navailable, ther
e870: 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 65 6c 73  e is nothing els
e880: 65 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  e we..      #   
e890: 20 20 20 20 63 61 6e 20 64 6f 2e 0d 0a 20 20 20      can do...   
e8a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e8b0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
e8c0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
e8d0: 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  hine)]} then {..
e8e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
e8f0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
e900: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e910: 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65  # NOTE: Does the
e920: 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66   specified platf
e930: 6f 72 6d 20 6d 61 74 63 68 20 75 70 20 74 6f 20  orm match up to 
e940: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
e950: 65 73 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ess?..      #.. 
e960: 20 20 20 20 20 69 66 20 7b 24 70 6c 61 74 66 6f       if {$platfo
e970: 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f  rm eq [machineTo
e980: 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f  Platform $::tcl_
e990: 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
e9a0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
e9b0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
e9c0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
e9d0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e9e0: 45 3a 20 54 68 65 20 73 70 65 63 69 66 69 65 64  E: The specified
e9f0: 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e   platform does n
ea00: 6f 74 20 6d 61 74 63 68 20 75 70 20 77 69 74 68  ot match up with
ea10: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20   the platform.. 
ea20: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
ea30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
ea40: 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
ea50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
ea60: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
ea70: 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c 69 74    proc haveSQLit
ea80: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b  eObjectCommand {
ea90: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
eaa0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
eab0: 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d  he [object] comm
eac0: 61 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 61 76  and currently av
ead0: 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
eae0: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
eaf0: 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20  [expr {[llength 
eb00: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f  [info commands o
eb10: 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20  bject]] > 0}].. 
eb20: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
eb30: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
eb40: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 20  ObjectCommand { 
eb50: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
eb60: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
eb70: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
eb80: 20 66 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22 20   for \"object\" 
eb90: 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e 2e  command usage...
eba0: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
ebb0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
ebc0: 6e 6f 28 73 71 6c 69 74 65 4f 62 6a 65 63 74 43  no(sqliteObjectC
ebd0: 6f 6d 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a 20  ommand)] && \.. 
ebe0: 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51           [haveSQ
ebf0: 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
ec00: 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
ec10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ec20: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
ec30: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ec40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ec50: 4f 54 45 3a 20 55 6e 6c 65 73 73 20 77 65 20 61  OTE: Unless we a
ec60: 72 65 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f  re forbidden fro
ec70: 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64 20  m doing so, add 
ec80: 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  some constraints
ec90: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
eca0: 20 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c 6f    that will allo
ecb0: 77 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 65  w most of the te
ecc0: 73 74 20 73 75 69 74 65 20 74 6f 20 72 75 6e 20  st suite to run 
ecd0: 28 69 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20 20  (i.e. those..   
ece0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
ecf0: 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 64  ts that do not d
ed00: 69 72 65 63 74 6c 79 20 72 65 6c 79 20 75 70 6f  irectly rely upo
ed10: 6e 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  n the [object] c
ed20: 6f 6d 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20 20  ommand)...      
ed30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
ed40: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
ed50: 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 41 73  :no(shimSQLiteAs
ed60: 73 65 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e 74  semblyConstraint
ed70: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
ed80: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
ed90: 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20 20  aint SQLite..   
eda0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
edb0: 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
edc0: 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64  op..          ad
edd0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  dConstraint Syst
ede0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
edf0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
ee00: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
ee10: 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79  ata.SQLite.Encry
ee20: 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ption..         
ee30: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
ee40: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
ee50: 65 2e 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20 20  e.Linq....      
ee60: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
ee70: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  t [appendArgs \.
ee80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
ee90: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
eea0: 65 2e 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69 6c  e.dll_v [getBuil
eeb0: 64 43 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20  dClrVersion]].. 
eec0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
eed0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
eee0: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53  xists ::no(shimS
eef0: 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
ef00: 61 6e 74 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  antConstraints)]
ef10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ef20: 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69      foreach defi
ef30: 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74  neConstant [list
ef40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ef50: 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53    INTEROP_EXTENS
ef60: 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e  ION_FUNCTIONS IN
ef70: 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e  TEROP_FTS5_EXTEN
ef80: 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
ef90: 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4a 53        INTEROP_JS
efa0: 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  ON1_EXTENSION IN
efb0: 54 45 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45  TEROP_PERCENTILE
efc0: 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
efe0: 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54 45 4e  ROP_REGEXP_EXTEN
eff0: 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53  SION INTEROP_TES
f000: 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  T_EXTENSION \.. 
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
f020: 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54  EROP_SESSION_EXT
f030: 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 53  ENSION INTEROP_S
f040: 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  HA1_EXTENSION \.
f050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
f060: 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58  NTEROP_TOTYPE_EX
f070: 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
f080: 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c 0d  VIRTUAL_TABLE \.
f090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55  .              U
f0a0: 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20  SE_INTEROP_DLL] 
f0b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
f0c0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
f0d0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
f0f0: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
f100: 74 61 6e 74 50 72 65 66 69 78 5d 20 24 64 65 66  tantPrefix] $def
f110: 69 6e 65 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20  ineConstant]..  
f120: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f130: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
f140: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
f150: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
f160: 65 56 69 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e  eVisualStudioCon
f170: 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e  straints)]} then
f180: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   {..          ad
f190: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
f1a0: 65 6e 64 41 72 67 73 20 76 69 73 75 61 6c 53 74  endArgs visualSt
f1b0: 75 64 69 6f 20 5b 67 65 74 42 75 69 6c 64 59 65  udio [getBuildYe
f1c0: 61 72 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ar]]..        }.
f1d0: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
f1e0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
f1f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
f200: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 61 6e  ...    proc chan
f210: 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f  geNativeRuntimeO
f220: 70 74 69 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d  ption { native }
f230: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c   {..      if {[l
f240: 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d  length [info com
f250: 6d 61 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20  mands debug]] > 
f260: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
f270: 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f    [llength [info
f280: 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62   subcommands deb
f290: 75 67 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e  ug runtimeoption
f2a0: 5d 5d 20 3e 20 30 20 26 26 20 5b 63 61 74 63 68  ]] > 0 && [catch
f2b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75   {..        debu
f2c0: 67 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20  g runtimeoption 
f2d0: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
f2e0: 20 22 61 64 64 22 20 3a 20 22 72 65 6d 6f 76 65   "add" : "remove
f2f0: 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  "}] native..    
f300: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
f310: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
f320: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
f330: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
f340: 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
f350: 6d 6d 61 6e 64 5d 20 26 26 20 5b 63 61 74 63 68  mmand] && [catch
f360: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
f370: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
f380: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
f390: 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f  [expr {$native ?
f3a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f3b0: 22 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f  "AddRuntimeOptio
f3c0: 6e 22 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74  n" : "RemoveRunt
f3d0: 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74  imeOption"}] nat
f3e0: 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ive..      }] ==
f3f0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f400: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
f410: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f420: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
f430: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f440: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
f450: 65 42 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65  eBuilds { channe
f460: 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d  l {select false}
f470: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
f480: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f490: 63 6b 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ck for every pos
f4a0: 73 69 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62  sible valid comb
f4b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65  ination of value
f4c0: 73 20 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20  s used when..   
f4d0: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
f4e0: 69 6e 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c  ing out the buil
f4f0: 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
f500: 72 79 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68  ry, showing each
f510: 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
f520: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
f530: 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20  variation along 
f540: 74 68 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20  the way...      
f550: 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  #..      foreach
f560: 20 6e 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61   native [list fa
f570: 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20  lse true] {..   
f580: 20 20 20 20 20 66 6f 72 65 61 63 68 20 79 65 61       foreach yea
f590: 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73  r [getBuildYears
f5a0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  ] {..          f
f5b0: 6f 72 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61  oreach configura
f5c0: 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
f5d0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d  nfigurations] {.
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
f5f0: 65 61 63 68 20 65 78 74 72 61 20 5b 67 65 74 42  each extra [getB
f600: 75 69 6c 64 45 78 74 72 61 73 5d 20 7b 0d 0a 20  uildExtras] {.. 
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
f630: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
f640: 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 62   the effective b
f650: 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20  uild platform.  
f660: 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20  This is..       
f670: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
f680: 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20  ased on whether 
f690: 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69 6d 61 72  or not a [primar
f6a0: 69 6c 79 5d 20 6e 61 74 69 76 65 20 62 75 69 6c  ily] native buil
f6b0: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
f6c0: 20 23 20 20 20 20 20 20 20 69 73 20 62 65 69 6e   #       is bein
f6d0: 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b 70 72  g used.  For [pr
f6e0: 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74  imarily] non-nat
f6f0: 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20  ive builds,..   
f700: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
f710: 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20     this will be 
f720: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
f730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f740: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
f750: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
f760: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
f770: 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20  $native]....    
f780: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f790: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
f7a0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f7b0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
f7c0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
f7d0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
f7e0: 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20  build \"" [expr 
f7f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f800: 20 20 20 20 20 7b 24 6e 61 74 69 76 65 20 3f 20       {$native ? 
f810: 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d  "native/" : ""}]
f820: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
f830: 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20 20 20 20  length \..      
f840: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
f850: 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70  tform] > 0 ? [ap
f860: 70 65 6e 64 41 72 67 73 20 24 70 6c 61 74 66 6f  pendArgs $platfo
f870: 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
f880: 61 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ar \..          
f890: 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e 66 69          / $confi
f8a0: 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20  guration "\"... 
f8b0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
f8c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f8d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
f8e0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
f8f0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
f900: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
f910: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
f920: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
f930: 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
f940: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
f950: 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a  ould be found...
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
f970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f980: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f  et directory [jo
f990: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
f9a0: 20 24 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20   $native \..    
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
f9c0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
f9d0: 74 6f 72 79 5d 20 24 79 65 61 72 20 24 70 6c 61  tory] $year $pla
f9e0: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
f9f0: 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
fa00: 20 20 20 20 20 20 20 20 20 20 24 65 78 74 72 61            $extra
fa10: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
fa20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
fa30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 74      # NOTE: Do t
fa40: 68 65 20 6e 65 63 65 73 73 61 72 79 20 66 69 6c  he necessary fil
fa50: 65 73 20 65 78 69 73 74 3f 20 20 43 75 72 72 65  es exist?  Curre
fa60: 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65 72 20 73  ntly, no other s
fa70: 74 65 70 73 0d 0a 20 20 20 20 20 20 20 20 20 20  teps..          
fa80: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
fa90: 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66 79 20  taken to verify 
faa0: 74 68 69 73 20 62 75 69 6c 64 20 69 73 20 61 63  this build is ac
fab0: 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e 0d 0a  tually viable...
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
fad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
fae0: 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  f {[isBuildAvail
faf0: 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69  able $native $di
fb00: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
fb10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fb20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
fb30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65       # NOTE: Whe
fb40: 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f  n in "select" mo
fb50: 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  de, automaticall
fb60: 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72  y select the fir
fb70: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
fb80: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
fb90: 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  lable build of S
fba0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
fbb0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  e and then retur
fbc0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
fbd0: 20 20 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64     #       immed
fbe0: 69 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20  iately...       
fbf0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
fc10: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
fc20: 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  hPlatform $platf
fc30: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
fc60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e       # NOTE: Man
fc70: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61  ually override a
fc80: 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  ll the build dir
fc90: 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e  ectory selection
fca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fcb0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
fcc0: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
fcd0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
fce0: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
fd10: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
fd20: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
fd40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fd50: 20 20 20 20 69 66 20 7b 21 5b 63 68 61 6e 67 65      if {![change
fd60: 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74  NativeRuntimeOpt
fd70: 69 6f 6e 20 24 6e 61 74 69 76 65 5d 7d 20 74 68  ion $native]} th
fd80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
fd90: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fda0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
fdb0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20 22  "no, failed to "
fde0: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
fdf0: 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d 6f 76  ? "add" : "remov
fe00: 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e"}] \..        
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 22 20 74 68 65 20 5c 22 6e 61 74 69 76 65 5c 22  " the \"native\"
fe30: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 5c   runtime option\
fe40: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
fe50: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
fe60: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  n false..       
fe70: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61    set ::test_yea
fea0: 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20  r $year..       
feb0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
fec0: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24  :test_platform $
fed0: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
fef0: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
ff00: 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74  tion $configurat
ff10: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
ff20: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
ff30: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ff40: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 79 65               "ye
ff60: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b  s, selected (" [
ff70: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
ff80: 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d  "native/" : ""}]
ff90: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ffa0: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
ffb0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
ffc0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
ffd0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
10000 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20  /] : ""}] $year 
10010 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
10020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10030 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
10040 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
10050 24 65 78 74 72 61 5d 20 3e 20 30 20 3f 20 5b 61  $extra] > 0 ? [a
10060 70 70 65 6e 64 41 72 67 73 20 2f 20 5c 0d 0a 20  ppendArgs / \.. 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 24 65 78 74 72 61 5d 20 3a 20 22       $extra] : "
10090 22 7d 5d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  "}] ")\n"]....  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
100d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
100e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
100f0 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10110 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10120 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10130 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
10140 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
10160 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
10170 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
10180 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
10190 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
101a0 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
101b0 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
101c0 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
101d0 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
101e0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
101f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10200 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 70  OTE: Check for p
10210 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66 20  ast releases of 
10220 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
10230 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63 74  te in the direct
10240 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
10250 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20     contained in 
10260 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61  the "System.Data
10270 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e  .SQLite" environ
10280 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 69  ment variable, i
10290 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
102a0 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
102b0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
102c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
102d0 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
102e0 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ite)] && \..    
102f0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
10300 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73 74  ngth $::env(Syst
10310 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d  em.Data.SQLite)]
10320 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
10330 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10340 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
10350 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
10360 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  ed directory whe
10370 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  re the necessary
10380 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10390 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72    components for
103a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
103b0 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f  ite should be fo
103c0 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  und...        #.
103d0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72  .        set dir
103e0 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74  ectory [file nat
103f0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
10400 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
10410 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e    $::env(System.
10420 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67 65  Data.SQLite) [ge
10430 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d  tReleaseVersion]
10440 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ]]....        tp
10450 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
10460 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10470 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
10480 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
10490 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
104a0 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  lease \"" \..   
104b0 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74           $direct
104c0 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ory "\"... "]...
104d0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
104e0 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65  ReleaseAvailable
104f0 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61 74   $directory plat
10500 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
10510 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
10520 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
10530 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
10540 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10550 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e   set platform un
10560 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20  known..         
10570 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
10580 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
10590 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70  matchPlatform $p
105a0 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
105b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
105c0 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74  t ::build_direct
105d0 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a  ory $directory..
105e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
105f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
10600 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
10610 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
10620 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
10630 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
10640 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
10650 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10660 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10670 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
10680 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74  gs "yes (" $plat
10690 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  form ")\n"]..   
106a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
106b0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
106c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
106d0 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
106e0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
106f0 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74  e exists $direct
10700 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ory] || \..     
10710 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
10720 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
10730 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
10740 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
10750 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10760 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10770 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10780 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
10790 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
107a0 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
107b0 61 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  an " \..        
107c0 20 20 20 20 20 20 20 20 22 69 6e 76 61 6c 69 64          "invalid
107d0 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6b 69 70   directory, skip
107e0 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72  ping check for r
107f0 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a  eleases...\n"]..
10800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
10810 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
10820 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10830 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 74       foreach pat
10840 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61  h [lsort -decrea
10850 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20  sing [file list 
10860 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b  $directory *]] {
10870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
10880 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
10890 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69  path] && [file i
108a0 73 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  sdirectory $path
108b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
108c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
108d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
108e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
108f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
10900 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
10910 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
10920 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d  $path "\"... "].
10950 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10960 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41   if {[isReleaseA
10970 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70  vailable $path p
10980 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
10990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
109a0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
109b0 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
109c0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b  set platform unk
109f0 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  nown..          
10a00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10a10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
10a20 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68  select && [match
10a30 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
10a40 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10a60 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  et ::build_direc
10a70 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20  tory $path....  
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10aa0 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
10ab0 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
10ac0 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
10ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ae0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10b10 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10b20 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10b30 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
10b40 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
10b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10b60 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
10b70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10b80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10b90 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
10ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
10bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
10bc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
10bd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10be0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10bf0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10c00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10c10 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10c20 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
10c30 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
10c40 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
10c50 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  not " \..       
10c60 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70       "set, skipp
10c70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65  ing check for re
10c80 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20  leases...\n"].. 
10c90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10ca0 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
10cb0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10cc0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c   checkForSQLiteL
10cd0 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c  ibrary { channel
10ce0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
10cf0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
10d00 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
10d10 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
10d20 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
10d30 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
10d40 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
10d50 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
10d60 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
10d70 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
10d80 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
10d90 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20  SQLiteVersion.. 
10da0 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
10db0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
10dc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10dd0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
10de0 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
10df0 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
10e00 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
10e10 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
10e20 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
10e30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10e40 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
10e50 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
10e60 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10e70 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
10e80 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
10e90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10ea0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10eb0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
10ec0 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
10ed0 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
10ee0 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
10ef0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10f00 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
10f10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10f20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
10f30 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
10f40 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
10f50 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
10f60 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
10f70 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
10f80 51 4c 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75  QLite3 SQLiteSou
10f90 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d  rceId..        }
10fa0 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
10fb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
10fc0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
10fd0 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
10fe0 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
10ff0 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
11000 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
11010 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11020 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
11030 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
11040 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11050 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
11060 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
11070 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
11080 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
11090 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
110a0 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
110b0 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
110c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
110d0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
110e0 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
110f0 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
11100 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11110 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
11120 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11130 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
11140 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20   NOTE: Yes, the 
11150 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
11160 61 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  ary appears to b
11170 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
11180 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11190 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
111a0 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20  QLite....       
111b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
111c0 54 45 3a 20 52 65 63 6f 72 64 20 76 65 72 73 69  TE: Record versi
111d0 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
111e0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 66 6f   core library fo
111f0 72 20 6c 61 74 65 72 20 75 73 65 0d 0a 20 20 20  r later use..   
11200 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
11210 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
11220 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 65 74 63  expressions, etc
11230 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
11240 20 68 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20   has..        # 
11250 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65        already be
11260 65 6e 20 73 65 74 20 28 6f 72 20 6f 76 65 72 72  en set (or overr
11270 69 64 64 65 6e 29 2c 20 73 6b 69 70 20 73 65 74  idden), skip set
11280 74 69 6e 67 20 69 74 2e 0d 0a 20 20 20 20 20 20  ting it...      
11290 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
112a0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
112b0 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f 76 65  :core_library_ve
112c0 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rsion]} then {..
112d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
112e0 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f 76 65 72  core_library_ver
112f0 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e 0d 0a 20  sion $version.. 
11300 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11310 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11320 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
11330 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
11340 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
11350 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
11360 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
11370 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
11380 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
11390 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
113a0 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
113b0 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
113c0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
113d0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
113e0 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
113f0 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
11400 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
11410 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
11420 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
11430 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
11440 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
11450 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
11460 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
11470 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e  3 InteropVersion
11480 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
11490 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
114a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
114b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
114c0 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
114d0 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
114e0 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
114f0 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
11500 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
11510 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11520 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
11530 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
11540 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
11550 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11560 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
11570 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11580 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11590 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
115a0 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
115b0 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
115c0 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
115d0 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
115e0 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
115f0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11600 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
11610 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
11620 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
11630 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
11640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
11650 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11660 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f  e.SQLite3 Intero
11670 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  pSourceId..     
11680 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
11690 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
116a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
116b0 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
116c0 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
116d0 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
116e0 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
116f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
11700 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
11710 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
11720 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11730 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
11740 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
11750 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
11760 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
11770 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
11780 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
11790 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
117a0 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
117b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
117c0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
117d0 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
117e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
117f0 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
11800 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
11810 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11820 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f 72     # NOTE: Befor
11830 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69 6e  e actually addin
11840 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  g the test const
11850 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72 65  raint, make sure
11860 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
11870 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69 73        version is
11880 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f 74   valid (i.e. not
11890 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63 6f   just that we co
118a0 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d 0a  uld query it)...
118b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
118c0 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e 20     if {$version 
118d0 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  ne "null"} then 
118e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
118f0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
11900 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74  : Yes, the SQLit
11910 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
11920 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ly appears to be
11930 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
11940 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11950 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
11960 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d  t SQLiteInterop.
11970 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
11980 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20 20   answer yes..   
11990 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
119a0 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73           set ans
119b0 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20 20  wer no..        
119c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
119d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
119e0 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72 20  endArgs $answer 
119f0 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  " (" $version " 
11a00 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
11a10 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
11a20 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
11a30 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
11a40 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
11a50 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
11a60 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
11a70 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
11a80 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
11a90 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11aa0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
11ac0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
11ad0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11ae0 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
11af0 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
11b00 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
11b10 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
11b20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
11b30 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
11b40 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
11b50 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
11b60 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
11b70 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
11b80 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
11b90 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
11ba0 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
11bb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11bc0 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
11bd0 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
11be0 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
11bf0 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
11c00 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11c10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
11c20 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
11c30 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
11c40 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
11c50 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
11c60 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
11c70 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
11c80 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11c90 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
11ca0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
11cb0 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e   [getSQLiteDefin
11cc0 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d  eConstantPrefix]
11cd0 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20   $name]....     
11ce0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11cf0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
11d00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11d10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11d20 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
11d30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
11d40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
11d50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72  puts $channel er
11d60 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ror\n..      }..
11d70 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11d80 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
11d90 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 7b  eCompileOption {
11da0 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20   channel name } 
11db0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
11dc0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11dd0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11de0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
11df0 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72  for SQLite inter
11e00 6f 70 20 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70  op assembly comp
11e10 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20 5c  ile option \"" \
11e20 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d  ..          $nam
11e30 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  e "\"... "].... 
11e40 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11e50 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
11e60 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11e70 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
11e80 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11e90 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
11ea0 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70  ite3 InteropComp
11eb0 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
11ec0 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
11ed0 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
11ee0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
11ef0 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
11f00 6f 63 61 73 65 20 24 63 6f 6d 70 69 6c 65 4f 70  ocase $compileOp
11f10 74 69 6f 6e 73 20 24 6e 61 6d 65 5d 20 21 3d 20  tions $name] != 
11f20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
11f30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11f40 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
11f50 74 68 69 73 20 63 6f 6d 70 69 6c 65 20 6f 70 74  this compile opt
11f60 69 6f 6e 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ion was enabled 
11f70 77 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6f 70  when the interop
11f80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
11f90 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
11fa0 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
11fb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11fc0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
11fd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65   [appendArgs [ge
11fe0 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70  tSQLiteCompileOp
11ff0 74 69 6f 6e 50 72 65 66 69 78 5d 20 24 6e 61 6d  tionPrefix] $nam
12000 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
12010 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
12020 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
12030 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12040 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12050 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
12060 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
12070 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
12080 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
12090 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
120a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
120b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
120c0 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
120d0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
120e0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
120f0 79 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e  y compile option
12100 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
12110 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22    $name "\"... "
12120 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
12130 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
12140 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
12150 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12160 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12170 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
12180 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
12190 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d  eCompileOptions.
121a0 0a 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65  .      } compile
121b0 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74  Options] == 0} t
121c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
121d0 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
121e0 63 74 20 2d 6e 6f 63 61 73 65 20 24 63 6f 6d 70  ct -nocase $comp
121f0 69 6c 65 4f 70 74 69 6f 6e 73 20 24 6e 61 6d 65  ileOptions $name
12200 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d  ] != -1} then {.
12210 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
12220 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12230 59 65 73 2c 20 74 68 69 73 20 63 6f 6d 70 69 6c  Yes, this compil
12240 65 20 6f 70 74 69 6f 6e 20 77 61 73 20 65 6e 61  e option was ena
12250 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 53 51  bled when the SQ
12260 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
12270 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
12280 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
12290 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
122a0 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
122b0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
122c0 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 43  Args [getSQLiteC
122d0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66  ompileOptionPref
122e0 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
122f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12300 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
12310 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
12320 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12330 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
12340 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12350 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12360 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12370 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
12380 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
12390 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
123a0 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a  eFormat { {timeZ
123b0 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  one true} } {.. 
123c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
123d0 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
123e0 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
123f0 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
12400 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
12410 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
12420 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
12430 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
12440 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
12450 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
12460 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
12470 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
12480 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
12490 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
124a0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
124b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
124c0 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
124d0 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
124e0 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
124f0 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
12500 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
12510 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
12520 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
12530 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
12540 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
12550 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12560 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
12570 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
12580 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
12590 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
125a0 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
125b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
125c0 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
125d0 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
125e0 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
125f0 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
12600 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
12610 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
12620 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
12630 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
12640 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
12650 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
12660 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12670 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
12680 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12690 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20      "yyyy-MM-dd 
126a0 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
126b0 22 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f  " [expr {$timeZo
126c0 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d  ne ? "K" : ""}]]
126d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
126e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
126f0 74 44 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b  tDateTimeTicks {
12700 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22   value {local ""
12710 7d 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  } {default ""} }
12720 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
12730 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
12740 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
12750 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
12760 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  n $default..    
12770 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
12780 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
12790 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
127a0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
127b0 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20  create \..      
127c0 20 20 20 20 20 20 2d 70 61 72 61 6d 65 74 65 72        -parameter
127d0 74 79 70 65 73 20 5b 6c 69 73 74 20 53 74 72 69  types [list Stri
127e0 6e 67 20 53 74 72 69 6e 67 20 49 46 6f 72 6d 61  ng String IForma
127f0 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a 20 20 20  tProvider \..   
12800 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
12810 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 44 61  Globalization.Da
12820 74 65 54 69 6d 65 53 74 79 6c 65 73 5d 20 44 61  teTimeStyles] Da
12830 74 65 54 69 6d 65 20 50 61 72 73 65 45 78 61 63  teTime ParseExac
12840 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
12850 20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74 65   $value [getDate
12860 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c 6c  TimeFormat] null
12870 20 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72 73   AdjustToUnivers
12880 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20 74  al]..      }]} t
12890 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
128a0 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a  eturn $default..
128b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
128c0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
128d0 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20  boolean -strict 
128e0 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b 0d  $local]} then {.
128f0 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
12900 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e  eTime [object in
12910 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61 74  voke -create Dat
12920 65 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69 6e  eTime SpecifyKin
12930 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d \..           
12940 20 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d 0d   $dateTime Utc].
12950 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
12960 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12970 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
12980 64 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d 0d  dateTime Ticks].
12990 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
129a0 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74 68    if {$local} th
129b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
129c0 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  turn [object inv
129d0 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f  oke $dateTime To
129e0 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  LocalTime.Ticks]
129f0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
12a00 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
12a10 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
12a20 24 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69 76  $dateTime ToUniv
12a30 65 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  ersalTime.Ticks]
12a40 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
12a50 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
12a60 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62  tProperties { ob
12a70 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b  ject varName } {
12a80 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
12a90 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74  $varName propert
12aa0 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  ies....      set
12ab0 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20 20   count 0..      
12ac0 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74 5d  set names [list]
12ad0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
12ae0 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 6f  sObjectHandle $o
12af0 62 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65 63  bject] && $objec
12b00 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  t ne "null"} the
12b10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61  n {..        eva
12b20 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
12b30 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
12b40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
12b50 6d 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f 70  membertypes Prop
12b60 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24  erty -nameonly $
12b70 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20 20  object]....     
12b80 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
12b90 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65  names [object me
12ba0 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20  mbers \..       
12bb0 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65       -membertype
12bc0 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e 6c  s Field -nameonl
12bd0 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20  y $object]..    
12be0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72    }....      for
12bf0 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
12c00 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
12c10 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
12c20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
12c30 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  e -objectflags +
12c40 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65 63  NoDispose $objec
12c50 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  t $name..       
12c60 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
12c70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12c80 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48    if {[isObjectH
12c90 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26  andle $value] &&
12ca0 20 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c 6c   $value ne "null
12cb0 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
12cc0 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
12cd0 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69 6e   null; object in
12ce0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
12cf0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
12d00 20 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73 68            -marsh
12d10 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64 6c  alflags +NoHandl
12d20 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
12d30 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  tActive \..     
12d40 20 20 20 20 20 20 20 20 20 20 20 41 64 64 4f 62             AddOb
12d50 6a 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f 6b  jectReference Ok
12d60 20 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a 0d   $value error...
12d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
12d80 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
12d90 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20 24  objects) [list $
12da0 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
12db0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
12dd0 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
12de0 28 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20 24  (values) [list $
12df0 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
12e00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
12e10 20 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e         incr coun
12e20 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
12e30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  e {..          l
12e40 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
12e50 73 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74 20  s(errors) [list 
12e60 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $name $::errorCo
12e70 64 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  de]..        }..
12e80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12e90 20 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d 0a   return $count..
12ea0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12eb0 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74  oc getAllPropert
12ec0 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72  ies { object var
12ed0 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
12ee0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
12ef0 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
12f00 20 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f 62     set value $ob
12f10 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77 68  ject....      wh
12f20 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20 20  ile {true} {..  
12f30 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
12f40 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
12f50 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
12f60 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
12f70 20 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70 72     $value ni $pr
12f80 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
12f90 65 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ects)} then {.. 
12fa0 20 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 70           getProp
12fb0 65 72 74 69 65 73 20 24 76 61 6c 75 65 20 70 72  erties $value pr
12fc0 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
12fd0 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
12fe0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
12ff0 74 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ts) $value..    
13000 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13010 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13020 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62  ts properties(ob
13030 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
13040 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13050 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
13060 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
13070 67 74 68 20 24 70 72 6f 70 65 72 74 69 65 73 28  gth $properties(
13080 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d 20  objects)] == 0} 
13090 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
130a0 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69    unset properti
130b0 65 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72 65  es(objects); bre
130c0 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ak..        }...
130d0 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c  .        set val
130e0 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64  ue [lindex [lind
130f0 65 78 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ex $properties(o
13100 62 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d 0d  bjects) 0] end].
13110 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 72 6f  .        set pro
13120 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
13130 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65 72   [lrange $proper
13140 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31 20  ties(objects) 1 
13150 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  end]..      }...
13160 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
13170 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
13180 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
13190 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
131a0 20 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20    foreach value 
131b0 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
131c0 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20 20  Objects) {..    
131d0 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75 65        if {$value
131e0 20 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f 6e   eq $object} con
131f0 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20  tinue..         
13200 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64   catch {object d
13210 69 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d 0a  ispose $value}..
13220 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
13230 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
13240 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
13250 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s)..      }..   
13260 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13270 67 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20 76  getVariables { v
13280 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74 73  arNames {objects
13290 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
132a0 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
132b0 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
132c0 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76  reach varName $v
132d0 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  arNames {..     
132e0 20 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c 20     if {[uplevel 
132f0 31 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65 78  1 [list array ex
13300 69 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d 7d  ists $varName]]}
13310 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13320 20 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d 65     set arrayName
13330 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20 20   $varName....   
13340 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65         foreach e
13350 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c 65  lementName [uple
13360 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
13370 79 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e 61  y names $arrayNa
13380 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  me]] {..        
13390 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61 70      set name [ap
133a0 70 65 6e 64 41 72 67 73 20 24 61 72 72 61 79 4e  pendArgs $arrayN
133b0 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e 61  ame ( $elementNa
133c0 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  me )]..         
133d0 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20     set varValue 
133e0 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
133f0 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a   set $name]]....
13400 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
13410 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
13420 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
13430 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
13450 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
13460 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
13470 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c 6c            getAll
13480 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72 56  Properties $varV
13490 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
134a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
134b0 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
134c0 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72 72  [list $name [arr
134d0 61 79 20 67 65 74 20 70 72 6f 70 65 72 74 69 65  ay get propertie
134e0 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s]]..           
134f0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13500 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
13510 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e   result [list $n
13520 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a  ame $varValue]..
13530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
13540 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13550 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13560 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56          set varV
13570 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  alue [uplevel 1 
13580 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e 61  [list set $varNa
13590 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
135a0 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26    if {$objects &
135b0 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c  & [isObjectHandl
135c0 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68  e $varValue]} th
135d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
135e0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
135f0 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
13600 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41              getA
13610 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61  llProperties $va
13620 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65  rValue propertie
13630 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s....           
13640 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
13650 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 5b  [list $varName [
13660 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
13670 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
13680 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13690 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
136a0 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
136b0 72 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d  rName $varValue]
136c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
136d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
136e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
136f0 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
13700 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
13710 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b  umerableToList {
13720 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d   enumerable } {.
13730 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
13740 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
13750 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
13760 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65  ngth $enumerable
13770 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65  ] == 0 || $enume
13780 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d  rable eq "null"}
13790 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
137a0 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
137b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
137c0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
137d0 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e   -alias item $en
137e0 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20  umerable {..    
137f0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13800 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
13810 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13820 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
13830 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72  ult [$item ToStr
13840 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing]..        }.
13850 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13860 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
13870 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
13880 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74  proc catchAndRet
13890 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74  urn { script {st
138a0 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20  ackTrace false} 
138b0 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20  {strict true} } 
138c0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
138d0 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
138e0 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
138f0 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
13900 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
13910 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20  ntext,..      # 
13920 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20        capturing 
13930 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  both the result 
13940 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
13950 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
13960 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
13970 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
13980 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d  $script} result]
13990 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
139a0 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74     # NOTE: Did t
139b0 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
139c0 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
139d0 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72   NOT raise an er
139e0 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ror?..      #.. 
139f0 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74       if {$strict
13a00 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c   && $code == 0 |
13a10 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63  | !$strict && $c
13a20 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b  ode != 1} then {
13a30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13a40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
13a50 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20  cess.  Return a 
13a60 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
13a70 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
13a80 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
13a90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
13aa0 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
13ab0 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
13ac0 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63   } elseif {$stac
13ad0 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  kTrace} then {..
13ae0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13af0 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
13b00 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
13b10 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61  wants a full sta
13b20 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70  ck trace (if app
13b30 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20  licable),..     
13b40 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
13b50 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
13b60 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
13b70 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72  d the result ver
13b80 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
13b90 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
13ba0 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72  n [list $code $r
13bb0 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20  esult]..      } 
13bc0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13bd0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13be0 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
13bf0 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
13c00 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61   want a full sta
13c10 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20  ck trace (if..  
13c20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
13c30 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72  plicable), retur
13c40 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
13c50 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74  e return code, t
13c60 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  he error..      
13c70 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
13c80 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  or the interpret
13c90 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f  er, and the erro
13ca0 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20  r message up to 
13cb0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
13cc0 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65       point where
13cd0 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65   the stack trace
13ce0 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a   should start...
13cf0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13d00 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
13d10 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $code $::errorCo
13d20 64 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  de \..          
13d30 20 20 5b 65 78 74 72 61 63 74 53 79 73 74 65 6d    [extractSystem
13d40 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74  DataSQLiteExcept
13d50 69 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73 75  ionMessage $resu
13d60 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  lt]]..      }.. 
13d70 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
13d80 63 20 72 65 73 65 74 45 78 63 65 70 74 69 6f 6e  c resetException
13d90 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
13da0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
13db0 73 65 74 20 65 78 63 65 70 74 69 6f 6e 20 61 73  set exception as
13dc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13dd0 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 28  is interpreter (
13de0 74 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20 20 20 20  to null)...     
13df0 20 23 20 20 20 20 20 20 20 54 68 69 73 20 28 70   #       This (p
13e00 72 69 76 61 74 65 29 20 70 72 6f 70 65 72 74 79  rivate) property
13e10 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 6f   is maintained o
13e20 6e 20 61 20 70 65 72 2d 74 68 72 65 61 64 20 62  n a per-thread b
13e30 61 73 69 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  asis...      #..
13e40 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
13e50 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
13e60 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
13e70 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63 65  r.GetActive Exce
13e80 70 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  ption null..    
13e90 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
13ea0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13eb0 63 61 74 63 68 41 6e 64 53 65 74 45 78 63 65 70  catchAndSetExcep
13ec0 74 69 6f 6e 20 7b 20 73 63 72 69 70 74 20 7b 76  tion { script {v
13ed0 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
13ee0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13ef0 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20   NOTE: Evaluate 
13f00 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
13f10 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
13f20 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65  r in their conte
13f30 78 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  xt...      #..  
13f40 20 20 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76      catch {uplev
13f50 65 6c 20 31 20 24 73 63 72 69 70 74 7d 0d 0a 0d  el 1 $script}...
13f60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13f70 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
13f80 20 28 70 72 69 76 61 74 65 29 20 65 78 63 65 70   (private) excep
13f90 74 69 6f 6e 20 70 72 6f 70 65 72 74 79 20 66 72  tion property fr
13fa0 6f 6d 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  om this interpre
13fb0 74 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ter,..      #   
13fc0 20 20 20 20 66 6f 72 20 74 68 69 73 20 74 68 72      for this thr
13fd0 65 61 64 2c 20 61 6e 64 20 61 64 64 20 61 73 20  ead, and add as 
13fe0 61 6e 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  an opaque object
13ff0 20 68 61 6e 64 6c 65 20 69 6e 20 74 68 65 0d 0a   handle in the..
14000 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
14010 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
14020 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
14030 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
14040 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
14050 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
14060 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
14070 76 61 72 4e 61 6d 65 20 65 78 63 65 70 74 69 6f  varName exceptio
14080 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
14090 20 20 20 20 73 65 74 20 65 78 63 65 70 74 69 6f      set exceptio
140a0 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
140b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 2d 61   \..          -a
140c0 6c 69 61 73 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  lias -flags +Non
140d0 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
140e0 65 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63  er.GetActive Exc
140f0 65 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  eption]....     
14100 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
14110 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
14120 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68  ompileCSharpWith
14130 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14140 74 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62  text memory symb
14150 6f 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c  ols strict resul
14160 74 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  tsVarName errors
14170 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65  VarName fileName
14180 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  s..            a
14190 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  rgs } {..      t
141a0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  ry {..        #.
141b0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
141c0 20 53 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f   Since we are go
141d0 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69 73 20  ing to use this 
141e0 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f  method name a lo
141f0 74 2c 20 61 73 73 69 67 6e 0d 0a 20 20 20 20 20  t, assign..     
14200 20 20 20 23 20 20 20 20 20 20 20 69 74 20 74 6f     #       it to
14210 20 61 20 76 61 72 69 61 62 6c 65 20 66 69 72 73   a variable firs
14220 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
14230 20 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52         set add R
14240 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c  eferencedAssembl
14250 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20  ies.Add....     
14260 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
14270 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
14280 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f   base command to
14290 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64   evaluate and ad
142a0 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 0d 0a  d the property..
142b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
142c0 73 65 74 74 69 6e 67 73 20 74 68 61 74 20 61 72  settings that ar
142d0 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  e almost always 
142e0 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e  needed by our un
142f0 69 74 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20  it tests..      
14300 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20    #       (i.e. 
14310 74 68 65 20 53 79 73 74 65 6d 20 61 6e 64 20 53  the System and S
14320 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d  ystem.Data assem
14330 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e  bly references).
14340 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14350 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
14360 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
14370 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68        compileCSh
14380 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72  arp $text $memor
14390 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69  y $symbols $stri
143a0 63 74 20 72 65 73 75 6c 74 73 20 5c 0d 0a 20 20  ct results \..  
143b0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 73            errors
143c0 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
143d0 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
143e0 61 2e 64 6c 6c 20 24 61 64 64 20 5c 0d 0a 20 20  a.dll $add \..  
143f0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
14400 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c  .Transactions.dl
14410 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d  l $add System.Xm
14420 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  l.dll]....      
14430 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14440 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65  OTE: Add all the
14450 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e   provided file n
14460 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79  ames as assembly
14470 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20   references...  
14480 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14490 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
144a0 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  e $fileNames {..
144b0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
144c0 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b  d command $add [
144d0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
144e0 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
144f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14500 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
14510 4e 4f 54 45 3a 20 41 64 64 20 65 78 74 72 61 20  NOTE: Add extra 
14520 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e  arguments, if an
14530 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e  y, to the comman
14540 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a  d to evaluate...
14550 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14560 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
14570 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d  command $args...
14580 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14590 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61      # NOTE: Alia
145a0 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c  s the compiler l
145b0 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64  ocal results and
145c0 20 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65   errors variable
145d0 73 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  s to..        # 
145e0 20 20 20 20 20 20 74 68 65 20 76 61 72 69 61 62        the variab
145f0 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65  le names provide
14600 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
14610 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14620 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
14630 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 73   length $results
14640 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  VarName] > 0} th
14650 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14660 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74 73  upvar 1 $results
14670 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d  VarName results.
14680 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
14690 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
146a0 67 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72 73  g length $errors
146b0 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  VarName] > 0} th
146c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
146d0 75 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56  upvar 1 $errorsV
146e0 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20  arName errors.. 
146f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14700 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14710 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20   NOTE: Evaluate 
14720 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
14730 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20  [compileCSharp] 
14740 63 6f 6d 6d 61 6e 64 20 61 6e 64 0d 0a 20 20 20  command and..   
14750 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
14760 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0d  urn the result..
14770 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14780 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e      eval $comman
14790 64 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  d..      } final
147a0 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  ly {..        #.
147b0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
147c0 20 49 66 20 74 68 65 20 43 23 20 63 6f 6d 70 69   If the C# compi
147d0 6c 65 72 20 77 61 73 20 69 6e 76 6f 6b 65 64 20  ler was invoked 
147e0 75 73 69 6e 67 20 5b 65 78 65 63 5d 2c 20 72 65  using [exec], re
147f0 73 65 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20  set the..       
14800 20 23 20 20 20 20 20 20 20 70 72 65 76 69 6f 75   #       previou
14810 73 20 70 72 6f 63 65 73 73 20 69 64 65 6e 74 69  s process identi
14820 66 69 65 72 20 6e 6f 77 20 28 69 2e 65 2e 20 74  fier now (i.e. t
14830 68 61 74 20 77 61 79 2c 20 69 74 20 64 6f 65 73  hat way, it does
14840 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14850 20 20 6e 6f 74 20 73 68 6f 77 20 75 70 20 61 73    not show up as
14860 20 62 65 69 6e 67 20 22 6c 65 61 6b 65 64 22 29   being "leaked")
14870 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14880 20 20 20 20 20 20 69 66 20 7b 5b 69 73 44 6f 74        if {[isDot
14890 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b  NetCore]} then {
148a0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
148b0 68 20 7b 69 6e 66 6f 20 70 72 65 76 69 6f 75 73  h {info previous
148c0 70 69 64 20 74 72 75 65 7d 0d 0a 20 20 20 20 20  pid true}..     
148d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
148e0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
148f0 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66  c isMemoryDb { f
14900 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
14910 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
14920 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69  TE: Is the speci
14930 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69  fied database fi
14940 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61  le name really a
14950 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14960 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  base?..      #..
14970 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
14980 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71  pr {$fileName eq
14990 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c   ":memory:" || \
149a0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
149b0 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e  ing range $fileN
149c0 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69  ame 0 12] eq "fi
149d0 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a  le::memory:"}]..
149e0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
149f0 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b  oc isTableInDb {
14a00 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64   name {varName d
14a10 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
14a20 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
14a30 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
14a40 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
14a50 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
14a60 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
14a70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14a80 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
14a90 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
14aa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
14ab0 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
14ac0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14ad0 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
14ae0 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74  the query used t
14af0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
14b00 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
14b10 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
14b20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
14b30 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
14b40 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
14b50 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
14b60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14b70 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
14b80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
14b90 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
14ba0 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
14bb0 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23  able is..      #
14bc0 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
14bd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d  n the database..
14be0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14bf0 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20  set sql {..     
14c00 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28     SELECT COUNT(
14c10 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
14c20 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
14c30 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
14c40 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20  ame = ?;..      
14c50 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
14c60 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
14c70 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
14c80 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
14c90 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20  s present...    
14ca0 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
14cb0 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
14cc0 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
14cd0 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
14ce0 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70  $db $sql [list p
14cf0 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61  aram1 String $na
14d00 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20  me]] > 0..      
14d10 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
14d20 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
14d30 75 6c 74 50 61 67 65 53 69 7a 65 20 7b 7d 20 7b  ultPageSize {} {
14d40 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
14d50 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 22  ch {executeSql "
14d60 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
14d70 3b 22 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c  ;" scalar} resul
14d80 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
14d90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14da0 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d  $result..      }
14db0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
14dc0 20 72 65 74 75 72 6e 20 30 0d 0a 20 20 20 20 20   return 0..     
14dd0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
14de0 20 20 70 72 6f 63 20 67 65 74 44 62 44 65 66 61    proc getDbDefa
14df0 75 6c 74 43 61 63 68 65 53 69 7a 65 20 7b 7d 20  ultCacheSize {} 
14e00 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
14e10 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
14e20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
14e30 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20 72 65 73  ze;" scalar} res
14e40 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
14e50 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
14e60 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
14e70 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14e80 20 20 20 72 65 74 75 72 6e 20 30 0d 0a 20 20 20     return 0..   
14e90 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
14ea0 20 20 20 20 70 72 6f 63 20 75 73 65 4c 65 67 61      proc useLega
14eb0 63 79 44 62 50 61 67 65 41 6e 64 43 61 63 68 65  cyDbPageAndCache
14ec0 53 69 7a 65 73 20 7b 20 76 61 72 4e 61 6d 65 20  Sizes { varName 
14ed0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
14ee0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
14ef0 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
14f00 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
14f10 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
14f20 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
14f30 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
14f40 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e  ler.  It contain
14f50 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
14f60 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
14f70 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20   that will be.. 
14f80 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
14f90 64 20 74 6f 20 65 78 65 63 75 74 65 20 71 75 65  d to execute que
14fa0 72 69 65 73 20 75 73 65 64 20 74 6f 20 73 65 74  ries used to set
14fb0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 63 61   the page and ca
14fc0 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20 20 20 20  che sizes...    
14fd0 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
14fe0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
14ff0 0d 0a 20 20 20 20 20 20 73 71 6c 20 65 78 65 63  ..      sql exec
15000 75 74 65 20 24 64 62 20 7b 0d 0a 20 20 20 20 20  ute $db {..     
15010 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
15020 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a 20 20 20  ize = 1024;..   
15030 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
15040 65 5f 73 69 7a 65 20 3d 20 32 30 30 30 3b 0d 0a  e_size = 2000;..
15050 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15060 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d   return [list \.
15070 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20  .          [sql 
15080 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
15090 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41   scalar $db "PRA
150a0 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 5d  GMA page_size;"]
150b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
150c0 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
150d0 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22  ute scalar $db "
150e0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
150f0 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  e;"]]..    }....
15100 0a 20 20 20 20 70 72 6f 63 20 6e 6f 72 6d 61 6c  .    proc normal
15110 69 7a 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73  izeExceptionMess
15120 61 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d  age { value } {.
15130 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
15140 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
15150 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 72 65  ] == 0} then {re
15160 74 75 72 6e 20 24 76 61 6c 75 65 7d 0d 0a 20 20  turn $value}..  
15170 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69      return [stri
15180 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c  ng map [list \r\
15190 6e 20 22 20 3d 3d 3e 20 22 20 5c 6e 20 22 20 3d  n " ==> " \n " =
151a0 3d 3e 20 22 5d 20 24 76 61 6c 75 65 5d 0d 0a 20  => "] $value].. 
151b0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
151c0 63 20 65 78 74 72 61 63 74 53 79 73 74 65 6d 44  c extractSystemD
151d0 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74 69  ataSQLiteExcepti
151e0 6f 6e 4d 65 73 73 61 67 65 20 7b 20 76 61 6c 75  onMessage { valu
151f0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
15200 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
15210 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 66   the string conf
15220 6f 72 6d 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f  orms to format o
15230 66 20 74 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63  f the normal exc
15240 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  eption..      # 
15250 20 20 20 20 20 20 65 72 72 6f 72 20 73 74 72 69        error stri
15260 6e 67 73 2c 20 65 78 74 72 61 63 74 20 61 6e 64  ngs, extract and
15270 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65   return only the
15280 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a   error message..
15290 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f        #       po
152a0 72 74 69 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20  rtion itself... 
152b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
152c0 74 20 70 61 74 74 65 72 6e 73 20 5b 6c 69 73 74  t patterns [list
152d0 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79 73 74 65   \..      {Syste
152e0 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c  m\.Data\.SQLite\
152f0 2e 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e  .SQLiteException
15300 20 5c 28 30 78 28 3f 3a 30 7c 38 29 5b 30 2d 39   \(0x(?:0|8)[0-9
15310 41 2d 46 61 2d 66 5d 7b 37 7d 5c 29 3a 5c 0d 0a  A-Fa-f]{7}\):\..
15320 20 20 20 20 20 20 20 20 20 20 28 2e 2b 3f 29 20            (.+?) 
15330 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20   (?: )?at} \..  
15340 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74      {System\.Dat
15350 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74  a\.SQLite\.SQLit
15360 65 45 78 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f  eException: (.+?
15370 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a  )  (?: )?at} \..
15380 20 20 20 20 20 20 7b 45 61 67 6c 65 5c 2e 5f 43        {Eagle\._C
15390 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c 69  omponents\.Publi
153a0 63 5c 2e 53 63 72 69 70 74 45 78 63 65 70 74 69  c\.ScriptExcepti
153b0 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29  on: (.+?)  (?: )
153c0 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66  ?at}]....      f
153d0 6f 72 65 61 63 68 20 70 61 74 74 65 72 6e 20 24  oreach pattern $
153e0 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20  patterns {..    
153f0 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
15400 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 76 61 6c  -- $pattern $val
15410 75 65 20 64 75 6d 6d 79 20 6d 65 73 73 61 67 65  ue dummy message
15420 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15430 20 20 20 20 20 73 65 74 20 6d 65 73 73 61 67 65       set message
15440 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
15450 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72  st \r\n \n] [str
15460 69 6e 67 20 74 72 69 6d 20 24 6d 65 73 73 61 67  ing trim $messag
15470 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e]]..          s
15480 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c 69 74 20  et lines [split 
15490 24 6d 65 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a  $message \n]....
154a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
154b0 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73 5d 20 3d  length $lines] =
154c0 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 2} then {..   
154d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69           if {[li
154e0 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 20 65  ndex $lines 0] e
154f0 71 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  q [lindex $lines
15500 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   1]} then {..   
15510 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
15520 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  n [lindex $lines
15530 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0]..           
15540 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15550 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
15560 41 72 67 73 20 5b 6c 69 6e 64 65 78 20 24 6c 69  Args [lindex $li
15570 6e 65 73 20 30 5d 20 22 20 2d 2d 20 22 20 5b 6c  nes 0] " -- " [l
15580 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 5d  index $lines 1]]
15590 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
155a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
155b0 6e 20 24 6d 65 73 73 61 67 65 0d 0a 20 20 20 20  n $message..    
155c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
155d0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
155e0 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  value..    }....
155f0 0a 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71  .    proc trimSq
15600 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20  l { sql } {..   
15610 20 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75     return [regsu
15620 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20  b -all -- {\s+} 
15630 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71  [string trim $sq
15640 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a  l] " "]..    }..
15650 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63  ...    proc exec
15660 75 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78  uteSql { sql {ex
15670 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72  ecute none} {for
15680 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e  mat none} {fileN
15690 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
156a0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
156b0 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
156c0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74   == 0} then {set
156d0 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72   fileName :memor
156e0 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70  y:}..      setup
156f0 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20  Db $fileName "" 
15700 22 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73  "" "" "" "" fals
15710 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61  e false false fa
15720 6c 73 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20  lse db true.... 
15730 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20       try {..    
15740 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
15750 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20  vel 1 [list \.. 
15760 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65             sql e
15770 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
15780 24 65 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74  $execute -format
15790 20 24 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71   $format $db $sq
157a0 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e  l]]..      } fin
157b0 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
157c0 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b  set connection [
157d0 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d  getDbConnection]
157e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20  ....        try 
157f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65  {..          cle
15800 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  anupDb $fileName
15810 20 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20   db false false 
15820 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
15830 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
15840 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6c 61        object fla
15850 67 73 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d  gs $connection -
15860 4e 6f 44 69 73 70 6f 73 65 3b 20 66 72 65 65 44  NoDispose; freeD
15870 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  bConnection..   
15880 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
15890 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
158a0 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b  roc hasNoFlags {
158b0 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20   varName none } 
158c0 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
158d0 20 24 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d   $varName flags.
158e0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  ...      if {![i
158f0 6e 66 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73  nfo exists flags
15900 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15910 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
15920 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15930 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
15940 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30  gth $flags] == 0
15950 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15960 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
15970 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15980 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c  if {$none && $fl
15990 61 67 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74  ags eq "None"} t
159a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
159b0 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
159c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
159d0 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
159e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
159f0 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
15a00 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67   { fileName flag
15a10 73 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  s {quiet false} 
15a20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
15a30 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
15a40 72 65 20 6f 75 74 20 77 68 69 63 68 20 64 61 74  re out which dat
15a50 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
15a60 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  or connection st
15a70 72 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20  ring these..    
15a80 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
15a90 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20  tion flags will 
15aa0 61 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74  actually apply t
15ab0 6f 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20  o.  This is not 
15ac0 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
15ad0 20 23 20 20 20 20 20 20 20 69 6e 20 71 75 69 65   #       in quie
15ae0 74 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74  t mode because t
15af0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
15b00 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
15b10 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20   logging..      
15b20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f  #       and repo
15b30 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d  rting purposes..
15b40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15b50 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
15b60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
15b70 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
15b80 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  $fileName] > 0} 
15b90 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15ba0 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b    set database [
15bb0 61 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65  appendArgs "file
15bc0 20 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e   name \"" $fileN
15bd0 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  ame \"]..       
15be0 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
15bf0 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f   exists ::dataSo
15c00 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  urce] && \..    
15c10 20 20 20 20 20 20 20 20 21 5b 61 72 72 61 79 20          ![array 
15c20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75  exists ::dataSou
15c30 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rce]} then {..  
15c40 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
15c50 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
15c60 20 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22   "data source \"
15c70 22 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20  " $::dataSource 
15c80 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
15c90 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
15ca0 20 73 65 74 20 64 61 74 61 62 61 73 65 20 3c 75   set database <u
15cb0 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20  nknown>..       
15cc0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
15cd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15ce0 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68 6f 75 67  NOTE: Even thoug
15cf0 68 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  h there is only 
15d00 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66 20 66 6c  one source of fl
15d10 61 67 73 20 73 6f 20 66 61 72 2c 20 74 68 65 79  ags so far, they
15d20 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15d30 6d 75 73 74 20 62 65 20 63 6f 6d 62 69 6e 65 64  must be combined
15d40 20 75 73 69 6e 67 20 74 68 65 20 63 6f 72 72 65   using the corre
15d50 63 74 20 73 79 6e 74 61 78 20 66 6f 72 20 65 6e  ct syntax for en
15d60 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20  umerated..      
15d70 23 20 20 20 20 20 20 20 66 6c 61 67 20 76 61 6c  #       flag val
15d80 75 65 73 20 66 6f 72 20 74 68 65 20 2e 4e 45 54  ues for the .NET
15d90 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20   Framework...   
15da0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
15db0 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
15dc0 61 67 73 20 24 66 6c 61 67 73 20 22 22 5d 0d 0a  ags $flags ""]..
15dd0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15de0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
15df0 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61  nd log) the loca
15e00 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
15e10 67 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  gs and the assoc
15e20 69 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  iated..      #  
15e30 20 20 20 20 20 64 61 74 61 20 73 6f 75 72 63 65       data source
15e40 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a   or file name...
15e50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15e60 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
15e70 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
15e80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15e90 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67  no(emitLocalFlag
15ea0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
15eb0 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
15ec0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f  ists ::no(emitLo
15ed0 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  calFlagsIfNone)]
15ee0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
15ef0 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73      ![hasNoFlags
15f00 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20   flags false])} 
15f10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15f20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
15f30 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15f40 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
15f50 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c       "---- local
15f60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
15f70 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
15f80 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
15f90 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
15fa0 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20  r {![hasNoFlags 
15fb0 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
15fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15fd0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
15fe0 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
15ff0 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
16000 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
16010 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16020 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
16030 6e 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61 72  nd log) the shar
16040 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
16050 61 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ags...      #.. 
16060 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
16070 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16080 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
16090 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
160a0 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44   invoke System.D
160b0 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
160c0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61 72  eConnection Shar
160d0 65 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20  edFlags..       
160e0 20 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d 20   } sharedFlags] 
160f0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16100 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
16110 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
16120 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29 5d  mitSharedFlags)]
16130 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
16140 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
16150 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61  sts ::no(emitSha
16160 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d  redFlagsIfNone)]
16170 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
16180 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61        ![hasNoFla
16190 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20 74  gs sharedFlags t
161a0 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  rue])} then {.. 
161b0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
161c0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
161d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e  "---- shared con
16200 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
16210 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
16220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16230 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20   " are: " [expr 
16240 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68  {![hasNoFlags sh
16250 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 20  aredFlags true] 
16260 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
16270 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
16280 20 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67 73   \" $sharedFlags
16290 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
162a0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
162b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
162c0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
162d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
162e0 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65  s ::no(emitShare
162f0 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20  dFlags)] && \.. 
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 69               ![i
16310 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16320 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 49  emitSharedFlagsI
16330 66 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d 20  fUnavailable)]} 
16340 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16350 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
16360 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
16370 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16380 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
16390 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
163a0 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
163b0 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
163c0 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
163d0 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c 6e   <unavailable>\n
163e0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
163f0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
16400 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
16410 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
16420 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65  ow (and log) the
16430 20 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61 6c   detected global
16440 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
16450 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20  s, if any...    
16460 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
16470 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
16480 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
16490 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
164a0 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29 5d  mitGlobalFlags)]
164b0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
164c0 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74     (![info exist
164d0 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61  s ::no(emitGloba
164e0 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c  lFlagsIfNone)] |
164f0 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
16500 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a    ![hasNoFlags :
16510 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
16520 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
16530 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
16540 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
16550 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16570 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e  "---- global con
16580 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72  nection flags ar
16590 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
165a0 20 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b 68        [expr {![h
165b0 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e  asNoFlags ::conn
165c0 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c  ection_flags fal
165d0 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  se] ? \..       
165e0 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
165f0 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74  gs \" $::connect
16600 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20  ion_flags \"] : 
16610 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
16620 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16630 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
16640 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
16650 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c  there are any gl
16660 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72  obal (per test r
16670 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  un) connection f
16680 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a  lags currently..
16690 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
166a0 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20  t, use them now 
166b0 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69  (i.e. by combini
166c0 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ng them with the
166d0 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a   ones for this..
166e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
166f0 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
16700 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
16710 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
16720 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d  nnection_flags]}
16730 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16740 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16750 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f  TE: Combine and/
16760 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  or replace the c
16770 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
16780 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68  and then show th
16790 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
167a0 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20     new value... 
167b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
167c0 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
167d0 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
167e0 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
167f0 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lags]....       
16800 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16810 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
16820 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63  g) the new effec
16830 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tive connection 
16840 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20  flags...        
16850 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
16860 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
16870 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
16880 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
16890 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61  (emitCombinedFla
168a0 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
168b0 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
168c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
168d0 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49 66  tCombinedFlagsIf
168e0 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20  None)] || \..   
168f0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61              ![ha
16900 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
16910 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  alse])} then {..
16920 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16930 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16940 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16960 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20   "---- combined 
16970 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
16980 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
16990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
169a0 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
169b0 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
169c0 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20   flags false] ? 
169d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
169e0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
169f0 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
16a00 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
16a10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16a20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
16a30 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
16a40 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  flags..    }....
16a50 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c 61  .    proc getFla
16a60 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c  gsProperty { {fl
16a70 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66  ags ""} {quiet f
16a80 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
16a90 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16aa0 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74  : Determine what
16ab0 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28 67   the combined (g
16ac0 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29  lobal and local)
16ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
16ae0 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 73     #       flags
16af0 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73   should be, poss
16b00 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20  ibly quietly... 
16b10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
16b20 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e  t flags [getConn
16b30 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24  ectionFlags "" $
16b40 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d  flags $quiet]...
16b50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16b60 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c  # NOTE: If no gl
16b70 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f  obal or local co
16b80 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
16b90 65 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ere specified, t
16ba0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
16bb0 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63    default connec
16bc0 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c  tion flags shoul
16bd0 64 20 62 65 20 75 73 65 64 3b 20 74 68 65 72 65  d be used; there
16be0 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20  fore, return..  
16bf0 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20 65      #       an e
16c00 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20 74  mpty string in t
16c10 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20 20  hat case...     
16c20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
16c30 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
16c40 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ags] == 0} then 
16c50 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
16c60 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  n ""..      }...
16c70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16c80 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72  # NOTE: In order
16c90 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
16ca0 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
16cb0 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62 65  ion flags are be
16cc0 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20 20  ing used..      
16cd0 23 20 20 20 20 20 20 20 69 74 20 69 73 20 6e 65  #       it is ne
16ce0 63 65 73 73 61 72 79 20 74 6f 20 61 74 74 65 6d  cessary to attem
16cf0 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20  pt a conversion 
16d00 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65 6e  to the actual en
16d10 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20 20  umerated..      
16d20 23 20 20 20 20 20 20 20 74 79 70 65 2e 20 20 46  #       type.  F
16d30 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68 65  ailing that, the
16d40 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20 74   check against t
16d50 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
16d60 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20   will be..      
16d70 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
16d80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16d90 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
16da0 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
16db0 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45 44   null; # IGNORED
16dc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65  ....        obje
16dd0 63 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74  ct invoke Utilit
16de0 79 20 54 72 79 50 61 72 73 65 46 6c 61 67 73 45  y TryParseFlagsE
16df0 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20 20  num "" \..      
16e00 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
16e10 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
16e20 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
16e30 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72  " $flags null tr
16e40 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ue \..          
16e50 20 20 74 72 75 65 20 74 72 75 65 20 65 72 72 6f    true true erro
16e60 72 0d 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65  r..      } value
16e70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16e80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
16e90 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67  NOTE: Attempting
16ea0 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f   to parse the co
16eb0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
16ec0 61 75 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a  aused a script..
16ed0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16ee0 65 72 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77  error.  Emit a w
16ef0 61 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65  arning to the te
16f00 73 74 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20  st log file and 
16f10 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
16f20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
16f30 61 6e 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20  an emtpy string 
16f40 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20  instead...      
16f50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f    #..        tlo
16f60 67 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  g [appendArgs \.
16f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
16f80 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
16f90 65 64 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e  ed to parse conn
16fa0 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72  ection flags, er
16fb0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
16fc0 20 20 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75        \n\t $valu
16fd0 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  e \n]....       
16fe0 20 73 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20   set value "".. 
16ff0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17000 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17010 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64   If the combined
17020 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f   flags string co
17030 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  uld not actually
17040 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20   be converted.. 
17050 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
17060 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74  the enumerated t
17070 79 70 65 20 69 74 20 69 73 20 74 68 65 20 64 65  ype it is the de
17080 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65  fault value, the
17090 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20  n just use..    
170a0 20 20 23 20 20 20 20 20 20 20 69 74 20 76 65 72    #       it ver
170b0 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65  batim; otherwise
170c0 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e  , just return an
170d0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
170e0 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23  In that..      #
170f0 20 20 20 20 20 20 20 63 61 73 65 2c 20 74 68 65         case, the
17100 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
17110 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62  ion flags will b
17120 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23  e used...      #
17130 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
17140 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
17150 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75  e] == 0 || $valu
17160 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20  e ne "Default"} 
17170 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17180 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41 52  #..        # WAR
17190 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72  NING: This retur
171a0 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 76 61  ns the string va
171b0 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69  lue of the combi
171c0 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a  ned flags, not..
171d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
171e0 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65     the enumerate
171f0 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69  d value.  This i
17200 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20  s by design and 
17210 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20  should not..    
17220 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
17230 65 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75  e changed withou
17240 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64  t careful consid
17250 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74  eration (e.g. it
17260 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20   would..        
17270 23 20 20 20 20 20 20 20 20 20 20 70 72 65 76 65  #          preve
17280 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e  nt the SQLiteCon
17290 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72  nection class fr
172a0 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61  om allowing inva
172b0 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lid..        #  
172c0 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61          ["magica
172d0 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e  l"] meta-flags).
172e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
172f0 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
17300 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22  endArgs "Flags="
17310 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20   $flags \;]..   
17320 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
17330 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
17340 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
17350 65 73 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20  estProperties { 
17360 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
17370 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
17380 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
17390 4f 54 45 3a 20 53 74 61 72 74 20 77 69 74 68 20  OTE: Start with 
173a0 22 46 6c 61 67 73 22 20 70 72 6f 70 65 72 74 79  "Flags" property
173b0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 63 6f 6e   for the new con
173c0 6e 65 63 74 69 6f 6e 2c 20 69 66 20 61 6e 79 2e  nection, if any.
173d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
173e0 20 73 65 74 20 72 65 73 75 6c 74 20 5b 67 65 74   set result [get
173f0 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 24 66  FlagsProperty $f
17400 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
17410 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17420 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e   NOTE: Add the n
17430 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
17440 6e 74 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66  nt test file, if
17450 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69   available.  Thi
17460 73 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  s is..      #   
17470 20 20 20 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f      only used fo
17480 72 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20  r debugging...  
17490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
174a0 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
174b0 74 65 73 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e  test_file]} then
174c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
174d0 6e 64 20 72 65 73 75 6c 74 20 54 65 73 74 46 69  nd result TestFi
174e0 6c 65 3d 20 24 3a 3a 74 65 73 74 5f 66 69 6c 65  le= $::test_file
174f0 20 5c 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   \;..      }....
17500 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17510 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e   NOTE: Add the n
17520 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
17530 6e 74 20 74 65 73 74 2c 20 69 66 20 61 76 61 69  nt test, if avai
17540 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  lable.  This is 
17550 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  only..      #   
17560 20 20 20 20 75 73 65 64 20 66 6f 72 20 64 65 62      used for deb
17570 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  ugging...      #
17580 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
17590 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65  o exists ::eagle
175a0 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61  _tests(CurrentNa
175b0 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me)]} then {..  
175c0 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
175d0 75 6c 74 20 54 65 73 74 4e 61 6d 65 3d 20 24 3a  ult TestName= $:
175e0 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72  :eagle_tests(Cur
175f0 72 65 6e 74 4e 61 6d 65 29 20 5c 3b 0d 0a 20 20  rentName) \;..  
17600 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
17610 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
17620 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
17630 63 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61  c enableSharedCa
17640 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e  che { channel en
17650 61 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c 73  able {quiet fals
17660 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
17670 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
17680 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
17690 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
176a0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
176b0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
176c0 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
176d0 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
176e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
176f0 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
17700 61 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28 24  ache [expr int($
17710 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20  enable)]..      
17720 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
17730 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17740 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17750 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
17760 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
17770 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17780 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17790 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e   call sqlite3_en
177a0 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
177b0 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20  e(" $enable \.. 
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e               ").
177d0 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
177e0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
177f0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
17800 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
17810 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
17820 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17830 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17840 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17850 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
17860 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
17870 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e  ared_cache(" $en
17880 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
17890 20 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f        ")... erro
178a0 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
178b0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
178c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
178d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65  .....    proc se
178e0 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20  tupDb {..       
178f0 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d       fileName {m
17900 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  ode ""} {dateTim
17910 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74  eFormat ""} {dat
17920 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66  eTimeKind ""} {f
17930 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20  lags ""}..      
17940 20 20 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d        {extra ""}
17950 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20   {qualify true} 
17960 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75  {delete true} {u
17970 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20  ri false}..     
17980 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72         {temporar
17990 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65  y true} {varName
179a0 20 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   db} {quiet fals
179b0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
179c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
179d0 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
179e0 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
179f0 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
17a00 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
17a10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
17a20 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
17a30 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
17a40 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
17a50 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
17a60 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74  ow, all test dat
17a70 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74  abases used by t
17a80 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72  he test suite ar
17a90 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20  e placed..      
17aa0 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65  #       into the
17ab0 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
17ac0 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62  ory.  Each datab
17ad0 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20  ase and related 
17ae0 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  files..      #  
17af0 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74       used by a t
17b00 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  est should be cl
17b10 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74  eaned up by that
17b20 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d   test using the.
17b30 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
17b40 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65  cleanupDb" proce
17b50 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20  dure, below...  
17b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
17b70 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
17b80 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
17b90 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
17ba0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
17bb0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
17bc0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
17bd0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
17be0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17bf0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17c00 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65  : By default, de
17c10 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
17c20 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
17c30 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
17c40 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
17c50 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72   name if it curr
17c60 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20  ently exists... 
17c70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
17c80 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
17c90 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65  $delete && [file
17ca0 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
17cb0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
17cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
17cd0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
17ce0 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  o delete any pre
17cf0 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
17d00 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
17d10 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
17d20 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20         name...  
17d30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17d40 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
17d50 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
17d60 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
17d70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
17d80 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
17d90 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
17da0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
17db0 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
17dc0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
17dd0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
17de0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
17df0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
17e00 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17e10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17e20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17e30 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
17e40 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
17e50 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
17e60 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
17e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17e80 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74    "\" during set
17e90 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
17ea0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
17eb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17ec0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
17ed0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17ee0 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
17ef0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
17f00 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
17f10 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
17f20 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
17f30 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
17f40 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
17f50 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62  the opened datab
17f60 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ase will be stor
17f70 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
17f80 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
17f90 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
17fa0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17fb0 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75  # NOTE: Start bu
17fc0 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  ilding the conne
17fd0 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54  ction string.  T
17fe0 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  he only required
17ff0 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
18000 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
18010 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
18020 20 69 73 20 74 68 65 20 64 61 74 61 20 73 6f 75   is the data sou
18030 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61  rce, which conta
18040 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ins the..      #
18050 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
18060 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66  file name itself
18070 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  .  If our caller
18080 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20   wants to use a 
18090 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20  URI as..      # 
180a0 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20 73        the data s
180b0 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65 20 46  ource, use the F
180c0 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f  ullUri connectio
180d0 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74  n string propert
180e0 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  y to..      #   
180f0 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20      prevent the 
18100 64 61 74 61 20 73 6f 75 72 63 65 20 73 74 72 69  data source stri
18110 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61  ng from being ma
18120 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ngled...      #.
18130 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d  .      if {$uri}
18140 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18150 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   set connection 
18160 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e  {FullUri=${fileN
18170 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65  ame}}..      } e
18180 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
18190 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44  et connection {D
181a0 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c  ata Source=${fil
181b0 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  eName}}..      }
181c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
181d0 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
181e0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
181f0 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b  has no special k
18200 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74  nowledge of what
18210 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20   the default..  
18220 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
18230 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20 54  ing is for the T
18240 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63  oFullPath connec
18250 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
18260 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20  ery, always..   
18270 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74     #       add t
18280 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77  he value we know
18290 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f   about to the co
182a0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
182b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
182c0 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
182d0 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d  on {;ToFullPath=
182e0 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20  ${qualify}}.... 
182f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18300 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
18310 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
18320 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64  journal mode, ad
18330 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
18340 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
18350 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
18360 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
18370 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
18380 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
18390 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e   length $mode] >
183a0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
183b0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
183c0 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20  ction {;Journal 
183d0 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20  Mode=${mode}}.. 
183e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
183f0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18400 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
18410 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
18420 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20  ime format, add 
18430 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  the necessary.. 
18440 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72       #       por
18450 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
18460 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
18470 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
18480 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
18490 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 46  ength $dateTimeF
184a0 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
184b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
184c0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
184d0 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24  DateTimeFormat=$
184e0 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d  {dateTimeFormat}
184f0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
18500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18510 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
18520 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
18530 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64  ateTimeKind, add
18540 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
18550 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
18560 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
18570 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
18580 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
18590 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
185a0 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65  length $dateTime
185b0 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Kind] > 0} then 
185c0 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
185d0 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44  d connection {;D
185e0 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61  ateTimeKind=${da
185f0 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20  teTimeKind}}..  
18600 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
18610 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18620 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
18630 74 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20  the final flags 
18640 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
18650 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d  ion need to be..
18660 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18670 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f  set flags [getCo
18680 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66  nnectionFlags $f
18690 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24  ileName $flags $
186a0 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
186b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
186c0 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
186d0 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51  pecified some SQ
186e0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
186f0 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  ags, add the..  
18700 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
18710 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ssary portion of
18720 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
18730 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
18740 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
18750 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
18760 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e  flags] > 0} then
18770 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
18780 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
18790 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d  Flags=${flags}}.
187a0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
187b0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
187c0 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
187d0 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78   specified an ex
187e0 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74  tra payload to t
187f0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  he connection.. 
18800 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72       #       str
18810 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e  ing, append it n
18820 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
18830 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
18840 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e  length $extra] >
18850 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
18860 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
18870 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d  ction \; $extra.
18880 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18890 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
188a0 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20  E: Add the name 
188b0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
188c0 65 73 74 20 66 69 6c 65 2c 20 69 66 20 61 76 61  est file, if ava
188d0 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73  ilable.  This is
188e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
188f0 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64 65  only used for de
18900 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20  bugging...      
18910 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
18920 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
18930 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  _file]} then {..
18940 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
18950 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 65 73 74  onnection {;Test
18960 46 69 6c 65 3d 24 7b 3a 3a 74 65 73 74 5f 66 69  File=${::test_fi
18970 6c 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  le}}..      }...
18980 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18990 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
189a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  name of the curr
189b0 65 6e 74 20 74 65 73 74 2c 20 69 66 20 61 76 61  ent test, if ava
189c0 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73  ilable.  This is
189d0 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 23 20 20   only..      #  
189e0 20 20 20 20 20 75 73 65 64 20 66 6f 72 20 64 65       used for de
189f0 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20  bugging...      
18a00 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
18a10 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67 6c  fo exists ::eagl
18a20 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e  e_tests(CurrentN
18a30 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ame)]} then {.. 
18a40 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
18a50 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 65 73 74 4e  nnection {;TestN
18a60 61 6d 65 3d 24 7b 3a 3a 65 61 67 6c 65 5f 74 65  ame=${::eagle_te
18a70 73 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29  sts(CurrentName)
18a80 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
18a90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18aa0 4e 4f 54 45 3a 20 46 6f 72 20 63 6c 61 72 69 74  NOTE: For clarit
18ab0 79 2c 20 61 70 70 65 6e 64 20 61 20 66 69 6e 61  y, append a fina
18ac0 6c 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 6f 20 74  l semicolon to t
18ad0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
18ae0 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ring...      #..
18af0 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
18b00 6e 65 63 74 69 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20  nection \;....  
18b10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18b20 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61  OTE: Open the da
18b30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18b40 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74  n now, placing t
18b50 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  he opaque handle
18b60 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20   value..      # 
18b70 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76        into the v
18b80 61 72 69 61 62 6c 65 20 73 70 65 63 69 66 69 65  ariable specifie
18b90 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
18ba0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18bb0 20 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65   set db [sql ope
18bc0 6e 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b  n -type SQLite [
18bd0 73 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f  subst $connectio
18be0 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  n]]....      #..
18bf0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
18c00 6e 66 69 67 75 72 65 20 74 68 65 20 74 65 6d 70  nfigure the temp
18c10 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
18c20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70  for the newly op
18c30 65 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20  ened database.. 
18c40 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
18c50 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65  nection now unle
18c60 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f  ss our caller fo
18c70 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20  rbids it...     
18c80 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74   #..      if {$t
18c90 65 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e  emporary && ![in
18ca0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
18cb0 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63  etTemporaryDirec
18cc0 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tory)]} then {..
18cd0 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
18ce0 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41  ute $db [appendA
18cf0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18d00 20 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f     "PRAGMA temp_
18d10 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
18d20 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72  = \"" [getTempor
18d30 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22  aryDirectory] \"
18d40 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \;]..      }....
18d50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
18d60 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61   NOTE: Perform a
18d70 6e 79 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e  ny extra per-con
18d80 6e 65 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f  nection setup fo
18d90 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
18da0 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
18db0 20 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75    database now u
18dc0 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72  nless our caller
18dd0 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20   forbids it...  
18de0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
18df0 20 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20   executeOnSetup 
18e00 5b 67 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74  [getExecuteOnSet
18e10 75 70 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  up]....      if 
18e20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
18e30 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  $executeOnSetup]
18e40 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
18e50 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73       ![info exis
18e60 74 73 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f  ts ::no(executeO
18e70 6e 53 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b  nSetup)]} then {
18e80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18e90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
18ea0 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61  s command may ra
18eb0 69 73 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66  ise an error; if
18ec0 20 73 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e   so, that is fin
18ed0 65 2c 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23  e, as..        #
18ee0 20 20 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f         the enclo
18ef0 73 69 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74  sing test will t
18f00 68 65 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b  hen fail.  The [
18f10 73 75 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  subst] command i
18f20 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
18f30 20 20 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53     used on the S
18f40 51 4c 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65  QL in case it ne
18f50 65 64 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20  eds to refer to 
18f60 73 74 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20  state in our..  
18f70 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
18f80 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
18f90 23 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65  #..        sql e
18fa0 78 65 63 75 74 65 20 24 64 62 20 5b 73 75 62 73  xecute $db [subs
18fb0 74 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75  t $executeOnSetu
18fc0 70 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p]..      }.... 
18fd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18fe0 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74  NOTE: Always ret
18ff0 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  urn the connecti
19000 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73  on handle upon s
19010 75 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23  uccess...      #
19020 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
19030 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  db..    }.....  
19040 20 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e    proc getDbConn
19050 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d  ection { {varNam
19060 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
19070 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19080 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
19090 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
190a0 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
190b0 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
190c0 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
190d0 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
190e0 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61  handle to the da
190f0 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c  tabase previousl
19100 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65  y opened via the
19110 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19120 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64  [setupDb] proced
19130 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ure should be st
19140 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
19150 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
19160 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
19170 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19180 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72    # NOTE: This r
19190 65 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e  eturns the ADO.N
191a0 45 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  ET IDbConnection
191b0 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65   object instance
191c0 20 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20   for the..      
191d0 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65  #       specifie
191e0 64 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65  d databse handle
191f0 2e 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67  .  Since getting
19200 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c   this object rel
19210 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20  ies upon..      
19220 23 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e  #       Eagle in
19230 74 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63  ternals, great c
19240 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61  are should be ta
19250 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73  ken to avoid dis
19260 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20  posing of..     
19270 20 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62   #       this ob
19280 6a 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73  ject or otherwis
19290 65 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74  e putting it int
192a0 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61  o an invalid sta
192b0 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
192c0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
192d0 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b  ists db]} then {
192e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
192f0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
19300 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
19310 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
19320 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  c -objectflags +
19330 4e 6f 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73  NoDispose -alias
19340 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19350 20 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65    Interpreter.Ge
19360 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
19370 6f 6e 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20  ons Item $db..  
19380 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
19390 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
193a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
193b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
193c0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
193d0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
193e0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
193f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
19400 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
19410 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19420 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19430 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19440 46 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20  Failure, report 
19450 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
19460 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  #..          tpu
19470 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19480 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
19490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
194a0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
194b0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e  ailed to get con
194c0 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
194d0 6f 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  or database \"" 
194e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
194f0 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
19500 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
19510 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
19520 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19530 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19540 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72  : Failure, retur
19550 6e 20 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69  n an obviously i
19560 6e 76 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62  nvalid opaque ob
19570 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
19580 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
19590 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
195a0 0d 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44  ..    proc freeD
195b0 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
195c0 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
195d0 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  n} } {..      #.
195e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
195f0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
19600 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
19610 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e  e.g. "connection
19620 22 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ") in the..     
19630 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
19640 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20   of our caller. 
19650 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   The opaque obje
19660 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  ct handle for an
19670 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20   ADO.NET..      
19680 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
19690 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  on previously re
196a0 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62  turned by [getDb
196b0 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75  Connection] shou
196c0 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ld be..      #  
196d0 20 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72       stored ther
196e0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
196f0 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
19700 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  ame connection..
19710 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19720 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
19730 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f   to remove the o
19740 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
19750 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  dle from the int
19760 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20  erpreter..      
19770 23 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68  #       now.  Th
19780 69 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f  is [object dispo
19790 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  se] call will no
197a0 74 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f  t actually dispo
197b0 73 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  se of the..     
197c0 20 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79   #       underly
197d0 69 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75  ing object becau
197e0 73 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73  se the +NoDispos
197f0 65 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  e flag was set o
19800 6e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  n it..      #   
19810 20 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74      during creat
19820 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75  ion of the opaqu
19830 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
19840 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19850 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
19860 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26  s connection] &&
19870 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63   \..          [c
19880 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73  atch {object dis
19890 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  pose $connection
198a0 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
198b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
198c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
198d0 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
198e0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e  o remove the han
198f0 64 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  dle, report why.
19900 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19910 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19920 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
19930 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
19940 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
19950 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
19960 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
19970 20 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e   handle \"" $con
19980 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
19990 20 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f         "\", erro
199a0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
199b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
199c0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
199d0 63 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f  c addDbConnectio
199e0 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  n { connection {
199f0 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
19a00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19a10 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
19a20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
19a30 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
19a40 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
19a50 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
19a60 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
19a70 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19a80 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
19a90 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
19aa0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
19ab0 72 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c  reate a correctl
19ac0 79 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65  y formatted name
19ad0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
19ae0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d  e connection to.
19af0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
19b00 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
19b10 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74  ist managed by t
19b20 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72  he Eagle interpr
19b30 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eter...      #..
19b40 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62        set db [ob
19b50 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
19b60 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
19b70 0a 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65  .          Eagle
19b80 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69  ._Components.Pri
19b90 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44  vate.FormatOps D
19ba0 61 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d  atabaseObjectNam
19bb0 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  e $connection \.
19bc0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74  .          SQLit
19bd0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a  eConnection [obj
19be0 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
19bf0 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
19c00 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20   NextId]]....   
19c10 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
19c20 54 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61  TE: Add the data
19c30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19c40 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
19c50 63 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69  caller to the li
19c60 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
19c70 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e    of those known
19c80 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e   to the Eagle in
19c90 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
19ca0 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63    #..      objec
19cb0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
19cc0 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72  +NonPublic Inter
19cd0 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
19ce0 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64  .connections Add
19cf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64   \..          $d
19d00 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  b $connection.. 
19d10 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19d20 63 20 72 65 6d 6f 76 65 44 62 54 72 61 6e 73 61  c removeDbTransa
19d30 63 74 69 6f 6e 20 7b 20 74 72 61 6e 73 61 63 74  ction { transact
19d40 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ion } {..      #
19d50 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19d60 52 65 6d 6f 76 65 20 74 68 65 20 64 61 74 61 62  Remove the datab
19d70 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ase transaction 
19d80 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
19d90 63 61 6c 6c 65 72 20 66 72 6f 6d 20 74 68 65 0d  caller from the.
19da0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
19db0 69 73 74 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f  ist of those kno
19dc0 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20  wn to the Eagle 
19dd0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
19de0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a      #..      obj
19df0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
19e00 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74  s +NonPublic Int
19e10 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
19e20 76 65 2e 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ve.transactions 
19e30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 52 65 6d  \..          Rem
19e40 6f 76 65 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  ove $transaction
19e50 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
19e60 70 72 6f 63 20 67 65 74 52 6f 77 73 46 72 6f 6d  proc getRowsFrom
19e70 44 61 74 61 54 61 62 6c 65 20 7b 20 64 61 74 61  DataTable { data
19e80 54 61 62 6c 65 20 7b 76 61 6c 75 65 43 61 6c 6c  Table {valueCall
19e90 62 61 63 6b 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  back ""} } {..  
19ea0 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69      set rows [li
19eb0 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63  st]..      set c
19ec0 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65  ount [$dataTable
19ed0 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d   Columns.Count].
19ee0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  ...      for {se
19ef0 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
19f00 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
19f10 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
19f20 20 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c       set dataCol
19f30 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20  umn [$dataTable 
19f40 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67  -alias Columns.g
19f50 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
19f60 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
19f70 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74  es($index) [$dat
19f80 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61  aColumn ColumnNa
19f90 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
19fa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
19fb0 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 73 6f 6d   NOTE: Setup som
19fc0 65 20 54 63 6c 20 72 65 74 75 72 6e 20 63 6f 64  e Tcl return cod
19fd0 65 20 63 6f 6e 73 74 61 6e 74 73 2e 0d 0a 20 20  e constants...  
19fe0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
19ff0 20 4f 6b 20 30 3b 20 73 65 74 20 45 72 72 6f 72   Ok 0; set Error
1a000 20 31 3b 20 73 65 74 20 52 65 74 75 72 6e 20 32   1; set Return 2
1a010 3b 20 73 65 74 20 42 72 65 61 6b 20 33 3b 20 73  ; set Break 3; s
1a020 65 74 20 43 6f 6e 74 69 6e 75 65 20 34 0d 0a 0d  et Continue 4...
1a030 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f  .      object fo
1a040 72 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74  reach -alias dat
1a050 61 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f  aRow [set dataRo
1a060 77 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52  ws [$dataTable R
1a070 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ows]] {..       
1a080 20 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d   set row [list].
1a090 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b  ...        for {
1a0a0 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69  set index 0} {$i
1a0b0 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b  ndex < $count} {
1a0c0 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
1a0d0 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
1a0e0 75 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72  ue [$dataRow -cr
1a0f0 65 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f  eate -alias get_
1a100 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a  Item $index]....
1a110 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1a120 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
1a130 6c 75 65 43 61 6c 6c 62 61 63 6b 5d 20 3e 20 30  lueCallback] > 0
1a140 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a150 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
1a160 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1a170 20 20 20 20 20 20 20 24 76 61 6c 75 65 43 61 6c         $valueCal
1a180 6c 62 61 63 6b 20 24 64 61 74 61 54 61 62 6c 65  lback $dataTable
1a190 20 24 64 61 74 61 52 6f 77 20 24 69 6e 64 65 78   $dataRow $index
1a1a0 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20   $value..       
1a1b0 20 20 20 20 20 7d 20 6e 65 77 56 61 6c 75 65 5d       } newValue]
1a1c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1a1d0 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 4f 6b  if {$code == $Ok
1a1e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a1f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a200 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a210 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
1a220 65 64 20 28 6e 65 77 3f 29 20 72 6f 77 20 76 61  ed (new?) row va
1a230 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  lue...          
1a240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a250 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
1a260 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69   [list $names($i
1a270 6e 64 65 78 29 20 24 6e 65 77 56 61 6c 75 65 5d  ndex) $newValue]
1a280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1a290 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d  elseif {$code ==
1a2a0 20 24 45 72 72 6f 72 7d 20 74 68 65 6e 20 7b 0d   $Error} then {.
1a2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1a2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a2d0 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1a2e0 28 6e 65 77 3f 29 20 4e 55 4c 4c 20 72 6f 77 20  (new?) NULL row 
1a2f0 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
1a300 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a310 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
1a320 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28  ow [list $names(
1a330 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20  $index)]..      
1a340 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
1a350 24 63 6f 64 65 20 3d 3d 20 24 52 65 74 75 72 6e  $code == $Return
1a360 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a370 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a380 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a390 20 53 6b 69 70 20 72 65 6d 61 69 6e 69 6e 67 20   Skip remaining 
1a3a0 76 61 6c 75 65 73 20 66 6f 72 20 74 68 69 73 20  values for this 
1a3b0 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  row...          
1a3c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a3d0 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20 20       break..    
1a3e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
1a3f0 20 7b 24 63 6f 64 65 20 3d 3d 20 24 42 72 65 61   {$code == $Brea
1a400 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  k} then {..     
1a410 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a420 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1a430 3a 20 53 6b 69 70 20 70 72 6f 63 65 73 73 69 6e  : Skip processin
1a440 67 20 74 68 69 73 20 72 6f 77 20 76 61 6c 75 65  g this row value
1a450 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1a460 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1a470 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65 20  } elseif {$code 
1a480 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68  == $Continue} th
1a490 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a4a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a4b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1a4c0 20 64 65 66 61 75 6c 74 20 72 6f 77 20 76 61 6c   default row val
1a4d0 75 65 20 68 61 6e 64 6c 69 6e 67 2e 0d 0a 20 20  ue handling...  
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1a4f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1a500 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1a520 74 20 63 6f 64 65 20 24 43 6f 6e 74 69 6e 75 65  t code $Continue
1a530 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1a540 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
1a550 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75  code == $Continu
1a560 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
1a570 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1a580 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
1a590 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62              ![ob
1a5b0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76  ject invoke Conv
1a5c0 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61  ert IsDBNull $va
1a5d0 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
1a5f0 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e  end row [list $n
1a600 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76  ames($index) [$v
1a610 61 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d  alue ToString]].
1a620 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1a630 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1a640 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
1a650 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69   [list $names($i
1a660 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20  ndex)]..        
1a670 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1a680 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1a690 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
1a6a0 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20   rows $row..    
1a6b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1a6c0 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d  urn $rows..    }
1a6d0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75  .....    proc du
1a6e0 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61  mpRowsFromDataTa
1a6f0 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f  ble { channel ro
1a700 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  ws } {..      se
1a710 74 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a  t sequence 1....
1a720 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
1a730 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20  w $rows {..     
1a740 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1a750 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1a760 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
1a770 70 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20  pr {$sequence > 
1a780 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20  1 ? "\n" : ""}] 
1a790 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65  "---- ROW #" $se
1a7a0 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20  quence :\n].... 
1a7b0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
1a7c0 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20  air $row {..    
1a7d0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
1a7e0 74 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20  th $pair] >= 2} 
1a7f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a800 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1a810 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a820 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1a830 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64       [list [lind
1a840 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20  ex $pair 0]] ": 
1a850 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20  " [list [lindex 
1a860 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20  $pair 1]] \n].. 
1a870 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1a880 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69  f {[llength $pai
1a890 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  r] == 1} then {.
1a8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1a8b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1a8c0 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20  endArgs \t \..  
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
1a8e0 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
1a8f0 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c  r 0]] ": <null>\
1a900 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1a910 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1a920 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1a930 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b  nel \t<empty>\n;
1a940 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61   # NOTE: No data
1a950 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
1a960 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1a970 20 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e       incr sequen
1a980 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ce..      }..   
1a990 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1a9a0 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65  cleanupDb { file
1a9b0 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  Name {varName db
1a9c0 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
1a9d0 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d   {qualify true}.
1a9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a9f0 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72        {delete tr
1aa00 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
1aa10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1aa20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
1aa30 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
1aa40 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
1aa50 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
1aa60 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
1aa70 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
1aa80 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
1aa90 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
1aaa0 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
1aab0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1aac0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
1aad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1aae0 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
1aaf0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1ab00 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
1ab10 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
1ab20 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
1ab30 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
1ab40 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1ab50 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
1ab60 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
1ab70 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
1ab80 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
1ab90 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
1aba0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
1abb0 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
1abc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1abd0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1abe0 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20  ed via the..    
1abf0 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70    #       [setup
1ac00 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68  Db] procedure sh
1ac10 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
1ac20 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
1ac30 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
1ac40 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
1ac50 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1ac60 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f  TE: Close the co
1ac70 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
1ac80 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54  database now.  T
1ac90 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
1aca0 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   us..      #    
1acb0 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65     to delete the
1acc0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
1acd0 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20  base file...    
1ace0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1acf0 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20  info exists db] 
1ad00 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63  && [catch {sql c
1ad10 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d  lose $db} error]
1ad20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ad30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1ad40 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1ad50 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20  failed to close 
1ad60 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
1ad70 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
1ad80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
1ad90 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1ada0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1adb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1adc0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1add0 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61  iled to close da
1ade0 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22  tabase \"" $db "
1adf0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  \", error: " \..
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1ae10 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
1ae20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
1ae30 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
1ae40 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
1ae50 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
1ae60 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
1ae70 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
1ae80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
1ae90 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
1aea0 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
1aeb0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1aec0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
1aed0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74   the full path t
1aee0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1aef0 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e  ile name.  For n
1af00 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20  ow, all test..  
1af10 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61      #       data
1af20 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73  base files are s
1af30 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d  tored in the tem
1af40 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
1af50 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1af60 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
1af70 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
1af80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
1af90 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
1afa0 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
1afb0 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
1afc0 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
1afd0 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
1afe0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1aff0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1b000 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
1b010 78 69 73 74 73 3b 20 69 6e 69 74 69 61 6c 6c 79  xists; initially
1b020 2c 20 61 73 73 75 6d 65 20 61 6c 6c 20 66 69 6c  , assume all fil
1b030 65 73 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 23  es will..      #
1b040 20 20 20 20 20 20 20 62 65 20 64 65 6c 65 74 65         be delete
1b050 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
1b060 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20  if necessary... 
1b070 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
1b080 74 20 73 75 63 63 65 73 73 20 74 72 75 65 0d 0a  t success true..
1b090 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
1b0a0 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
1b0b0 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
1b0c0 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
1b0d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1b0e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b0f0 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64   Skip deleting d
1b100 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66  atabase files if
1b110 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
1b120 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20  he global..     
1b130 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
1b140 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69  ble to prevent i
1b150 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1b160 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1b170 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c  o exists ::no(cl
1b180 65 61 6e 75 70 44 62 46 69 6c 65 73 29 5d 7d 20  eanupDbFiles)]} 
1b190 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b1a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1b1b0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1b1c0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
1b1d0 74 20 57 41 4c 20 66 69 6c 65 2c 20 69 66 20 61  t WAL file, if a
1b1e0 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ny, now...      
1b1f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1b200 20 73 65 74 20 77 61 6c 46 69 6c 65 4e 61 6d 65   set walFileName
1b210 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69   [appendArgs $fi
1b220 6c 65 4e 61 6d 65 20 2d 77 61 6c 5d 0d 0a 0d 0a  leName -wal]....
1b230 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
1b240 69 6c 65 20 65 78 69 73 74 73 20 24 77 61 6c 46  ile exists $walF
1b250 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1b260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1b270 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1b280 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 69 73  OTE: If there is
1b290 20 61 20 57 41 4c 20 66 69 6c 65 2c 20 69 74 20   a WAL file, it 
1b2a0 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 20 62  should be zero b
1b2b0 79 74 65 73 20 61 74 20 74 68 69 73 0d 0a 20 20  ytes at this..  
1b2c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1b2d0 20 20 70 6f 69 6e 74 2e 0d 0a 20 20 20 20 20 20    point...      
1b2e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b2f0 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 73 69       if {[set si
1b300 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 24 77  ze [file size $w
1b310 61 6c 46 69 6c 65 4e 61 6d 65 5d 5d 20 3d 3d 20  alFileName]] == 
1b320 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1b330 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b340 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1b350 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
1b360 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
1b370 65 20 57 41 4c 20 66 69 6c 65 2c 20 72 65 70 6f  e WAL file, repo
1b380 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
1b390 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b3a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1b3b0 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
1b3c0 24 77 61 6c 46 69 6c 65 4e 61 6d 65 7d 20 65 72  $walFileName} er
1b3d0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1b3f0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1b400 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b410 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b420 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1b430 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1b440 64 65 6c 65 74 65 20 57 41 4c 20 66 69 6c 65 20  delete WAL file 
1b450 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65  \"" $walFileName
1b460 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b470 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
1b480 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
1b490 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1b4a0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
1b4b0 20 20 20 20 20 20 20 20 73 65 74 20 73 75 63 63          set succ
1b4c0 65 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ess false..     
1b4d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1b4e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1b4f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b500 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1b510 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1b520 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1b530 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1b540 4e 49 4e 47 3a 20 57 41 4c 20 66 69 6c 65 20 5c  NING: WAL file \
1b550 22 22 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 20  "" $walFileName 
1b560 22 5c 22 20 69 73 20 22 20 24 73 69 7a 65 20 5c  "\" is " $size \
1b570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b580 20 20 20 20 22 20 62 79 74 65 73 20 69 6e 20 73      " bytes in s
1b590 69 7a 65 2c 20 73 6b 69 70 70 69 6e 67 20 61 6c  ize, skipping al
1b5a0 6c 20 66 69 6c 65 20 64 65 6c 65 74 69 6f 6e 73  l file deletions
1b5b0 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ...\n"]....     
1b5c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b5d0 31 3b 20 23 20 65 72 72 6f 72 0d 0a 20 20 20 20  1; # error..    
1b5e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b5f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b600 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1b610 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
1b620 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
1b630 65 73 74 20 53 48 4d 20 66 69 6c 65 2c 20 69 66  est SHM file, if
1b640 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20 20   any, now...    
1b650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b660 20 20 20 73 65 74 20 73 68 6d 46 69 6c 65 4e 61     set shmFileNa
1b670 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  me [appendArgs $
1b680 66 69 6c 65 4e 61 6d 65 20 2d 73 68 6d 5d 0d 0a  fileName -shm]..
1b690 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b6a0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 68  [file exists $sh
1b6b0 6d 46 69 6c 65 4e 61 6d 65 5d 20 26 26 20 5c 0d  mFileName] && \.
1b6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
1b6d0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
1b6e0 74 65 20 24 73 68 6d 46 69 6c 65 4e 61 6d 65 7d  te $shmFileName}
1b6f0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1b700 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1b710 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1b720 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
1b730 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1b740 74 68 65 20 53 48 4d 20 66 69 6c 65 2c 20 72 65  the SHM file, re
1b750 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
1b760 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b770 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1b780 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1b790 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1b7a0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1b7b0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1b7c0 20 74 6f 20 64 65 6c 65 74 65 20 53 48 4d 20 66   to delete SHM f
1b7d0 69 6c 65 20 5c 22 22 20 24 73 68 6d 46 69 6c 65  ile \"" $shmFile
1b7e0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
1b7f0 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
1b800 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
1b810 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1b820 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
1b830 20 20 20 20 73 65 74 20 73 75 63 63 65 73 73 20      set success 
1b840 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
1b850 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b860 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1b870 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
1b880 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
1b890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f  database file no
1b8a0 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b8c0 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
1b8d0 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
1b8e0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1b8f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b900 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b910 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
1b920 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
1b930 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
1b940 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
1b950 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  #..            t
1b960 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b970 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b980 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b990 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1b9a0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
1b9b0 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ete database fil
1b9c0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
1b9d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b9e0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1b9f0 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
1ba00 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1ba10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
1ba20 65 74 20 73 75 63 63 65 73 73 20 66 61 6c 73 65  et success false
1ba30 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1ba40 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1ba50 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1ba60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ba70 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
1ba80 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
1ba90 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
1baa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bab0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1bac0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1bad0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1bae0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1baf0 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
1bb00 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1bb10 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
1bb20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bb30 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
1bb40 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  up\n"]..        
1bb50 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1bb60 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
1bb70 20 7b 24 73 75 63 63 65 73 73 20 3f 20 30 20 3a   {$success ? 0 :
1bb80 20 31 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a   1}]..    }.....
1bb90 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76      proc saveEnv
1bba0 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1bbb0 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61  s { names {varNa
1bbc0 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
1bbd0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1bbe0 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65  E: For each name
1bbf0 2c 20 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20  , does the live 
1bc00 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1bc10 61 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d  able exist?  If.
1bc20 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
1bc30 6f 2c 20 73 61 76 65 20 74 68 65 20 76 61 6c 75  o, save the valu
1bc40 65 20 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68  e for later; oth
1bc50 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72  erwise, make sur
1bc60 65 20 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20  e the saved..   
1bc70 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65     #       value
1bc80 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
1bc90 65 69 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76  either.  The liv
1bca0 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  e environment va
1bcb0 72 69 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23  riables..      #
1bcc0 20 20 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63         ARE NOT c
1bcd0 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70  hanged by this p
1bce0 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
1bcf0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
1bd00 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
1bd10 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65  rName] == 0} the
1bd20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
1bd30 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e   varName savedEn
1bd40 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  v..      }....  
1bd50 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1bd60 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d  Name savedEnv...
1bd70 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
1bd80 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20  ame $names {..  
1bd90 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1bda0 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61  exists ::env($na
1bdb0 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  me)]} then {..  
1bdc0 20 20 20 20 20 20 20 20 73 65 74 20 73 61 76 65          set save
1bdd0 64 45 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65  dEnv($name) $::e
1bde0 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
1bdf0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1be00 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
1be10 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
1be20 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
1be30 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1be40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1be50 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73   NOTE: This is s
1be60 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49  elf-cleaning.  I
1be70 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72  f no saved envir
1be80 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73  onment variables
1be90 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20   now..      #   
1bea0 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76      exist, remov
1beb0 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20  e the array...  
1bec0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1bed0 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76  {[array size sav
1bee0 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65  edEnv] == 0} the
1bef0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73  n {..        uns
1bf00 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
1bf10 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d  avedEnv..      }
1bf20 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bf30 70 72 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69  proc restoreEnvi
1bf40 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1bf50 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d   { names {varNam
1bf60 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
1bf70 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1bf80 3a 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c  : For each name,
1bf90 20 64 6f 65 73 20 74 68 65 20 73 61 76 65 64 20   does the saved 
1bfa0 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1bfb0 61 62 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d  able exist?  If.
1bfc0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
1bfd0 6f 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 73  o, restore the s
1bfe0 61 76 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75  aved value and u
1bff0 6e 73 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69  nset it; otherwi
1c000 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20  se, make sure.. 
1c010 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1c020 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
1c030 74 20 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20  t variable does 
1c040 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65 72  not exist either
1c050 20 28 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20   (i.e. it..     
1c060 20 23 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74   #       was not
1c070 20 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69   set to begin wi
1c080 74 68 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64  th).  Both saved
1c090 20 61 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f   and live enviro
1c0a0 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  nment..      #  
1c0b0 20 20 20 20 20 76 61 72 69 61 62 6c 65 73 20 41       variables A
1c0c0 52 45 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  RE changed by th
1c0d0 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  is procedure... 
1c0e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1c0f0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
1c100 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d   $varName] == 0}
1c110 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c120 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76   set varName sav
1c130 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
1c140 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1c150 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e  $varName savedEn
1c160 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  v....      forea
1c170 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b  ch name $names {
1c180 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
1c190 6e 66 6f 20 65 78 69 73 74 73 20 73 61 76 65 64  nfo exists saved
1c1a0 45 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65  Env($name)]} the
1c1b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
1c1c0 65 74 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20  et ::env($name) 
1c1d0 24 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29  $savedEnv($name)
1c1e0 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
1c1f0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
1c200 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20  vedEnv($name).. 
1c210 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1c220 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
1c230 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65   -nocomplain ::e
1c240 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20  nv($name)..     
1c250 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1c260 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c270 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20  # NOTE: This is 
1c280 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20  self-cleaning.  
1c290 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69  If no saved envi
1c2a0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1c2b0 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20  s now..      #  
1c2c0 20 20 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f       exist, remo
1c2d0 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20  ve the array... 
1c2e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1c2f0 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61   {[array size sa
1c300 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68  vedEnv] == 0} th
1c310 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e  en {..        un
1c320 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
1c330 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20  savedEnv..      
1c340 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1c350 20 70 72 6f 63 20 73 61 76 65 45 61 67 6c 65 53   proc saveEagleS
1c360 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  hellEnvironment 
1c370 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1c380 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1c390 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
1c3a0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1c3b0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 4e 6f  riables [list No
1c3c0 4d 75 74 65 78 65 73 5d 20 73 61 76 65 64 45 6e  Mutexes] savedEn
1c3d0 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
1c3e0 20 70 72 6f 63 20 72 65 73 74 6f 72 65 45 61 67   proc restoreEag
1c3f0 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65  leShellEnvironme
1c400 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1c410 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1c420 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1c430 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e    restoreEnviron
1c440 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1c450 69 73 74 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73  ist NoMutexes] s
1c460 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1c470 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
1c480 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e  MdaConfigEnviron
1c490 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
1c4a0 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
1c4b0 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
1c4c0 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
1c4d0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
1c4e0 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44 41 5d 20  st COMPLUS_MDA] 
1c4f0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
1c500 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
1c510 74 6f 72 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76  toreMdaConfigEnv
1c520 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
1c530 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
1c540 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
1c550 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
1c560 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1c570 6c 65 73 20 5b 6c 69 73 74 20 43 4f 4d 50 4c 55  les [list COMPLU
1c580 53 5f 4d 44 41 5d 20 73 61 76 65 64 45 6e 76 0d  S_MDA] savedEnv.
1c590 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1c5a0 72 6f 63 20 73 61 76 65 47 65 74 53 65 74 74 69  roc saveGetSetti
1c5b0 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65  ngValueEnvironme
1c5c0 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1c5d0 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1c5e0 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1c5f0 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1c600 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1c610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   \..          No
1c620 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74  _Expand No_SQLit
1c630 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65  eGetSettingValue
1c640 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e   No_SQLiteXmlCon
1c650 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20  figFile] \..    
1c660 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1c670 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1c680 6f 63 20 72 65 73 74 6f 72 65 47 65 74 53 65 74  oc restoreGetSet
1c690 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e  tingValueEnviron
1c6a0 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
1c6b0 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
1c6c0 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
1c6d0 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
1c6e0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1c6f0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1c700 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f     No_Expand No_
1c710 53 51 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67  SQLiteGetSetting
1c720 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58  Value No_SQLiteX
1c730 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d  mlConfigFile] \.
1c740 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1c750 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1c760 20 20 20 70 72 6f 63 20 73 61 76 65 53 51 4c 69     proc saveSQLi
1c770 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69  teConnectionEnvi
1c780 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1c790 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1c7a0 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1c7b0 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
1c7c0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1c7d0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1c7e0 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67 73 5f     DefaultFlags_
1c7f0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
1c800 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63   No_SQLiteConnec
1c810 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c  tionNewParser] \
1c820 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
1c830 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1c840 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1c850 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
1c860 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1c870 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1c880 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1c890 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74 6f  v....      resto
1c8a0 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1c8b0 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
1c8c0 20 20 20 20 20 20 20 20 20 20 44 65 66 61 75 6c            Defaul
1c8d0 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e  tFlags_SQLiteCon
1c8e0 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74  nection No_SQLit
1c8f0 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61  eConnectionNewPa
1c900 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20  rser] \..       
1c910 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
1c920 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1c930 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 76 65 72  saveSQLiteConver
1c940 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  tEnvironment {} 
1c950 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
1c960 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
1c970 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65  nv....      save
1c980 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1c990 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  bles [list \..  
1c9a0 20 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69          Use_SQLi
1c9b0 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c  teConvert_Defaul
1c9c0 74 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69  tDbType Use_SQLi
1c9d0 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c  teConvert_Defaul
1c9e0 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20  tTypeName] \..  
1c9f0 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
1ca00 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1ca10 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69  proc restoreSQLi
1ca20 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72 6f 6e  teConvertEnviron
1ca30 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
1ca40 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
1ca50 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
1ca60 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
1ca70 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1ca80 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1ca90 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e     Use_SQLiteCon
1caa0 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79  vert_DefaultDbTy
1cab0 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e  pe Use_SQLiteCon
1cac0 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65  vert_DefaultType
1cad0 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  Name] \..       
1cae0 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
1caf0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1cb00 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
1cb10 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e  Callback { chann
1cb20 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20  el log } {..    
1cb30 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1cb40 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75   "---- setting u
1cb50 70 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72  p debugger inter
1cb60 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  rupt callback...
1cb70 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
1cb80 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1cb90 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1cba0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1cbb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cbc0 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
1cbd0 65 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69  eterTestPath qui
1cbe0 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
1cbf0 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 0d 0a 20  erTestPath].... 
1cc00 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20         try {..  
1cc10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cc20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 72 65       # NOTE: Pre
1cc30 76 65 6e 74 20 74 68 65 20 76 65 6e 64 6f 72 20  vent the vendor 
1cc40 73 63 72 69 70 74 20 66 72 6f 6d 20 62 65 69 6e  script from bein
1cc50 67 20 6e 6f 69 73 79 20 77 68 65 6e 20 63 72 65  g noisy when cre
1cc60 61 74 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20  ating..         
1cc70 20 23 20 20 20 20 20 20 20 74 68 65 20 69 73 6f   #       the iso
1cc80 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1cc90 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
1cca0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
1ccb0 3a 65 6e 76 28 71 75 69 65 74 46 69 6e 64 49 6e  :env(quietFindIn
1ccc0 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
1ccd0 68 29 20 31 0d 0a 20 20 20 20 20 20 20 20 20 20  h) 1..          
1cce0 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 53  set ::env(quietS
1ccf0 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54  etupInterpreterT
1cd00 65 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a 20 20  estPath) 1....  
1cd10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cd20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
1cd30 65 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70  e sure the scrip
1cd40 74 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74  t debugger and t
1cd50 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
1cd60 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 20  rpreter..       
1cd70 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73     #       are s
1cd80 65 74 75 70 20 61 6e 64 20 72 65 61 64 79 20 66  etup and ready f
1cd90 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20  or use...       
1cda0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1cdb0 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65  debug setup true
1cdc0 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
1cdd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1cde0 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
1cdf0 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b 61   necessary packa
1ce00 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f  ges into the iso
1ce10 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1ce20 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
1ce30 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
1ce40 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20   eval {..       
1ce50 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
1ce60 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20  uire Eagle..    
1ce70 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
1ce80 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69  require Eagle.Li
1ce90 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20  brary..         
1cea0 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
1ceb0 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20  re Eagle.Test.. 
1cec0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1ced0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1cee0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
1cef0 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  y the necessary 
1cf00 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74  variables into t
1cf10 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
1cf20 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
1cf30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1cf40 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
1cf50 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  set ::test_chann
1cf60 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e  el $channel; # N
1cf70 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d  OTE: For [tputs]
1cf80 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  ...          deb
1cf90 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
1cfa0 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b  ::test_log $log;
1cfb0 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c   # NOTE: For [tl
1cfc0 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og].....        
1cfd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1cfe0 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74   NOTE: Install t
1cff0 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  he callback scri
1d000 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  pt to be evaluat
1d010 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74  ed in the isolat
1d020 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
1d030 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65        interprete
1d040 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65  r when this inte
1d050 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72  rpreter is inter
1d060 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74  rupted by script
1d070 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1d080 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e      cancellation
1d090 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20  , etc...        
1d0a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
1d0b0 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70  ebug callback ap
1d0c0 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20  ply {{sender e} 
1d0d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1d0e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
1d0f0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1d100 68 69 73 20 64 65 62 75 67 67 65 72 20 63 61 6c  his debugger cal
1d110 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61  lback is one tha
1d120 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e  t we care about.
1d130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1d140 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
1d150 20 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 20   interruptTypes 
1d160 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72  [split [$e Inter
1d170 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 0d  ruptType] ", "].
1d180 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1d190 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e  f {"Canceled" in
1d1a0 20 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73   $interruptTypes
1d1b0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
1d1c0 20 20 20 20 20 20 20 22 55 6e 77 6f 75 6e 64 22         "Unwound"
1d1d0 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79   in $interruptTy
1d1e0 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  pes} then {..   
1d1f0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1d200 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1d210 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
1d220 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
1d230 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  nd is available.
1d240 20 20 53 69 6e 63 65 0d 0a 20 20 20 20 20 20 20    Since..       
1d250 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1d260 68 69 73 20 69 73 20 61 6e 20 69 73 6f 6c 61 74  his is an isolat
1d270 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20  ed interpreter, 
1d280 63 68 65 63 6b 20 66 6f 72 20 69 74 20 74 68 65  check for it the
1d290 20 68 61 72 64 0d 0a 20 20 20 20 20 20 20 20 20   hard..         
1d2a0 20 20 20 20 20 23 20 20 20 20 20 20 20 77 61 79       #       way
1d2b0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1d2c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1d2d0 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b    if {[llength [
1d2e0 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62  info commands ob
1d2f0 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e  ject]] > 0} then
1d300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d320 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
1d330 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1d340 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
1d350 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f  ections known to
1d360 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
1d370 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
1d380 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
1d390 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1d3a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d3b0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
1d3c0 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
1d3d0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1d3e0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1d3f0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1d400 20 20 20 20 20 20 20 20 20 24 65 20 49 6e 74 65           $e Inte
1d410 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69  rpreter.connecti
1d420 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
1d430 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1d450 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1d460 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c  o cancel any SQL
1d470 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67   queries in prog
1d480 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20  ress on..       
1d490 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1d4a0 20 20 20 74 68 69 73 20 64 61 74 61 62 61 73 65     this database
1d4b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20   connection...  
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1d4e0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1d4f0 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e  {$pair Value.Can
1d500 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  cel} error]} the
1d510 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d520 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d530 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1d540 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d  appendArgs \n \.
1d550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d560 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1d570 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1d580 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66  o cancel query f
1d590 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20  "connection \"" 
1d5c0 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c  [$pair Key] "\",
1d5d0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c   error: " \n\t \
1d5e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d5f0 20 20 20 20 20 20 20 20 20 20 24 65 72 72 6f 72            $error
1d600 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1d610 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1d620 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d630 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
1d640 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1d650 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d660 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1d670 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20  endArgs \n \..  
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1d6a0 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c 20 61   cannot cancel a
1d6b0 6e 79 20 71 75 65 72 69 65 73 3a 20 22 20 5c 0d  ny queries: " \.
1d6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d6d0 20 20 20 20 20 22 74 68 65 20 5c 22 6f 62 6a 65       "the \"obje
1d6e0 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ct\" command is 
1d6f0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c 6e 22  not available\n"
1d700 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1d710 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1d720 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 7d 0d  }..          }}.
1d730 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  .        } final
1d740 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ly {..          
1d750 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
1d760 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
1d770 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1d780 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65     quietFindInte
1d790 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20  rpreterTestPath 
1d7a0 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70  quietSetupInterp
1d7b0 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a  reterTestPath]..
1d7c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1d7d0 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
1d7e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d7f0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e  addConstraint in
1d800 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e  terruptCallback.
1d810 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20  sqlite3....     
1d820 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1d830 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
1d840 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1d850 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d860 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c  [appendArgs "no,
1d870 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1d880 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1d890 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1d8a0 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69    proc cleanupFi
1d8b0 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63  le { fileName {c
1d8c0 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f  ollect true} {fo
1d8d0 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  rce false} } {..
1d8e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1d8f0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1d900 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64  o force all pend
1d910 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62  ing "garbage" ob
1d920 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c  jects to be coll
1d930 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20  ected,..      # 
1d940 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20        including 
1d950 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
1d960 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a  s and backup obj
1d970 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c  ects; this shoul
1d980 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23  d allow..      #
1d990 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72         the under
1d9a0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1d9b0 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
1d9c0 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
1d9d0 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
1d9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d9f0 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
1da00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1da10 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1da20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1da30 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
1da40 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
1da50 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
1da60 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
1da70 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
1da80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1da90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1daa0 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
1dab0 20 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73   test files if s
1dac0 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
1dad0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
1dae0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1daf0 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e    to prevent it.
1db00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1db10 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
1db20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  || ![info exists
1db30 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c   ::no(cleanupFil
1db40 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
1db50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1db60 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1db70 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
1db80 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e  e test file now.
1db90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1dba0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
1dbb0 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
1dbc0 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
1dbd0 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
1dbe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dbf0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1dc00 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
1dc10 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
1dc20 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
1dc30 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
1dc40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1dc50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1dc60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1dc70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1dc90 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1dca0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73  ed to delete tes
1dcb0 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  t file \"" $file
1dcc0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
1dcd0 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
1dce0 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
1dcf0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1dd00 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1dd10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1dd20 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
1dd30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1dd40 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
1dd50 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
1dd60 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
1dd70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1dd80 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
1dd90 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1dda0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1ddb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1ddc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1ddd0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
1dde0 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
1ddf0 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
1de00 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
1de10 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
1de20 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
1de30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1de40 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1de50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1de60 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
1de70 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
1de80 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
1de90 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1dea0 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
1deb0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1dec0 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
1ded0 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
1dee0 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e 61 6d  pMemory { varNam
1def0 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  e {quiet false} 
1df00 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
1df10 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
1df20 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20  Command] && \.. 
1df30 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1df40 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
1df50 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1df60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1df70 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
1df80 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
1df90 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
1dfa0 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e  "connection") in
1dfb0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
1dfc0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66        context of
1dfd0 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68   our caller.  Th
1dfe0 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
1dff0 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d 0a 20  handle for an.. 
1e000 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 41         #       A
1e010 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74 69 6f  DO.NET connectio
1e020 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74  n previously ret
1e030 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43  urned by [getDbC
1e040 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20 20 20  onnection]..    
1e050 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
1e060 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ld be stored the
1e070 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
1e080 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
1e090 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74  $varName connect
1e0a0 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ion....        i
1e0b0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1e0c0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1e0d0 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  voke $connection
1e0e0 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 0d 0a   ReleaseMemory..
1e0f0 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1e100 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e110 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e120 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e130 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1e140 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1e150 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1e160 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1e170 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1e180 20 74 6f 20 72 65 6c 65 61 73 65 20 64 61 74 61   to release data
1e190 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65 72 72  base memory, err
1e1a0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1e1b0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1e1c0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1e1d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e1e0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1e1f0 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
1e200 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
1e210 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74 68 65  debug]] > 0} the
1e220 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1e230 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1e240 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1e250 6c 69 73 74 20 64 65 62 75 67 20 70 75 72 67 65  list debug purge
1e260 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  ]..        } res
1e270 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1e280 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1e290 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1e2a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1e2b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1e2c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1e2e0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1e2f0 6c 65 64 20 74 6f 20 70 75 72 67 65 20 63 61 6c  led to purge cal
1e300 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f 72 3a 20  l frame, error: 
1e310 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1e320 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1e330 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1e340 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1e350 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
1e360 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1e370 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
1e380 20 64 65 62 75 67 20 63 6c 65 61 6e 75 70 5d 0d   debug cleanup].
1e390 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1e3a0 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
1e3b0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1e3c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1e3d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1e3e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1e3f0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1e400 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1e410 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1e420 64 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 74  d to cleanup int
1e430 65 72 70 72 65 74 65 72 2c 20 65 72 72 6f 72 3a  erpreter, error:
1e440 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1e450 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1e460 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1e470 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1e480 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1e490 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1e4a0 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1e4b0 74 20 64 65 62 75 67 20 63 6f 6c 6c 65 63 74 5d  t debug collect]
1e4c0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
1e4d0 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
1e4e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1e4f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1e500 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1e510 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1e520 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1e540 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1e550 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  ed to collect ga
1e560 72 62 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  rbage, error: " 
1e570 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e580 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1e590 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1e5a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1e5b0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1e5c0 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 4d 65      proc setupMe
1e5d0 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 76  moryCounters { v
1e5e0 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  arName } {..    
1e5f0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1e600 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1e610 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e620 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
1e630 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20  e counter....   
1e640 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72       set counter
1e650 28 31 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61  (1) [object crea
1e660 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  te -alias \..   
1e670 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1e680 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66  Diagnostics.Perf
1e690 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50  ormanceCounter P
1e6a0 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20  rocess \..      
1e6b0 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53        "Working S
1e6c0 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  et" [file rootna
1e6d0 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  me [file tail $:
1e6e0 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a  :bin_file]]]....
1e6f0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e          set coun
1e700 74 65 72 28 32 29 20 5b 6f 62 6a 65 63 74 20 63  ter(2) [object c
1e710 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
1e720 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1e730 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
1e740 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
1e750 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20  r Process \..   
1e760 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e           "Workin
1e770 67 20 53 65 74 20 50 65 61 6b 22 20 5b 66 69 6c  g Set Peak" [fil
1e780 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
1e790 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c   tail $::bin_fil
1e7a0 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e]]]....        
1e7b0 73 65 74 20 63 6f 75 6e 74 65 72 28 33 29 20 5b  set counter(3) [
1e7c0 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
1e7d0 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
1e7e0 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e      System.Diagn
1e7f0 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e  ostics.Performan
1e800 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73  ceCounter Proces
1e810 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1e820 20 22 50 72 69 76 61 74 65 20 42 79 74 65 73 22   "Private Bytes"
1e830 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
1e840 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69  [file tail $::bi
1e850 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20  n_file]]]..     
1e860 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1e870 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
1e880 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74  .    proc report
1e890 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b  MemoryCounters {
1e8a0 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61 6d 65   channel varName
1e8b0 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20 20 20   prefix } {..   
1e8c0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1e8d0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1e8e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e8f0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
1e900 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20  me counter....  
1e910 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1e920 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e930 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e940 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20  "---- " $prefix 
1e950 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d  " counter \"" \.
1e960 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
1e970 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
1e980 6e 74 65 72 28 31 29 20 43 6f 75 6e 74 65 72 4e  nter(1) CounterN
1e990 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69  ame] "\" value i
1e9a0 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
1e9b0 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
1e9c0 65 20 24 63 6f 75 6e 74 65 72 28 31 29 20 52 61  e $counter(1) Ra
1e9d0 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20  wValue] \n].... 
1e9e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1e9f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ea00 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ea10 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78   "---- " $prefix
1ea20 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c   " counter \"" \
1ea30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
1ea40 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
1ea50 75 6e 74 65 72 28 32 29 20 43 6f 75 6e 74 65 72  unter(2) Counter
1ea60 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20  Name] "\" value 
1ea70 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  is " \..        
1ea80 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
1ea90 6b 65 20 24 63 6f 75 6e 74 65 72 28 32 29 20 52  ke $counter(2) R
1eaa0 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a  awValue] \n]....
1eab0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1eac0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ead0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1eae0 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69    "---- " $prefi
1eaf0 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  x " counter \"" 
1eb00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1eb10 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
1eb20 6f 75 6e 74 65 72 28 33 29 20 43 6f 75 6e 74 65  ounter(3) Counte
1eb30 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65  rName] "\" value
1eb40 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   is " \..       
1eb50 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
1eb60 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20  oke $counter(3) 
1eb70 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20  RawValue] \n].. 
1eb80 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1eb90 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65  ..    proc colle
1eba0 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e  ctGarbage { chan
1ebb0 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64  nel {millisecond
1ebc0 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74  s 1000} {quiet t
1ebd0 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
1ebe0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1ebf0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1ec00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1ec10 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1ec20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1ec30 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
1ec40 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20  Memory false..  
1ec50 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
1ec60 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1ec70 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1ec80 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1ec90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1eca0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1ecb0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1ecc0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
1ecd0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
1ece0 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c  e CLR before col
1ecf0 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
1ed20 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1ed30 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1ed40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
1ed50 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1ed60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ed70 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1ed80 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1eda0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1edb0 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65  ed to get CLR me
1edc0 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f  mory usage, erro
1edd0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1ede0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1edf0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1ee00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ee10 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1ee20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1ee30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ee60 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
1ee70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1ee80 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c   NOTE: Repeatedl
1ee90 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  y attempt to col
1eea0 6c 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74  lect garbage unt
1eeb0 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20  il the allotted 
1eec0 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20  number..      # 
1eed0 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65        of millise
1eee0 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65  conds has elapse
1eef0 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d  d.  Always attem
1ef00 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  pt to collect ga
1ef10 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20  rbage..      #  
1ef20 20 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e       at least on
1ef30 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ce...      #..  
1ef40 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1ef50 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1ef60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ef70 20 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c     set start [cl
1ef80 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
1ef90 20 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b        set stop [
1efa0 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28  expr {$start + (
1efb0 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20  $milliseconds / 
1efc0 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20  1000)}]....     
1efd0 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20     do {..       
1efe0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1eff0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1f000 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
1f010 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
1f020 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
1f030 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  any..          #
1f040 20 20 20 20 20 20 20 65 72 72 6f 72 20 74 68 61         error tha
1f050 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
1f060 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20   if we fail...  
1f070 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f080 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1f090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1f0a0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
1f0b0 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74  GetTotalMemory t
1f0c0 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  rue..          }
1f0d0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1f0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1f0f0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1f100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f110 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1f120 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1f150 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61  ailed full garba
1f160 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65  ge collection, e
1f170 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
1f190 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1f1a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f1b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f1c0 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
1f1d0 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
1f1e0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b         } while {
1f1f0 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26  $start <= $now &
1f200 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d  & $now < $stop}.
1f210 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1f220 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1f230 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f260 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
1f270 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1f280 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1f290 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1f2a0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1f2b0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1f2c0 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
1f2d0 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
1f2e0 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  e..        } res
1f2f0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
1f300 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1f310 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1f320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1f330 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1f340 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1f350 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f360 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
1f370 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
1f380 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
1f390 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f3a0 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
1f3b0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
1f3c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1f3d0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1f3e0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1f3f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f400 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f410 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f430 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1f440 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c  failed to get CL
1f450 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  R memory usage, 
1f460 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1f470 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1f480 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1f490 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f4a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1f4b0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1f4c0 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c  c getSQLiteHandl
1f4d0 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65  eCounts { channe
1f4e0 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
1f4f0 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72  } {..      set r
1f500 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
1f510 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1f520 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1f530 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1f540 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44      [haveSQLiteD
1f550 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f  efineConstant CO
1f560 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65  UNT_HANDLE]} the
1f570 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1f580 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f590 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61  Add each critica
1f5a0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74  l handle count t
1f5b0 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  o the resulting 
1f5c0 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
1f5d0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1f5e0 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a  h name [list \..
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e              conn
1f600 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74  ectionCount stat
1f610 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75  ementCount backu
1f620 70 43 6f 75 6e 74 20 62 6c 6f 62 43 6f 75 6e 74  pCount blobCount
1f630 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
1f640 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1f650 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1f660 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1f670 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1f680 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1f690 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
1f6a0 65 62 75 67 44 61 74 61 20 24 6e 61 6d 65 0d 0a  ebugData $name..
1f6b0 20 20 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75            } valu
1f6c0 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
1f6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1f6e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1f6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f700 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1f710 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
1f740 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20  andle count \"" 
1f750 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24  $name "\" is " $
1f760 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  value \n]..     
1f770 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f780 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1f790 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20  result $value.. 
1f7a0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1f7b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1f7c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1f7d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f7e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f7f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1f820 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63   failed to get c
1f830 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1f840 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ount \"" \..    
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e                $n
1f860 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ame "\", error: 
1f870 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e  " \n\t $value \n
1f880 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1f890 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f8a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f8b0 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65  } elseif {!$quie
1f8c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1f8d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f8e0 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c  NOTE: The actual
1f8f0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
1f900 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
1f910 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
1f920 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
1f930 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70     return an emp
1f940 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ty list...      
1f950 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1f960 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1f970 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
1f980 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c  e counts unavail
1f990 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  able\n"..      }
1f9a0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
1f9b0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
1f9c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75  ....    proc shu
1f9d0 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68  tdownSQLite { ch
1f9e0 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c  annel {force fal
1f9f0 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  se} {quiet false
1fa00 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1fa10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1fa20 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c  ke sure that SQL
1fa30 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1fa40 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73   is completely s
1fa50 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a  hutdown.  This..
1fa60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
1fa70 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74   used by tests t
1fa80 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69  hat change confi
1fa90 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
1faa0 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20   and/or those.. 
1fab0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
1fac0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  t need to make s
1fad0 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69  ure logging is i
1fae0 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e  nitialized (i.e.
1faf0 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20   just in case.. 
1fb00 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1fb10 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
1fb20 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c  rary was initial
1fb30 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63  ized in the proc
1fb40 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20  ess prior to..  
1fb50 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1fb60 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20  SQLiteLog class 
1fb70 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65  being able to se
1fb80 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20  tup its logging 
1fb90 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20  callback)...    
1fba0 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c    #       Normal
1fbb0 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ly, this should 
1fbc0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
1fbd0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
1fbe0 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20  oaded and..     
1fbf0 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66   #       ready f
1fc00 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
1fc10 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1fc20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66   #..      if {$f
1fc30 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74  orce || [isSQLit
1fc40 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
1fc50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fc60 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d 61      # BUGFIX: Ma
1fc70 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79  ke sure that any
1fc80 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73 61   "leaked" transa
1fc90 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f  ctions and/or co
1fca0 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20  nnections..     
1fcb0 20 20 20 23 20 20 20 20 20 20 20 20 20 61 72 65     #         are
1fcc0 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f   cleaned up befo
1fcd0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
1fce0 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
1fcf0 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  unction...      
1fd00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
1fd10 65 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e  each transaction
1fd20 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69   [info transacti
1fd30 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
1fd40 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1fd50 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  tch \..         
1fd60 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61       System#Data
1fd70 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54 72  #SQLite#SQLiteTr
1fd80 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72 61  ansaction#* $tra
1fd90 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20  nsaction]} then 
1fda0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1fdb0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1fdc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 74             sql t
1fdd0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1fde0 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  ack $transaction
1fdf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1fe00 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1fe10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fe20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1fe30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fe40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1fe50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1fe60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1fe70 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1fe80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b  rolled back leak
1fe90 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c  ed transaction \
1fea0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1feb0 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73            $trans
1fec0 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20  action \"\n]..  
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1fee0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1fef0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1ff00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1ff10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ff20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1ff30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ff40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ff50 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1ff60 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1ff70 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b  to rollback leak
1ff80 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c  ed transaction \
1ff90 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1ffa0 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73            $trans
1ffb0 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f  action "\", erro
1ffc0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1ffd0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1ffe0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1fff0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
20000 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
20010 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
20020 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74  db [info connect
20030 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
20040 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
20050 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  atch \..        
20060 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74        System#Dat
20070 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 43  a#SQLite#SQLiteC
20080 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d  onnection#* $db]
20090 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
200a0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
200b0 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d   {sql close $db}
200c0 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
200d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
200e0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
200f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20100 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20110 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20120 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20130 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20140 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20 64   closed leaked d
20150 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20  atabase \"" $db 
20160 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
20170 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20180 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
20190 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
201a0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
201b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
201c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
201d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
20200 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
20210 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73  e leaked databas
20220 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62               $db
20240 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
20250 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20270 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
20280 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20290 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
202a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
202b0 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61  UGFIX: Before ca
202c0 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
202d0 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
202e0 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f  on, make sure bo
202f0 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  th..        #   
20300 20 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41        of the PRA
20310 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65  GMA related dire
20320 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20  ctory names are 
20330 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  freed...        
20340 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
20350 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
20360 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72  ries $channel tr
20370 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ue....        if
20380 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
20390 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
203a0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
203b0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
203c0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
203d0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
203e0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71  NativeMethods sq
203f0 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a  lite3_shutdown..
20400 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
20410 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
20420 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
20430 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
20440 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20450 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
20460 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20470 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
20480 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
20490 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20  down()... ok: " 
204a0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
204b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
204c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
204d0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
204e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
204f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
20500 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20510 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20520 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
20530 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
20540 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  ()... error: " \
20550 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
20560 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20570 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
20580 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
20590 70 72 6f 63 20 67 65 74 53 65 74 74 69 6e 67 52  proc getSettingR
205a0 65 61 64 43 6f 75 6e 74 20 7b 20 6e 61 6d 65 20  eadCount { name 
205b0 7b 76 69 61 46 69 6c 65 20 66 61 6c 73 65 7d 20  {viaFile false} 
205c0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
205d0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 62  haveConstraint b
205e0 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
205f0 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b 63 61 74  n.Debug] && [cat
20600 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
20610 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
20620 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61  gs +NonPublic -a
20630 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
20640 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
20650 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
20660 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64 43   GetSettingReadC
20670 6f 75 6e 74 73 20 24 76 69 61 46 69 6c 65 0d 0a  ounts $viaFile..
20680 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
20690 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
206a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
206b0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
206c0 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20  gth $name] > 0} 
206d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
206e0 20 20 69 66 20 7b 5b 24 73 65 74 74 69 6e 67 52    if {[$settingR
206f0 65 61 64 43 6f 75 6e 74 73 20 54 72 79 47 65 74  eadCounts TryGet
20700 56 61 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c 75  Value $name valu
20710 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
20720 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
20730 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
20740 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
20760 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24  -- setting \"" $
20770 6e 61 6d 65 20 22 5c 22 20 77 61 73 20 72 65 61  name "\" was rea
20780 64 20 22 20 24 76 61 6c 75 65 20 22 20 74 69 6d  d " $value " tim
20790 65 73 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  es" \..         
207a0 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 76         [expr {$v
207b0 69 61 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20  iaFile ? " from 
207c0 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
207d0 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c  n file" : ""}] \
207e0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
207f0 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d    return $value.
20800 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
20810 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
20820 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
20830 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
20840 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  gReadCounts Coun
20850 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
20860 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
20870 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
20880 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
20890 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52  s pair $settingR
208a0 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  eadCounts {..   
208b0 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
208c0 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
208d0 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
208e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
208f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
20900 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20910 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20920 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70   setting \"" [$p
20930 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73  air Key] "\" was
20940 20 72 65 61 64 20 22 20 5b 24 70 61 69 72 20 56   read " [$pair V
20950 61 6c 75 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  alue] \..       
20960 20 20 20 20 20 20 20 20 20 22 20 74 69 6d 65 73           " times
20970 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c  " [expr {$viaFil
20980 65 20 3f 20 22 20 66 72 6f 6d 20 74 68 65 20 63  e ? " from the c
20990 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
209a0 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20  e" : \..        
209b0 20 20 20 20 20 20 20 20 22 22 7d 5d 20 5c 6e 5d          ""}] \n]
209c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
209d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
209e0 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65 43 6f 75  n [list $nameCou
209f0 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e 74 5d 0d  nt $valueCount].
20a00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
20a10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
20a20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
20a30 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $name] > 0} then
20a40 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
20a50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
20a60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
20a80 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 24  -- setting \"" $
20a90 6e 61 6d 65 20 22 5c 22 20 77 61 73 20 6e 6f 74  name "\" was not
20aa0 20 72 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76   read" [expr {$v
20ab0 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20  iaFile ? \..    
20ac0 20 20 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74          " from t
20ad0 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
20ae0 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e   file" : ""}] \n
20af0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
20b00 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
20b10 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20b20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20b30 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20b40 2d 20 6e 6f 20 73 65 74 74 69 6e 67 73 20 77 65  - no settings we
20b50 72 65 20 72 65 61 64 22 20 5b 65 78 70 72 20 7b  re read" [expr {
20b60 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20  $viaFile ? \..  
20b70 20 20 20 20 20 20 20 20 20 20 22 20 66 72 6f 6d            " from
20b80 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
20b90 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20  on file" : ""}] 
20ba0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
20bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 0d        return -1.
20bc0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
20bd0 72 6f 63 20 67 65 74 4f 74 68 65 72 43 6f 75 6e  roc getOtherCoun
20be0 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  t { name } {..  
20bf0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e      if {[haveCon
20c00 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e  straint buildCon
20c10 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67  figuration.Debug
20c20 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20  ] && [catch {.. 
20c30 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
20c40 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
20c50 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
20c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
20c70 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20c80 44 65 62 75 67 44 61 74 61 20 47 65 74 4f 74 68  DebugData GetOth
20c90 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20  erCounts..      
20ca0 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d 20 3d  } otherCounts] =
20cb0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
20cc0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
20cd0 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e   length $name] >
20ce0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20cf0 20 20 20 20 20 20 69 66 20 7b 5b 24 6f 74 68 65        if {[$othe
20d00 72 43 6f 75 6e 74 73 20 54 72 79 47 65 74 56 61  rCounts TryGetVa
20d10 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d  lue $name value]
20d20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20d30 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
20d40 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
20d50 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20d60 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20d70 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c   other counter \
20d80 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 68 61 73  "" $name "\" has
20d90 20 76 61 6c 75 65 20 22 20 24 76 61 6c 75 65 20   value " $value 
20da0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
20db0 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65     return $value
20dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
20dd0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20de0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e  .          set n
20df0 61 6d 65 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72  ameCount [$other
20e00 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20  Counts Count].. 
20e10 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
20e20 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20  ueCount 0....   
20e30 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
20e40 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
20e50 72 20 24 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b  r $otherCounts {
20e60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ..            in
20e70 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24  cr valueCount [$
20e80 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20  pair Value].... 
20e90 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20ea0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20eb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e  "---- other coun
20ee0 74 65 72 20 5c 22 22 20 5b 24 70 61 69 72 20 4b  ter \"" [$pair K
20ef0 65 79 5d 20 22 5c 22 20 68 61 73 20 76 61 6c 75  ey] "\" has valu
20f00 65 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e " \..         
20f10 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 56 61         [$pair Va
20f20 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  lue] \n]..      
20f30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20f40 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
20f50 24 6e 61 6d 65 43 6f 75 6e 74 20 24 76 61 6c 75  $nameCount $valu
20f60 65 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20  eCount]..       
20f70 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
20f80 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
20f90 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e   length $name] >
20fa0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20fb0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
20fc0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
20fd0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20fe0 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72       "---- other
20ff0 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 24 6e 61   counter \"" $na
21000 6d 65 20 22 5c 22 20 68 61 73 20 6e 6f 20 76 61  me "\" has no va
21010 6c 75 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d  lue\n"]..      }
21020 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
21030 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
21040 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 74 68 65  hannel "---- the
21050 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20  re are no other 
21060 63 6f 75 6e 74 65 72 73 5c 6e 22 0d 0a 20 20 20  counters\n"..   
21070 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
21080 74 75 72 6e 20 2d 31 0d 0a 20 20 20 20 7d 0d 0a  turn -1..    }..
21090 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f  ...    proc repo
210a0 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
210b0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
210c0 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
210d0 66 61 6c 73 65 7d 20 7b 72 65 73 65 74 20 74 72  false} {reset tr
210e0 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  ue} {collect tru
210f0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
21100 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
21110 66 20 70 6f 73 73 69 62 6c 65 2c 20 61 6c 77 61  f possible, alwa
21120 79 73 20 72 65 73 65 74 20 74 68 65 20 63 61 63  ys reset the cac
21130 68 65 64 20 61 73 73 65 6d 62 6c 79 20 64 69 72  hed assembly dir
21140 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
21150 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 61        and the ca
21160 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75  ched XML configu
21170 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65  ration file name
21180 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
21190 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
211a0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
211b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
211c0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
211d0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
211e0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
211f0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
21200 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
21210 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
21220 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
21230 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21240 20 20 52 65 73 65 74 43 61 63 68 65 64 41 73 73    ResetCachedAss
21250 65 6d 62 6c 79 44 69 72 65 63 74 6f 72 79 0d 0a  emblyDirectory..
21260 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
21270 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
21280 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
21290 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
212a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
212b0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 72  $channel "---- r
212c0 65 73 65 74 20 63 61 63 68 65 64 20 61 73 73 65  eset cached asse
212d0 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79 5c 6e  mbly directory\n
212e0 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  "..          }..
212f0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
21300 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
21310 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21320 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21330 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21340 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
21350 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
21360 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
21370 20 74 6f 20 72 65 73 65 74 20 63 61 63 68 65 64   to reset cached
21380 20 61 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74   assembly direct
21390 6f 72 79 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20  ory, " \..      
213a0 20 20 20 20 20 20 20 20 20 20 22 65 72 72 6f 72            "error
213b0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
213c0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
213d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
213e0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
213f0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
21400 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
21410 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
21420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21430 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
21440 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
21450 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
21460 20 20 20 20 20 20 20 20 52 65 73 65 74 43 61 63          ResetCac
21470 68 65 64 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65  hedXmlConfigFile
21480 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  Name..        } 
21490 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
214a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
214b0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
214c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
214d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
214e0 2d 2d 2d 2d 20 72 65 73 65 74 20 63 61 63 68 65  ---- reset cache
214f0 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74  d XML configurat
21500 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 5c 6e 22  ion file name\n"
21510 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
21520 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
21530 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
21540 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
21550 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
21560 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
21570 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
21580 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
21590 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
215a0 74 6f 20 72 65 73 65 74 20 63 61 63 68 65 64 20  to reset cached 
215b0 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  XML configuratio
215c0 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  n " \..         
215d0 20 20 20 20 20 20 20 22 66 69 6c 65 20 6e 61 6d         "file nam
215e0 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  e, error: " \n\t
215f0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
21600 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21610 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
21620 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
21630 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61   NOTE: If availa
21640 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28  ble, report on (
21650 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72 65 73  and possibly res
21660 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d 65 0d  et) the runtime.
21670 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
21680 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 74 61  onfiguration sta
21690 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20 20 20  tistics...      
216a0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
216b0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
216c0 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20  mmand] && \..   
216d0 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
216e0 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66  traint buildConf
216f0 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d  iguration.Debug]
21700 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21710 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
21720 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
21730 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
21740 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
21750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21760 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
21770 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47  Lite.DebugData G
21780 65 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75  etSettingReadCou
21790 6e 74 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  nts false..     
217a0 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64     } settingRead
217b0 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
217c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
217d0 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
217e0 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
217f0 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20  s Count]..      
21800 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75      set valueCou
21810 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nt 0....        
21820 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
21830 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 73 65   -alias pair $se
21840 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
21850 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
21860 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b  ncr valueCount [
21870 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a  $pair Value]....
21880 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
21890 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
218a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
218b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
218c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
218e0 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22  ---- setting \""
218f0 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
21900 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20   was read " \.. 
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22   [$pair Value] "
21930 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   times\n"]..    
21940 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21950 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21960 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20      if {$reset} 
21970 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21980 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
21990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
219a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
219b0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
219c0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
219d0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
219e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
219f0 65 62 75 67 44 61 74 61 20 43 6c 65 61 72 53 65  ebugData ClearSe
21a00 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
21a10 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
21a20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
21a30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21a40 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
21a50 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
21a70 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21a80 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21aa0 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69  ---- reset setti
21ab0 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  ng statistics fo
21ac0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22  r the previous "
21ad0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21ae0 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75          $nameCou
21af0 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
21b00 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76   $valueCount " v
21b10 61 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a  alues read\n"]..
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
21b40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
21b50 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
21b60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21b70 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21b80 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
21b90 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
21bb0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
21bc0 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69  d to reset setti
21bd0 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  ng statistics fo
21be0 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  r " \..         
21bf0 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20             "the 
21c00 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65  previous " $name
21c10 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
21c20 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
21c30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21c40 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20         " values 
21c50 72 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c  read, error: " \
21c60 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
21c90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21ca0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21cb0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
21cc0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
21cd0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
21ce0 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
21cf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21d00 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
21d10 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47  Lite.DebugData G
21d20 65 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75  etSettingReadCou
21d30 6e 74 73 20 74 72 75 65 0d 0a 20 20 20 20 20 20  nts true..      
21d40 20 20 7d 20 73 65 74 74 69 6e 67 46 69 6c 65 52    } settingFileR
21d50 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
21d60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21d70 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74     set nameCount
21d80 20 5b 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65   [$settingFileRe
21d90 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d  adCounts Count].
21da0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
21db0 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20  alueCount 0.... 
21dc0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
21dd0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
21de0 61 69 72 20 24 73 65 74 74 69 6e 67 46 69 6c 65  air $settingFile
21df0 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20  ReadCounts {..  
21e00 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
21e10 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
21e20 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
21e30 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21e40 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21e50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
21e60 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
21e70 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
21e80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
21e90 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61  setting \"" [$pa
21ea0 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20  ir Key] "\" was 
21eb0 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20  read " \..      
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
21ed0 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65  ir Value] " time
21ee0 73 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69  s from the confi
21ef0 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22  guration file\n"
21f00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
21f10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
21f20 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
21f30 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  reset} then {.. 
21f40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
21f50 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
21f60 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
21f70 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
21f80 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
21f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21fa0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
21fb0 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61 20  QLite.DebugData 
21fc0 43 6c 65 61 72 53 65 74 74 69 6e 67 52 65 61 64  ClearSettingRead
21fd0 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a 20 20 20  Counts true..   
21fe0 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
21ff0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22010 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
22020 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22030 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
22040 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22060 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74       "---- reset
22070 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
22080 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65 76  ics for the prev
22090 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  ious " \..      
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e                $n
220b0 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
220c0 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
220d0 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65 61 64  nt " values read
220e0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
220f0 20 20 20 20 20 20 20 20 20 20 22 66 72 6f 6d 20            "from 
22100 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
22110 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20  n file\n"]..    
22120 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22130 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
22140 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22150 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
22160 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22170 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22180 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22190 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
221a0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
221b0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
221c0 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73   reset setting s
221d0 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20  tatistics for " 
221e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
221f0 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76         "the prev
22200 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e  ious " $nameCoun
22210 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20  t " names and " 
22220 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20  $valueCount \.. 
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61 64     " values read
22250 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67   from the config
22260 75 72 61 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72  uration file, er
22270 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20  ror: " \n\t \.. 
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20     $error \n].. 
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
222b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
222c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
222d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
222e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
222f0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
22300 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
22310 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
22320 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22330 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
22340 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65  ite.DebugData Ge
22350 74 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20  tOtherCounts..  
22360 20 20 20 20 20 20 7d 20 6f 74 68 65 72 43 6f 75        } otherCou
22370 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
22380 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
22390 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 6f 74 68   nameCount [$oth
223a0 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d  erCounts Count].
223b0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
223c0 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20  alueCount 0.... 
223d0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
223e0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
223f0 61 69 72 20 24 6f 74 68 65 72 43 6f 75 6e 74 73  air $otherCounts
22400 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22410 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20  incr valueCount 
22420 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d  [$pair Value]...
22430 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22440 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
22450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22460 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
22470 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e  "---- other coun
224a0 74 65 72 20 5c 22 22 20 5b 24 70 61 69 72 20 4b  ter \"" [$pair K
224b0 65 79 5d 20 22 5c 22 20 68 61 73 20 76 61 6c 75  ey] "\" has valu
224c0 65 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e " \..         
224d0 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
224e0 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20  Value] \n]..    
224f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22500 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22510 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20      if {$reset} 
22520 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22530 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
22540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22550 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
22560 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
22570 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
22580 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
22590 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
225a0 65 62 75 67 44 61 74 61 20 43 6c 65 61 72 4f 74  ebugData ClearOt
225b0 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20  herCounts..     
225c0 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20         } error] 
225d0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
225e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
225f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
22600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22610 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
22620 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 6f     "---- reset o
22650 74 68 65 72 20 63 6f 75 6e 74 65 72 73 20 66 6f  ther counters fo
22660 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22  r the previous "
22670 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22680 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75          $nameCou
22690 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
226a0 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76   $valueCount " v
226b0 61 6c 75 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  alues\n"]..     
226c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
226d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
226e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
226f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
22700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22710 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22720 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22730 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22740 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
22750 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
22760 72 65 73 65 74 20 6f 74 68 65 72 20 63 6f 75 6e  reset other coun
22770 74 65 72 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20  ters for " \..  
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 22 74 68 65 20 70 72 65 76 69 6f 75 73 20    "the previous 
227a0 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e  " $nameCount " n
227b0 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75  ames and " $valu
227c0 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20  eCount \..      
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
227e0 76 61 6c 75 65 73 2c 20 65 72 72 6f 72 3a 20 22  values, error: "
227f0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
22800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22810 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
22820 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22830 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22840 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
22850 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
22860 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20  Command] && \.. 
22870 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53 51           [haveSQ
22880 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
22890 6e 74 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55  nt INTEROP_VIRTU
228a0 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a  AL_TABLE] && \..
228b0 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
228c0 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
228d0 61 6e 74 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59  ant TRACK_MEMORY
228e0 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d  _BYTES]} then {.
228f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
22900 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
22910 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
22920 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
22930 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
22940 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
22950 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
22960 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
22970 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
22980 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
22990 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
229a0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
229b0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
229c0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
229d0 4d 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f  Memory bytesAllo
229e0 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
229f0 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
22a00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22a10 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
22a20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22a30 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22a40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
22a50 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
22a60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22a70 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
22a80 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
22a90 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
22aa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
22ab0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
22ad0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
22ae0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
22af0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
22b00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
22b10 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
22b20 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
22b30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22b40 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
22b50 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
22b60 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
22b70 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
22b80 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
22b90 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
22ba0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
22bb0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
22bc0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
22bd0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
22be0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
22bf0 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73  ory maximumBytes
22c00 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20  Allocated..     
22c10 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
22c20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22c30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22c40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22c50 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22c60 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22c70 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
22c80 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
22c90 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
22ca0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
22cb0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
22cc0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
22cd0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
22ce0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22cf0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
22d00 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
22d10 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
22d20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
22d30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22d40 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
22d50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
22d60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
22d70 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
22d80 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
22d90 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
22da0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
22db0 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
22dc0 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
22dd0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
22de0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
22df0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
22e00 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
22e10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22e20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
22e30 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
22e40 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
22e50 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20  _memory_used..  
22e60 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
22e70 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
22e80 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
22e90 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
22ea0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22eb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22ec0 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
22ed0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
22ee0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
22ef0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
22f00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
22f10 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65   NOTE: Maybe the
22f20 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
22f30 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61  rary is unavaila
22f40 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ble?..          
22f50 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
22f60 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
22f70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
22f80 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
22f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
22fa0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
22fb0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
22fc0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
22fd0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
22fe0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
22ff0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
23000 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a   unavailable....
23010 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
23020 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
23030 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23040 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23050 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
23060 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23070 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72  }....      set r
23080 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23  esult $memory; #
23090 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65   NOTE: Return me
230a0 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f  mory in-use to o
230b0 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20  ur caller.....  
230c0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
230d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
230e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
230f0 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
23100 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
23110 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
23120 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
23130 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
23140 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
23150 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
23160 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23170 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
23180 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
23190 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
231a0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
231b0 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
231c0 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
231e0 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68  ite3_memory_high
231f0 77 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20 20  water 0..       
23200 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
23210 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23220 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
23230 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23240 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23250 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
23260 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
23270 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
23280 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
23290 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
232a0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
232b0 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
232c0 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
232d0 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
232e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
232f0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
23300 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
23310 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
23320 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
23330 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23340 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23350 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
23360 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
23370 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
23380 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
23390 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
233a0 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
233b0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
233c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
233d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
233e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
233f0 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
23400 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
23410 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
23420 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
23430 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
23440 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  ge $channel..   
23450 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
23460 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
23470 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
23480 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
23490 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
234a0 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
234b0 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ... "..      }..
234c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
234d0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
234e0 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
234f0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
23500 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
23510 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
23520 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
23530 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
23540 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
23550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23560 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
23570 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
23580 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  memory]} then {.
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
235a0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
235b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
235c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
235d0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
235e0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
235f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
23600 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
23610 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
23620 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
23630 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d....           
23640 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
23650 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23660 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23670 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
23680 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
23690 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
236a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
236b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
236c0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
236d0 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
236e0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
236f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23700 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23710 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23720 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
23730 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23740 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
23750 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
23760 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
23770 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
23780 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
23790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
237a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
237b0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
237c0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
237d0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
237e0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
237f0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
23800 70 72 6f 63 20 72 65 73 65 74 53 51 4c 69 74 65  proc resetSQLite
23810 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68  Directories { ch
23820 61 6e 6e 65 6c 20 6e 61 74 69 76 65 20 7d 20 7b  annel native } {
23830 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
23840 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
23850 20 74 6f 20 75 73 65 20 74 68 65 20 6e 61 74 69   to use the nati
23860 76 65 20 41 50 49 20 28 76 69 61 20 74 68 65 20  ve API (via the 
23870 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
23880 29 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )?..      #..   
23890 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
238a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
238b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
238c0 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65  E: Now make sure
238d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
238e0 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  d temporary dire
238f0 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20  ctories are..   
23900 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
23910 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
23920 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
23930 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
23940 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
23950 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
23960 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
23970 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
23980 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
23990 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 23  able,..        #
239a0 20 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a         use it...
239b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
239c0 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
239d0 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33  x 1} {$index < 3
239e0 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
239f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
23a00 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23a10 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
23a20 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
23a30 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
23a40 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
23a50 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
23a60 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
23a70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23a80 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
23a90 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24  _set_directory $
23aa0 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20  index null..    
23ab0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
23ac0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
23ad0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23ae0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23af0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23b00 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
23b10 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  ll sqlite3_win32
23b20 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22  _set_directory("
23b30 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20   $index \..     
23b40 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75             ", nu
23b50 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  ll)... ok: " $re
23b60 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
23b70 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
23b80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23b90 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23ba0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23bb0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
23bc0 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  ll sqlite3_win32
23bd0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22  _set_directory("
23be0 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20   $index \..     
23bf0 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75             ", nu
23c00 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  ll)... error: " 
23c10 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
23c20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
23c30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23c40 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
23c50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
23c60 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75  OTE: Now make su
23c70 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
23c80 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
23c90 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20  rectories are.. 
23ca0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
23cb0 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75  eset their defau
23cc0 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68  lt values, which
23cd0 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20   should be null 
23ce0 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20  for both...     
23cf0 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
23d00 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
23d10 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
23d20 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
23d30 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
23d40 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62 65      appear to be
23d50 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20   available, use 
23d60 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 50  the associated P
23d70 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a  RAGMA commands..
23d80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23d90 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20  instead...      
23da0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
23db0 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
23dc0 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
23dd0 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
23de0 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
23df0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
23e00 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73   sql [appendArgs
23e10 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65   "PRAGMA " $dire
23e20 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22  ctory " = \"\";"
23e30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
23e40 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
23e50 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75  teSql $sql} resu
23e60 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
23e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
23e80 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
23e90 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
23eb0 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
23ec0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
23ed0 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20  .. ok: \"" \..  
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
23ef0 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20  esult \"\n]..   
23f00 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
23f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
23f20 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
23f30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
23f40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23f50 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
23f60 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
23f70 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
23f90 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
23fa0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23fb0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
23fc0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
23fd0 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
23fe0 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20  teDirectories { 
23ff0 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66  channel {reset f
24000 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
24010 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
24020 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73  : Check if the s
24030 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
24040 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
24050 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
24060 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
24070 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
24080 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
24090 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
240a0 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65   function sqlite
240b0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
240c0 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ctory... "....  
240d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
240e0 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74  OTE: This call t
240f0 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  o the sqlite3_wi
24100 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
24110 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  y function uses 
24120 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
24130 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65     invalid value
24140 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73 74   0 for the first
24150 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73   argument.  This
24160 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65   code is designe
24170 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
24180 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c   to check if cal
24190 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f  ling the functio
241a0 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20  n will raise an 
241b0 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d  exception (i.e..
241c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
241d0 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
241e0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
241f0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
24200 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a   as long as no..
24210 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
24220 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67  rectory is chang
24230 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ed)...      #.. 
24240 20 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64       if {[isWind
24250 6f 77 73 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  ows] && [catch {
24260 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
24270 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
24280 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
24290 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
242a0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
242b0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
242c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
242d0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
242e0 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c  _directory 0 nul
242f0 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  l..      }] == 0
24300 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24310 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24320 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65  OTE: Calling the
24330 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
24340 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
24350 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
24360 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
24370 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69  cause an excepti
24380 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  on; therefore, i
24390 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61  t must be availa
243a0 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ble (i.e...     
243b0 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
243c0 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
243d0 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
243e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
243f0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
24400 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20         case)... 
24410 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24420 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
24430 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
24440 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20  t_directory.... 
24450 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
24460 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
24470 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
24480 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
24490 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
244a0 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
244b0 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20  ctories?..      
244c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
244d0 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
244e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74  .          reset
244f0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
24500 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
24510 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
24520 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
24530 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
24540 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20  el no\n....     
24550 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24560 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
24570 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
24580 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
24590 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f  ies?  This can o
245a0 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nly..        #  
245b0 20 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65       be performe
245c0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
245d0 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20  oaded and ready 
245e0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
245f0 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
24600 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20       suite...   
24610 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24620 69 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69  if {$reset && [i
24630 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
24640 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24650 20 72 65 73 65 74 53 51 4c 69 74 65 44 69 72 65   resetSQLiteDire
24660 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
24670 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
24680 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
24690 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
246a0 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68  OTE: Finally, sh
246b0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ow the current v
246c0 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
246d0 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
246e0 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
246f0 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20    directories.  
24700 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65  This can only be
24710 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51   performed if SQ
24720 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a  Lite is loaded..
24730 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
24740 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
24750 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
24760 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
24770 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65     if {[isSQLite
24780 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
24790 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
247a0 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
247b0 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
247c0 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
247d0 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
247e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
247f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24800 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  gs "---- checkin
24810 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  g " $directory "
24820 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
24830 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70      set sql [app
24840 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20  endArgs "PRAGMA 
24850 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d  " $directory \;]
24860 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
24870 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
24880 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72  eSql $sql scalar
24890 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
248a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
248b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
248c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
248d0 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20  ok: \"" $result 
248e0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
248f0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
24900 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
24910 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24920 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  s "error: " \n\t
24930 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
24940 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24950 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
24960 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
24970 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  c loadSQLiteTest
24980 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e  Settings { chann
24990 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b  el {suffix ""} {
249a0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
249b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
249c0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f   # NOTE: Skip lo
249d0 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e  ading the settin
249e0 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61 67  gs if their usag
249f0 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61 62  e has been disab
24a00 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  led...      #.. 
24a10 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
24a20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
24a30 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d  teTestSettings)]
24a40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24a50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24a60 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d  OTE: Load custom
24a70 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
24a80 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
24a90 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
24aa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24ab0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
24ac0 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
24ad0 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d  (user)]} then {.
24ae0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 75  .          set u
24af0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
24b00 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
24b10 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
24b20 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
24b30 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
24b40 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69   settings $suffi
24b50 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  x . $::tcl_platf
24b60 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65  orm(user) .eagle
24b70 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
24b80 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
24b90 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
24ba0 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
24bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
24bc0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
24bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24be0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
24bf0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65  "---- loading pe
24c20 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74  r-user test sett
24c30 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
24c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c50 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
24c60 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e  FileName \"...\n
24c70 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
24c80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24c90 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65              uple
24cb0 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72  vel 1 [list sour
24cc0 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67 73  ce $userSettings
24cd0 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  FileName]..     
24ce0 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d         } error]}
24cf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24d00 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
24d10 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
24d20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
24d30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
24d40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
24d60 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
24d70 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d  led to load per-
24d80 75 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69  user settings fi
24d90 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
24db0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
24dc0 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ame "\", error: 
24dd0 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
24de0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
24df0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24e00 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
24e10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
24e20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
24e30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24e40 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
24e50 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
24e60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24e70 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
24e80 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  ped loading per-
24e90 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e  user test settin
24ea0 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
24ed0 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64  leName "\", it d
24ee0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
24ef0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
24f00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
24f10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
24f20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
24f30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24f40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24f50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24f60 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
24f70 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
24f80 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
24f90 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74  atform(host)]} t
24fa0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24fb0 20 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67   set hostSetting
24fc0 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20  sFileName [file 
24fd0 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44  join [getCommonD
24fe0 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20  irectory] \..   
24ff0 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
25000 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20  ndArgs settings 
25010 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c  $suffix . $::tcl
25020 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20  _platform(host) 
25030 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20  .eagle]]....    
25040 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
25050 65 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74  exists $hostSett
25060 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  ingsFileName]} t
25070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25080 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
25090 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
250a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
250b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
250c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
250d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64        "---- load
250e0 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73  ing per-host tes
250f0 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
25100 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
25110 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
25120 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c  ttingsFileName \
25130 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "...\n]..       
25140 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25150 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
25160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25170 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
25180 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65  t source $hostSe
25190 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d  ttingsFileName].
251a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
251b0 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
251d0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
251e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
251f0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
25200 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
25230 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
25240 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69  d per-host setti
25250 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
25280 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
25290 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
252a0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
252b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
252c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
252d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
252e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
252f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
25300 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
25310 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
25320 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
25330 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
25340 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
25350 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  g per-host test 
25360 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
25370 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
25380 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
25390 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
253a0 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
253b0 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
253c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
253d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
253e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
253f0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 70 79  ...    proc copy
25400 53 61 6d 70 6c 65 44 61 74 61 62 61 73 65 46 69  SampleDatabaseFi
25410 6c 65 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  les {} {..      
25420 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20  uplevel 1 {..   
25430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25440 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 28 6f 72  # NOTE: Copy (or
25450 20 72 65 2d 63 6f 70 79 29 20 74 68 65 20 72 65   re-copy) the re
25460 66 65 72 65 6e 63 65 20 64 61 74 61 62 61 73 65  ference database
25470 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 74   file used for t
25480 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
25490 20 20 20 20 20 75 6e 69 74 20 74 65 73 74 20 74       unit test t
254a0 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  o the build dire
254b0 63 74 6f 72 79 20 69 6e 20 63 61 73 65 20 69 74  ctory in case it
254c0 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
254d0 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
254e0 20 20 20 62 79 20 61 20 70 72 65 76 69 6f 75 73     by a previous
254f0 20 74 65 73 74 20 72 75 6e 2e 0d 0a 20 20 20 20   test run...    
25500 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
25510 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
25520 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69  $northwindEfDbFi
25530 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
25540 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
25550 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61  uildDirectory fa
25560 6c 73 65 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  lse] [file tail 
25570 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69  $northwindEfDbFi
25580 6c 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  le]]..      }.. 
25590 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
255a0 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50  c runSQLiteTestP
255b0 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  rologue {} {..  
255c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
255d0 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
255e0 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f  g our custom pro
255f0 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
25600 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
25610 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
25620 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
25630 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
25640 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72  o exists ::no(pr
25650 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ologue.eagle)]} 
25660 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
25670 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
25680 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66  E: Load the "bef
25690 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ore-constraints"
256a0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
256b0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
256c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
256d0 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
256e0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
256f0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
25700 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
25710 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
25720 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
25730 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20  .before]....    
25740 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25750 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
25760 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
25770 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c  mand is availabl
25780 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20 73  e; if not, add s
25790 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ome..        #  
257a0 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d 61       shims to ma
257b0 6b 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74  ke the test suit
257c0 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d  e run smoother..
257d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
257e0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
257f0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20  teObjectCommand 
25800 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
25810 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25820 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
25830 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65  termine the name
25840 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20  s of the native 
25850 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
25860 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
25870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
25880 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
25890 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72  BuildPlatform tr
258a0 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ue]..        set
258b0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61   architecture [a
258c0 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c  rchitectureForPl
258d0 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
258e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
258f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25900 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72  Show the platfor
25910 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75  m and architectu
25920 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  re used to help 
25930 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20  locate the..    
25940 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
25950 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d  ve build files..
25960 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25970 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
25980 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
25990 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
259a0 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66       "---- platf
259b0 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  orm for locating
259c0 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
259d0 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20  les is \"" \..  
259e0 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
259f0 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  orm \"\n]....   
25a00 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
25a10 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
25a20 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
25a30 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68        "---- arch
25a40 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63  itecture for loc
25a50 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
25a60 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
25a70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
25a80 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c  architecture \"\
25a90 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
25aa0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
25ab0 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
25ac0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
25ad0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
25ae0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
25af0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
25b00 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
25b10 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
25b20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
25b30 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
25b40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
25b50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
25b60 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61  uild a list of a
25b70 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64  uxiliary Managed
25b80 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
25b90 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20  tants (MDA)..   
25ba0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
25bb0 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
25bc0 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
25bd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25be0 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
25bf0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
25c00 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
25c10 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78   EagleShell32.ex
25c20 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73  e.mda.config Ins
25c30 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63  taller.exe.mda.c
25c40 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
25c50 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64       test.exe.md
25c60 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e  a.config testlin
25c70 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  q.exe.mda.config
25c80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25c90 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e  testef6.exe.mda.
25ca0 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
25cb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25cc0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
25cd0 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c  list of external
25ce0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
25cf0 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d  andle.  Some of.
25d00 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25d10 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79   these files may
25d20 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f   be native and/o
25d30 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  r managed assemb
25d40 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20  lies that are.. 
25d50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
25d60 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f  equired to perfo
25d70 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  rm various tests
25d80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25d90 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72 6e        set extern
25da0 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  alFileNames [lis
25db0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
25dc0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69   [file join Enti
25dd0 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20  tyFramework lib 
25de0 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
25df0 74 20 46 78 20 22 22 5d 20 5c 0d 0a 20 20 20 20  t Fx ""] \..    
25e00 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
25e10 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34  map [list netFx4
25e20 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78  51 netFx45 netFx
25e30 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46  452 netFx45 netF
25e40 78 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  x46 \..         
25e50 20 20 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78     netFx45 netFx
25e60 34 36 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46  461 netFx45 netF
25e70 78 34 36 32 20 6e 65 74 46 78 34 35 20 6e 65 74  x462 netFx45 net
25e80 46 78 34 37 20 6e 65 74 46 78 34 35 20 5c 0d 0a  Fx47 netFx45 \..
25e90 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 74 46              netF
25ea0 78 34 37 31 20 6e 65 74 46 78 34 35 20 6e 65 74  x471 netFx45 net
25eb0 46 78 34 37 32 20 6e 65 74 46 78 34 35 20 6e 65  Fx472 netFx45 ne
25ec0 74 53 74 61 6e 64 61 72 64 32 30 20 6e 65 74 46  tStandard20 netF
25ed0 78 34 35 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  x45] \..        
25ee0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 4e 65 74      [getBuildNet
25ef0 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d  Fx]]] EntityFram
25f00 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
25f10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25f20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
25f30 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
25f40 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
25f50 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
25f60 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
25f70 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
25f80 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 5d  FileNames [list]
25f90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c  ....        eval
25fa0 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46   lappend nativeF
25fb0 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61 74  ileNames [getNat
25fc0 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
25fd0 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20  mesOnly]..      
25fe0 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e    eval lappend n
25ff0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b  ativeFileNames [
26000 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
26010 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  lyFileNamesOnly]
26020 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
26030 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
26040 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
26050 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
26060 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
26070 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
26080 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
26090 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  et mixedFileName
260a0 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
260b0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
260c0 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
260d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
260e0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69 78       lappend mix
260f0 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73 74  edFileNames Syst
26100 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
26110 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
26120 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26130 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
26140 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
26150 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
26160 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
26170 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
26180 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
26190 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
261a0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
261b0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
261c0 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53  QLite.Linq.dll S
261d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
261e0 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20  e.EF6.dll]....  
261f0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73 52        if {![hasR
26200 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
26210 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
26220 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
26230 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
26240 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
26250 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
26260 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
26270 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
26280 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f 75   Show the variou
26290 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65 20  s lists of file 
262a0 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 68  names that are h
262b0 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d 0a  andled by this..
262c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
262d0 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
262e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
262f0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
26300 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
26310 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26320 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22  "---- list of \"
26330 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20  configuration\" 
26340 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
26350 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26360 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
26370 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
26380 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
26390 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
263a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
263b0 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
263c0 22 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69  "MDA configurati
263d0 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20  on\" file names 
263e0 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  is: " \..       
263f0 20 20 20 20 20 24 6d 64 61 43 6f 6e 66 69 67 46       $mdaConfigF
26400 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
26410 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
26420 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
26430 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
26440 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
26450 69 73 74 20 6f 66 20 5c 22 65 78 74 65 72 6e 61  ist of \"externa
26460 6c 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  l\" file names i
26470 73 3a 20 22 20 24 65 78 74 65 72 6e 61 6c 46 69  s: " $externalFi
26480 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
26490 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
264a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
264b0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
264c0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
264d0 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c 22  st of \"native\"
264e0 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
264f0 22 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  " $nativeFileNam
26500 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  es \n]....      
26510 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
26520 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
26530 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
26540 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66     "---- list of
26550 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 20   \"mixed\" file 
26560 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6d 69 78  names is: " $mix
26570 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  edFileNames \n].
26580 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
26590 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
265a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
265b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
265c0 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d 61 6e 61  - list of \"mana
265d0 67 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73  ged\" file names
265e0 20 69 73 3a 20 22 20 24 6d 61 6e 61 67 65 64 46   is: " $managedF
265f0 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a  ileNames \n]....
26600 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26610 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76     # NOTE: Remov
26620 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74  e any test const
26630 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66 65  raints that refe
26640 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20  r to the native 
26650 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20  and/or..        
26660 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
26670 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
26680 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e  hat we handle un
26690 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66  less forbidden f
266a0 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20  rom..        #  
266b0 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a       doing so...
266c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
266d0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
266e0 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
266f0 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  RemoveConstraint
26700 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
26710 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
26720 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
26730 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
26740 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
26750 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
26760 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
26770 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
26780 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
26790 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
267a0 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
267b0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
267c0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
267d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
267e0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
267f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
26800 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
26810 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
26820 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
26830 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
26840 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
26850 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
26860 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  _ [file tail $fi
26870 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
26880 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26890 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
268a0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
268b0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
268c0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
268d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
268e0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
268f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
26900 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
26910 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
26920 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
26930 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
26940 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
26950 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
26960 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
26970 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
26980 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
26990 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
269a0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
269b0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
269c0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
269d0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
269e0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
269f0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
26a00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26a10 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
26a20 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
26a30 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69  QLite related fi
26a40 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c  le handling (del
26a50 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20  eting,..        
26a60 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c  #       copying,
26a70 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66   and loading) if
26a80 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
26a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26aa0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
26ab0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
26ac0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
26ad0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
26ae0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
26af0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
26b00 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
26b10 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
26b20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26b30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
26b40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
26b50 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  teSqliteFiles)]}
26b60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26b70 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
26b80 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
26b90 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  teSqliteConfigFi
26ba0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
26bc0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
26bd0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
26be0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26bf0 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
26c00 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  yFile $fileName.
26c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26c20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26c30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
26c40 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
26c50 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
26c60 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
26c70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26c80 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
26c90 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
26ca0 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
26cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26cc0 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
26cd0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  ile $fileName fa
26ce0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
26cf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
26d00 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
26d10 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
26d20 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
26d40 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
26d50 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
26d60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
26d70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
26d80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
26d90 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
26da0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74  (deleteSqliteNat
26db0 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
26dc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26dd0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
26de0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
26df0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61 74  qliteImplicitNat
26e00 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
26e10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26e20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
26e30 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
26e40 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
26e50 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
26e60 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
26e70 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
26e80 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
26e90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
26eb0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
26ec0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e  no(deleteSqliteN
26ed0 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
26ee0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26ef0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
26f00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
26f10 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c  o(deleteSqlitePl
26f20 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
26f30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26f40 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
26f50 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
26f60 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f80 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
26f90 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
26fa0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
26fb0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
26fc0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
26fd0 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
26fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ff0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
27000 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
27010 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
27020 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
27030 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
27040 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
27050 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
27060 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
27070 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
27080 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
27090 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
270a0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
270b0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
270c0 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
270f0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61  bly $fileName $a
27100 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27130 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27140 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
27150 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
27160 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
27170 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
27180 53 71 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73  SqliteMixedFiles
27190 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
271a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
271b0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
271c0 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
271d0 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
271e0 6e 20 69 73 20 73 65 74 2c 20 64 65 6c 65 74 65  n is set, delete
271f0 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20 20   implicit..     
27200 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
27210 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
27220 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77 65  mbly files as we
27230 6c 6c 2e 20 20 54 68 69 73 20 72 75 6e 74 69 6d  ll.  This runtim
27240 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  e option..      
27250 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27260 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64  check is handled
27270 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74   when building t
27280 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
27290 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20  -mode..         
272a0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
272b0 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
272c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
272d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
272e0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
272f0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
27300 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78  qliteImplicitMix
27310 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
27320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
27330 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
27340 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  ame $mixedFileNa
27350 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
27360 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
27370 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
27380 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
27390 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
273a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
273b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
273c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
273d0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
273e0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
273f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
27400 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
27410 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
27420 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
27430 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
27440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27450 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
27460 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
27470 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
27490 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
274a0 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
274b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
274c0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
274d0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
274e0 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
27510 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
27520 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
27530 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
27540 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
27550 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
27560 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27570 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
27580 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
27590 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
275a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
275b0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
275c0 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
275d0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
275f0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
27600 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
27610 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
27620 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
27640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
27660 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
27670 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
27680 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
27690 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d  teManagedFiles)]
276a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
276b0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
276c0 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
276d0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
276e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
276f0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
27700 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
27710 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
27720 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
27730 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27740 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27750 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
27760 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65  or the "autoSele
27770 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ct" runtime opti
27780 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c  on.  If present,
27790 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
277a0 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61      attempt to a
277b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
277c0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76  ect the first av
277d0 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
277e0 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
277f0 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20   (or "release") 
27800 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79  of SQLite and Sy
27810 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
27820 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
27830 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68      for use with
27840 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
27850 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
27860 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61           if {[ha
27870 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61  sRuntimeOption a
27880 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e  utoSelect]} then
27890 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
278a0 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51  if {![checkForSQ
278b0 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
278c0 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d  st_channel true]
278d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
278e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
278f0 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
27900 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
27910 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
27920 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
27930 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
27940 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
27950 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
27960 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c   verify the buil
27970 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 69  d directory if i
27980 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20  nstructed;..    
27990 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
279a0 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75  herwise, make su
279b0 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65  re it actually e
279c0 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68  xists or halt th
279d0 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20  e entire..      
279e0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
279f0 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20 69  ing process if i
27a00 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
27a10 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
27a20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
27a30 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
27a40 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72 65  (verifyBuildDire
27a50 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d  ctory)]} then {.
27a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
27a70 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
27a80 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e  TE: At this poin
27a90 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  t, the build dir
27aa0 65 63 74 6f 72 69 65 73 20 4d 55 53 54 20 65 78  ectories MUST ex
27ab0 69 73 74 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ist for..       
27ac0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
27ad0 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
27ae0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20   to continue... 
27af0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
27b00 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
27b10 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c  rectory [getBuil
27b20 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c 73 65  dDirectory false
27b30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
27b40 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
27b50 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c  ts $directory] |
27b60 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
27b70 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69       ![file isdi
27b80 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
27b90 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
27ba0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
27bc0 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74  TE: Just prior t
27bd0 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69  o actually halti
27be0 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  ng the testing p
27bf0 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20  rocess,..       
27c00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
27c10 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  dd an error to t
27c20 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65  he test log file
27c30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
27c40 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
27c50 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
27c60 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
27c70 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
27c80 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
27c90 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20  ould not verify 
27ca0 6e 61 74 69 76 65 20 62 75 69 6c 64 20 64 69 72  native build dir
27cb0 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d 0a 20 20  ectory \"" \..  
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cd0 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2c 20  $directory "\", 
27ce0 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74  all testing halt
27cf0 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ed\n"]....      
27d00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27d10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
27d20 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69 70   Raising a scrip
27d30 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69  t error from thi
27d40 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68  s point should h
27d50 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  alt..           
27d60 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
27d70 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d  esting process..
27d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
27d90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27da0 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
27db0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
27dc0 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
27dd0 74 20 76 65 72 69 66 79 20 6e 61 74 69 76 65 20  t verify native 
27de0 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
27df0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
27e00 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74           $direct
27e10 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73  ory "\", all tes
27e20 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20  ting halted"].. 
27e30 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
27e40 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
27e50 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75  directory [getBu
27e60 69 6c 64 44 69 72 65 63 74 6f 72 79 20 74 72 75  ildDirectory tru
27e70 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
27e80 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
27e90 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
27ea0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
27eb0 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
27ec0 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
27ed0 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
27f00 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
27f10 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
27f20 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
27f30 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
27f40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27f50 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
27f60 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
27f70 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
27f80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
27f90 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
27fa0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
27fb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
27fc0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
27fd0 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
27fe0 20 6d 61 6e 61 67 65 64 20 62 75 69 6c 64 20 64   managed build d
27ff0 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d 0a  irectory \"" \..
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28010 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22    $directory "\"
28020 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
28030 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  lted\n"]....    
28040 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
28050 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
28060 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72  E: Raising a scr
28070 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  ipt error from t
28080 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64  his point should
28090 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20   halt..         
280a0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
280b0 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
280c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
280d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
280e0 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
280f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
28100 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
28110 6e 6f 74 20 76 65 72 69 66 79 20 6d 61 6e 61 67  not verify manag
28120 65 64 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  ed build directo
28130 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  ry \"" \..      
28140 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
28150 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20  ectory "\", all 
28160 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
28170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
28180 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
28190 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
281a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
281b0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f  kip trying to co
281c0 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  py any files if 
281d0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
281e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
281f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
28200 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
28210 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
28220 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
28230 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
28240 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
28250 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d  iteConfigFiles)]
28260 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
28270 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
28280 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
28290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
282a0 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
282b0 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   \"configuration
282c0 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a  \" files...\n"..
282d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
282e0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
282f0 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
28300 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
28310 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
28320 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
28330 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
28340 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
28350 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28360 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
28370 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
28380 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
28390 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
283c0 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
283d0 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
283e0 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
283f0 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  ) configuration.
28400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
28410 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20         file for 
28420 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20  the Eagle shell 
28430 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74  to the build out
28440 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a  put directory,..
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
28460 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e        while usin
28470 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61  g each of the na
28480 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f  mes of the vario
28490 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a  us legacy test..
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
284b0 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65        executable
284c0 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  s.  This will he
284d0 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  lp to make sure 
284e0 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20  that all the..  
284f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
28500 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73      legacy tests
28510 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c   run with exactl
28520 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  y the same set o
28530 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  f Managed..     
28540 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
28550 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
28560 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64  tants configured
28570 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
28580 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
28590 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
285a0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
285c0 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 4d 44 41  -- copying \"MDA
285d0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22   configuration\"
285e0 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
28600 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
28610 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
28620 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
28630 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e        tryCopyBin
28640 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65  aryFile EagleShe
28650 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
28660 67 20 74 72 75 65 20 22 22 20 24 66 69 6c 65 4e  g true "" $fileN
28670 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
28680 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
28690 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
286a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
286b0 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c  opy the external
286c0 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e   binaries, if an
286d0 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  y, to the direct
286e0 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20  ory that..      
286f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28700 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67  contains the Eag
28710 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20  le shell.  This 
28720 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65  is typically use
28730 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20  d to make..     
28740 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
28750 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73   sure assemblies
28760 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
28770 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65  he ones being te
28780 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20  sted are..      
28790 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
287a0 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67  available during
287b0 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
287c0 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  cess...         
287d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
287e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
287f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  est_channel "---
28800 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65 78 74 65  - copying \"exte
28810 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  rnal\" files...\
28820 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
28830 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
28840 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
28850 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
28860 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
28870 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24  pyExternalFile $
28880 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
28890 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
288a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
288b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
288c0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
288d0 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46  opySqliteNativeF
288e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
28900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
28910 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
28920 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c  st platform is l
28930 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c  ikely the defaul
28940 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  t for this..    
28950 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
28960 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20    machine, also 
28970 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  try to copy the 
28980 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20  native files to 
28990 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
289a0 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
289b0 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20  y location...   
289c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
289d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
289e0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
289f0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70  no(copySqliteImp
28a00 6c 69 63 69 74 4e 61 74 69 76 65 46 69 6c 65 73  licitNativeFiles
28a10 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
28a20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73 44 65             [isDe
28a30 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
28a40 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
28a60 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
28a70 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
28a80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
28a90 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74  copying implicit
28aa0 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65   \"native\" file
28ab0 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20  s...\n"....     
28ac0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
28ad0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
28ae0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
28b10 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73  y $fileName fals
28b20 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
28b30 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
28b40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28b50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
28b60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
28b70 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  pySqliteNonImpli
28b80 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
28b90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
28ba0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
28bb0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
28bc0 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
28bd0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
28bf0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
28c00 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
28c10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
28c20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
28c30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
28c40 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
28c70 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65   \"native\" file
28c80 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20 5c  s for platform \
28c90 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
28cb0 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  tform \"...\n]..
28cc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28cd0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
28ce0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
28cf0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
28d10 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
28d20 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c  leName false $pl
28d30 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
28d40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
28d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28d70 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
28d80 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
28d90 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
28da0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
28db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dc0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
28dd0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
28de0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
28e00 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
28e10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
28e20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28e30 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
28e40 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c  opying \"native\
28e50 22 20 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68  " files for arch
28e60 69 74 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a  itecture \"" \..
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
28e90 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a  ure \"...\n]....
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
28ec0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
28ed0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
28ee0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
28ef0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
28f00 4e 61 6d 65 20 66 61 6c 73 65 20 24 61 72 63 68  Name false $arch
28f10 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
28f20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
28f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28f50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
28f60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
28f70 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
28f80 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
28f90 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74  eMixedFiles)]} t
28fa0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
28fb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28fc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
28fd0 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
28fe0 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  ntime option is 
28ff0 73 65 74 2c 20 63 6f 70 79 20 69 6d 70 6c 69 63  set, copy implic
29000 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  it..            
29010 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d    #       mixed-
29020 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
29030 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20 20 54 68  les as well.  Th
29040 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  e runtime option
29050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29060 23 20 20 20 20 20 20 20 63 68 65 63 6b 20 69 73  #       check is
29070 20 68 61 6e 64 6c 65 64 20 77 68 65 6e 20 62 75   handled when bu
29080 69 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 20  ilding the list 
29090 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a 20  of mixed-mode.. 
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
290b0 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66 69       assembly fi
290c0 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20 20  le names...     
290d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
290e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
290f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
29100 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69  (copySqliteImpli
29110 63 69 74 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  citMixedFiles)]}
29120 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29130 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
29140 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
29150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29160 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
29170 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c 22 6d  ing implicit \"m
29180 69 78 65 64 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  ixed\" files...\
29190 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
291a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
291b0 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
291c0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
291d0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
291e0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
291f0 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20  eName false..   
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
29220 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
29230 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
29240 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
29250 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
29260 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
29280 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
29290 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50  ::no(copySqliteP
292a0 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
292b0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
292c0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
292d0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
292e0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
29310 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
29320 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
29340 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d 69 78  -- copying \"mix
29350 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70  ed\" files for p
29360 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20  latform \"" \.. 
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c       $platform \
29390 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "...\n]....     
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
293b0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
293c0 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  ixedFileNames {.
293d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
293e0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
293f0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
29400 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  alse $platform..
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
29430 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29440 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
29450 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
29460 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
29470 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
29480 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
29490 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
294a0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
294b0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
294c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
294d0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
294e0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
294f0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
29520 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66  "mixed\" files f
29530 6f 72 20 61 72 63 68 69 74 65 63 74 75 72 65 20  or architecture 
29540 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72               $ar
29560 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e 2e 2e  chitecture \"...
29570 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
29580 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
29590 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
295a0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295c0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
295d0 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
295e0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
29610 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
29620 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
29630 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29640 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
29650 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
29660 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69  ySqliteManagedFi
29670 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
29680 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
29690 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
296a0 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67  el "---- copying
296b0 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c   \"managed\" fil
296c0 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20  es...\n"....    
296d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
296e0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
296f0 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
29720 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d 0a  $fileName true..
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
29740 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
29750 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
29760 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
29770 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
29780 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61  ip trying to loa
29790 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  d any files if i
297a0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
297b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
297c0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
297d0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
297e0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
297f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
29800 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
29810 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
29820 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  teImplicitFiles)
29830 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
29840 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
29850 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
29860 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d  Data.SQLite.dll.
29870 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
29880 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
29890 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
298a0 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c  ::no(loadSqliteL
298b0 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  inqFiles)]} then
298c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
298d0 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
298e0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
298f0 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
29900 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
29910 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
29920 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
29930 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36  no(loadSqliteEf6
29940 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
29950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
29960 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
29970 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
29980 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20  e.EF6.dll..     
29990 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
299a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
299b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
299c0 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  oadSqliteNonImpl
299d0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
299e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
299f0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
29a00 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
29a10 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
29a20 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
29a30 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
29a40 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
29a50 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
29a60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
29a70 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
29a80 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
29a90 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66  QLite.dll $platf
29aa0 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
29ab0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
29ac0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
29ad0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
29ae0 64 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  dSqliteArchitect
29af0 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
29b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29b10 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
29b20 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
29b30 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
29b50 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
29b60 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
29b70 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75  .dll $architectu
29b80 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
29b90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
29ba0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
29bb0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29bc0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29bd0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69  leNameOnly $nati
29be0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
29bf0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
29c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
29c10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
29c20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
29c30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
29c40 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
29c50 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6e 61 74  rsion of \"" nat
29c60 69 76 65 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  ive/ $fileNameOn
29c70 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
29c80 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 5c 22 22        "\"... \""
29c90 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
29ca0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
29cb0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
29cc0 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e       $fileNameOn
29cd0 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  ly]] \"\n]..    
29ce0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
29cf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f   }....        fo
29d00 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
29d10 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  ly $mixedFileNam
29d20 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
29d30 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
29d40 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
29d50 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
29d60 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
29d70 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
29d80 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
29d90 5c 22 22 20 6d 69 78 65 64 2f 20 24 66 69 6c 65  \"" mixed/ $file
29da0 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20  NameOnly \..    
29db0 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e              "\".
29dc0 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
29dd0 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
29de0 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
29df0 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
29e00 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d  NameOnly]] \"\n]
29e10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
29e20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29e30 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
29e40 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61 6e 61 67 65  NameOnly $manage
29e50 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
29e60 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
29e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
29e80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
29e90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
29ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29eb0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
29ec0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d 61 6e 61  sion of \"" mana
29ed0 67 65 64 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  ged/ $fileNameOn
29ee0 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
29ef0 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 5c 22 22        "\"... \""
29f00 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
29f10 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
29f20 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
29f30 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e       $fileNameOn
29f40 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  ly]] \"\n]..    
29f50 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
29f60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
29f70 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
29f80 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
29f90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
29fa0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
29fb0 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46  ameOnly $nativeF
29fc0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
29fd0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
29fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
29ff0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2a000 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
2a010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a020 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
2a030 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
2a040 6e 61 74 69 76 65 2f 70 6c 61 74 66 6f 72 6d 2f  native/platform/
2a050 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a060 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
2a070 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  / $fileNameOnly 
2a080 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
2a090 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a0a0 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 5b 67        version [g
2a0b0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
2a0c0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c   $fileNameOnly \
2a0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a0e0 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20      $platform]] 
2a0f0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
2a100 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2a110 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
2a120 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
2a130 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  nly $mixedFileNa
2a140 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
2a150 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2a160 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2a170 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2a180 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
2a1b0 69 6f 6e 20 6f 66 20 5c 22 22 20 6d 69 78 65 64  ion of \"" mixed
2a1c0 2f 70 6c 61 74 66 6f 72 6d 2f 20 5c 0d 0a 20 20  /platform/ \..  
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1e0 24 70 6c 61 74 66 6f 72 6d 20 2f 20 24 66 69 6c  $platform / $fil
2a1f0 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
2a200 20 5c 22 22 20 5b 66 69 6c 65 20 5c 0d 0a 20 20   \"" [file \..  
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a220 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
2a230 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
2a240 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20  NameOnly \..    
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
2a260 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d  latform]] \"\n].
2a270 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2a280 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2a290 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a2a0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2a2b0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
2a2c0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
2a2d0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
2a2e0 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
2a2f0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
2a300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a310 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
2a320 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2a330 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
2a340 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2a360 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
2a370 20 6f 66 20 5c 22 22 20 6e 61 74 69 76 65 2f 61   of \"" native/a
2a380 72 63 68 69 74 65 63 74 75 72 65 2f 20 5c 0d 0a  rchitecture/ \..
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3a0 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
2a3b0 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  / $fileNameOnly 
2a3c0 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
2a3d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2a3e0 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 5b 67        version [g
2a3f0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
2a400 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c   $fileNameOnly \
2a410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a420 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
2a430 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  e]] \"\n]..     
2a440 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2a450 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2a460 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2a470 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69  ameOnly $mixedFi
2a480 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2a490 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2a4b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2a4c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2a4d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2a4e0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
2a4f0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d  version of \"" m
2a500 69 78 65 64 2f 61 72 63 68 69 74 65 63 74 75 72  ixed/architectur
2a510 65 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e/ \..          
2a520 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
2a530 63 74 75 72 65 20 2f 20 24 66 69 6c 65 4e 61 6d  cture / $fileNam
2a540 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22  eOnly "\"... \""
2a550 20 5b 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20   [file \..      
2a560 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72 73              vers
2a570 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
2a580 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
2a590 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  Only \..        
2a5a0 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69            $archi
2a5b0 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d  tecture]] \"\n].
2a5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2a5d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2a5e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2a5f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a600 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
2a610 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73  st of managed as
2a620 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68 65  semblies for the
2a630 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
2a640 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2a650 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20    and report on 
2a660 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
2a670 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
2a680 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
2a690 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2a6a0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
2a6b0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
2a6c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
2a6d0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
2a6e0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
2a6f0 65 20 55 74 69 6c 69 74 79 20 47 65 74 41 73 73  e Utility GetAss
2a700 65 6d 62 6c 69 65 73 0d 0a 20 20 20 20 20 20 20  emblies..       
2a710 20 20 20 7d 20 61 73 73 65 6d 62 6c 69 65 73 5d     } assemblies]
2a720 20 3d 3d 20 30 20 7c 7c 20 5b 63 61 74 63 68 20   == 0 || [catch 
2a730 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
2a740 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70  bject invoke App
2a750 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f  Domain.CurrentDo
2a760 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69  main GetAssembli
2a770 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  es..          } 
2a780 61 73 73 65 6d 62 6c 69 65 73 5d 20 3d 3d 20 30  assemblies] == 0
2a790 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2a7a0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
2a7b0 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61  each assembly $a
2a7c0 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20  ssemblies {..   
2a7d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2a7e0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53  string match \{S
2a7f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2a800 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74  e* $assembly]} t
2a810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2a820 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2a830 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
2a840 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a860 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
2a870 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24  ed assembly: " $
2a880 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20  assembly \n]..  
2a890 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2a8a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2a8b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2a8c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2a8d0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
2a8e0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2a8f0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
2a900 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2a910 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
2a920 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61   for \"System.Da
2a930 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22  ta.SQLite\"... "
2a940 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
2a950 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2a960 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2a970 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
2a980 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
2a990 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
2a9a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
2a9b0 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73  Lite3 DefineCons
2a9c0 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20  tants..         
2a9d0 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e   } defineConstan
2a9e0 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
2a9f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
2aa00 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2aa10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2aa20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
2aa30 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
2aa40 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e        $defineCon
2aa50 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  stants] <none>] 
2aa60 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
2aa70 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2aa80 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2aa90 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
2aaa0 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
2aab0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
2aac0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
2aad0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
2aae0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2aaf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ab00 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76    "---- source v
2ab10 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
2ab20 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
2ab30 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ll\"... "....   
2ab40 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
2ab50 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2ab60 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
2ab70 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
2ab80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ab90 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
2aba0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
2abb0 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
2abc0 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20  Version..       
2abd0 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
2abe0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2abf0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
2ac00 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
2ac10 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
2ac20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2ac30 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c   set version nul
2ac40 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
2ac50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
2ac60 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2ac70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2ac80 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20  $version \n]..  
2ac90 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2aca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
2acb0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2acc0 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
2acd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2ace0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2acf0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
2ad00 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2ad10 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
2ad20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2ad30 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74   source checkout
2ad40 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
2ad50 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
2ad60 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2ad70 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2ad80 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2ad90 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2ada0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2adc0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2add0 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
2ade0 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65  n ProviderSource
2adf0 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  Id..          } 
2ae00 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
2ae10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2ae20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
2ae30 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
2ae40 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2ae60 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
2ae70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2ae90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2aea0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73  l [appendArgs $s
2aeb0 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20  ourceId \n]..   
2aec0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
2aed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
2aee0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2aef0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
2af00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2af10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2af20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2af30 45 3a 20 52 65 73 65 74 20 63 61 63 68 65 64 20  E: Reset cached 
2af40 22 62 72 65 61 6b 20 69 6e 74 6f 20 64 65 62 75  "break into debu
2af50 67 67 65 72 22 20 73 65 74 74 69 6e 67 20 73 6f  gger" setting so
2af60 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0d   that it can be.
2af70 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2af80 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65   used during the
2af90 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20 6e   test file, if n
2afa0 65 65 64 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  eeded...        
2afb0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
2afc0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2afd0 6f 28 72 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  o(resetBreakInto
2afe0 44 65 62 75 67 67 65 72 29 5d 20 26 26 20 5c 0d  Debugger)] && \.
2aff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61  .            [ha
2b000 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
2b010 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
2b020 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
2b030 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
2b040 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
2b050 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
2b060 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
2b070 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
2b080 74 61 2e 53 51 4c 69 74 65 2e 48 65 6c 70 65 72  ta.SQLite.Helper
2b090 4d 65 74 68 6f 64 73 20 52 65 73 65 74 42 72 65  Methods ResetBre
2b0a0 61 6b 49 6e 74 6f 44 65 62 75 67 67 65 72 0d 0a  akIntoDebugger..
2b0b0 20 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75            } resu
2b0c0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
2b0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
2b0e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2b0f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2b100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2b110 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 52 65     "---- call Re
2b120 73 65 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75  setBreakIntoDebu
2b130 67 67 65 72 28 29 2e 2e 2e 20 6f 6b 5c 6e 22 5d  gger()... ok\n"]
2b140 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
2b150 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
2b160 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2b170 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2b180 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2b190 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
2b1a0 6c 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  l ResetBreakInto
2b1b0 44 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 65 72  Debugger()... er
2b1c0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
2b1d0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
2b1e0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
2b1f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2b200 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
2b210 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2b220 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69 6c   Check the avail
2b230 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e 64  able builds (and
2b240 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66 20   "releases") of 
2b250 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20  SQLite and..    
2b260 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74      #       Syst
2b270 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d  em.Data.SQLite..
2b280 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2b290 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
2b2a0 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74  teBuilds $::test
2b2b0 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
2b2c0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
2b2d0 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74  Releases $::test
2b2e0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
2b2f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2b300 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e   NOTE: Now, we n
2b310 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74  eed to know if t
2b320 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
2b330 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c 61  ibrary is availa
2b340 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
2b350 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75       (i.e. becau
2b360 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f  se the managed-o
2b370 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  nly System.Data.
2b380 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20  SQLite assembly 
2b390 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  can..        #  
2b3a0 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75       load withou
2b3b0 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69  t it; however, i
2b3c0 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74  t cannot do anyt
2b3d0 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68  hing useful with
2b3e0 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  out..        #  
2b3f0 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77 65       it).  If we
2b400 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d   are using the m
2b410 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
2b420 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64  ly and we alread
2b430 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
2b440 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f     found it (abo
2b450 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  ve), this should
2b460 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e   always succeed.
2b470 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2b480 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2b490 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65  iteLibrary $::te
2b4a0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2b4b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b4c0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
2b4d0 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  f the SQLite int
2b4e0 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73  erop assembly is
2b4f0 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
2b500 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2b510 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
2b520 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68  terop $::test_ch
2b530 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
2b540 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2b550 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51  TE: Check the SQ
2b560 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61 6e  Lite database an
2b570 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  d temporary dire
2b580 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20  ctories...      
2b590 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
2b5a0 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
2b5b0 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
2b5c0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
2b5d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2b5e0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
2b5f0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72  determine if var
2b600 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ious compile-tim
2b610 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64  e options needed
2b620 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20   for..        # 
2b630 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74        test const
2b640 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62  raints were enab
2b650 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
2b660 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54  ged assembly.  T
2b670 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  here..        # 
2b680 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63        are some c
2b690 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
2b6a0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c  ons that must al
2b6b0 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61  so have been ena
2b6c0 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  bled..        # 
2b6d0 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e        for the in
2b6e0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
2b6f0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66  n order to be ef
2b700 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68  fective.  For th
2b710 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ose..        #  
2b720 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74       options, it
2b730 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64   will be assumed
2b740 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e 61   that it was ena
2b750 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74  bled for the int
2b760 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20  erop..        # 
2b770 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69        assembly i
2b780 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64  f it was enabled
2b790 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64   for the managed
2b7a0 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
2b7b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
2b7c0 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e  oreach defineCon
2b7d0 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20  stant [list \.. 
2b7e0 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43 4b             CHECK
2b7f0 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e  _STATE COUNT_HAN
2b800 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f  DLE DEBUG INTERO
2b810 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f  P_CODEC INTEROP_
2b820 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20  DEBUG \..       
2b830 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54       INTEROP_EXT
2b840 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
2b850 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58   INTEROP_FTS5_EX
2b860 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2b870 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49         INTEROP_I
2b880 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 54  NCLUDE_CEROD INT
2b890 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54  EROP_INCLUDE_EXT
2b8a0 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55  RA INTEROP_INCLU
2b8b0 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20 20  DE_SEE \..      
2b8c0 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e        INTEROP_IN
2b8d0 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 49 4e 54  CLUDE_ZIPVFS INT
2b8e0 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e  EROP_JSON1_EXTEN
2b8f0 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2b900 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41      INTEROP_LEGA
2b910 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50  CY_CLOSE INTEROP
2b920 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45 52  _LOG INTEROP_PER
2b930 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f  CENTILE_EXTENSIO
2b940 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
2b950 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f   INTEROP_REGEXP_
2b960 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
2b970 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e 53  P_SESSION_EXTENS
2b980 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
2b990 20 20 20 49 4e 54 45 52 4f 50 5f 53 48 41 31 5f     INTEROP_SHA1_
2b9a0 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
2b9b0 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e  P_TEST_EXTENSION
2b9c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2b9d0 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45  INTEROP_TOTYPE_E
2b9e0 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
2b9f0 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c  _VIRTUAL_TABLE \
2ba00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45  ..            NE
2ba10 54 5f 32 30 20 4e 45 54 5f 33 35 20 4e 45 54 5f  T_20 NET_35 NET_
2ba20 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35  40 NET_45 NET_45
2ba30 31 20 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34 36  1 NET_452 NET_46
2ba40 20 4e 45 54 5f 34 36 31 20 5c 0d 0a 20 20 20 20   NET_461 \..    
2ba50 20 20 20 20 20 20 20 20 4e 45 54 5f 34 36 32 20          NET_462 
2ba60 4e 45 54 5f 34 37 20 4e 45 54 5f 34 37 31 20 4e  NET_47 NET_471 N
2ba70 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c  ET_COMPACT_20 PL
2ba80 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52  ATFORM_COMPACTFR
2ba90 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20  AMEWORK \..     
2baa0 20 20 20 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e         PRELOAD_N
2bab0 41 54 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45  ATIVE_LIBRARY RE
2bac0 54 41 52 47 45 54 41 42 4c 45 20 53 51 4c 49 54  TARGETABLE SQLIT
2bad0 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20  E_STANDARD \..  
2bae0 20 20 20 20 20 20 20 20 20 20 54 48 52 4f 57 5f            THROW_
2baf0 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43  ON_DISPOSED TRAC
2bb00 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49  E TRACE_CONNECTI
2bb10 4f 4e 20 54 52 41 43 45 5f 44 45 54 45 43 54 49  ON TRACE_DETECTI
2bb20 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
2bb30 20 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 54    TRACE_HANDLE T
2bb40 52 41 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41  RACE_PRELOAD TRA
2bb50 43 45 5f 53 48 41 52 45 44 20 54 52 41 43 45 5f  CE_SHARED TRACE_
2bb60 53 54 41 54 45 4d 45 4e 54 20 5c 0d 0a 20 20 20  STATEMENT \..   
2bb70 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 57           TRACE_W
2bb80 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d  ARNING TRACK_MEM
2bb90 4f 52 59 5f 42 59 54 45 53 20 55 53 45 5f 45 4e  ORY_BYTES USE_EN
2bba0 54 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36  TITY_FRAMEWORK_6
2bbb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2bbc0 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20  USE_INTEROP_DLL 
2bbd0 55 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57  USE_PREPARE_V2 W
2bbe0 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20  INDOWS] {..     
2bbf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bc00 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
2bc10 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74  if the compile-t
2bc20 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69  ime option is li
2bc30 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74  sted in the list
2bc40 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23   of..          #
2bc50 20 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63         "define c
2bc60 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74  onstants" kept t
2bc70 72 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d  rack of by the m
2bc80 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
2bc90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2bca0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2bcb0 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
2bcc0 73 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68  stant $::test_ch
2bcd0 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e  annel $defineCon
2bce0 73 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d  stant..        }
2bcf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2bd00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
2bd10 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
2bd20 69 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20 63  ine if various c
2bd30 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
2bd40 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a  ons needed for..
2bd50 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2bd60 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
2bd70 20 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f   were enabled fo
2bd80 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
2bd90 73 65 6d 62 6c 79 20 61 6e 64 2f 6f 72 0d 0a 20  sembly and/or.. 
2bda0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
2bdb0 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  or the SQLite co
2bdc0 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  re library...   
2bdd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bde0 66 6f 72 65 61 63 68 20 63 6f 6d 70 69 6c 65 4f  foreach compileO
2bdf0 70 74 69 6f 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20  ption [list \.. 
2be00 20 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43             CODEC
2be10 20 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54   EXTENSION_FUNCT
2be20 49 4f 4e 53 20 48 41 53 5f 43 4f 44 45 43 20 49  IONS HAS_CODEC I
2be30 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 43  NCLUDE_CEROD INC
2be40 4c 55 44 45 5f 45 58 54 52 41 20 5c 0d 0a 20 20  LUDE_EXTRA \..  
2be50 20 20 20 20 20 20 20 20 20 20 49 4e 43 4c 55 44            INCLUD
2be60 45 5f 53 45 45 20 49 4e 43 4c 55 44 45 5f 5a 49  E_SEE INCLUDE_ZI
2be70 50 56 46 53 20 4a 53 4f 4e 31 5f 45 58 54 45 4e  PVFS JSON1_EXTEN
2be80 53 49 4f 4e 20 4c 45 47 41 43 59 5f 43 4c 4f 53  SION LEGACY_CLOS
2be90 45 20 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20  E LOG \..       
2bea0 20 20 20 20 20 50 45 52 43 45 4e 54 49 4c 45 5f       PERCENTILE_
2beb0 45 58 54 45 4e 53 49 4f 4e 20 52 45 47 45 58 50  EXTENSION REGEXP
2bec0 5f 45 58 54 45 4e 53 49 4f 4e 20 53 45 53 53 49  _EXTENSION SESSI
2bed0 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  ON_EXTENSION \..
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 31              SHA1
2bef0 5f 45 58 54 45 4e 53 49 4f 4e 20 54 45 53 54 5f  _EXTENSION TEST_
2bf00 45 58 54 45 4e 53 49 4f 4e 20 54 4f 54 59 50 45  EXTENSION TOTYPE
2bf10 5f 45 58 54 45 4e 53 49 4f 4e 20 56 49 52 54 55  _EXTENSION VIRTU
2bf20 41 4c 5f 54 41 42 4c 45 5d 20 7b 0d 0a 20 20 20  AL_TABLE] {..   
2bf30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2bf40 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2bf50 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65  k if the compile
2bf60 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
2bf70 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69  listed in the li
2bf80 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  st..          # 
2bf90 20 20 20 20 20 20 6b 65 70 74 20 74 72 61 63 6b        kept track
2bfa0 20 6f 66 20 62 79 20 74 68 65 20 69 6e 74 65 72   of by the inter
2bfb0 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 2f  op assembly and/
2bfc0 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
2bfd0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2bfe0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
2bff0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2c000 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
2c010 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69  QLiteCompileOpti
2c020 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
2c030 65 6c 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f  el $compileOptio
2c040 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
2c050 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c060 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
2c070 20 69 66 20 74 68 65 20 53 79 73 74 65 6d 2e 44   if the System.D
2c080 61 74 61 2e 53 51 4c 69 74 65 20 70 72 6f 76 69  ata.SQLite provi
2c090 64 65 72 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  der was compiled
2c0a0 20 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20 23   with..        #
2c0b0 20 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 66         support f
2c0c0 6f 72 20 61 6e 79 20 65 6e 63 72 79 70 74 65 64  or any encrypted
2c0d0 20 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20   databases...   
2c0e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2c0f0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 44  if {[haveSQLiteD
2c100 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e  efineConstant IN
2c110 54 45 52 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c 20  TEROP_CODEC] || 
2c120 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2c130 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
2c140 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50  Constant INTEROP
2c150 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74  _INCLUDE_SEE]} t
2c160 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2c170 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2c180 4e 4f 54 45 3a 20 4e 6f 77 20 63 68 65 63 6b 20  NOTE: Now check 
2c190 69 66 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  if the interop a
2c1a0 73 73 65 6d 62 6c 79 20 77 61 73 20 61 6c 73 6f  ssembly was also
2c1b0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a   compiled with..
2c1c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2c1d0 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 65 6e    support for en
2c1e0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
2c1f0 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  s...          #.
2c200 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
2c210 68 61 76 65 53 51 4c 69 74 65 43 6f 6d 70 69 6c  haveSQLiteCompil
2c220 65 4f 70 74 69 6f 6e 20 43 4f 44 45 43 5d 20 7c  eOption CODEC] |
2c230 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
2c240 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 43 6f     [haveSQLiteCo
2c250 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 49 4e 43 4c  mpileOption INCL
2c260 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b  UDE_SEE]} then {
2c270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
2c280 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
2c290 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 63 68  OTE: Finally, ch
2c2a0 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74  eck if the SQLit
2c2b0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77  e core library w
2c2c0 61 73 20 63 6f 6d 70 69 6c 65 64 0d 0a 20 20 20  as compiled..   
2c2d0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2c2e0 20 77 69 74 68 20 73 75 70 70 6f 72 74 20 66 6f   with support fo
2c2f0 72 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  r encrypted data
2c300 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  bases...        
2c310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c320 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
2c330 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20  teCompileOption 
2c340 48 41 53 5f 43 4f 44 45 43 5d 7d 20 74 68 65 6e  HAS_CODEC]} then
2c350 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c360 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2c370 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
2c380 61 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  add constraint f
2c390 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
2c3a0 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
2c3b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2c3c0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
2c3d0 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
2c3e0 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79  ata.SQLite.Encry
2c3f0 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ption..         
2c400 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2c410 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
2c420 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c430 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
2c440 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
2c450 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61  ld year.  Basica
2c460 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61  lly, this indica
2c470 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tes..        #  
2c480 20 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69       which versi
2c490 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e  on of MSBuild an
2c4a0 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64  d/or Visual Stud
2c4b0 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a  io was used to..
2c4c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c4d0 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65  compile the asse
2c4e0 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e  mbly binaries un
2c4f0 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20  der test...     
2c500 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
2c510 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2c520 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
2c530 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
2c540 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
2c550 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79  a.SQLite build y
2c560 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ear... "....    
2c570 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65      set year [ge
2c580 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20  tBuildYear]..   
2c590 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
2c5a0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
2c5b0 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d  uildYear. $year]
2c5c0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
2c5d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2c5e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
2c5f0 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  year \"\n]....  
2c600 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c610 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2c620 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2c630 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
2c640 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2c650 20 62 75 69 6c 64 20 6e 61 74 69 76 65 20 79 65   build native ye
2c660 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ar... "....     
2c670 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
2c680 42 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72 5d  BuildNativeYear]
2c690 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
2c6a0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2c6b0 72 67 73 20 62 75 69 6c 64 4e 61 74 69 76 65 59  rgs buildNativeY
2c6c0 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20  ear. $year]..   
2c6d0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2c6e0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2c6f0 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
2c700 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
2c710 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2c720 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
2c730 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54  rrent build .NET
2c740 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73   Framework.  Bas
2c750 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20  ically, this..  
2c760 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
2c770 64 69 63 61 74 65 73 20 77 68 69 63 68 20 76 65  dicates which ve
2c780 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45  rsion of the .NE
2c790 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62  T Framework is b
2c7a0 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  eing..        # 
2c7b0 20 20 20 20 20 20 75 73 65 64 20 62 79 20 74 68        used by th
2c7c0 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72  e assembly binar
2c7d0 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d  ies under test..
2c7e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2c7f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2c800 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
2c810 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
2c820 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
2c830 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
2c840 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  uild .NET Framew
2c850 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ork... "....    
2c860 20 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67      set netFx [g
2c870 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20  etBuildNetFx].. 
2c880 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
2c890 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2c8a0 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e   buildFramework.
2c8b0 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20   $netFx]..      
2c8c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2c8d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2c8e0 72 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22  rgs \" $netFx \"
2c8f0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
2c900 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2c910 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
2c920 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ent build config
2c930 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73  uration.  This s
2c940 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a  hould normally..
2c950 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c960 62 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67  be either "Debug
2c970 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d  " or "Release"..
2c980 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2c990 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2c9a0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
2c9b0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
2c9c0 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
2c9d0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
2c9e0 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
2c9f0 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  on... "....     
2ca00 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61     set configura
2ca10 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
2ca20 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
2ca30 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
2ca40 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2ca50 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  buildConfigurati
2ca60 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69  on. $configurati
2ca70 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  on]..        tpu
2ca80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2ca90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2caa0 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  " $configuration
2cab0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
2cac0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2cad0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
2cae0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
2caf0 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
2cb00 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
2cb10 6c 64 20 65 78 74 72 61 2e 2e 2e 20 22 0d 0a 0d  ld extra... "...
2cb20 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2cb30 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2cb40 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
2cb50 69 6c 64 20 65 78 74 72 61 20 64 69 72 65 63 74  ild extra direct
2cb60 6f 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ory.  This will 
2cb70 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20  normally..      
2cb80 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74    #       be eit
2cb90 68 65 72 20 22 6e 65 74 73 74 61 6e 64 61 72 64  her "netstandard
2cba0 32 2e 30 22 20 6f 72 20 61 6e 20 65 6d 70 74 79  2.0" or an empty
2cbb0 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
2cbc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
2cbd0 20 65 78 74 72 61 20 5b 67 65 74 42 75 69 6c 64   extra [getBuild
2cbe0 45 78 74 72 61 5d 0d 0a 0d 0a 20 20 20 20 20 20  Extra]....      
2cbf0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2cc00 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30  ngth $extra] > 0
2cc10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2cc20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
2cc30 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
2cc40 69 6c 64 45 78 74 72 61 2e 20 24 65 78 74 72 61  ildExtra. $extra
2cc50 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ]..          tpu
2cc60 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2cc70 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2cc80 22 20 24 65 78 74 72 61 20 5c 22 5c 6e 5d 0d 0a  " $extra \"\n]..
2cc90 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2cca0 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
2ccb0 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 45  onstraint buildE
2ccc0 78 74 72 61 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20  xtra.none..     
2ccd0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2cce0 73 74 5f 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65  st_channel <none
2ccf0 3e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  >\n..        }..
2cd00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2cd10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79       # NOTE: Try
2cd20 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74   to setup an int
2cd30 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20  errupt callback 
2cd40 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  using the script
2cd50 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20   debugger..     
2cd60 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
2cd70 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20  will cancel all 
2cd80 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
2cd90 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20  rogress for all 
2cda0 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
2cdb0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
2cdc0 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
2cdd0 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e  his interpreter.
2cde0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2cdf0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2ce00 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
2ce10 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  teInterruptCallb
2ce20 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ack)]} then {.. 
2ce30 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62           setupDb
2ce40 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
2ce50 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  k $::test_channe
2ce60 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  l $::test_log.. 
2ce70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ce80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ce90 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
2cea0 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74   the native runt
2ceb0 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63  ime option, whic
2cec0 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20  h would mean we 
2ced0 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
2cee0 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d       using the m
2cef0 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
2cf00 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
2cf10 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2cf20 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
2cf30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61  :test_channel na
2cf40 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
2cf50 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2cf60 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
2cf70 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
2cf80 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
2cf90 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  er of connection
2cfa0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
2cfb0 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20     "opened" and 
2cfc0 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68  "closed" from th
2cfd0 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65  e pool when dete
2cfe0 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73  rmining if a tes
2cff0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
2d000 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61     passed.  Disa
2d010 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76  bling this behav
2d020 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  ior is sometimes
2d030 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e   necessary (e.g.
2d040 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d050 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c    during the rel
2d060 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f  ease testing pro
2d070 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68  cess) because th
2d080 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d  ere are several.
2d090 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2d0a0 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
2d0b0 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20   on the "opened 
2d0c0 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74  from pool" count
2d0d0 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a   being greater..
2d0e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2d0f0 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73  than zero.  Thes
2d100 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  e tests may fail
2d110 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d   due to the non-
2d120 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20  deterministic.. 
2d130 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
2d140 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43  ehavior of the C
2d150 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e  LR GC, even when
2d160 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67   there is no bug
2d170 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20   in the code..  
2d180 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
2d190 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20  ing tested...   
2d1a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2d1b0 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
2d1c0 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
2d1d0 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e  annel noPoolCoun
2d1e0 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ts....        #.
2d1f0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2d200 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
2d210 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20  st suite should 
2d220 75 73 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  use shared-cache
2d230 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20   mode...        
2d240 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
2d250 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
2d260 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2d270 20 73 68 61 72 65 64 43 61 63 68 65 0d 0a 0d 0a   sharedCache....
2d280 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2d290 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
2d2a0 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
2d2b0 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75  sage prior to ru
2d2c0 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e  nning any tests.
2d2d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2d2e0 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
2d2f0 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
2d300 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2d310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2d320 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
2d330 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
2d340 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74 68 65   modules for the
2d350 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
2d360 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
2d370 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f 6e 20        report on 
2d380 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
2d390 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
2d3a0 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
2d3b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2d3c0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
2d3d0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
2d3e0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 6f            set mo
2d3f0 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e  dules [object in
2d400 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  voke \..        
2d410 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
2d420 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73 73  gnostics.Process
2d430 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  .GetCurrentProce
2d440 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20  ss Modules].... 
2d450 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
2d460 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d  foreach -alias m
2d470 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b  odule $modules {
2d480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
2d490 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
2d4a0 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65 20  OTE: The module 
2d4b0 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20 6d  file name here m
2d4c0 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65  ust be normalize
2d4d0 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
2d4e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
2d4f0 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
2d500 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f  e normalize [$mo
2d510 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d  dule FileName]].
2d520 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
2d530 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 66   fileNameOnly [f
2d540 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
2d550 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
2d560 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20     if {[lsearch 
2d570 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d  -exact -nocase -
2d580 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  - \..           
2d590 20 20 20 20 20 5b 67 65 74 4e 61 74 69 76 65 4c       [getNativeL
2d5a0 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
2d5b0 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  nly] $fileNameOn
2d5c0 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ly] != -1} then 
2d5d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d5e0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d5f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2d600 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2d610 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
2d620 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74  und loaded SQLit
2d630 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
2d640 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20   module: " \..  
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d660 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20  $fileName \n].. 
2d670 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2d680 65 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65  eif {[lsearch -e
2d690 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20  xact -nocase -- 
2d6a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2d6b0 20 20 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73     [getInteropAs
2d6c0 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f  semblyFileNamesO
2d6d0 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  nly] $fileNameOn
2d6e0 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  ly] != -1} then 
2d6f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d700 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d710 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2d720 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2d730 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
2d740 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74  und loaded SQLit
2d750 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2d760 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ly module: " \..
2d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d780 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d    $fileName \n].
2d790 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2d7a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d7b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2d7c0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
2d7d0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2d7e0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2d800 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  - compile-time o
2d810 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74  ptions for SQLit
2d820 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e  e core library..
2d830 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2d840 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2d850 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2d860 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2d870 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2d890 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2d8a0 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65 43  .SQLite3 SQLiteC
2d8b0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20  ompileOptions.. 
2d8c0 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70 69           } compi
2d8d0 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d  leOptions] == 0}
2d8e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d8f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2d900 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2d910 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69  ndArgs [formatLi
2d920 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20  st [lsort \..   
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f               $co
2d940 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e  mpileOptions] <n
2d950 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
2d960 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
2d970 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2d980 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2d990 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
2d9a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2d9b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
2d9c0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
2d9d0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d9e0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2d9f0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
2da00 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2da10 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ns for SQLite in
2da20 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
2da30 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2da40 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2da50 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2da60 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2da70 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2da90 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2daa0 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70  .SQLite3 Interop
2dab0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a  CompileOptions..
2dac0 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70            } comp
2dad0 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
2dae0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2daf0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2db00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2db10 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
2db20 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63                $c
2db40 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c  ompileOptions] <
2db50 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20  none>] \n]..    
2db60 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2db70 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2db80 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2db90 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
2dba0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2dbb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
2dbc0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2dbd0 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74 69 76  : Show the activ
2dbe0 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
2dbf0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
2dc00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2dc10 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2dc20 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20  ppendArgs "---- 
2dc30 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c  constraints: " \
2dc40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
2dc50 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
2dc60 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73   [getConstraints
2dc70 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  ]] <none>] \n]..
2dc80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2dc90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76       # NOTE: Sav
2dca0 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  e the test const
2dcb0 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62  raints for use b
2dcc0 79 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65  y threads create
2dcd0 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  d in this..     
2dce0 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69     #       appli
2dcf0 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20  cation domain.  
2dd00 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
2dd10 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  y because all th
2dd20 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
2dd30 20 23 20 20 20 20 20 20 20 22 74 65 73 74 20 63   #       "test c
2dd40 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74  ontext" informat
2dd50 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61  ion is per-threa
2dd60 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
2dd70 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2dd80 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
2dd90 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68  constraints]} th
2dda0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2ddb0 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  set ::test_const
2ddc0 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f  raints $::eagle_
2ddd0 74 65 73 74 73 28 43 6f 6e 73 74 72 61 69 6e 74  tests(Constraint
2dde0 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  s)..        }...
2ddf0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2de00 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
2de10 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73   the "after-cons
2de20 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
2de30 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
2de40 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
2de50 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
2de60 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
2de70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2de80 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
2de90 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
2dea0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
2deb0 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d  channel .after].
2dec0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2ded0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
2dee0 20 6e 65 63 65 73 73 61 72 79 2c 20 65 6e 61 62   necessary, enab
2def0 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
2df00 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
2df10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2df20 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
2df30 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
2df40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2df50 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
2df60 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
2df70 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
2df80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2df90 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2dfa0 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
2dfb0 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
2dfc0 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20   began (now)... 
2dfd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2dfe0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2dff0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e000 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2e010 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
2e020 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
2e030 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a  s began at " \..
2e040 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
2e050 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
2e060 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
2e070 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2e080 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
2e090 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73 50 72  QLiteTestFilesPr
2e0a0 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
2e0b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
2e0c0 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
2e0d0 20 6f 75 72 20 63 75 73 74 6f 6d 20 66 69 6c 65   our custom file
2e0e0 73 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68  s prologue if th
2e0f0 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
2e100 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
2e110 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
2e120 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2e130 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2e140 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c  no(prologue.eagl
2e150 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
2e160 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b       uplevel 1 {
2e170 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2e180 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2e190 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
2e1a0 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
2e1b0 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 6e  to the various n
2e1c0 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  on-data files.. 
2e1d0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2e1e0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2e1f0 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
2e200 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
2e210 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
2e220 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   entityFramework
2e230 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
2e240 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
2e250 6c 64 46 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74  ldFileName Entit
2e260 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 20 66  yFramework.dll f
2e270 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
2e280 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 65 72     set installer
2e290 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
2e2a0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
2e2b0 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61  ldFileName Insta
2e2c0 6c 6c 65 72 2e 65 78 65 20 66 61 6c 73 65 5d 0d  ller.exe false].
2e2d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2e2e0 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44   sqliteDesignerD
2e2f0 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
2e300 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
2e310 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  dFileName SQLite
2e320 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 20 66 61  .Designer.dll fa
2e330 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2e340 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
2e350 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d  SQLiteDllFile \.
2e360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2e370 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
2e380 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2e390 69 74 65 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a  ite.dll false]..
2e3a0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2e3b0 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2e3c0 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LinqDllFile \.. 
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2e3e0 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
2e3f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2e400 65 2e 4c 69 6e 71 2e 64 6c 6c 20 66 61 6c 73 65  e.Linq.dll false
2e410 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2e420 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
2e430 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d  iteEf6DllFile \.
2e440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2e450 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
2e460 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2e470 69 74 65 2e 45 46 36 2e 64 6c 6c 20 66 61 6c 73  ite.EF6.dll fals
2e480 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
2e490 73 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20  set testExeFile 
2e4a0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2e4b0 65 20 74 65 73 74 2e 65 78 65 20 66 61 6c 73 65  e test.exe false
2e4c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
2e4d0 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65   testLinqExeFile
2e4e0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
2e4f0 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 20  me testlinq.exe 
2e500 66 61 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20  false]..        
2e510 20 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65    set testEf6Exe
2e520 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
2e530 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65  leName testef6.e
2e540 78 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  xe false]....   
2e550 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2e560 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75      # NOTE: Setu
2e570 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  p the variables 
2e580 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
2e590 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 20 66  e various data f
2e5a0 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  iles..          
2e5b0 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64  #       required
2e5c0 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69 6e   by the tests in
2e5d0 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20   this file...   
2e5e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2e5f0 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
2e600 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
2e610 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2e620 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2e630 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2e640 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65 73  estDataPath] tes
2e650 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20  tlinq.out]].... 
2e660 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72           set nor
2e670 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b  thwindEfDbFile [
2e680 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2e690 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2e6b0 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
2e6c0 64 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69  dirname [getSQLi
2e6d0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d  teTestDataPath]]
2e6e0 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
2e6f0 20 20 20 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74     testlinq nort
2e700 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a  hwindEF.db]]....
2e710 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
2e720 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65  nWalDbFile [file
2e730 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2e740 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2e750 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2e760 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2e770 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20  nonWal.db]].... 
2e780 20 20 20 20 20 20 20 20 20 73 65 74 20 77 61 6c           set wal
2e790 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  DbFile [file nat
2e7a0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2e7b0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2e7c0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2e7d0 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
2e7e0 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
2e7f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2e800 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f   NOTE: The vario
2e810 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73  us install/unins
2e820 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75  tall log files u
2e830 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d  sed to test the.
2e840 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2e850 20 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63     design-time c
2e860 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c  omponent install
2e870 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
2e880 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2e890 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2e8a0 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
2e8b0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2e8c0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2e8d0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
2e8e0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
2e8f0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2e900 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  005.log]]....   
2e910 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2e920 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
2e930 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2e940 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2e950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2e960 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2e970 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
2e980 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
2e990 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2e9a0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
2e9b0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b  lVs2010LogFile [
2e9c0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2e9d0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2e9e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2e9f0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2ea00 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
2ea10 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d  st_Vs2010.log]].
2ea20 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2ea30 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2ea40 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  12LogFile [file 
2ea50 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2ea60 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2ea70 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2ea80 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2ea90 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2eaa0 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2012.log]]....  
2eab0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2eac0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
2ead0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2eae0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2eaf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2eb00 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2eb10 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2eb20 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e  ler_Test_Vs2013.
2eb30 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2eb40 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2eb50 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
2eb60 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2eb70 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2eb90 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2eba0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2ebb0 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
2ebc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2ebd0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
2ebe0 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  017LogFile [file
2ebf0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2ec00 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2ec10 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2ec20 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2ec30 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
2ec40 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2017.log]].... 
2ec50 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2ec60 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
2ec70 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
2ec80 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2ec90 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2eca0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2ecb0 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
2ecc0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2ecd0 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
2ece0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2ecf0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
2ed00 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
2ed10 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2ed20 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2ed30 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2ed40 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
2ed50 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2ed60 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
2ed70 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
2ed80 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
2ed90 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
2eda0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2edb0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2edc0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2edd0 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
2ede0 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
2edf0 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  10.log]]....    
2ee00 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
2ee10 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
2ee20 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2ee30 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2ee40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ee50 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2ee60 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
2ee70 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
2ee80 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
2ee90 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
2eea0 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
2eeb0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2eec0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2eed0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2eee0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2eef0 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
2ef00 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
2ef10 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
2ef20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2ef30 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
2ef40 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2ef50 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2ef60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ef70 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2ef80 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
2ef90 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
2efa0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2efb0 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
2efc0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
2efd0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2efe0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2eff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2f000 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2f010 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2f020 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e 6c  er_Test_Vs2017.l
2f030 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2f040 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
2f050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f080 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
2f090 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2f0a0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 68 65 63  exists ::no(chec
2f0b0 6b 46 6f 72 53 71 6c 69 74 65 46 69 6c 65 73 29  kForSqliteFiles)
2f0c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2f0d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2f0e0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2f0f0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2f100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f110 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 65 6e 74   [file tail $ent
2f120 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
2f130 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
2f150 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
2f160 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74 79  _channel $entity
2f170 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
2f180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2f190 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2f1a0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2f1b0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2f1c0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2f1d0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2f1e0 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78  ail $installerEx
2f1f0 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
2f200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f210 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2f220 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73 74  st_channel $inst
2f230 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e 73  allerExeFile Ins
2f240 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20 20  taller.exe..    
2f250 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2f260 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2f270 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2f280 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2f290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2f2a0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
2f2b0 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c  qliteDesignerDll
2f2c0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2f2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2f2e0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2f2f0 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69 74  t_channel $sqlit
2f300 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
2f310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2f320 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2f330 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2f340 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2f350 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2f360 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2f370 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
2f380 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  QLiteDllFile]]]}
2f390 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2f3a0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2f3b0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2f3c0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
2f3d0 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  iteDllFile..    
2f3e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2f3f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2f400 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2f410 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2f420 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2f430 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73     [file tail $s
2f440 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
2f450 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  inqDllFile]]]} t
2f460 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f470 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2f480 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2f490 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
2f4a0 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20 20  eLinqDllFile..  
2f4b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2f4c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2f4d0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2f4e0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2f4f0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2f500 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2f510 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
2f520 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  eEf6DllFile]]]} 
2f530 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2f540 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2f550 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2f560 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
2f570 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20 20  teEf6DllFile..  
2f580 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2f590 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2f5a0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2f5b0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2f5c0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2f5d0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2f5e0 24 74 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d 7d  $testExeFile]]]}
2f5f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2f600 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2f610 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2f620 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20 74  l $testExeFile t
2f630 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  est.exe..       
2f640 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2f650 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2f660 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2f670 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f690 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2f6a0 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  LinqExeFile]]]} 
2f6b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2f6c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2f6d0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2f6e0 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
2f6f0 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d 0a  e testlinq.exe..
2f700 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2f710 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2f720 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
2f730 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
2f740 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
2f750 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
2f760 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
2f770 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2f780 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2f790 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2f7a0 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36 45  hannel $testEf6E
2f7b0 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e 65  xeFile testef6.e
2f7c0 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xe..            
2f7d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2f7e0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
2f7f0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2f800 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
2f810 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2f820 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 4f   tail $testLinqO
2f830 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  utFile]]]} then 
2f840 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2f850 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2f860 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2f870 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20 20  tLinqOutFile..  
2f880 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2f890 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2f8a0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2f8b0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2f8c0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2f8d0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2f8e0 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69  $northwindEfDbFi
2f8f0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
2f900 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
2f910 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
2f920 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77 69  channel $northwi
2f930 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20 20  ndEfDbFile..    
2f940 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2f950 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2f960 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2f970 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2f980 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2f990 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e     [file tail $n
2f9a0 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20  onWalDbFile]]]} 
2f9b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2f9c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
2f9d0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
2f9e0 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a   $nonWalDbFile..
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2fa00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2fa10 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
2fa20 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
2fa30 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
2fa40 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
2fa50 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d  l $walDbFile]]]}
2fa60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2fa70 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2fa80 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2fa90 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20 20  l $walDbFile..  
2faa0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2fab0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2fac0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2fad0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2fae0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2faf0 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2fb00 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2fb10 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  05LogFile]]]} th
2fb20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2fb30 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2fb40 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2fb50 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
2fb60 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
2fb70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2fb80 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2fb90 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2fba0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2fbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fbc0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2fbd0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
2fbe0 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
2fbf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2fc00 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2fc10 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2fc20 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
2fc30 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  File..          
2fc40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2fc50 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2fc60 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2fc70 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
2fc90 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
2fca0 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
2fcb0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2fcd0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2fce0 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
2fcf0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2fd00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2fd10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
2fd20 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
2fd30 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
2fd40 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
2fd50 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
2fd60 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
2fd70 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2012LogFile]]]
2fd80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2fd90 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2fda0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2fdb0 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
2fdc0 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2012LogFile..  
2fdd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2fde0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2fdf0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
2fe00 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
2fe10 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
2fe20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
2fe30 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
2fe40 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  13LogFile]]]} th
2fe50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2fe60 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2fe70 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2fe80 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2fe90 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  3LogFile..      
2fea0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2feb0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
2fec0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
2fed0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
2fee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fef0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
2ff00 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
2ff10 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
2ff20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ff30 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2ff40 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
2ff50 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
2ff60 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  File..          
2ff70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2ff80 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
2ff90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2ffa0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
2ffc0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
2ffd0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
2ffe0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
30000 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
30010 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
30020 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
30030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
30040 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
30050 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
30060 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
30070 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
30080 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
30090 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
300a0 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d  llVs2005LogFile]
300b0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
300c0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
300d0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
300e0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
300f0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
30100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
30110 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
30120 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
30130 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
30140 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
30150 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
30160 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
30170 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d  llVs2008LogFile]
30180 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
30190 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
301a0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
301b0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
301c0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
301d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
301e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
301f0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
30200 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
30210 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
30220 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
30230 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
30240 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d  llVs2010LogFile]
30250 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
30260 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
30270 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
30280 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
30290 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
302a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
302b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
302c0 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
302d0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
302e0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
302f0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
30300 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
30310 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d  llVs2012LogFile]
30320 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
30330 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
30340 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
30350 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
30360 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
30370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
30380 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
30390 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
303a0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
303b0 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
303c0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
303d0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
303e0 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d  llVs2013LogFile]
303f0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
30400 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
30410 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
30420 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
30430 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
30440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
30450 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
30460 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
30470 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
30480 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
30490 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
304a0 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
304b0 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d  llVs2015LogFile]
304c0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
304d0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
304e0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
304f0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
30500 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
30510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
30520 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
30530 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
30540 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
30550 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
30560 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
30570 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61  ail $testUninsta
30580 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 5d  llVs2017LogFile]
30590 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
305a0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
305b0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
305c0 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  nnel $testUninst
305d0 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
305e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
305f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
30600 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
30610 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
30620 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
30630 73 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20  stFilesEpilogue 
30640 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
30650 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
30660 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
30670 73 74 6f 6d 20 66 69 6c 65 73 20 65 70 69 6c 6f  stom files epilo
30680 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
30690 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
306a0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
306b0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
306c0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
306d0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
306e0 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
306f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
30700 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
30710 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
30720 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20  mplain \..      
30730 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
30740 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
30750 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  le testUninstall
30760 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2015LogFile \.
30770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
30780 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
30790 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e  13LogFile testUn
307a0 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
307b0 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
307c0 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
307d0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
307e0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
307f0 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2008LogFile \.. 
30800 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
30810 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
30820 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
30830 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
30840 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30850 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
30860 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  015LogFile testI
30870 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
30880 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
30890 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c       testInstall
308a0 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65  Vs2012LogFile te
308b0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  stInstallVs2010L
308c0 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
308d0 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74          testInst
308e0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
308f0 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
30900 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20 20  05LogFile....   
30910 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
30920 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20  complain \..    
30930 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77            northw
30940 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74  indEfDbFile test
30950 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20  LinqOutFile \.. 
30960 20 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c               wal
30970 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46  DbFile nonWalDbF
30980 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ile....         
30990 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
309a0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
309b0 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
309c0 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
309d0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
309e0 20 20 20 20 74 65 73 74 45 78 65 46 69 6c 65 20      testExeFile 
309f0 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
30a00 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  Ef6DllFile \..  
30a10 20 20 20 20 20 20 20 20 20 20 20 20 73 79 73 74              syst
30a20 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
30a30 44 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44 61  DllFile systemDa
30a40 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20  taSQLiteDllFile 
30a50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
30a60 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44   sqliteDesignerD
30a70 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65 72  llFile installer
30a80 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
30a90 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79 46           entityF
30aa0 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d  rameworkDllFile.
30ab0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
30ac0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
30ad0 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
30ae0 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d  eTestEpilogue {}
30af0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
30b00 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
30b10 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
30b20 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74  om epilogue if t
30b30 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
30b40 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
30b50 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
30b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
30b70 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
30b80 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67  :no(epilogue.eag
30b90 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
30ba0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
30bb0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68   # NOTE: Show wh
30bc0 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74  en our tests act
30bd0 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77  ually ended (now
30be0 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
30bf0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
30c00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
30c10 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
30c20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79          "---- Sy
30c30 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
30c40 20 74 65 73 74 73 20 65 6e 64 65 64 20 61 74 20   tests ended at 
30c50 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
30c60 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b   [clock format [
30c70 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20  clock seconds]] 
30c80 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
30c90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
30ca0 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70 69 6c  : Load the "epil
30cb0 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70 65 72  ogue" custom per
30cc0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
30cd0 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20 20 20  -host test..    
30ce0 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
30cf0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
30d00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
30d10 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
30d20 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
30d30 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
30d40 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d  nnel .epilogue].
30d50 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30d60 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
30d70 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20  Before checking 
30d80 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72  the final resour
30d90 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51  ces in use by SQ
30da0 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20  Lite, make..    
30db0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75      #         su
30dc0 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50  re both of the P
30dd0 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
30de0 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
30df0 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
30e00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
30e10 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
30e20 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
30e30 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
30e40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
30e50 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72    # NOTE: Also r
30e60 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
30e70 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72  ce usage after r
30e80 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
30e90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30ea0 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
30eb0 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
30ec0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
30ed0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
30ee0 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
30ef0 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61   the critical ha
30f00 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65  ndle counts afte
30f10 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
30f20 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
30f30 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69  .        getSQLi
30f40 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24  teHandleCounts $
30f50 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
30f60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
30f70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
30f80 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73 61 62  necessary, disab
30f90 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  le shared-cache 
30fa0 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  mode now...     
30fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
30fc0 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
30fd0 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65 5d  ion sharedCache]
30fe0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
30ff0 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65 64      enableShared
31000 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63 68  Cache $::test_ch
31010 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20  annel false..   
31020 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
31030 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23  .    }.....    #
31040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31080 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
31090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
310a0 23 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e  ############# EN
310b0 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23  D Eagle ONLY ###
310c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
310d0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
310e0 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
310f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31100 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31120 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
31130 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
31140 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d  TE: Save the nam
31150 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
31160 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
31170 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20  is file...  #.. 
31180 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
31190 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  ts common_direct
311a0 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
311b0 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72    set common_dir
311c0 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
311d0 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
311e0 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  t]]..  }....  #.
311f0 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69  .  # NOTE: Provi
31200 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  de the System.Da
31210 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70  ta.SQLite test p
31220 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e  ackage to the in
31230 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d  terpreter...  #.
31240 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69  .  package provi
31250 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  de System.Data.S
31260 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a  QLite.Test 1.0..
31270 7d 0d 0a                                         }..