System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 93f4f65dc861c62dcf034209518697e30436b6be:


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 69 73 44 61 72  ..    proc isDar
5390: 77 69 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  win {} {..      
53a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
53b0: 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78          [info ex
53c0: 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
53d0: 6f 72 6d 28 6f 73 29 5d 20 26 26 20 24 3a 3a 74  orm(os)] && $::t
53e0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 20  cl_platform(os) 
53f0: 65 71 20 22 44 61 72 77 69 6e 22 0d 0a 20 20 20  eq "Darwin"..   
5400: 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d     }]..    }....
5410: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 4e 61 74  .    proc getNat
5420: 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
5430: 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20 20  mesOnly {} {..  
5440: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5450: 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65 63  OTE: First, chec
5460: 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66  k if the list of
5470: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
5480: 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62  file names has b
5490: 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
54a0: 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72     manually over
54b0: 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23  ridden...      #
54c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
54d0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 61 74 69 76  o exists ::nativ
54e0: 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e  e_library_file_n
54f0: 61 6d 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ames] && \..    
5500: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
5510: 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79  ::native_library
5520: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30  _file_names] > 0
5530: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5540: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5550: 4f 54 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66  OTE: The list of
5560: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
5570: 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62  file names has b
5580: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
5590: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
55a0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
55b0: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
55c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
55d0: 20 72 65 74 75 72 6e 20 24 3a 3a 6e 61 74 69 76   return $::nativ
55e0: 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e  e_library_file_n
55f0: 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ames..      } el
5600: 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73  seif {[isWindows
5610: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5620: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5630: 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c  NOTE: Otherwise,
5640: 20 6f 6e 20 57 69 6e 33 32 20 61 6c 77 61 79 73   on Win32 always
5650: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
5660: 64 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  d native library
5670: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5680: 20 20 66 69 6c 65 20 6e 61 6d 65 20 22 73 71 6c    file name "sql
5690: 69 74 65 33 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20  ite3.dll"...    
56a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
56b0: 65 74 75 72 6e 20 5b 6c 69 73 74 20 73 71 6c 69  eturn [list sqli
56c0: 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20  te3.dll]..      
56d0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44 6f 74  } elseif {[isDot
56e0: 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b  NetCore]} then {
56f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5700: 20 20 20 20 20 23 20 20 20 20 20 20 20 57 68 65       #       Whe
5710: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  n running on .NE
5720: 54 20 43 6f 72 65 2c 20 72 65 74 75 72 6e 20 74  T Core, return t
5730: 68 65 20 73 61 6d 65 20 6e 61 74 69 76 65 20 6c  he same native l
5740: 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
5750: 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d  #       file nam
5760: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 6f  e that is used o
5770: 6e 20 57 69 6e 64 6f 77 73 20 28 69 2e 65 2e 20  n Windows (i.e. 
5780: 6f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  otherwise, assum
5790: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
57a0: 20 20 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e     we are runnin
57b0: 67 20 6f 6e 20 4d 6f 6e 6f 20 61 6e 64 20 75 73  g on Mono and us
57c0: 65 20 69 74 73 20 50 2f 49 6e 76 6f 6b 65 20 63  e its P/Invoke c
57d0: 6f 6e 76 65 6e 74 69 6f 6e 73 29 2e 0d 0a 20 20  onventions)...  
57e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
57f0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 73 71   return [list sq
5800: 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20 20 20  lite3.dll]..    
5810: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44    } elseif {[isD
5820: 61 72 77 69 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  arwin]} then {..
5830: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5840: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
5850: 72 75 6e 6e 69 6e 67 20 6f 6e 20 44 61 72 77 69  running on Darwi
5860: 6e 20 28 69 2e 65 2e 20 74 68 65 20 6b 65 72 6e  n (i.e. the kern
5870: 65 6c 20 6f 66 20 69 4f 53 20 2f 20 4d 61 63 20  el of iOS / Mac 
5880: 4f 53 20 58 29 2c 0d 0a 20 20 20 20 20 20 20 20  OS X),..        
5890: 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  #       return t
58a0: 68 65 20 4d 61 63 20 4f 53 20 58 20 6e 61 74 69  he Mac OS X nati
58b0: 76 65 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20  ve library file 
58c0: 6e 61 6d 65 2e 20 20 54 68 69 73 20 66 69 6c 65  name.  This file
58d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
58e0: 20 20 6e 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c    name is normal
58f0: 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ly required for 
5900: 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23  Mono...        #
5910: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5920: 20 5b 6c 69 73 74 20 6c 69 62 73 71 6c 69 74 65   [list libsqlite
5930: 33 2e 64 79 6c 69 62 5d 0d 0a 20 20 20 20 20 20  3.dylib]..      
5940: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5950: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5960: 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20  OTE: Otherwise, 
5970: 72 65 74 75 72 6e 20 74 68 65 20 67 65 6e 65 72  return the gener
5980: 69 63 20 50 4f 53 49 58 20 6e 61 74 69 76 65 20  ic POSIX native 
5990: 6c 69 62 72 61 72 79 20 66 69 6c 65 0d 0a 20 20  library file..  
59a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
59b0: 6d 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 6e  me.  This file n
59c0: 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  ame is normally 
59d0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 4d 6f 6e  required for Mon
59e0: 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o...        #.. 
59f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
5a00: 69 73 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 73  ist libsqlite3.s
5a10: 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  o]..      }..   
5a20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
5a30: 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
5a40: 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20  lyFileNamesOnly 
5a50: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5a60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
5a70: 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  st, check if the
5a80: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70   list of interop
5a90: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
5aa0: 61 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20  ames has been.. 
5ab0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
5ac0: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
5ad0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5ae0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
5af0: 74 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73  ts ::interop_ass
5b00: 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73  embly_file_names
5b10: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5b20: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e    [llength $::in
5b30: 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66  terop_assembly_f
5b40: 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20  ile_names] > 0} 
5b50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5b60: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5b70: 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69  E: The list of i
5b80: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
5b90: 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62  file names has b
5ba0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
5bb0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5bc0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
5bd0: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
5be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5bf0: 20 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72   return $::inter
5c00: 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65  op_assembly_file
5c10: 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20  _names..      } 
5c20: 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f  elseif {[isWindo
5c30: 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ws]} then {..   
5c40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5c50: 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73  # NOTE: Otherwis
5c60: 65 2c 20 6f 6e 20 57 69 6e 33 32 2c 20 61 6c 77  e, on Win32, alw
5c70: 61 79 73 20 75 73 65 20 74 68 65 20 69 6e 74 65  ays use the inte
5c80: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
5c90: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
5ca0: 20 20 20 6e 61 6d 65 20 22 53 51 4c 69 74 65 2e     name "SQLite.
5cb0: 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 2e 0d 0a 20  Interop.dll"... 
5cc0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5cd0: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 53    return [list S
5ce0: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
5cf0: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
5d00: 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72  if {[isDotNetCor
5d10: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5d30: 20 20 20 20 20 20 20 57 68 65 6e 20 72 75 6e 6e         When runn
5d40: 69 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65  ing on .NET Core
5d50: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  , return the sam
5d60: 65 20 69 6e 74 65 72 70 20 61 73 73 65 6d 62 6c  e interp assembl
5d70: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
5d80: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 74 68 61     file name tha
5d90: 74 20 69 73 20 75 73 65 64 20 6f 6e 20 57 69 6e  t is used on Win
5da0: 64 6f 77 73 20 28 69 2e 65 2e 20 6f 74 68 65 72  dows (i.e. other
5db0: 77 69 73 65 2c 20 61 73 73 75 6d 65 0d 0a 20 20  wise, assume..  
5dc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65        #       we
5dd0: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
5de0: 4d 6f 6e 6f 20 61 6e 64 20 75 73 65 20 69 74 73  Mono and use its
5df0: 20 50 2f 49 6e 76 6f 6b 65 20 63 6f 6e 76 65 6e   P/Invoke conven
5e00: 74 69 6f 6e 73 29 2e 0d 0a 20 20 20 20 20 20 20  tions)...       
5e10: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5e20: 72 6e 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e  rn [list SQLite.
5e30: 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20  Interop.dll]..  
5e40: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
5e50: 73 44 61 72 77 69 6e 5d 7d 20 74 68 65 6e 20 7b  sDarwin]} then {
5e60: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5e70: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65       # NOTE: Whe
5e80: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 44 61 72  n running on Dar
5e90: 77 69 6e 20 28 69 2e 65 2e 20 74 68 65 20 6b 65  win (i.e. the ke
5ea0: 72 6e 65 6c 20 6f 66 20 69 4f 53 20 2f 20 4d 61  rnel of iOS / Ma
5eb0: 63 20 4f 53 20 58 29 2c 0d 0a 20 20 20 20 20 20  c OS X),..      
5ec0: 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
5ed0: 20 74 68 65 20 4d 61 63 20 4f 53 20 58 20 69 6e   the Mac OS X in
5ee0: 74 65 72 70 20 61 73 73 65 6d 62 6c 79 20 66 69  terp assembly fi
5ef0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 69 73 20 66  le name.  This f
5f00: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
5f10: 20 20 20 20 20 6e 61 6d 65 20 69 73 20 6e 6f 72       name is nor
5f20: 6d 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 66  mally required f
5f30: 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20  or Mono...      
5f40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5f50: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
5f60: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
5f70: 62 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  b]..      } else
5f80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5f90: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
5fa0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
5fb0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53   the generic POS
5fc0: 49 58 20 69 6e 74 65 72 70 20 61 73 73 65 6d 62  IX interp assemb
5fd0: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
5fe0: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20   #       name.  
5ff0: 54 68 69 73 20 66 69 6c 65 20 6e 61 6d 65 20 69  This file name i
6000: 73 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 71 75 69  s normally requi
6010: 72 65 64 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20  red for Mono... 
6020: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6030: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c    return [list l
6040: 69 62 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  ibSQLite.Interop
6050: 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  .so]..      }.. 
6060: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6070: 63 20 67 65 74 43 6f 72 65 45 78 74 65 6e 73 69  c getCoreExtensi
6080: 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  onBinaryFileName
6090: 20 7b 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20   { {default ""} 
60a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
60b0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43 6f 72 65  ileName [getCore
60c0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 5d 0d  BinaryFileName].
60d0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  ...      if {[fi
60e0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
60f0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
6100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
6110: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
6120: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
6130: 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d  $default..    }.
6140: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 42  ....    proc isB
6150: 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b 20  uildAvailable { 
6160: 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f 72 79  native directory
6170: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
6180: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6190: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
61a0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
61b0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
61c0: 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73  r the primary as
61d0: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
61e0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
61f0: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
6200: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
6210: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d  components.  It.
6220: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
6230: 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 74  hould be noted t
6240: 68 61 74 20 74 68 69 73 20 61 73 73 65 6d 62 6c  hat this assembl
6250: 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20  y file may also 
6260: 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20 20 20  contain the..   
6270: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
6280: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66  e components, if
6290: 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20   a native build 
62a0: 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20  is in use...    
62b0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
62c0: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
62d0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
62e0: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
62f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74  ..          Syst
6300: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
6310: 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ll]]....      if
6320: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
6330: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
6340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
6350: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
6360: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
6370: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
6380: 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  mpt to automatic
6390: 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66 20 74  ally detect if t
63a0: 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d  he primary assem
63b0: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
63c0: 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20     contains any 
63d0: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
63e0: 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  s, if necessary.
63f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6400: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
6410: 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20  gth $native] == 
6420: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6430: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
6440: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
6450: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6460: 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
6470: 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65  varName $varName
6480: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
6490: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
64a0: 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65 41 73  e [isMixedModeAs
64b0: 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
64c0: 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20   $varName]..    
64d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
64e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
64f0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
6500: 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61  embly also conta
6510: 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65 20 63  ins the native c
6520: 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20  omponents,..    
6530: 20 20 23 20 20 20 20 20 20 20 77 65 20 68 61 76    #       we hav
6540: 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 20  e everything we 
6550: 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  need...      #..
6560: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
6570: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
6580: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
6590: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
65a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
65b0: 3a 20 49 66 20 74 68 65 20 6d 61 63 68 69 6e 65  : If the machine
65c0: 20 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c   name is unavail
65d0: 61 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 6e  able, there is n
65e0: 6f 74 68 69 6e 67 20 65 6c 73 65 20 77 65 0d 0a  othing else we..
65f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
6600: 6e 20 64 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  n do...      #..
6610: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
6620: 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c   exists ::tcl_pl
6630: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
6640: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6650: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
6660: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6670: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6680: 3a 20 57 68 61 74 20 69 73 20 74 68 65 20 61 72  : What is the ar
6690: 63 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 74  chitecture for t
66a0: 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20  his machine?..  
66b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
66c0: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 6d   architecture [m
66d0: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
66e0: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
66f0: 28 6d 61 63 68 69 6e 65 29 20 74 72 75 65 5d 0d  (machine) true].
6700: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6710: 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69    # NOTE: What i
6720: 73 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 66  s the platform f
6730: 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f  or this machine?
6740: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6750: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d   set platform [m
6760: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
6770: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
6780: 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20  (machine)]....  
6790: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
67a0: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
67b0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
67c0: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
67d0: 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
67e0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
67f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6800: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
6810: 74 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e  te native compon
6820: 65 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a  ents.  If this..
6830: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
6840: 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68  le exists, we sh
6850: 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74  ould have everyt
6860: 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20  hing we need... 
6870: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f       #..      fo
6880: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
6890: 6c 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73  ly [getInteropAs
68a0: 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f  semblyFileNamesO
68b0: 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nly] {..        
68c0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
68d0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
68e0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
68f0: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
6900: 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65     $architecture
6910: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
6920: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
6930: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
6940: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
6950: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6960: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
6970: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
6980: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
6990: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
69a0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
69b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
69c0: 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e  $platform $fileN
69d0: 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20  ameOnly]]....   
69e0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
69f0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
6a00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6a10: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
6a20: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
6a30: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
6a40: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
6a50: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
6a60: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
6a70: 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
6a80: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
6a90: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
6aa0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
6ab0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6ac0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
6ad0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6ae0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
6af0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
6b00: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
6b10: 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  lified file name
6b20: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20   for the SQLite 
6b30: 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  core..      #   
6b40: 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20 49 66      library.  If
6b50: 20 74 68 69 73 20 66 69 6c 65 20 65 78 69 73 74   this file exist
6b60: 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76  s, we should hav
6b70: 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 0d  e everything we.
6b80: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
6b90: 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  eed...      #.. 
6ba0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
6bb0: 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61  eNameOnly [getNa
6bc0: 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
6bd0: 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20  amesOnly] {..   
6be0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
6bf0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
6c00: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
6c10: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
6c20: 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
6c30: 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f  cture $fileNameO
6c40: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
6c50: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
6c60: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
6c70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
6c80: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
6c90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6ca0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
6cb0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
6cc0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
6cd0: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
6ce0: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24       $platform $
6cf0: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a  fileNameOnly]]..
6d00: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
6d10: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
6d20: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
6d30: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6d40: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
6d50: 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  ...        set f
6d60: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
6d70: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
6d80: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
6d90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66  ..            $f
6da0: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
6db0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
6dc0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
6dd0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
6de0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
6df0: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
6e00: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6e10: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6e20: 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61  : One or more na
6e30: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  tive components 
6e40: 6e 65 65 64 65 64 20 62 79 20 53 79 73 74 65 6d  needed by System
6e50: 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
6e60: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
6e70: 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20  missing...      
6e80: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
6e90: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
6ea0: 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65 6c 65  .    proc isRele
6eb0: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b 20 64  aseAvailable { d
6ec0: 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d  irectory {varNam
6ed0: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
6ee0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
6ef0: 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
6f00: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6f10: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
6f20: 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20  ame $varName..  
6f30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
6f40: 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64 41 76  eturn [isBuildAv
6f50: 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69 72 65  ailable "" $dire
6f60: 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d  ctory $varName].
6f70: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
6f80: 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72  roc joinBuildDir
6f90: 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20  ectory { native 
6fa0: 70 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f  path year platfo
6fb0: 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  rm configuration
6fc0: 20 65 78 74 72 61 20 7d 20 7b 0d 0a 20 20 20 20   extra } {..    
6fd0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6fe0: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61 6e  E: Figure out an
6ff0: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  d then return th
7000: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
7010: 64 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  d path to the bu
7020: 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ild..      #    
7030: 20 20 20 64 69 72 65 63 74 6f 72 79 20 62 61 73     directory bas
7040: 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72  ed on all the ar
7050: 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65 64  guments provided
7060: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
7070: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7080: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
7090: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
70a0: 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  urn [file join $
70b0: 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24  path bin $year $
70c0: 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67  platform $config
70d0: 75 72 61 74 69 6f 6e 20 24 65 78 74 72 61 5d 0d  uration $extra].
70e0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
70f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7100: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
7110: 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66   bin $year $conf
7120: 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 20 24 65  iguration bin $e
7130: 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  xtra]..      }..
7140: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7150: 6f 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63  oc getBuildDirec
7160: 74 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e  tory { managedOn
7170: 6c 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  ly } {..      #.
7180: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
7190: 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69 76  ee if the "nativ
71a0: 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
71b0: 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  n has been set. 
71c0: 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d   If so, use the.
71d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
71e0: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
71f0: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
7200: 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65  mbly (a.k.a. the
7210: 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d   native interop.
7220: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
7230: 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e  ssembly).  To en
7240: 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  able this option
7250: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
7260: 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a   line, enter a..
7270: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
7280: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
7290: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
72a0: 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e  owing (all on on
72b0: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
72c0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
72d0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
72e0: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e  -initialize -run
72f0: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
7300: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7310: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
7320: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
7330: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
7340: 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74       To enable t
7350: 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74  his option via t
7360: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
7370: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65  prior to the "be
7380: 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20  ta 16"..      # 
7390: 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66        release of
73a0: 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c   Eagle, the foll
73b0: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75  owing command mu
73c0: 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
73d0: 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ad..      #     
73e0: 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f    (also all on o
73f0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
7400: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
7410: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
7420: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f   -initialize -po
7430: 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20  stInitialize..  
7440: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22 6f      #         "o
7450: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
7460: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
7470: 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74  ve AddRuntimeOpt
7480: 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20  ion native"..   
7490: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
74a0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
74b0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
74c0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
74d0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
74e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
74f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69  ng length $::bui
7510: 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ld_directory] > 
7520: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7530: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7540: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
7550: 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  on of the build 
7560: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7570: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
7580: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7590: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
75a0: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
75b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
75c0: 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f  return $::build_
75d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
75e0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
75f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7600: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
7610: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
7620: 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65  tion is set, the
7630: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
7640: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20  mbly..        # 
7650: 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 74        is being t
7660: 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20  ested.  In that 
7670: 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20 74  case, the path t
7680: 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  o the build dire
7690: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ctory..        #
76a0: 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74         will cont
76b0: 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ain the platform
76c0: 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68   name and all th
76d0: 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  e binaries under
76e0: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
76f0: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
7700: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
7710: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20   directory.  If 
7720: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
7730: 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  time..        # 
7740: 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20        option is 
7750: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75 69  not set, the bui
7760: 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  ld directory wil
7770: 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  l be considered 
7780: 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23  to be..        #
7790: 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d         "platform
77a0: 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20  -neutral", with 
77b0: 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65  the notable exce
77c0: 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74  ption of any nat
77d0: 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ive..        #  
77e0: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65       assembly (e
77f0: 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65  .g. "SQLite.Inte
7800: 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64  rop.dll") copied
7810: 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74 68   there during th
7820: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
7830: 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73     build process
7840: 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65   itself.  If the
7850: 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73   build process s
7860: 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d  omehow does not.
7870: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7880: 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65   copy the native
7890: 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68   assembly for th
78a0: 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73  is platform, mos
78b0: 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a  t of the tests..
78c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
78d0: 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69 6c  in the suite wil
78e0: 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70  l simply be skip
78f0: 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20  ped.  Generally 
7900: 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d  speaking, there.
7910: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7920: 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f   are two ways to
7930: 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72   build the binar
7940: 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72 69  ies when prepari
7950: 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20  ng to run the.. 
7960: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7970: 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20  est suite:..    
7980: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7990: 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20         1. Build 
79a0: 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e  the separate man
79b0: 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20  aged and native 
79c0: 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67  assemblies using
79d0: 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23   some..        #
79e0: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e            comman
79f0: 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a  ds similar to:..
7a00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7a10: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75     #          bu
7a20: 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67  ild.bat ${Config
7a30: 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f  uration}ManagedO
7a40: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
7a50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7a60: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
7a70: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61  Configuration}Na
7a80: 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66  tiveOnly ${Platf
7a90: 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d  orm}..        #.
7aa0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7ab0: 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66      Where ${Conf
7ac0: 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69  iguration} is ei
7ad0: 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20  ther "Debug" or 
7ae0: 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20  "Release" and.. 
7af0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
7b00: 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73    ${Platform} is
7b10: 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20   either "Win32" 
7b20: 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20  or "x64"...     
7b30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7b40: 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74        2. Build t
7b50: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
7b60: 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63  sembly using a c
7b70: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
7b80: 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o:..        #.. 
7b90: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
7ba0: 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f    build.bat ${Co
7bb0: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50  nfiguration} ${P
7bc0: 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20  latform}..      
7bd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
7be0: 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24 7b          Where ${
7bf0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69  Configuration} i
7c00: 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  s either "Debug"
7c10: 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e   or "Release" an
7c20: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
7c30: 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d        ${Platform
7c40: 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69 6e  } is either "Win
7c50: 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49  32" or "x64".  I
7c60: 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  f this command i
7c70: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
7c80: 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72 69        used, vari
7c90: 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20 72  ous tests that r
7ca0: 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e  equire supplemen
7cb0: 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20  tary managed..  
7cc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
7cd0: 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67   assemblies (e.g
7ce0: 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73  . LINQ) may be s
7cf0: 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68  kipped unless th
7d00: 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20  ose binaries..  
7d10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
7d20: 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c   are subsequentl
7d30: 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  y copied into th
7d40: 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63 74  e correct direct
7d50: 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20  ory (i.e. by..  
7d60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
7d70: 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29   "test_all.bat")
7d80: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7d90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f        #       No
7da0: 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74  te that all of t
7db0: 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64  he build command
7dc0: 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66  s above will def
7dd0: 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20  ault to using.. 
7de0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7df0: 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
7e00: 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61  n of MSBuild ava
7e10: 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22  ilable and the "
7e20: 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a  test_year" may..
7e30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7e40: 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73  need to be adjus
7e50: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ted accordingly 
7e60: 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20  to actually run 
7e70: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
7e80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7e90: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f   Refer to the co
7ea0: 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75  mments in [getBu
7eb0: 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72  ildYear] for mor
7ec0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
7ed0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7ee0: 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69    how to set thi
7ef0: 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20  s variable...   
7f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7f10: 73 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70 72  set native [expr
7f20: 20 7b 21 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20   {!$managedOnly 
7f30: 26 26 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  && [hasRuntimeOp
7f40: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 5d 0d 0a  tion native]}]..
7f50: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7f60: 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63   [joinBuildDirec
7f70: 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65  tory $native [ge
7f80: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
7f90: 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
7fa0: 20 20 20 20 5b 65 78 70 72 20 7b 24 6d 61 6e 61      [expr {$mana
7fb0: 67 65 64 4f 6e 6c 79 20 3f 20 5b 67 65 74 42 75  gedOnly ? [getBu
7fc0: 69 6c 64 59 65 61 72 5d 20 3a 20 5b 67 65 74 42  ildYear] : [getB
7fd0: 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72 5d 7d  uildNativeYear]}
7fe0: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
7ff0: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
8000: 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74  rm $native] [get
8010: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
8020: 6f 6e 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  on] \..         
8030: 20 20 20 5b 65 78 70 72 20 7b 24 6d 61 6e 61 67     [expr {$manag
8040: 65 64 4f 6e 6c 79 20 3f 20 5b 67 65 74 42 75 69  edOnly ? [getBui
8050: 6c 64 45 78 74 72 61 5d 20 3a 20 22 22 7d 5d 5d  ldExtra] : ""}]]
8060: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8070: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
8080: 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 20  tReleaseVersion 
8090: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
80a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
80b0: 75 72 65 20 6f 75 74 20 74 68 65 20 72 65 6c 65  ure out the rele
80c0: 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  ase version for 
80d0: 75 73 65 20 77 69 74 68 20 74 68 65 20 62 75 69  use with the bui
80e0: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
80f0: 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65 6e      #       when
8100: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 76   checking for av
8110: 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73 65 73  ailable releases
8120: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8130: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
8140: 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  ts ::release_ver
8150: 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20  sion] && \..    
8160: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
8170: 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f  ngth $::release_
8180: 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  version] > 0} th
8190: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
81a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
81b0: 20 54 68 65 20 72 65 6c 65 61 73 65 20 76 65 72   The release ver
81c0: 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  sion has been ov
81d0: 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72 65 66  erridden; theref
81e0: 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20 20 20  ore, use it..   
81f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72       #       ver
8200: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
8210: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
8220: 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  n $::release_ver
8230: 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  sion..      } el
8240: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
8250: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8260: 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65 72 73   No release vers
8270: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
8280: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  , return an empt
8290: 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  y string...     
82a0: 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69 73     #       It is
82b0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65   important to re
82c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
82d0: 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75 73  ring here becaus
82e0: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
82f0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66         result of
8300: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
8310: 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68  may be used with
8320: 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20   [file join]... 
8330: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8340: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
8350: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8360: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
8370: 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  dFileName { file
8380: 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79  Name managedOnly
8390: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
83a0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
83b0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
83c0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
83d0: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66   file name as if
83e0: 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64   it were located
83f0: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
8400: 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69 72         build dir
8410: 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69  ectory, discardi
8420: 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79  ng any directory
8430: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65   information pre
8440: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
8450: 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20      in the file 
8460: 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64  name as provided
8470: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
8480: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8490: 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c 65  set result [file
84a0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
84b0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
84c0: 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72  oin [getBuildDir
84d0: 65 63 74 6f 72 79 20 24 6d 61 6e 61 67 65 64 4f  ectory $managedO
84e0: 6e 6c 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5c  nly] $platform \
84f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
8500: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
8510: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ]]]....      #..
8520: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68        # HACK: Wh
8530: 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f  en running on Wo
8540: 57 36 34 2c 20 61 73 73 75 6d 65 20 74 68 65 20  W64, assume the 
8550: 74 65 73 74 20 65 78 65 63 75 74 61 62 6c 65 73  test executables
8560: 20 61 72 65 20 70 72 65 73 65 6e 74 0d 0a 20 20   are present..  
8570: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68      #       with
8580: 20 74 68 65 20 22 33 32 22 20 73 75 66 66 69 78   the "32" suffix
8590: 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20   on them...     
85a0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
85b0: 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26  sRunningWoW64] &
85c0: 26 20 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f  & [file extensio
85d0: 6e 20 24 72 65 73 75 6c 74 5d 20 65 71 20 22 2e  n $result] eq ".
85e0: 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  exe"} then {..  
85f0: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
8600: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
8610: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73  le rootname $res
8620: 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20  ult] 32.exe]..  
8630: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
8640: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
8650: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8660: 63 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72  c getExternalDir
8670: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
8680: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8690: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
86a0: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
86b0: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
86c0: 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61  he external bina
86d0: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
86e0: 20 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63 61    files are loca
86f0: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
8700: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
8710: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
8720: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8730: 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
8740: 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  rname [file dirn
8750: 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79  ame [info binary
8760: 5d 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ]]]]]..    }....
8770: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e  .    proc getBin
8780: 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aryDirectory {} 
8790: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
87a0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
87b0: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
87c0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
87d0: 68 65 72 65 20 74 68 65 20 74 65 73 74 20 61 70  here the test ap
87e0: 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20  plication..     
87f0: 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 20   #       itself 
8800: 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65 20  (i.e. the Eagle 
8810: 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65  shell) is locate
8820: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
8830: 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20 20   used as..      
8840: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 73 74  #       the dest
8850: 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ination for the 
8860: 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44 61  copied System.Da
8870: 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ta.SQLite native
8880: 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
8890: 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
88a0: 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65 63  mblies (i.e. bec
88b0: 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e 65  ause this is one
88c0: 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61 63   of the few plac
88d0: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
88e0: 20 20 77 68 65 72 65 20 74 68 65 20 43 4c 52 20    where the CLR 
88f0: 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66 69  will actually fi
8900: 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d  nd and load them
8910: 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20   properly)...   
8920: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8930: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
8940: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
8950: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8960: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8970: 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74  $::binary_direct
8980: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
8990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
89a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
89b0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
89c0: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
89d0: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
89e0: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
89f0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
8a00: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
8a10: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
8a20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8a30: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
8a40: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
8a50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
8a60: 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d  rn [info binary]
8a70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8a80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
8a90: 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  tExternalFileNam
8aa0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
8ab0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8ac0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
8ad0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
8ae0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
8af0: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
8b00: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
8b10: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
8b20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
8b30: 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e  ternal binaries.
8b40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8b50: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
8b60: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
8b70: 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61 6c  oin [getExternal
8b80: 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65  Directory] $file
8b90: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  Name]]..    }...
8ba0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69  ..    proc getBi
8bb0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66  naryFileName { f
8bc0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
8bd0: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
8be0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8bf0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
8c00: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
8c10: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
8c20: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
8c30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
8c40: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c 20  nary directory, 
8c50: 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64  discarding any d
8c60: 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61  irectory informa
8c70: 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20  tion present..  
8c80: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74      #       in t
8c90: 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  he file name as 
8ca0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
8cb0: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
8cc0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
8cd0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
8ce0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
8cf0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
8d00: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
8d10: 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69  atform [file tai
8d20: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
8d30: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8d40: 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79  oc getCoreBinary
8d50: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74  FileName { {plat
8d60: 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61  form ""} {standa
8d70: 72 64 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rd ""} } {..    
8d80: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8d90: 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 66  E: Returns the f
8da0: 75 6c 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65  ull path for the
8db0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
8dc0: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
8dd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8de0: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 63  native library c
8df0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ode for this pla
8e00: 74 66 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63  tform.  First, c
8e10: 68 65 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d  heck and see if.
8e20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
8e30: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
8e40: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
8e50: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
8e60: 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20  oaded.  Next,.. 
8e70: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 61 6c       #       fal
8e80: 6c 62 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68  lback to what th
8e90: 65 20 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75  e full path shou
8ea0: 6c 64 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20  ld be, based on 
8eb0: 77 68 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20  whether the..   
8ec0: 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64     #       mixed
8ed0: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69  -mode assembly i
8ee0: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64  s being used and
8ef0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8f00: 20 63 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20   current..      
8f10: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
8f20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8f30: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
8f40: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
8f50: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
8f60: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
8f70: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
8f80: 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
8f90: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5f 53  NativeMethods _S
8fa0: 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c  QLiteNativeModul
8fb0: 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  eFileName..     
8fc0: 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20   } fileName] == 
8fd0: 30 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  0 && [string len
8fe0: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
8ff0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
9000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9010: 20 4e 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74   NOTE: The SQLit
9020: 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69  e core native li
9030: 62 72 61 72 79 20 68 61 73 20 61 6c 72 65 61 64  brary has alread
9040: 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69  y been loaded vi
9050: 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  a..        #    
9060: 20 20 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69     the native li
9070: 62 72 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72  brary pre-loader
9080: 2e 20 20 52 65 74 75 72 6e 20 74 68 61 74 20 66  .  Return that f
9090: 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20  ile name now... 
90a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
90b0: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
90c0: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
90d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
90e0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
90f0: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
9100: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65  tion has been se
9110: 74 2c 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  t, always return
9120: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
9130: 20 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f      file name fo
9140: 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  r the mixed-mode
9150: 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
9160: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
9170: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
9180: 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b   native]} then {
9190: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
91a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
91b0: 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  urn the mixed-mo
91c0: 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  de assembly file
91d0: 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
91e0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
91f0: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
9200: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
9210: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
9220: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
9230: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79 73 74  ] $platform Syst
9240: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
9250: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ll]]..      }...
9260: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9270: 23 20 4e 4f 54 45 3a 20 41 72 65 20 77 65 20 61  # NOTE: Are we a
9280: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 75 74  ttempting to aut
9290: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63  omatically detec
92a0: 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  t whether or not
92b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
92c0: 20 20 20 20 69 6e 74 65 72 6f 70 20 61 73 73 65      interop asse
92d0: 6d 62 6c 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mbly should be u
92e0: 73 65 64 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sed?..      #.. 
92f0: 20 20 20 20 20 73 65 74 20 61 75 74 6f 6d 61 74       set automat
9300: 69 63 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  ic [expr {[strin
9310: 67 20 6c 65 6e 67 74 68 20 24 73 74 61 6e 64 61  g length $standa
9320: 72 64 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d 0a 20 20  rd] == 0}]....  
9330: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9340: 4f 54 45 3a 20 46 69 72 73 74 2c 20 69 6e 20 65  OTE: First, in e
9350: 69 74 68 65 72 20 22 61 75 74 6f 6d 61 74 69 63  ither "automatic
9360: 22 20 6f 72 20 22 6e 6f 6e 2d 73 74 61 6e 64 61  " or "non-standa
9370: 72 64 22 20 6d 6f 64 65 73 2c 20 61 74 74 65 6d  rd" modes, attem
9380: 70 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  pt..      #     
9390: 20 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 61    to find the na
93a0: 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f  tive-only intero
93b0: 70 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  p assembly...   
93c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
93d0: 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c 20 21 24  $automatic || !$
93e0: 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b  standard} then {
93f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
9410: 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
9420: 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  e the native-onl
9430: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
9440: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
9450: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 66 6f   #       name fo
9460: 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 20  r this platform 
9470: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
9480: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
9490: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
94a0: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
94b0: 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
94c0: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
94d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
94e0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
94f0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
9500: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
9510: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
9520: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
9530: 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  form $fileNameOn
9540: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
9550: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
9560: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
9570: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9580: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
9590: 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
95a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
95b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
95c0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
95d0: 68 65 6e 2c 20 69 6e 20 65 69 74 68 65 72 20 22  hen, in either "
95e0: 61 75 74 6f 6d 61 74 69 63 22 20 6f 72 20 22 73  automatic" or "s
95f0: 74 61 6e 64 61 72 64 22 20 6d 6f 64 65 73 2c 20  tandard" modes, 
9600: 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20 20 20 20  attempt to..    
9610: 20 20 23 20 20 20 20 20 20 20 66 69 6e 64 20 74    #       find t
9620: 68 65 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69  he standard SQLi
9630: 74 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20  te library...   
9640: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
9650: 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c 20 24 73  $automatic || $s
9660: 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d  tandard} then {.
9670: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9680: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
9690: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
96a0: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
96b0: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
96c0: 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20   library..      
96d0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e    #       file n
96e0: 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ame for this pla
96f0: 74 66 6f 72 6d 20 61 6e 64 20 74 68 65 6e 20 72  tform and then r
9700: 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20  eturn it...     
9710: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
9720: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
9730: 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  ly [getNativeLib
9740: 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
9750: 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
9760: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
9770: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
9780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
9790: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
97a0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
97b0: 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61  platform $fileNa
97c0: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
97d0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
97e0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
97f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
9800: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
9810: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
9820: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
9830: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9840: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9850: 45 3a 20 57 61 73 20 74 68 65 20 6d 61 6e 61 67  E: Was the manag
9860: 65 64 20 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70  ed assembly comp
9870: 69 6c 65 64 20 65 78 70 65 63 74 69 6e 67 20 74  iled expecting t
9880: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 0d  o deal with the.
9890: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
98a0: 74 61 6e 64 61 72 64 20 63 6f 72 65 20 6c 69 62  tandard core lib
98b0: 72 61 72 79 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rary?..      #..
98c0: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
98d0: 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
98e0: 61 6e 74 20 53 51 4c 49 54 45 5f 53 54 41 4e 44  ant SQLITE_STAND
98f0: 41 52 44 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ARD]} then {..  
9900: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9910: 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63   # NOTE: Fallbac
9920: 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 20 74  k to returning t
9930: 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73  he native-only s
9940: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
9950: 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
9960: 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d  #       file nam
9970: 65 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  e for the platfo
9980: 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm...        #..
9990: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
99a0: 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65 74 4e 61  NamesOnly [getNa
99b0: 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
99c0: 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a 20 20 20  amesOnly]....   
99d0: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
99e0: 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  h $fileNamesOnly
99f0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9a00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9a10: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   ""..        }..
9a20: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9a30: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
9a40: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
9a60: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
9a70: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c 69 6e 64   $platform [lind
9a80: 65 78 20 24 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  ex $fileNamesOnl
9a90: 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  y 0]]]..      } 
9aa0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
9ab0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
9ac0: 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72  E: Fallback to r
9ad0: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61 74  eturning the nat
9ae0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
9af0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 0d 0a   assembly file..
9b00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9b10: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70 6c 61  name for the pla
9b20: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20  tform...        
9b30: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
9b40: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65  ileNamesOnly [ge
9b50: 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
9b60: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a  FileNamesOnly]..
9b70: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
9b80: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
9b90: 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65  sOnly] == 0} the
9ba0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  n {..          r
9bb0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
9bc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
9bd0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
9be0: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
9bf0: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
9c00: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
9c10: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
9c20: 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d  [lindex $fileNam
9c30: 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20  esOnly 0]]]..   
9c40: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9c50: 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d      proc getComm
9c60: 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  onDirectory {} {
9c70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9c80: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
9c90: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
9ca0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
9cb0: 65 72 65 20 74 68 65 20 74 65 73 74 20 73 63 72  ere the test scr
9cc0: 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ipts..      #   
9cd0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
9ce0: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
9cf0: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 72 65  lt, this just re
9d00: 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c 65 0d  turns the Eagle.
9d10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
9d20: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  inary directory.
9d30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9d40: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
9d50: 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  s ::common_direc
9d60: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
9d70: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
9d80: 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  ngth $::common_d
9d90: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
9da0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
9db0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9dc0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
9dd0: 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72  f the common dir
9de0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
9df0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
9e00: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
9e10: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
9e20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9e30: 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  urn $::common_di
9e40: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
9e50: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
9e60: 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64  xists ::vendor_d
9e70: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
9e80: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
9e90: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64  g length $::vend
9ea0: 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  or_directory] > 
9eb0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9ec0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9ed0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
9ee0: 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64 6f 72  on of the vendor
9ef0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
9f00: 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20  een set;..      
9f10: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
9f20: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
9f30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9f40: 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f   return $::vendo
9f50: 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  r_directory..   
9f60: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
9f70: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
9f80: 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20  library] && \.. 
9f90: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
9fa0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c   length $::tcl_l
9fb0: 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26 20 5c  ibrary] > 0 && \
9fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
9fd0: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a  e isdirectory $:
9fe0: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74  :tcl_library]} t
9ff0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
a000: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a010: 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 77  : The variable w
a020: 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ith the location
a030: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 6c   of the script l
a040: 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20 20 20  ibrary is..     
a050: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 20 61     #       set a
a060: 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  nd appears to be
a070: 20 61 20 72 65 61 6c 20 64 69 72 65 63 74 6f 72   a real director
a080: 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65  y (i.e. not embe
a090: 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  dded..        # 
a0a0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 61 20 66        within a f
a0b0: 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72 65 2c  ile); therefore,
a0c0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
a0d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
a0e0: 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  urn $::tcl_libra
a0f0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
a100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a110: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
a120: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 64  allback to the d
a130: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
a140: 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 61 62  ing the executab
a150: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
a160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
a170: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
a180: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
a190: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
a1a0: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b  abaseDirectory {
a1b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
a1c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
a1d0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
a1e0: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
a1f0: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
a200: 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20  databases..     
a210: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
a220: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
a230: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
a240: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
a250: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
a260: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
a270: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
a280: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
a290: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
a2a0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
a2b0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
a2c0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
a2d0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
a2e0: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
a2f0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
a300: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
a310: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a320: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
a330: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
a340: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
a350: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
a360: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a370: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
a380: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a390: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
a3a0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
a3b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
a3c0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
a3d0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
a3e0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
a3f0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
a400: 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  th $::scratch_di
a410: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
a420: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
a430: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
a440: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
a450: 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72   the scratch dir
a460: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
a470: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
a480: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
a490: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
a4a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a4b0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63      return $::sc
a4c0: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d  ratch_directory.
a4d0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
a4e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a4f0: 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74  [getTemporaryPat
a500: 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  h]..      }..   
a510: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a520: 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
a530: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
a540: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a550: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
a560: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
a570: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
a580: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
a590: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
a5a0: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
a5b0: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
a5c0: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
a5d0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
a5e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
a5f0: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
a600: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
a610: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
a620: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
a630: 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  sts ::temporary_
a640: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
a650: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
a660: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d  ng length $::tem
a670: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
a680: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
a690: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a6a0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
a6b0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  cation of the te
a6c0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
a6d0: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
a6e0: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
a6f0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
a700: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
a710: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
a720: 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61  eturn $::tempora
a730: 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ry_directory..  
a740: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
a750: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
a760: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
a770: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
a780: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a790: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
a7a0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
a7b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a7c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
a7d0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
a7e0: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
a7f0: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
a800: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
a810: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
a820: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
a830: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a840: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
a850: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
a860: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a870: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
a880: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
a890: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
a8a0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45  ...    proc getE
a8b0: 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 7b 7d  xecuteOnSetup {}
a8c0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
a8d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 78 65  nfo exists ::exe
a8e0: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 26  cute_on_setup] &
a8f0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
a900: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
a910: 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75  :execute_on_setu
a920: 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  p] > 0} then {..
a930: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a940: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
a950: 6e 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  n the configured
a960: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
a970: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
a980: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
a990: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
a9a0: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
a9b0: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
a9c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
a9d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a9e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
a9f0: 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70  execute_on_setup
aa00: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
aa10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
aa20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20       # NOTE: By 
aa30: 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69  default, there i
aa40: 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65 78 65 63  s no SQL to exec
aa50: 75 74 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ute during the c
aa60: 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20  onnection..     
aa70: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70     #       setup
aa80: 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e   procedure (i.e.
aa90: 20 66 6f 72 20 65 76 65 72 79 20 74 65 73 74 20   for every test 
aaa0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
aab0: 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  ion)...        #
aac0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
aad0: 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20   ""..      }..  
aae0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
aaf0: 20 67 65 74 53 74 72 69 6e 67 4d 61 70 46 6f 72   getStringMapFor
ab00: 54 63 6c 45 73 63 61 70 65 20 7b 7d 20 7b 0d 0a  TclEscape {} {..
ab10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
ab20: 73 74 20 5c 5c 20 5c 5c 5c 5c 20 5c 5b 20 5c 5c  st \\ \\\\ \[ \\
ab30: 5c 5b 20 5c 5d 20 5c 5c 5c 5d 20 5c 24 20 5c 5c  \[ \] \\\] \$ \\
ab40: 5c 24 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  \$]..    }..... 
ab50: 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f     proc getTestO
ab60: 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65  verridesPreamble
ab70: 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65   { {extraVarName
ab80: 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  s ""} } {..     
ab90: 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c   set varNames [l
aba0: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ist]....      #.
abb0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
abc0: 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61  f available, sta
abd0: 72 74 20 77 69 74 68 20 74 68 65 20 6d 61 73 74  rt with the mast
abe0: 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  er list of test 
abf0: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
ac00: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
ac10: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
ac20: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
ac30: 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72  sts ::test_overr
ac40: 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ides] && \..    
ac50: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
ac60: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
ac70: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
ac80: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
ac90: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a  end varNames $::
aca0: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a  test_overrides..
acb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
acc0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
acd0: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
ace0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64  y our caller, ad
acf0: 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  d any additional
ad00: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
ad10: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74   #       names t
ad20: 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20  o copy now...   
ad30: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
ad40: 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56  [llength $extraV
ad50: 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68  arNames] > 0} th
ad60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
ad70: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
ad80: 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d  mes $extraVarNam
ad90: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
ada0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
adb0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
adc0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
add0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
ade0: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63  y processing eac
adf0: 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  h..      #      
ae00: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61   variable name a
ae10: 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65  nd adding the ne
ae20: 63 65 63 65 73 73 61 72 79 20 73 63 72 69 70 74  cecessary script
ae30: 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a   fragments for..
ae40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61        #       ea
ae50: 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23  ch one...      #
ae60: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
ae70: 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66  lt ""....      f
ae80: 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24  oreach varName $
ae90: 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  varNames {..    
aea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
aeb0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
aec0: 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61   qualified globa
aed0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e  l variable name.
aee0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
aef0: 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72       set fullVar
af00: 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
af10: 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d   :: $varName]...
af20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
af30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
af40: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 65 78   the variable ex
af50: 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ist in this inte
af60: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f  rpreter context?
af70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
af80: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
af90: 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61  xists $fullVarNa
afa0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
afb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
afc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65      # NOTE: Appe
afd0: 6e 64 20 61 20 73 63 72 69 70 74 20 66 72 61 67  nd a script frag
afe0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ment to the resu
aff0: 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72  lt that will cor
b000: 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20  rectly..        
b010: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 61    #       copy a
b020: 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ny contained val
b030: 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e  ue to another in
b040: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
b050: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
b060: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
b070: 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74  d result \n "set
b080: 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20   " $fullVarName 
b090: 22 20 5c 7b 22 20 5b 73 74 72 69 6e 67 20 6d 61  " \{" [string ma
b0a0: 70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  p \..           
b0b0: 20 20 20 5b 67 65 74 53 74 72 69 6e 67 4d 61 70     [getStringMap
b0c0: 46 6f 72 54 63 6c 45 73 63 61 70 65 5d 20 5b 73  ForTclEscape] [s
b0d0: 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  et $fullVarName]
b0e0: 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ] \}..        }.
b0f0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b100: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
b110: 45 3a 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  E: If the result
b120: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
b130: 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66 72 61   more script fra
b140: 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64 20 61  gments, append a
b150: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b160: 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20  newline...      
b170: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
b180: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73  ring length $res
b190: 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ult] > 0} then {
b1a0: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
b1b0: 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20 20   result \n..    
b1c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
b1d0: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
b1e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b1f0: 6d 6f 76 65 53 79 73 74 65 6d 44 61 74 61 53 51  moveSystemDataSQ
b200: 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67 20 7b 20  LiteDllConfig { 
b210: 7b 72 65 73 74 6f 72 65 20 66 61 6c 73 65 7d 20  {restore false} 
b220: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
b230: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69   {..      set di
b240: 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e 61  rectory [getBina
b250: 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a  ryDirectory]....
b260: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b270: 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74  g length $direct
b280: 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
b290: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
b2a0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
b2b0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
b2c0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b2d0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b2f0: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69  --- skipped movi
b300: 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  ng \"System.Data
b310: 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66  .SQLite.dll.conf
b320: 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20  ig\", " \..     
b330: 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e           "no bin
b340: 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  ary directory\n"
b350: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
b360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
b370: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b380: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31 29   set fileName(1)
b390: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
b3a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
b3b0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
b3c0: 6f 72 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ory System.Data.
b3d0: 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
b3e0: 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  g]]....      set
b3f0: 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 61 70   fileName(2) [ap
b400: 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61  pendArgs $fileNa
b410: 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d  me(1) .moved]...
b420: 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 74  .      if {$rest
b430: 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ore} then {..   
b440: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b450: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28  xists $fileName(
b460: 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  2)]} then {..   
b470: 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61         file rena
b480: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20  me $fileName(2) 
b490: 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a  $fileName(1)....
b4a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
b4b0: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b4d0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b4e0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b500: 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22   "---- moved \""
b510: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 22 5c   $fileName(2) "\
b520: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
b530: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
b540: 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a  eName(1) \"\n]..
b550: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b560: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b570: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
b580: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b590: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
b5a0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b5b0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
b5e0: 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61  ving \"" $fileNa
b5f0: 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20 20 20 20  me(2) \..       
b600: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b610: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b620: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
b630: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b640: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b650: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
b660: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28  xists $fileName(
b670: 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  1)]} then {..   
b680: 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61         file rena
b690: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20  me $fileName(1) 
b6a0: 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a  $fileName(2)....
b6b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
b6c0: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b6e0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
b6f0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
b700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b710: 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22   "---- moved \""
b720: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 22 5c   $fileName(1) "\
b730: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
b740: 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
b750: 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a  eName(2) \"\n]..
b760: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
b770: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b780: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
b790: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
b7b0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b7c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
b7f0: 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61  ving \"" $fileNa
b800: 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20 20 20 20  me(1) \..       
b810: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b820: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b830: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
b840: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b850: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b860: 20 20 20 20 70 72 6f 63 20 77 72 69 74 65 53 79      proc writeSy
b870: 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
b880: 6c 43 6f 6e 66 69 67 20 7b 20 64 61 74 61 20 7b  lConfig { data {
b890: 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20  verbose true} } 
b8a0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64 69 72  {..      set dir
b8b0: 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e 61 72  ectory [getBinar
b8c0: 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  yDirectory].... 
b8d0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
b8e0: 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74 6f   length $directo
b8f0: 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
b900: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
b910: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
b920: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b930: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
b940: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
b960: 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e  -- skipped movin
b970: 67 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  g \"System.Data.
b980: 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
b990: 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20  g\", " \..      
b9a0: 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61          "no bina
b9b0: 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d  ry directory\n"]
b9c0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
b9d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
b9e0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b9f0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
ba00: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a  le normalize \..
ba10: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
ba20: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
ba30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ba40: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 5d 0d  te.dll.config]].
ba50: 0a 0d 0a 20 20 20 20 20 20 77 72 69 74 65 46 69  ...      writeFi
ba60: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 64 61  le $fileName $da
ba70: 74 61 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ta....      if {
ba80: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
ba90: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
baa0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
bab0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
bac0: 2d 2d 2d 2d 20 77 72 6f 74 65 20 5c 22 53 79 73  ---- wrote \"Sys
bad0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
bae0: 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 5c 6e 22 0d  dll.config\"\n".
baf0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bb00: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
bb10: 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  me..    }.....  
bb20: 20 20 70 72 6f 63 20 6d 6f 76 65 45 61 67 6c 65    proc moveEagle
bb30: 53 68 65 6c 6c 4d 64 61 43 6f 6e 66 69 67 20 7b  ShellMdaConfig {
bb40: 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73 65 7d   {restore false}
bb50: 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20   {verbose true} 
bb60: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 64  } {..      set d
bb70: 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69 6e  irectory [getBin
bb80: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d  aryDirectory]...
bb90: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
bba0: 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63  ng length $direc
bbb0: 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tory] == 0} then
bbc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
bbd0: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
bbe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
bbf0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
bc00: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
bc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
bc20: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76  ---- skipped mov
bc30: 69 6e 67 20 5c 22 45 61 67 6c 65 53 68 65 6c 6c  ing \"EagleShell
bc40: 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5c  .exe.mda.config\
bc50: 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  ", " \..        
bc60: 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61 72 79        "no binary
bc70: 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a   directory\n"]..
bc80: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
bc90: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
bca0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
bcb0: 74 20 66 69 6c 65 4e 61 6d 65 28 31 29 20 5b 66  t fileName(1) [f
bcc0: 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d  ile normalize \.
bcd0: 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
bce0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
bcf0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
bd00: 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a  mda.config]]....
bd10: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
bd20: 6d 65 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67  me(2) [appendArg
bd30: 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e  s $fileName(1) .
bd40: 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20  moved]....      
bd50: 69 66 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68  if {$restore} th
bd60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
bd70: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
bd80: 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68  fileName(2)]} th
bd90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
bda0: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
bdb0: 65 4e 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61  eName(2) $fileNa
bdc0: 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(1)....       
bdd0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
bde0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bdf0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
be00: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
be10: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
be20: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
be30: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
be40: 61 6d 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22  ame(2) "\" to \"
be50: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
be60: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31       $fileName(1
be70: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
be80: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
be90: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
bea0: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
beb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bec0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
bed0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
bee0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
bef0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
bf00: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
bf10: 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c  " $fileName(2) \
bf20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf30: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
bf40: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
bf50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
bf60: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
bf70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  se {..        if
bf80: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
bf90: 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68  fileName(1)]} th
bfa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
bfb0: 66 69 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c  file rename $fil
bfc0: 65 4e 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61  eName(1) $fileNa
bfd0: 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20  me(2)....       
bfe0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
bff0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c000: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c010: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
c020: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c030: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c040: 6d 6f 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e  moved \"" $fileN
c050: 61 6d 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22  ame(1) "\" to \"
c060: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
c070: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32       $fileName(2
c080: 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ) \"\n]..       
c090: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
c0a0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c0b0: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
c0c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c0d0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c0e0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c0f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c100: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
c110: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
c120: 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c  " $fileName(1) \
c130: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c140: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
c150: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
c160: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
c170: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
c180: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c190: 63 20 77 72 69 74 65 45 61 67 6c 65 53 68 65 6c  c writeEagleShel
c1a0: 6c 4d 64 61 43 6f 6e 66 69 67 20 7b 20 64 61 74  lMdaConfig { dat
c1b0: 61 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  a {verbose true}
c1c0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
c1d0: 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69  directory [getBi
c1e0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a  naryDirectory]..
c1f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
c200: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
c210: 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  ctory] == 0} the
c220: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
c230: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c240: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
c250: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c260: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c270: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c280: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
c290: 76 69 6e 67 20 5c 22 45 61 67 6c 65 53 68 65 6c  ving \"EagleShel
c2a0: 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
c2b0: 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  \", " \..       
c2c0: 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e 61 72         "no binar
c2d0: 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 5d 0d  y directory\n"].
c2e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
c2f0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
c300: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
c310: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
c320: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20  e normalize \.. 
c330: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
c340: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 45  oin $directory E
c350: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64  agleShell.exe.md
c360: 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  a.config]]....  
c370: 20 20 20 20 77 72 69 74 65 46 69 6c 65 20 24 66      writeFile $f
c380: 69 6c 65 4e 61 6d 65 20 24 64 61 74 61 0d 0a 0d  ileName $data...
c390: 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62  .      if {$verb
c3a0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
c3b0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
c3c0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
c3d0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c3e0: 77 72 6f 74 65 20 5c 22 45 61 67 6c 65 53 68 65  wrote \"EagleShe
c3f0: 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
c400: 67 5c 22 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  g\"\n"..      }.
c410: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
c420: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 7d  $fileName..    }
c430: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
c440: 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62  tAppDomainPreamb
c450: 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22 22 7d  le { {prefix ""}
c460: 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d 20 7b   {suffix ""} } {
c470: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c480: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
c490: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
c4a0: 61 20 74 65 73 74 20 73 65 74 75 70 20 73 63 72  a test setup scr
c4b0: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73 75 69  ipt fragment sui
c4c0: 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20  table for..     
c4d0: 20 23 20 20 20 20 20 20 20 65 76 61 6c 75 61 74   #       evaluat
c4e0: 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65 72 70  ion by an interp
c4f0: 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e  reter created in
c500: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70   an isolated app
c510: 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  lication..      
c520: 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20  #       domain. 
c530: 20 54 68 65 20 73 63 72 69 70 74 20 66 72 61 67   The script frag
c540: 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72  ment being retur
c550: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 72 72  ned will be surr
c560: 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ounded by..     
c570: 20 23 20 20 20 20 20 20 20 74 68 65 20 70 72 65   #       the pre
c580: 66 69 78 20 61 6e 64 20 73 75 66 66 69 78 20 22  fix and suffix "
c590: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
c5a0: 22 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f  " specified by o
c5b0: 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20  ur caller,..    
c5c0: 20 20 23 20 20 20 20 20 20 20 69 66 20 61 6e 79    #       if any
c5d0: 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 73 63  .  The entire sc
c5e0: 72 69 70 74 20 62 65 69 6e 67 20 72 65 74 75 72  ript being retur
c5f0: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73  ned will be subs
c600: 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20 20 20  tituted via..   
c610: 20 20 20 23 20 20 20 20 20 20 20 5b 73 75 62 73     #       [subs
c620: 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  t], in the conte
c630: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
c640: 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  , before being r
c650: 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20  eturned...      
c660: 23 20 20 20 20 20 20 20 54 68 69 73 20 73 74 65  #       This ste
c670: 70 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  p is necessary s
c680: 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69  o that some limi
c690: 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f  ted context info
c6a0: 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  rmation,..      
c6b0: 23 20 20 20 20 20 20 20 70 72 69 6d 61 72 69 6c  #       primaril
c6c0: 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
c6d0: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
c6e0: 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74 72 61  ries, can be tra
c6f0: 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20 20 20  nsferred..      
c700: 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  #       to the i
c710: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 74 68  nterpreter in th
c720: 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  e isolated appli
c730: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d  cation domain, m
c740: 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20 20 20  aking it..      
c750: 23 20 20 20 20 20 20 20 61 62 6c 65 20 74 6f 20  #       able to 
c760: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e  successfully run
c770: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
c780: 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ire one or more 
c790: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
c7a0: 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e 20 6f        files in o
c7b0: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 69 6e  ne of the testin
c7c0: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20  g directories.  
c7d0: 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b  Callers should k
c7e0: 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20 23 20  eep in..      # 
c7f0: 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61 74 20        mind that 
c800: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 20  the test script 
c810: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
c820: 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72  eturned cannot r
c830: 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ely on..      # 
c840: 20 20 20 20 20 20 61 6e 79 20 73 63 72 69 70 74        any script
c850: 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75   library procedu
c860: 72 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  res that are not
c870: 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
c880: 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20   Eagle..      # 
c890: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 70 61        library pa
c8a0: 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69 6e 69  ckage (i.e. "ini
c8b0: 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75  t.eagle"), inclu
c8c0: 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f 76 69  ding those provi
c8d0: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
c8e0: 20 20 20 20 20 20 74 68 65 20 45 61 67 6c 65 20        the Eagle 
c8f0: 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20 75 6e  test package, un
c900: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 63 6f  less the file co
c910: 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20 69 73  ntaining them is
c920: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
c930: 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20         manually 
c940: 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d  via some other m
c950: 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62  echanism (e.g. b
c960: 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70 70 72  y including appr
c970: 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20 23  opriate..      #
c980: 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67 65 20         [package 
c990: 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75  require] or [sou
c9a0: 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e  rce] commands in
c9b0: 20 74 68 65 20 70 72 65 66 69 78 20 6f 72 20 73   the prefix or s
c9c0: 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23 20 20  uffix..      #  
c9d0: 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67       script frag
c9e0: 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61  ments).  Also, a
c9f0: 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65 66 65  ll variable refe
ca00: 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e  rences and all n
ca10: 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  ested..      #  
ca20: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69       commands (i
ca30: 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73 71 75  .e. those in squ
ca40: 61 72 65 20 62 72 61 63 6b 65 74 73 29 20 63 6f  are brackets) co
ca50: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66  ntained in the f
ca60: 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  inal..      #   
ca70: 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67 6d      script fragm
ca80: 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75 70 20  ent will end up 
ca90: 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
caa0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
cab0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
cac0: 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74       calling int
cad0: 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e 6f 74  erpreter and not
cae0: 20 74 68 65 20 74 61 72 67 65 74 20 69 6e 74 65   the target inte
caf0: 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20  rpreter created 
cb00: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
cb10: 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64 20 61        isolated a
cb20: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
cb30: 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c  n unless the dol
cb40: 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72  lar signs and/or
cb50: 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20 20 23   square..      #
cb60: 20 20 20 20 20 20 20 62 72 61 63 6b 65 74 73 20         brackets 
cb70: 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20 71 75  are specially qu
cb80: 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b 73 6c  oted with backsl
cb90: 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ashes...      #.
cba0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75  .      return [u
cbb0: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
cbc0: 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73  ubst [appendArgs
cbd0: 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20 20 20   $prefix {..    
cbe0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
cbf0: 20 4e 4f 54 45 3a 20 54 68 65 20 5c 5b 6f 62 6a   NOTE: The \[obj
cc00: 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61  ect\] command ma
cc10: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 69 6e 20  y be missing in 
cc20: 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f 72 65 0d  some Eagle core.
cc30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
cc40: 20 6c 69 62 72 61 72 79 20 63 6f 6e 66 69 67 75   library configu
cc50: 72 61 74 69 6f 6e 73 2e 20 20 43 6c 6f 6e 69 6e  rations.  Clonin
cc60: 67 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20  g and using the 
cc70: 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20  procedure..     
cc80: 20 20 20 23 20 20 20 20 20 20 20 5c 5b 63 68 61     #       \[cha
cc90: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
cca0: 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79 20 68 65 6c  Option\] may hel
ccb0: 70 20 74 6f 20 6d 69 74 69 67 61 74 65 20 74 68  p to mitigate th
ccc0: 69 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  is...        #..
ccd0: 20 20 20 20 20 20 20 20 70 72 6f 63 20 63 68 61          proc cha
cce0: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
ccf0: 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  Option \..      
cd00: 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 61 72 67        {[info arg
cd10: 73 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  s changeNativeRu
cd20: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 20 5c 0d  ntimeOption]} \.
cd30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69  .            {[i
cd40: 6e 66 6f 20 62 6f 64 79 20 63 68 61 6e 67 65 4e  nfo body changeN
cd50: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
cd60: 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]}....        
cd70: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
cd80: 20 20 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52     changeNativeR
cd90: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5b 68 61  untimeOption [ha
cda0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
cdb0: 61 74 69 76 65 5d 0d 0a 20 20 20 20 20 20 20 20  ative]..        
cdc0: 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54  }..      } [getT
cdd0: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
cde0: 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20  mble [list path 
cdf0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24  test_channel]] $
ce00: 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d  suffix]]]..    }
ce10: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
ce20: 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c  yCopyExternalFil
ce30: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
ce40: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
ce50: 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65  orm ""} {newFile
ce60: 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73  Name ""} {verbos
ce70: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
ce80: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
ce90: 65 4e 61 6d 65 20 5b 67 65 74 45 78 74 65 72 6e  eName [getExtern
cea0: 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  alFileName $file
ceb0: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
cec0: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
ced0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
cee0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
cef0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
cf00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cf10: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
cf20: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
cf30: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
cf40: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
cf50: 70 65 64 20 63 6f 70 79 69 6e 67 20 65 78 74 65  ped copying exte
cf60: 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22 20 24 73  rnal file \"" $s
cf70: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
cf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
cf90: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
cfa0: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
cfb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
cfc0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
cfd0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
cfe0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
cff0: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
d000: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
d010: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
d020: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
d030: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
d040: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
d050: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
d060: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
d070: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
d080: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
d090: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
d0a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d0b0: 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72     set targetDir
d0c0: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
d0d0: 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  name $targetFile
d0e0: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
d0f0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
d100: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
d110: 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69  exists $targetDi
d120: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
d130: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ..          file
d140: 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69   mkdir $targetDi
d150: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20  rectory..       
d160: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69   }....        fi
d170: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
d180: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
d190: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
d1a0: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
d1b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
d1c0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d1d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d1e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d1f0: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74  "---- copied ext
d200: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
d210: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
d220: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
d230: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
d240: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
d250: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
d260: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
d270: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d280: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d290: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
d2a0: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
d2b0: 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  py external file
d2c0: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
d2d0: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
d2e0: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
d2f0: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
d300: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d310: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d320: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69    proc tryCopyBi
d330: 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20  naryFile {..    
d340: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
d350: 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c   managedOnly {pl
d360: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
d370: 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a 20 20 20  ileName ""}..   
d380: 20 20 20 20 20 20 20 20 20 7b 76 65 72 62 6f 73           {verbos
d390: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
d3a0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
d3b0: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
d3c0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
d3d0: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
d3e0: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
d3f0: 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65  e exists $source
d400: 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
d410: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
d420: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
d430: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
d440: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d450: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d470: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79  --- skipped copy
d480: 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ing binary file 
d490: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
d4a0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
d4b0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
d4c0: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
d4d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
d4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
d4f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
d500: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d510: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
d520: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
d530: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
d540: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
d550: 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  dFileName \..   
d560: 20 20 20 20 20 20 20 20 20 24 6e 65 77 46 69 6c           $newFil
d570: 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e  eName $managedOn
d580: 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  ly $platform].. 
d590: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d5a0: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
d5b0: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
d5c0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  ildFileName \.. 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
d5e0: 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  Name $managedOnl
d5f0: 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  y $platform]..  
d600: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
d610: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
d620: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
d630: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
d640: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
d650: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
d660: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
d670: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
d680: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
d690: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
d6a0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
d6b0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
d6c0: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
d6d0: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
d6e0: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
d6f0: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
d700: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
d710: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d720: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d730: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d740: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d750: 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20  - copied binary 
d760: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
d770: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
d780: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
d790: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
d7a0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
d7b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d7c0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d7d0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
d7e0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d7f0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
d800: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e  iled to copy bin
d810: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
d820: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
d830: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
d840: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
d850: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
d860: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
d870: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
d880: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
d890: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
d8a0: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
d8b0: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
d8c0: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
d8d0: 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "}..            
d8e0: 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d  {verbose true} }
d8f0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
d900: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
d910: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
d920: 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
d930: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d  dOnly $platform]
d940: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
d950: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
d960: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
d970: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
d980: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
d990: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
d9a0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
d9b0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
d9c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d9d0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
d9e0: 6f 70 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  opying build fil
d9f0: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
da00: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
da10: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
da20: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
da30: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
da40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
da50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
da60: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
da70: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
da80: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
da90: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
daa0: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  tFileName [getBi
dab0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65  naryFileName $ne
dac0: 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  wFileName $platf
dad0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  orm]..      } el
dae0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
daf0: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
db00: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
db10: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
db20: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
db30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74  }....      set t
db40: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b  argetDirectory [
db50: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61  file dirname $ta
db60: 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  rgetFileName]...
db70: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
db80: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  h {..        if 
db90: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
dba0: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d  targetDirectory]
dbb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dbc0: 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24      file mkdir $
dbd0: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d  targetDirectory.
dbe0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
dbf0: 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
dc00: 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69  -force $sourceFi
dc10: 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69  leName $targetFi
dc20: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d  leName..      }]
dc30: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
dc40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
dc50: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
dc60: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
dc70: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
dc80: 70 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20  pied build file 
dc90: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
dca0: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
dcb0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
dcc0: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
dcd0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
dce0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
dcf0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
dd00: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
dd10: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
dd20: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
dd30: 74 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69  to copy build fi
dd40: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
dd50: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
dd60: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
dd70: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
dd80: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
dd90: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
dda0: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
ddb0: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66  teBinaryFile { f
ddc0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
ddd0: 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 74  m ""} {verbose t
dde0: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
ddf0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
de00: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
de10: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
de20: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
de30: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
de40: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
de50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
de60: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
de70: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
de80: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
de90: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
dea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
deb0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c  ---- skipped del
dec0: 65 74 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c  eting binary fil
ded0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
dee0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
def0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
df00: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
df10: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
df20: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
df30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
df40: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
df50: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d  te $fileName}] =
df60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
df70: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
df80: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
df90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
dfa0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65        "---- dele
dfb0: 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ted binary file 
dfc0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
dfd0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
dfe0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
dff0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
e000: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
e020: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65  --- failed to de
e030: 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65  lete binary file
e040: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
e050: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
e060: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e070: 63 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64  c tryDeleteBuild
e080: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
e090: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e      fileName man
e0a0: 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f  agedOnly {platfo
e0b0: 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  rm ""} {verbose 
e0c0: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
e0d0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67   set fileName [g
e0e0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
e0f0: 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67  $fileName $manag
e100: 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d  edOnly $platform
e110: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
e120: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
e130: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
e140: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
e150: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
e160: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
e170: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
e180: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e190: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
e1a0: 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  - skipped deleti
e1b0: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
e1c0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
e1e0: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
e1f0: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
e200: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65   }....        re
e210: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
e220: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
e230: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
e240: 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d  fileName}] == 0}
e250: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e260: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
e270: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e280: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
e290: 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20    "---- deleted 
e2a0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
e2b0: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
e2c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
e2d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e2e0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e2f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e300: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
e310: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
e320: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
e330: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
e340: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
e350: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
e360: 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20  opyAssembly {.. 
e370: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
e380: 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  ame managedOnly 
e390: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
e3a0: 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73  db true} {verbos
e3b0: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
e3c0: 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
e3d0: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d  ile $fileName $m
e3e0: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74  anagedOnly $plat
e3f0: 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65  form "" $verbose
e400: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70  ....      if {$p
e410: 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  db} then {..    
e420: 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64      tryCopyBuild
e430: 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73  File [appendArgs
e440: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e450: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
e460: 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20  fileName] .pdb] 
e470: 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c  $managedOnly $pl
e480: 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f  atform "" $verbo
e490: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
e4a0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
e4b0: 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
e4c0: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y {..           
e4d0: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
e4e0: 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75  orm ""} {pdb tru
e4f0: 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65  e} {verbose true
e500: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79  } } {..      try
e510: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
e520: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
e530: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 0d  form $verbose...
e540: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
e550: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e560: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
e570: 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73  File [appendArgs
e580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e590: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
e5a0: 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20  fileName] .pdb] 
e5b0: 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f  $platform $verbo
e5c0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
e5d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
e5e0: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
e5f0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
e600: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
e610: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
e620: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
e630: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
e640: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
e650: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
e660: 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65          set asse
e670: 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61  mbly [object loa
e680: 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69 6c 65  d -loadtype File
e690: 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d   -alias $fileNam
e6a0: 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  e]..      }] == 
e6b0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e6c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
e6d0: 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74  NOTE: Now, add t
e6e0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73  he necessary tes
e6f0: 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
e700: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e710: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e720: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
e730: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
e740: 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
e750: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e760: 54 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61  TE: Grab the ima
e770: 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69  ge runtime versi
e780: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65  on from the asse
e790: 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20  mbly because..  
e7a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
e7b0: 76 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79  veral tests rely
e7c0: 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20   on it having a 
e7d0: 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a  certain value...
e7e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e7f0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
e800: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
e810: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
e820: 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] _ \..        
e830: 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49      [$assembly I
e840: 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
e850: 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]]....        
e860: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e870: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  E: Return the fu
e880: 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c  ll path of the l
e890: 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  oaded file...   
e8a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e8b0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
e8c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
e8d0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
e8e0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e8f0: 20 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b   isSQLiteReady {
e900: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
e910: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
e920: 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
e930: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
e940: 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69  only if the SQLi
e950: 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  te native..     
e960: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
e970: 20 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e   and the System.
e980: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
e990: 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65  ged assembly are
e9a0: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
e9b0: 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
e9c0: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
e9d0: 74 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72  test suite.  Cur
e9e0: 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f  rently, this pro
e9f0: 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20  cedure..      # 
ea00: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
ea10: 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65  called only afte
ea20: 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73  r the [tryLoadAs
ea30: 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72  sembly] procedur
ea40: 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20  e has..      #  
ea50: 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64       been called
ea60: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68   to probe for th
ea70: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ea80: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ea90: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
eaa0: 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68       and the [ch
eab0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72  eckForSQLite] pr
eac0: 6f 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e  ocedure has been
ead0: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
eae0: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
eaf0: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e      the SQLite n
eb00: 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f  ative library; o
eb10: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70  therwise, this p
eb20: 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69  rocedure will si
eb30: 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mply..      #   
eb40: 20 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72      always retur
eb50: 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23  n zero...      #
eb60: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
eb70: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
eb80: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
eb90: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
eba0: 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73  te] && [haveCons
ebb0: 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d 0d 0a  traint SQLite]..
ebc0: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d        }]..    }.
ebd0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 61 74  ....    proc mat
ebe0: 63 68 50 6c 61 74 66 6f 72 6d 20 7b 20 70 6c 61  chPlatform { pla
ebf0: 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20  tform } {..     
ec00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
ec10: 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  : An empty strin
ec20: 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  g for the platfo
ec30: 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  rm means that th
ec40: 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a  e build is not..
ec50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
ec60: 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74 69  rimarily] a nati
ec70: 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65 66  ve build; theref
ec80: 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20 6d  ore, it always m
ec90: 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20 23  atches...      #
eca0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
ecb0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
ecc0: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
ecd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
ece0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
ecf0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
ed00: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
ed10: 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d 65 20 69  e machine name i
ed20: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 74  s unavailable, t
ed30: 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
ed40: 65 6c 73 65 20 77 65 0d 0a 20 20 20 20 20 20 23  else we..      #
ed50: 20 20 20 20 20 20 20 63 61 6e 20 64 6f 2e 0d 0a         can do...
ed60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
ed70: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
ed80: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
ed90: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
eda0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
edb0: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  n false..      }
edc0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
edd0: 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
ede0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c  the specified pl
edf0: 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70 20  atform match up 
ee00: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
ee10: 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20 23  rocess?..      #
ee20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c 61  ..      if {$pla
ee30: 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e  tform eq [machin
ee40: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
ee50: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
ee60: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
ee70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ee80: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
ee90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
eea0: 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69 66  NOTE: The specif
eeb0: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65  ied platform doe
eec0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20 77  s not match up w
eed0: 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ith the platform
eee0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
eef0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
ef00: 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
ef10: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
ef20: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
ef30: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
ef40: 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
ef50: 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  d {} {..      #.
ef60: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
ef70: 73 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  s the [object] c
ef80: 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e 74 6c 79  ommand currently
ef90: 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20   available?..   
efa0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
efb0: 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67  rn [expr {[lleng
efc0: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
efd0: 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 5d  s object]] > 0}]
efe0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
eff0: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
f000: 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
f010: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
f020: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f030: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
f040: 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a 65 63 74  ing for \"object
f050: 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  \" command usage
f060: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
f070: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
f080: 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f 62 6a 65   ::no(sqliteObje
f090: 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26 26 20 5c  ctCommand)] && \
f0a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
f0b0: 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
f0c0: 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
f0d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
f0e0: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
f0f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f100: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f110: 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 77  # NOTE: Unless w
f120: 65 20 61 72 65 20 66 6f 72 62 69 64 64 65 6e 20  e are forbidden 
f130: 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 61  from doing so, a
f140: 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69  dd some constrai
f150: 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nts..        #  
f160: 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 61       that will a
f170: 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20 74 68 65  llow most of the
f180: 20 74 65 73 74 20 73 75 69 74 65 20 74 6f 20 72   test suite to r
f190: 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73 65 0d 0a  un (i.e. those..
f1a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f1b0: 74 65 73 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  tests that do no
f1c0: 74 20 64 69 72 65 63 74 6c 79 20 72 65 6c 79 20  t directly rely 
f1d0: 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a 65 63 74  upon the [object
f1e0: 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20 20 20  ] command)...   
f1f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f200: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
f210: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
f220: 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73 74 72 61  eAssemblyConstra
f230: 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
f240: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
f250: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a  straint SQLite..
f260: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
f270: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e  straint SQLiteIn
f280: 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20  terop..         
f290: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
f2a0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
f2b0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e..          add
f2c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
f2d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e  m.Data.SQLite.En
f2e0: 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  cryption..      
f2f0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
f300: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
f310: 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20 20 20  Lite.Linq....   
f320: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
f330: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
f340: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f350: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
f360: 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67 65 74 42  Lite.dll_v [getB
f370: 75 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 5d 5d  uildClrVersion]]
f380: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
f390: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
f3a0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68  o exists ::no(sh
f3b0: 69 6d 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  imSQLiteDefineCo
f3c0: 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61 69 6e 74  nstantConstraint
f3d0: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
f3e0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
f3f0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c  efineConstant [l
f400: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
f410: 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54       INTEROP_EXT
f420: 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
f430: 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58   INTEROP_FTS5_EX
f440: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
f450: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
f460: 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e  _JSON1_EXTENSION
f470: 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54   INTEROP_PERCENT
f480: 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  ILE_EXTENSION \.
f490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
f4a0: 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58  NTEROP_REGEXP_EX
f4b0: 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
f4c0: 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TEST_EXTENSION \
f4d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f4e0: 49 4e 54 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f  INTEROP_SESSION_
f4f0: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
f500: 50 5f 53 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e  P_SHA1_EXTENSION
f510: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f520: 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45    INTEROP_TOTYPE
f530: 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
f540: 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
f550: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f560: 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c    USE_INTEROP_DL
f570: 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  L] {..          
f580: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
f590: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
f5b0: 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43  getSQLiteDefineC
f5c0: 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d 20 24  onstantPrefix] $
f5d0: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 5d 0d  defineConstant].
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f5f0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f600: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
f610: 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51  ists ::no(shimSQ
f620: 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64 69 6f  LiteVisualStudio
f630: 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
f640: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
f650: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
f660: 61 70 70 65 6e 64 41 72 67 73 20 76 69 73 75 61  appendArgs visua
f670: 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75 69 6c  lStudio [getBuil
f680: 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20 20 20  dYear]]..       
f690: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
f6a0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
f6b0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
f6c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
f6d0: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
f6e0: 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74 69 76  meOption { nativ
f6f0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
f700: 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
f710: 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d 5d  commands debug]]
f720: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
f730: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 69       [llength [i
f740: 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20  nfo subcommands 
f750: 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74  debug runtimeopt
f760: 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b 63 61  ion]] > 0 && [ca
f770: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 64  tch {..        d
f780: 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74 69  ebug runtimeopti
f790: 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  on [expr {$nativ
f7a0: 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d  e ? "add" : "rem
f7b0: 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ove"}] native.. 
f7c0: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
f7d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
f7e0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
f7f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
f800: 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
f810: 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 63 61  tCommand] && [ca
f820: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
f830: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
f840: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
f850: 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  ve [expr {$nativ
f860: 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e ? \..         
f870: 20 20 20 22 41 64 64 52 75 6e 74 69 6d 65 4f 70     "AddRuntimeOp
f880: 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76 65 52  tion" : "RemoveR
f890: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20  untimeOption"}] 
f8a0: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d  native..      }]
f8b0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
f8c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
f8d0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
f8e0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
f8f0: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
f900: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
f910: 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68 61  LiteBuilds { cha
f920: 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c  nnel {select fal
f930: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
f940: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f950: 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72 79 20  Check for every 
f960: 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64 20 63  possible valid c
f970: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61  ombination of va
f980: 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e 0d 0a  lues used when..
f990: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
f9a0: 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65 20 62  cating out the b
f9b0: 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
f9c0: 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67 20 65  ctory, showing e
f9d0: 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20  ach available.. 
f9e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
f9f0: 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f  ld variation alo
fa00: 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20 20 20  ng the way...   
fa10: 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
fa20: 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69 73 74  ach native [list
fa30: 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a   false true] {..
fa40: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
fa50: 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
fa60: 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ars] {..        
fa70: 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66 69 67    foreach config
fa80: 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
fa90: 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d  dConfigurations]
faa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fab0: 66 6f 72 65 61 63 68 20 65 78 74 72 61 20 5b 67  foreach extra [g
fac0: 65 74 42 75 69 6c 64 45 78 74 72 61 73 5d 20 7b  etBuildExtras] {
fad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fae0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
faf0: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
fb00: 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76  out the effectiv
fb10: 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d  e build platform
fb20: 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20  .  This is..    
fb30: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
fb40: 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68    based on wheth
fb50: 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69  er or not a [pri
fb60: 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20 62  marily] native b
fb70: 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20  uild..          
fb80: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
fb90: 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20  eing used.  For 
fba0: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d  [primarily] non-
fbb0: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a  native builds,..
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
fbd0: 20 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20        this will 
fbe0: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
fbf0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
fc00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
fc10: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
fc20: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
fc30: 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  rm $native].... 
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
fc50: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
fc60: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
fc80: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
fc90: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
fca0: 74 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65 78  te build \"" [ex
fcb0: 70 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  pr \..          
fcc0: 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76 65          {$native
fcd0: 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22   ? "native/" : "
fce0: 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  "}] [expr {[stri
fcf0: 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20  ng length \..   
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
fd10: 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20  platform] > 0 ? 
fd20: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c 61  [appendArgs $pla
fd30: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
fd40: 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20 20  $year \..       
fd50: 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f             / $co
fd60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
fd70: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
fd80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fd90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
fda0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
fdb0: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
fdc0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
fdd0: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
fde0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
fdf0: 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79  omponents for Sy
fe00: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
fe10: 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64   should be found
fe20: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
fe30: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
fe40: 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20    set directory 
fe50: 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74  [joinBuildDirect
fe60: 6f 72 79 20 24 6e 61 74 69 76 65 20 5c 0d 0a 20  ory $native \.. 
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69   [getBuildBaseDi
fe90: 72 65 63 74 6f 72 79 5d 20 24 79 65 61 72 20 24  rectory] $year $
fea0: 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67  platform $config
feb0: 75 72 61 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  uration \..     
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 78               $ex
fed0: 74 72 61 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tra]....        
fee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fef0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
ff00: 6f 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  o the necessary 
ff10: 66 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75  files exist?  Cu
ff20: 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65  rrently, no othe
ff30: 72 20 73 74 65 70 73 0d 0a 20 20 20 20 20 20 20  r steps..       
ff40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
ff50: 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69  re taken to veri
ff60: 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69 73  fy this build is
ff70: 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65   actually viable
ff80: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ff90: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
ffa0: 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76    if {[isBuildAv
ffb0: 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20  ailable $native 
ffc0: 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
ffd0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
ffe0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
fff0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10000 57 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22  When in "select"
10010 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63   mode, automatic
10020 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
10030 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20  first..         
10040 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
10050 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f  vailable build o
10060 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
10070 4c 69 74 65 20 61 6e 64 20 74 68 65 6e 20 72 65  Lite and then re
10080 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  turn..          
10090 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6d        #       im
100a0 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20 20  mediately...    
100b0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
100d0 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
100e0 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
100f0 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
10100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
10120 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10130 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64  Manually overrid
10140 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20  e all the build 
10150 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74  directory select
10160 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
10170 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
10180 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74  elated test sett
10190 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ings in order to
101a0 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c   force this buil
101b0 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
101c0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
101d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
101e0 74 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a  te to be used...
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10210 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 61         if {![cha
10220 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
10230 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76 65 5d 7d  Option $native]}
10240 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
10260 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10270 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74     "no, failed t
102a0 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  o " [expr {$nati
102b0 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65  ve ? "add" : "re
102c0 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20  move"}] \..     
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76     " the \"nativ
102f0 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  e\" runtime opti
10300 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  on\n"]....      
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
10320 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
10340 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
10350 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
10360 79 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20  year $year..    
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
10380 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  t ::test_platfor
10390 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  m $platform..   
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
103b0 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  et ::test_config
103c0 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75  uration $configu
103d0 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ration....      
103e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
103f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10400 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
10430 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  " [expr {$native
10440 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22   ? "native/" : "
10450 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  "}] \..         
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
10470 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
10480 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
10490 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
104a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
104b0 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
104c0 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
104d0 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74  ar / $configurat
104e0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
10500 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
10510 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 20 3f  th $extra] > 0 ?
10520 20 5b 61 70 70 65 6e 64 41 72 67 73 20 2f 20 5c   [appendArgs / \
10530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10540 20 20 20 20 20 20 20 20 24 65 78 74 72 61 5d 20          $extra] 
10550 3a 20 22 22 7d 5d 20 22 29 5c 6e 22 5d 0d 0a 0d  : ""}] ")\n"]...
10560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10570 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
105a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
105b0 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
105c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
105d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
105e0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
10600 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
10610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10620 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
10630 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10640 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10650 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
10660 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
10670 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
10680 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
10690 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65  es { channel {se
106a0 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  lect false} } {.
106b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
106c0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
106d0 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20  r past releases 
106e0 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
106f0 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72  QLite in the dir
10700 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
10710 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20        contained 
10720 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44  in the "System.D
10730 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69  ata.SQLite" envi
10740 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
10750 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20  , if..      #   
10760 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20      present...  
10770 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10780 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
10790 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e  env(System.Data.
107a0 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20  SQLite)] && \.. 
107b0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
107c0 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53   length $::env(S
107d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
107e0 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  e)] > 0} then {.
107f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10800 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
10810 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
10820 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20  ified directory 
10830 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73  where the necess
10840 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
10850 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20       components 
10860 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
10870 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65  SQLite should be
10880 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
10890 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
108a0 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  directory [file 
108b0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
108c0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
108d0 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74       $::env(Syst
108e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20  em.Data.SQLite) 
108f0 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69  [getReleaseVersi
10900 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  on]]]....       
10910 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10920 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10930 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10940 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
10950 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
10960 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
10970 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
10980 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d  ectory "\"... "]
10990 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
109a0 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61  [isReleaseAvaila
109b0 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70  ble $directory p
109c0 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
109d0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
109e0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
109f0 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
10a00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10a10 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
10a20 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
10a30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10a40 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26     if {$select &
10a50 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d  & [matchPlatform
10a60 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
10a70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10a80 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72   set ::build_dir
10a90 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
10aa0 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y....           
10ab0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10ac0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
10ad0 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
10ae0 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
10af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
10b00 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
10b10 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10b20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10b30 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10b40 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
10b50 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
10b60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10b70 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10b80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
10b90 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
10ba0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
10bb0 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72  file exists $dir
10bc0 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20  ectory] || \..  
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69              ![fi
10be0 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
10bf0 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
10c00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10c10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10c20 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
10c40 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
10c50 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
10c60 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
10c70 69 73 20 61 6e 20 22 20 5c 0d 0a 20 20 20 20 20  is an " \..     
10c80 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 76 61             "inva
10c90 6c 69 64 20 64 69 72 65 63 74 6f 72 79 2c 20 73  lid directory, s
10ca0 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
10cb0 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
10cc0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
10cd0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
10ce0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10cf0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10d00 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63  path [lsort -dec
10d10 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69  reasing [file li
10d20 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d  st $directory *]
10d30 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
10d40 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
10d50 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c  s $path] && [fil
10d60 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70  e isdirectory $p
10d70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ath]} then {..  
10d80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10d90 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10da0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10db0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10dc0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
10dd0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10de0 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
10df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e00 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20     $path "\"... 
10e10 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
10e20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61      if {[isRelea
10e30 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74  seAvailable $pat
10e40 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  h platform]} the
10e50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
10e60 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
10e70 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
10e80 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
10e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ea0 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
10eb0 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
10ec0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
10ee0 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
10ef0 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  tchPlatform $pla
10f00 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
10f30 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d  rectory $path...
10f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f50 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10f60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
10f70 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
10f80 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
10f90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
10fb0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
10fc0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10fe0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
10ff0 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
11000 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
11010 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
11020 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
11030 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
11050 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11060 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
11070 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11080 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
11090 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
110a0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
110b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
110c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
110d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
110e0 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
110f0 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
11100 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
11110 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20  is not " \..    
11120 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b          "set, sk
11130 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72  ipping check for
11140 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d   releases...\n"]
11150 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11160 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
11170 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11180 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
11190 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e  teLibrary { chan
111a0 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
111b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
111c0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
111d0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
111e0 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
111f0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
11200 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
11210 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
11220 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
11230 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
11240 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
11250 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f 6e  e3 SQLiteVersion
11260 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
11270 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
11280 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11290 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
112a0 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
112b0 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
112c0 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
112d0 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
112e0 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
112f0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11300 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
11310 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
11320 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
11330 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11340 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
11350 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11360 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11370 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
11380 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
11390 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
113a0 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
113b0 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
113c0 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
113d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
113e0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
113f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
11400 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
11410 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
11420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
11430 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11440 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
11450 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20  SourceId..      
11460 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74    } sourceId]} t
11470 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11480 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
11490 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
114a0 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
114b0 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
114c0 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
114d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
114e0 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
114f0 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
11500 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11510 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
11520 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
11530 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
11540 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
11550 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
11560 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
11570 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
11580 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
11590 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
115a0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
115b0 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
115c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
115d0 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
115e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
115f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11600 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
11610 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
11620 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
11630 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
11640 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11650 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
11660 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
11670 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
11680 20 4e 4f 54 45 3a 20 52 65 63 6f 72 64 20 76 65   NOTE: Record ve
11690 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  rsion of the SQL
116a0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
116b0 20 66 6f 72 20 6c 61 74 65 72 20 75 73 65 0d 0a   for later use..
116c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
116d0 62 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  by test constrai
116e0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  nt expressions, 
116f0 65 74 63 2e 20 20 49 66 20 74 68 69 73 20 76 61  etc.  If this va
11700 6c 75 65 20 68 61 73 0d 0a 20 20 20 20 20 20 20  lue has..       
11710 20 23 20 20 20 20 20 20 20 61 6c 72 65 61 64 79   #       already
11720 20 62 65 65 6e 20 73 65 74 20 28 6f 72 20 6f 76   been set (or ov
11730 65 72 72 69 64 64 65 6e 29 2c 20 73 6b 69 70 20  erridden), skip 
11740 73 65 74 74 69 6e 67 20 69 74 2e 0d 0a 20 20 20  setting it...   
11750 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11760 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
11770 73 20 3a 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79  s ::core_library
11780 5f 76 65 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20  _version]} then 
11790 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
117a0 20 3a 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f   ::core_library_
117b0 76 65 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e  version $version
117c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
117d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
117e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
117f0 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
11800 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
11810 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
11820 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11830 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11840 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
11850 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
11860 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
11870 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
11880 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
11890 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
118a0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
118b0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
118c0 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
118d0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
118e0 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
118f0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11900 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
11910 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11920 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
11930 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
11940 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
11950 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
11960 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11970 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
11980 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
11990 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
119a0 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
119b0 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
119c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
119d0 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
119e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
119f0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
11a00 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
11a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
11a20 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
11a30 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
11a40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11a50 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
11a60 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
11a70 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
11a80 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
11a90 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
11aa0 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
11ab0 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
11ac0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
11ad0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
11ae0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
11af0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11b00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11b10 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
11b20 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
11b30 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
11b40 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
11b50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
11b60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11b70 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
11b80 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
11b90 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
11ba0 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
11bb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11bc0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
11bd0 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
11be0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
11bf0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
11c00 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
11c10 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
11c20 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
11c30 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
11c40 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
11c50 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
11c60 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
11c70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
11c80 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
11c90 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
11ca0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11cb0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
11cc0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
11cd0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11ce0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65        # NOTE: Be
11cf0 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64  fore actually ad
11d00 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f  ding the test co
11d10 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73  nstraint, make s
11d20 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ure the..       
11d30 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e   #       version
11d40 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20   is valid (i.e. 
11d50 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77 65  not just that we
11d60 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29   could query it)
11d70 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11d80 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73 69        if {$versi
11d90 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  on ne "null"} th
11da0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11db0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
11dc0 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
11dd0 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
11de0 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
11df0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
11e00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11e10 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
11e20 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
11e30 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  op....          
11e40 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a  set answer yes..
11e50 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
11e60 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11e70 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20  answer no..     
11e80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
11e90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
11ea0 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77  appendArgs $answ
11eb0 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e  er " (" $version
11ec0 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
11ed0 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
11ee0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
11ef0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
11f00 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
11f10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
11f20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
11f30 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63  fineConstant { c
11f40 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d  hannel name } {.
11f50 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
11f60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11f70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  s \..          "
11f80 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
11f90 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
11fa0 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73  Lite define cons
11fb0 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c  tant \"" $name \
11fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e  ..          "\".
11fd0 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  .. "]....      i
11fe0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
11ff0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
12000 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
12010 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
12020 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
12030 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
12040 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a  efineConstants..
12050 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
12060 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
12070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
12080 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
12090 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69  ct -nocase $defi
120a0 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d  neConstants $nam
120b0 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b  e] != -1} then {
120c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
120d0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
120e0 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e   Yes, this defin
120f0 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65  e constant was e
12100 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20  nabled when the 
12110 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
12120 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
12130 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  bly was compiled
12140 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
12150 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
12160 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
12170 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 44 65  rgs [getSQLiteDe
12180 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
12190 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
121a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
121b0 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
121c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
121d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
121e0 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
121f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12200 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12210 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12220 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
12230 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
12240 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
12250 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
12260 6e 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  n { channel name
12270 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
12280 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12290 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
122a0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
122b0 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
122c0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 63  terop assembly c
122d0 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22  ompile option \"
122e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  " \..          $
122f0 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  name "\"... "]..
12300 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
12310 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
12320 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
12330 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
12340 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
12350 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
12360 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 43  SQLite3 InteropC
12370 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20  ompileOptions.. 
12380 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
12390 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
123a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
123b0 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
123c0 20 2d 6e 6f 63 61 73 65 20 24 63 6f 6d 70 69 6c   -nocase $compil
123d0 65 4f 70 74 69 6f 6e 73 20 24 6e 61 6d 65 5d 20  eOptions $name] 
123e0 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
123f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12400 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
12410 73 2c 20 74 68 69 73 20 63 6f 6d 70 69 6c 65 20  s, this compile 
12420 6f 70 74 69 6f 6e 20 77 61 73 20 65 6e 61 62 6c  option was enabl
12430 65 64 20 77 68 65 6e 20 74 68 65 20 69 6e 74 65  ed when the inte
12440 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20 23  rop..          #
12450 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
12460 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  was compiled... 
12470 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12480 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
12490 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
124a0 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c  [getSQLiteCompil
124b0 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d 20 24  eOptionPrefix] $
124c0 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
124d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
124e0 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
124f0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
12500 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12510 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
12520 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
12530 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
12540 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
12550 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  r\n..      }....
12560 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12570 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12580 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
12590 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
125a0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
125b0 72 61 72 79 20 63 6f 6d 70 69 6c 65 20 6f 70 74  rary compile opt
125c0 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
125d0 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e       $name "\"..
125e0 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  . "]....      if
125f0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12600 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
12610 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
12620 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
12630 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
12640 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
12650 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
12660 6e 73 0d 0a 20 20 20 20 20 20 7d 20 63 6f 6d 70  ns..      } comp
12670 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
12680 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12690 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d    if {[lsearch -
126a0 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 63  exact -nocase $c
126b0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 20 24 6e  ompileOptions $n
126c0 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e  ame] != -1} then
126d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
126e0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
126f0 45 3a 20 59 65 73 2c 20 74 68 69 73 20 63 6f 6d  E: Yes, this com
12700 70 69 6c 65 20 6f 70 74 69 6f 6e 20 77 61 73 20  pile option was 
12710 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65  enabled when the
12720 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
12730 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20     #       core 
12740 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
12750 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  iled...         
12760 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
12770 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
12780 65 6e 64 41 72 67 73 20 5b 67 65 74 53 51 4c 69  endArgs [getSQLi
12790 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50  teCompileOptionP
127a0 72 65 66 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d  refix] $name]...
127b0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
127c0 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
127d0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
127e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
127f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
12800 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12810 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12820 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12830 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20  nel error\n..   
12840 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
12850 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65      proc getDate
12860 54 69 6d 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69  TimeFormat { {ti
12870 6d 65 5a 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b  meZone true} } {
12880 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12890 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
128a0 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20 72  ocedure simply r
128b0 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66 61  eturns the "defa
128c0 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66 6f  ult" DateTime fo
128d0 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20 20  rmat used..     
128e0 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20   #       by the 
128f0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
12900 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12910 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64  [info exists ::d
12920 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
12930 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
12940 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12950 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
12960 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
12970 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12980 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
12990 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f  n the manually o
129a0 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65 20  verridden value 
129b0 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d 65  for the DateTime
129c0 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20   format...      
129d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
129e0 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  urn $::datetime_
129f0 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20  format..      } 
12a00 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12a10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12a20 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53 4f  E: Return an ISO
12a30 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66 6f  8601 DateTime fo
12a40 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65 20  rmat compatible 
12a50 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20  with SQLite,..  
12a60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
12a70 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
12a80 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20 66  , and suitable f
12a90 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e  or round-trippin
12aa0 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  g with the..    
12ab0 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74 65      #       Date
12ac0 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74 68  Time class of th
12ad0 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66  e framework.  If
12ae0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 63   this value is c
12af0 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20 20  hanged,..       
12b00 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75 73   #       various
12b10 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 2e   tests may fail.
12b20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12b30 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
12b40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
12b50 20 20 20 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d         "yyyy-MM-
12b60 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46  dd HH:mm:ss.FFFF
12b70 46 46 46 22 20 5b 65 78 70 72 20 7b 24 74 69 6d  FFF" [expr {$tim
12b80 65 5a 6f 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22  eZone ? "K" : ""
12b90 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  }]]..      }..  
12ba0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12bb0 20 67 65 74 44 61 74 65 54 69 6d 65 54 69 63 6b   getDateTimeTick
12bc0 73 20 7b 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c  s { value {local
12bd0 20 22 22 7d 20 7b 64 65 66 61 75 6c 74 20 22 22   ""} {default ""
12be0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
12bf0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
12c00 24 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68  $value] == 0} th
12c10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
12c20 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20  turn $default.. 
12c30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12c40 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
12c50 20 20 20 20 20 20 73 65 74 20 64 61 74 65 54 69        set dateTi
12c60 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  me [object invok
12c70 65 20 2d 63 72 65 61 74 65 20 5c 0d 0a 20 20 20  e -create \..   
12c80 20 20 20 20 20 20 20 20 20 2d 70 61 72 61 6d 65           -parame
12c90 74 65 72 74 79 70 65 73 20 5b 6c 69 73 74 20 53  tertypes [list S
12ca0 74 72 69 6e 67 20 53 74 72 69 6e 67 20 49 46 6f  tring String IFo
12cb0 72 6d 61 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a  rmatProvider \..
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
12cd0 65 6d 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e  em.Globalization
12ce0 2e 44 61 74 65 54 69 6d 65 53 74 79 6c 65 73 5d  .DateTimeStyles]
12cf0 20 44 61 74 65 54 69 6d 65 20 50 61 72 73 65 45   DateTime ParseE
12d00 78 61 63 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  xact \..        
12d10 20 20 20 20 24 76 61 6c 75 65 20 5b 67 65 74 44      $value [getD
12d20 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e  ateTimeFormat] n
12d30 75 6c 6c 20 41 64 6a 75 73 74 54 6f 55 6e 69 76  ull AdjustToUniv
12d40 65 72 73 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d  ersal]..      }]
12d50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12d60 20 20 72 65 74 75 72 6e 20 24 64 65 66 61 75 6c    return $defaul
12d70 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
12d80 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
12d90 69 73 20 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69  is boolean -stri
12da0 63 74 20 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e  ct $local]} then
12db0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
12dc0 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74  dateTime [object
12dd0 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74 65 20   invoke -create 
12de0 44 61 74 65 54 69 6d 65 20 53 70 65 63 69 66 79  DateTime Specify
12df0 4b 69 6e 64 20 5c 0d 0a 20 20 20 20 20 20 20 20  Kind \..        
12e00 20 20 20 20 24 64 61 74 65 54 69 6d 65 20 55 74      $dateTime Ut
12e10 63 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  c]..      } else
12e20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
12e30 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  rn [object invok
12e40 65 20 24 64 61 74 65 54 69 6d 65 20 54 69 63 6b  e $dateTime Tick
12e50 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  s]..      }.... 
12e60 20 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d       if {$local}
12e70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12e80 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20   return [object 
12e90 69 6e 76 6f 6b 65 20 24 64 61 74 65 54 69 6d 65  invoke $dateTime
12ea0 20 54 6f 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63   ToLocalTime.Tic
12eb0 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ks]..      } els
12ec0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
12ed0 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  urn [object invo
12ee0 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f 55  ke $dateTime ToU
12ef0 6e 69 76 65 72 73 61 6c 54 69 6d 65 2e 54 69 63  niversalTime.Tic
12f00 6b 73 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ks]..      }..  
12f10 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12f20 20 67 65 74 50 72 6f 70 65 72 74 69 65 73 20 7b   getProperties {
12f30 20 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20   object varName 
12f40 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
12f50 20 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70   1 $varName prop
12f60 65 72 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20  erties....      
12f70 73 65 74 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20  set count 0..   
12f80 20 20 20 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69     set names [li
12f90 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
12fa0 7b 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65  {[isObjectHandle
12fb0 20 24 6f 62 6a 65 63 74 5d 20 26 26 20 24 6f 62   $object] && $ob
12fc0 6a 65 63 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20  ject ne "null"} 
12fd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12fe0 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d  eval lappend nam
12ff0 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65  es [object membe
13000 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rs \..          
13010 20 20 2d 6d 65 6d 62 65 72 74 79 70 65 73 20 50    -membertypes P
13020 72 6f 70 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c  roperty -nameonl
13030 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20  y $object]....  
13040 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
13050 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74  nd names [object
13060 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20   members \..    
13070 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65 72 74          -membert
13080 79 70 65 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65  ypes Field -name
13090 6f 6e 6c 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20  only $object].. 
130a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
130b0 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61  foreach name $na
130c0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  mes {..        i
130d0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
130e0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
130f0 76 6f 6b 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67  voke -objectflag
13100 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62  s +NoDispose $ob
13110 6a 65 63 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20  ject $name..    
13120 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20      } value] == 
13130 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13140 20 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65       if {[isObje
13150 63 74 48 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d  ctHandle $value]
13160 20 26 26 20 24 76 61 6c 75 65 20 6e 65 20 22 6e   && $value ne "n
13170 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
13180 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65 72            set er
13190 72 6f 72 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74  ror null; object
131a0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
131b0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 6d 61               -ma
131d0 72 73 68 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61  rshalflags +NoHa
131e0 6e 64 6c 65 20 49 6e 74 65 72 70 72 65 74 65 72  ndle Interpreter
131f0 2e 47 65 74 41 63 74 69 76 65 20 5c 0d 0a 20 20  .GetActive \..  
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64                Ad
13210 64 4f 62 6a 65 63 74 52 65 66 65 72 65 6e 63 65  dObjectReference
13220 20 4f 6b 20 24 76 61 6c 75 65 20 65 72 72 6f 72   Ok $value error
13230 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13240 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69  lappend properti
13250 65 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73  es(objects) [lis
13260 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d  t $name $value].
13270 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
13280 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
13290 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74   lappend propert
132a0 69 65 73 28 76 61 6c 75 65 73 29 20 5b 6c 69 73  ies(values) [lis
132b0 74 20 24 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d  t $name $value].
132c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
132d0 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 63            incr c
132e0 6f 75 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  ount..        } 
132f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13300 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70 65 72    lappend proper
13310 74 69 65 73 28 65 72 72 6f 72 73 29 20 5b 6c 69  ties(errors) [li
13320 73 74 20 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f  st $name $::erro
13330 72 43 6f 64 65 5d 0d 0a 20 20 20 20 20 20 20 20  rCode]..        
13340 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13350 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 75 6e      return $coun
13360 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
13370 20 70 72 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70   proc getAllProp
13380 65 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20  erties { object 
13390 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  varName } {..   
133a0 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
133b0 61 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ame properties..
133c0 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
133d0 24 6f 62 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20  $object....     
133e0 20 77 68 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d   while {true} {.
133f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
13400 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65  nfo exists prope
13410 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
13420 73 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  s)] || \..      
13430 20 20 20 20 20 20 24 76 61 6c 75 65 20 6e 69 20        $value ni 
13440 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
13450 4f 62 6a 65 63 74 73 29 7d 20 74 68 65 6e 20 7b  Objects)} then {
13460 0d 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 50  ..          getP
13470 72 6f 70 65 72 74 69 65 73 20 24 76 61 6c 75 65  roperties $value
13480 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
13490 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
134a0 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62  roperties(seenOb
134b0 6a 65 63 74 73 29 20 24 76 61 6c 75 65 0d 0a 20  jects) $value.. 
134c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
134d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
134e0 78 69 73 74 73 20 70 72 6f 70 65 72 74 69 65 73  xists properties
134f0 28 6f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e  (objects)]} then
13500 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 62 72   {..          br
13510 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  eak..        }..
13520 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
13530 6c 65 6e 67 74 68 20 24 70 72 6f 70 65 72 74 69  length $properti
13540 65 73 28 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20  es(objects)] == 
13550 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13560 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
13570 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29 3b 20  rties(objects); 
13580 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d  break..        }
13590 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
135a0 76 61 6c 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c  value [lindex [l
135b0 69 6e 64 65 78 20 24 70 72 6f 70 65 72 74 69 65  index $propertie
135c0 73 28 6f 62 6a 65 63 74 73 29 20 30 5d 20 65 6e  s(objects) 0] en
135d0 64 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  d]..        set 
135e0 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63  properties(objec
135f0 74 73 29 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f  ts) [lrange $pro
13600 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
13610 20 31 20 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d   1 end]..      }
13620 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
13630 6e 66 6f 20 65 78 69 73 74 73 20 70 72 6f 70 65  nfo exists prope
13640 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
13650 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
13660 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 6c       foreach val
13670 75 65 20 24 70 72 6f 70 65 72 74 69 65 73 28 73  ue $properties(s
13680 65 65 6e 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20  eenObjects) {.. 
13690 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61           if {$va
136a0 6c 75 65 20 65 71 20 24 6f 62 6a 65 63 74 7d 20  lue eq $object} 
136b0 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20  continue..      
136c0 20 20 20 20 63 61 74 63 68 20 7b 6f 62 6a 65 63      catch {objec
136d0 74 20 64 69 73 70 6f 73 65 20 24 76 61 6c 75 65  t dispose $value
136e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
136f0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 70 72          unset pr
13700 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
13710 65 63 74 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  ects)..      }..
13720 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13730 6f 63 20 67 65 74 56 61 72 69 61 62 6c 65 73 20  oc getVariables 
13740 7b 20 76 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65  { varNames {obje
13750 63 74 73 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  cts false} } {..
13760 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
13770 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
13780 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
13790 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
137a0 20 20 20 20 20 20 69 66 20 7b 5b 75 70 6c 65 76        if {[uplev
137b0 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61 79  el 1 [list array
137c0 20 65 78 69 73 74 73 20 24 76 61 72 4e 61 6d 65   exists $varName
137d0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
137e0 20 20 20 20 20 20 73 65 74 20 61 72 72 61 79 4e        set arrayN
137f0 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a  ame $varName....
13800 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
13810 68 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75  h elementName [u
13820 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 61  plevel 1 [list a
13830 72 72 61 79 20 6e 61 6d 65 73 20 24 61 72 72 61  rray names $arra
13840 79 4e 61 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20  yName]] {..     
13850 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 20         set name 
13860 5b 61 70 70 65 6e 64 41 72 67 73 20 24 61 72 72  [appendArgs $arr
13870 61 79 4e 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e  ayName ( $elemen
13880 74 4e 61 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20  tName )]..      
13890 20 20 20 20 20 20 73 65 74 20 76 61 72 56 61 6c        set varVal
138a0 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  ue [uplevel 1 [l
138b0 69 73 74 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d  ist set $name]].
138c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
138d0 66 20 7b 24 6f 62 6a 65 63 74 73 20 26 26 20 5b  f {$objects && [
138e0 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24  isObjectHandle $
138f0 76 61 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20  varValue]} then 
13900 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13910 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
13920 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20  in properties.. 
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
13940 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76  AllProperties $v
13950 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69  arValue properti
13960 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  es....          
13970 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
13980 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b  lt [list $name [
13990 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
139a0 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
139b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
139c0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
139d0 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
139e0 20 24 6e 61 6d 65 20 24 76 61 72 56 61 6c 75 65   $name $varValue
139f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
13a00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13a10 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
13a20 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
13a30 61 72 56 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c  arValue [uplevel
13a40 20 31 20 5b 6c 69 73 74 20 73 65 74 20 24 76 61   1 [list set $va
13a50 72 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rName]]....     
13a60 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65 63 74       if {$object
13a70 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74 48 61  s && [isObjectHa
13a80 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65 5d 7d  ndle $varValue]}
13a90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13aa0 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
13ab0 6d 70 6c 61 69 6e 20 70 72 6f 70 65 72 74 69 65  mplain propertie
13ac0 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  s..            g
13ad0 65 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20  etAllProperties 
13ae0 24 76 61 72 56 61 6c 75 65 20 70 72 6f 70 65 72  $varValue proper
13af0 74 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ties....        
13b00 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
13b10 6c 74 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d  lt [list $varNam
13b20 65 20 5b 61 72 72 61 79 20 67 65 74 20 70 72 6f  e [array get pro
13b30 70 65 72 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20  perties]]..     
13b40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13b50 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
13b60 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20  nd result [list 
13b70 24 76 61 72 4e 61 6d 65 20 24 76 61 72 56 61 6c  $varName $varVal
13b80 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ue]..          }
13b90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13ba0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13bb0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
13bc0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13bd0 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73   enumerableToLis
13be0 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d  t { enumerable }
13bf0 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
13c00 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
13c10 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
13c20 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61   length $enumera
13c30 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e  ble] == 0 || $en
13c40 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c  umerable eq "nul
13c50 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
13c60 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
13c70 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  lt..      }.... 
13c80 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
13c90 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20  ach -alias item 
13ca0 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20  $enumerable {.. 
13cb0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
13cc0 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d  ng length $item]
13cd0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
13ce0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
13cf0 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f  result [$item To
13d00 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20  String]..       
13d10 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
13d20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
13d30 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
13d40 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64     proc catchAnd
13d50 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20  Return { script 
13d60 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73  {stackTrace fals
13d70 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d  e} {strict true}
13d80 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
13d90 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
13da0 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
13db0 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
13dc0 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72   caller in their
13dd0 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20   context,..     
13de0 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69   #       capturi
13df0 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75  ng both the resu
13e00 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  lt and the retur
13e10 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23  n code...      #
13e20 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65  ..      set code
13e30 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c   [catch {uplevel
13e40 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75   1 $script} resu
13e50 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  lt]....      #..
13e60 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69        # NOTE: Di
13e70 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  d the script pro
13e80 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
13e90 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e  ler NOT raise an
13ea0 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23   error?..      #
13eb0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72  ..      if {$str
13ec0 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20  ict && $code == 
13ed0 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26  0 || !$strict &&
13ee0 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65   $code != 1} the
13ef0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13f00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13f10 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  Success.  Return
13f20 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
13f30 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
13f40 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20   the result...  
13f50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13f60 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
13f70 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
13f80 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
13f90 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20  tackTrace} then 
13fa0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
13fb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
13fc0 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
13fd0 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20  er wants a full 
13fe0 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20  stack trace (if 
13ff0 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20  applicable),..  
14000 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
14010 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
14020 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
14030 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
14040 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
14050 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
14060 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
14070 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
14080 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14090 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
140a0 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
140b0 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  Our caller does 
140c0 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20  not want a full 
140d0 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d  stack trace (if.
140e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
140f0 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65   applicable), re
14100 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
14110 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
14120 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20  , the error..   
14130 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64       #       cod
14140 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70  e for the interp
14150 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65  reter, and the e
14160 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20  rror message up 
14170 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
14180 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68  #       point wh
14190 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72  ere the stack tr
141a0 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74  ace should start
141b0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
141c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
141d0 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f  st $code $::erro
141e0 72 43 6f 64 65 20 5c 0d 0a 20 20 20 20 20 20 20  rCode \..       
141f0 20 20 20 20 20 5b 65 78 74 72 61 63 74 53 79 73       [extractSys
14200 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63  temDataSQLiteExc
14210 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 24 72  eptionMessage $r
14220 65 73 75 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d  esult]]..      }
14230 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14240 70 72 6f 63 20 72 65 73 65 74 45 78 63 65 70 74  proc resetExcept
14250 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
14260 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
14270 20 52 65 73 65 74 20 65 78 63 65 70 74 69 6f 6e   Reset exception
14280 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14290 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
142a0 72 20 28 74 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20  r (to null)...  
142b0 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
142c0 20 28 70 72 69 76 61 74 65 29 20 70 72 6f 70 65   (private) prope
142d0 72 74 79 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  rty is maintaine
142e0 64 20 6f 6e 20 61 20 70 65 72 2d 74 68 72 65 61  d on a per-threa
142f0 64 20 62 61 73 69 73 2e 0d 0a 20 20 20 20 20 20  d basis...      
14300 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
14310 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
14320 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
14330 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 45  eter.GetActive E
14340 78 63 65 70 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20  xception null.. 
14350 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
14360 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14370 6f 63 20 63 61 74 63 68 41 6e 64 53 65 74 45 78  oc catchAndSetEx
14380 63 65 70 74 69 6f 6e 20 7b 20 73 63 72 69 70 74  ception { script
14390 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
143a0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
143b0 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
143c0 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
143d0 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
143e0 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
143f0 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ntext...      #.
14400 0a 20 20 20 20 20 20 63 61 74 63 68 20 7b 75 70  .      catch {up
14410 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d  level 1 $script}
14420 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
14430 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
14440 74 68 65 20 28 70 72 69 76 61 74 65 29 20 65 78  the (private) ex
14450 63 65 70 74 69 6f 6e 20 70 72 6f 70 65 72 74 79  ception property
14460 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 74 65 72   from this inter
14470 70 72 65 74 65 72 2c 0d 0a 20 20 20 20 20 20 23  preter,..      #
14480 20 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20         for this 
14490 74 68 72 65 61 64 2c 20 61 6e 64 20 61 64 64 20  thread, and add 
144a0 61 73 20 61 6e 20 6f 70 61 71 75 65 20 6f 62 6a  as an opaque obj
144b0 65 63 74 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ect handle in th
144c0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
144d0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
144e0 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
144f0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
14500 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
14510 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
14520 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
14530 31 20 24 76 61 72 4e 61 6d 65 20 65 78 63 65 70  1 $varName excep
14540 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  tion..      }...
14550 0a 20 20 20 20 20 20 73 65 74 20 65 78 63 65 70  .      set excep
14560 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
14570 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oke \..         
14580 20 2d 61 6c 69 61 73 20 2d 66 6c 61 67 73 20 2b   -alias -flags +
14590 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
145a0 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
145b0 45 78 63 65 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  Exception]....  
145c0 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
145d0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
145e0 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
145f0 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
14600 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
14610 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
14620 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
14630 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
14640 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
14650 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
14660 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
14670 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14680 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65  TE: Since we are
14690 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68   going to use th
146a0 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61  is method name a
146b0 20 6c 6f 74 2c 20 61 73 73 69 67 6e 0d 0a 20 20   lot, assign..  
146c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
146d0 20 74 6f 20 61 20 76 61 72 69 61 62 6c 65 20 66   to a variable f
146e0 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  irst...        #
146f0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 64  ..        set ad
14700 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
14710 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
14720 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14730 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
14740 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64  the base command
14750 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64   to evaluate and
14760 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72 74   add the propert
14770 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
14780 20 20 20 73 65 74 74 69 6e 67 73 20 74 68 61 74     settings that
14790 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
147a0 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
147b0 20 75 6e 69 74 20 74 65 73 74 73 0d 0a 20 20 20   unit tests..   
147c0 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e       #       (i.
147d0 65 2e 20 74 68 65 20 53 79 73 74 65 6d 20 61 6e  e. the System an
147e0 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73  d System.Data as
147f0 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
14800 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
14810 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d          set comm
14820 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  and [list \..   
14830 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65           compile
14840 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
14850 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
14860 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 5c 0d  trict results \.
14870 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
14880 6f 72 73 20 24 61 64 64 20 53 79 73 74 65 6d 2e  ors $add System.
14890 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
148a0 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 5c 0d  Data.dll $add \.
148b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
148c0 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73  tem.Transactions
148d0 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d  .dll $add System
148e0 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .Xml.dll]....   
148f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14900 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
14910 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
14920 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
14930 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
14940 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14950 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
14960 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
14970 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70  {..          lap
14980 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64  pend command $ad
14990 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  d [getBinaryFile
149a0 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  Name $fileName].
149b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
149c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
149d0 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 78 74   # NOTE: Add ext
149e0 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66  ra arguments, if
149f0 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d   any, to the com
14a00 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65  mand to evaluate
14a10 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14a20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
14a30 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73  nd command $args
14a40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
14a50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14a60 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
14a70 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
14a80 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
14a90 62 6c 65 73 20 74 6f 0d 0a 20 20 20 20 20 20 20  bles to..       
14aa0 20 23 20 20 20 20 20 20 20 74 68 65 20 76 61 72   #       the var
14ab0 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76  iable names prov
14ac0 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
14ad0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
14ae0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
14af0 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75  ing length $resu
14b00 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  ltsVarName] > 0}
14b10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14b20 20 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75     upvar 1 $resu
14b30 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c  ltsVarName resul
14b40 74 73 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ts..        }...
14b50 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
14b60 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72  ring length $err
14b70 6f 72 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  orsVarName] > 0}
14b80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14b90 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72 6f     upvar 1 $erro
14ba0 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  rsVarName errors
14bb0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
14bc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14bd0 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
14be0 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
14bf0 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72  ed [compileCShar
14c00 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 0d 0a  p] command and..
14c10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  return the resul
14c30 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
14c40 20 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d         eval $com
14c50 6d 61 6e 64 0d 0a 20 20 20 20 20 20 7d 20 66 69  mand..      } fi
14c60 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
14c70 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14c80 54 45 3a 20 49 66 20 74 68 65 20 43 23 20 63 6f  TE: If the C# co
14c90 6d 70 69 6c 65 72 20 77 61 73 20 69 6e 76 6f 6b  mpiler was invok
14ca0 65 64 20 75 73 69 6e 67 20 5b 65 78 65 63 5d 2c  ed using [exec],
14cb0 20 72 65 73 65 74 20 74 68 65 0d 0a 20 20 20 20   reset the..    
14cc0 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
14cd0 69 6f 75 73 20 70 72 6f 63 65 73 73 20 69 64 65  ious process ide
14ce0 6e 74 69 66 69 65 72 20 6e 6f 77 20 28 69 2e 65  ntifier now (i.e
14cf0 2e 20 74 68 61 74 20 77 61 79 2c 20 69 74 20 64  . that way, it d
14d00 6f 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  oes..        #  
14d10 20 20 20 20 20 6e 6f 74 20 73 68 6f 77 20 75 70       not show up
14d20 20 61 73 20 62 65 69 6e 67 20 22 6c 65 61 6b 65   as being "leake
14d30 64 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  d")...        #.
14d40 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
14d50 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65  DotNetCore]} the
14d60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
14d70 61 74 63 68 20 7b 69 6e 66 6f 20 70 72 65 76 69  atch {info previ
14d80 6f 75 73 70 69 64 20 74 72 75 65 7d 0d 0a 20 20  ouspid true}..  
14d90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14da0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14db0 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20  proc isMemoryDb 
14dc0 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
14dd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
14de0 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70   NOTE: Is the sp
14df0 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73 65  ecified database
14e00 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c   file name reall
14e10 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y an in-memory d
14e20 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20  atabase?..      
14e30 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
14e40 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65  [expr {$fileName
14e50 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c   eq ":memory:" |
14e60 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  | \..          [
14e70 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69  string range $fi
14e80 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20  leName 0 12] eq 
14e90 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d  "file::memory:"}
14ea0 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
14eb0 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44   proc isTableInD
14ec0 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d  b { name {varNam
14ed0 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
14ee0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14ef0 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
14f00 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
14f10 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
14f20 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
14f30 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
14f40 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63     caller.  It c
14f50 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
14f60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14f70 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c  handle that will
14f80 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
14f90 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75     used to execu
14fa0 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73 65  te the query use
14fb0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
14fc0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
14fd0 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
14fe0 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
14ff0 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  hat database... 
15000 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
15010 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
15020 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
15030 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
15040 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
15050 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72  r table to deter
15060 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65  mine if the name
15070 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20  d table is..    
15080 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
15090 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
150a0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
150b0 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20     set sql {..  
150c0 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55        SELECT COU
150d0 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  NT(*) FROM sqlit
150e0 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
150f0 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e  ype = 'table' AN
15100 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20  D name = ?;..   
15110 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
15120 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
15130 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
15140 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
15150 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20  e is present... 
15160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
15170 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
15180 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75        [sql execu
15190 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
151a0 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73  ar $db $sql [lis
151b0 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20  t param1 String 
151c0 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20  $name]] > 0..   
151d0 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d     }]..    }....
151e0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
151f0 65 66 61 75 6c 74 50 61 67 65 53 69 7a 65 20 7b  efaultPageSize {
15200 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
15210 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
15220 6c 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73  l "PRAGMA page_s
15230 69 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20 72 65  ize;" scalar} re
15240 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
15250 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
15260 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
15270 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15280 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a 20 20      return 0..  
15290 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
152a0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 44  .    proc getDbD
152b0 65 66 61 75 6c 74 43 61 63 68 65 53 69 7a 65 20  efaultCacheSize 
152c0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  {} {..      if {
152d0 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
152e0 71 6c 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  ql "PRAGMA cache
152f0 5f 73 69 7a 65 3b 22 20 73 63 61 6c 61 72 7d 20  _size;" scalar} 
15300 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
15310 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
15320 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
15330 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
15340 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 0d 0a        return 0..
15350 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
15360 0c 0d 0a 20 20 20 20 70 72 6f 63 20 75 73 65 4c  ...    proc useL
15370 65 67 61 63 79 44 62 50 61 67 65 41 6e 64 43 61  egacyDbPageAndCa
15380 63 68 65 53 69 7a 65 73 20 7b 20 76 61 72 4e 61  cheSizes { varNa
15390 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  me } {..      #.
153a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
153b0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
153c0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
153d0 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
153e0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
153f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15400 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
15410 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
15420 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
15430 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
15440 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15450 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
15460 71 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20  queries used to 
15470 73 65 74 20 74 68 65 20 70 61 67 65 20 61 6e 64  set the page and
15480 20 63 61 63 68 65 20 73 69 7a 65 73 2e 0d 0a 20   cache sizes... 
15490 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
154a0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
154b0 62 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c 20 65  b....      sql e
154c0 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a 20 20  xecute $db {..  
154d0 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
154e0 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0d 0a  e_size = 1024;..
154f0 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 63          PRAGMA c
15500 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 30  ache_size = 2000
15510 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
15520 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
15530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
15540 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
15550 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 22  ute scalar $db "
15560 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
15570 3b 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ;"] \..         
15580 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65   [sql execute -e
15590 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64  xecute scalar $d
155a0 62 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  b "PRAGMA cache_
155b0 73 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20 7d 0d  size;"]]..    }.
155c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6e 6f 72  ....    proc nor
155d0 6d 61 6c 69 7a 65 45 78 63 65 70 74 69 6f 6e 4d  malizeExceptionM
155e0 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
155f0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
15600 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
15610 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
15620 7b 72 65 74 75 72 6e 20 24 76 61 6c 75 65 7d 0d  {return $value}.
15630 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73  .      return [s
15640 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
15650 5c 72 5c 6e 20 22 20 3d 3d 3e 20 22 20 5c 6e 20  \r\n " ==> " \n 
15660 22 20 3d 3d 3e 20 22 5d 20 24 76 61 6c 75 65 5d  " ==> "] $value]
15670 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
15680 70 72 6f 63 20 65 78 74 72 61 63 74 53 79 73 74  proc extractSyst
15690 65 6d 44 61 74 61 53 51 4c 69 74 65 45 78 63 65  emDataSQLiteExce
156a0 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 7b 20 76  ptionMessage { v
156b0 61 6c 75 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  alue } {..      
156c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
156d0 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   If the string c
156e0 6f 6e 66 6f 72 6d 73 20 74 6f 20 66 6f 72 6d 61  onforms to forma
156f0 74 20 6f 66 20 74 68 65 20 6e 6f 72 6d 61 6c 20  t of the normal 
15700 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20 20 20 20  exception..     
15710 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 73   #       error s
15720 74 72 69 6e 67 73 2c 20 65 78 74 72 61 63 74 20  trings, extract 
15730 61 6e 64 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20  and return only 
15740 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
15750 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15760 20 70 6f 72 74 69 6f 6e 20 69 74 73 65 6c 66 2e   portion itself.
15770 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15780 20 73 65 74 20 70 61 74 74 65 72 6e 73 20 5b 6c   set patterns [l
15790 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 7b 53 79  ist \..      {Sy
157a0 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51 4c 69  stem\.Data\.SQLi
157b0 74 65 5c 2e 53 51 4c 69 74 65 45 78 63 65 70 74  te\.SQLiteExcept
157c0 69 6f 6e 20 5c 28 30 78 28 3f 3a 30 7c 38 29 5b  ion \(0x(?:0|8)[
157d0 30 2d 39 41 2d 46 61 2d 66 5d 7b 37 7d 5c 29 3a  0-9A-Fa-f]{7}\):
157e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 28 2e 2b  \..          (.+
157f0 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d  ?)  (?: )?at} \.
15800 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
15810 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
15820 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20 28  LiteException: (
15830 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20  .+?)  (?: )?at} 
15840 5c 0d 0a 20 20 20 20 20 20 7b 45 61 67 6c 65 5c  \..      {Eagle\
15850 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 5c 2e 50 75  ._Components\.Pu
15860 62 6c 69 63 5c 2e 53 63 72 69 70 74 45 78 63 65  blic\.ScriptExce
15870 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f  ption: (.+?)  (?
15880 3a 20 29 3f 61 74 7d 5d 0d 0a 0d 0a 20 20 20 20  : )?at}]....    
15890 20 20 66 6f 72 65 61 63 68 20 70 61 74 74 65 72    foreach patter
158a0 6e 20 24 70 61 74 74 65 72 6e 73 20 7b 0d 0a 20  n $patterns {.. 
158b0 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67 65         if {[rege
158c0 78 70 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24  xp -- $pattern $
158d0 76 61 6c 75 65 20 64 75 6d 6d 79 20 6d 65 73 73  value dummy mess
158e0 61 67 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  age]} then {..  
158f0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73 73          set mess
15900 61 67 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  age [string map 
15910 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d 20 5b  [list \r\n \n] [
15920 73 74 72 69 6e 67 20 74 72 69 6d 20 24 6d 65 73  string trim $mes
15930 73 61 67 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20  sage]]..        
15940 20 20 73 65 74 20 6c 69 6e 65 73 20 5b 73 70 6c    set lines [spl
15950 69 74 20 24 6d 65 73 73 61 67 65 20 5c 6e 5d 0d  it $message \n].
15960 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
15970 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73  {[llength $lines
15980 5d 20 3d 3d 20 32 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 2} then {..
15990 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
159a0 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30  [lindex $lines 0
159b0 5d 20 65 71 20 5b 6c 69 6e 64 65 78 20 24 6c 69  ] eq [lindex $li
159c0 6e 65 73 20 31 5d 7d 20 74 68 65 6e 20 7b 0d 0a  nes 1]} then {..
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
159e0 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 6c 69  turn [lindex $li
159f0 6e 65 73 20 30 5d 0d 0a 20 20 20 20 20 20 20 20  nes 0]..        
15a00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15a10 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
15a20 65 6e 64 41 72 67 73 20 5b 6c 69 6e 64 65 78 20  endArgs [lindex 
15a30 24 6c 69 6e 65 73 20 30 5d 20 22 20 2d 2d 20 22  $lines 0] " -- "
15a40 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
15a50 31 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  1]]..          }
15a60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
15a70 74 75 72 6e 20 24 6d 65 73 73 61 67 65 0d 0a 20  turn $message.. 
15a80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15a90 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
15aa0 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 7d 0d  n $value..    }.
15ab0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69  ....    proc tri
15ac0 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a  mSql { sql } {..
15ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65        return [re
15ae0 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73  gsub -all -- {\s
15af0 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  +} [string trim 
15b00 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20  $sql] " "]..    
15b10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
15b20 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20  xecuteSql { sql 
15b30 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b  {execute none} {
15b40 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69  format none} {fi
15b50 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
15b60 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
15b70 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  g length $fileNa
15b80 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
15b90 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65  set fileName :me
15ba0 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65  mory:}..      se
15bb0 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  tupDb $fileName 
15bc0 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20 66  "" "" "" "" "" f
15bd0 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
15be0 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d 0a   false db true..
15bf0 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20  ..      try {.. 
15c00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75         return [u
15c10 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c  plevel 1 [list \
15c20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
15c30 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75  l execute -execu
15c40 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f 72  te $execute -for
15c50 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62 20  mat $format $db 
15c60 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  $sql]]..      } 
15c70 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20  finally {..     
15c80 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
15c90 6e 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  n [getDbConnecti
15ca0 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  on]....        t
15cb0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry {..          
15cc0 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e  cleanupDb $fileN
15cd0 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66 61 6c  ame db false fal
15ce0 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  se false..      
15cf0 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
15d00 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
15d10 66 6c 61 67 73 20 24 63 6f 6e 6e 65 63 74 69 6f  flags $connectio
15d20 6e 20 2d 4e 6f 44 69 73 70 6f 73 65 3b 20 66 72  n -NoDispose; fr
15d30 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  eeDbConnection..
15d40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15d50 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
15d60 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61 67    proc hasNoFlag
15d70 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e 65  s { varName none
15d80 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61   } {..      upva
15d90 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c 61  r 1 $varName fla
15da0 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  gs....      if {
15db0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 6c  ![info exists fl
15dc0 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ags]} then {..  
15dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
15de0 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
15df0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15e00 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d  length $flags] =
15e10 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
15e20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
15e30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15e40 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26 20     if {$none && 
15e50 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65 22  $flags eq "None"
15e60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15e70 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
15e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15e90 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
15ea0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15eb0 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c   getConnectionFl
15ec0 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66  ags { fileName f
15ed0 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c 73  lags {quiet fals
15ee0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
15ef0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
15f00 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
15f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
15f20 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  me or connection
15f30 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a 20   string these.. 
15f40 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
15f50 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69  nection flags wi
15f60 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70 6c  ll actually appl
15f70 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 6e  y to.  This is n
15f80 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  ot necessary..  
15f90 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 71      #       in q
15fa0 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75 73  uiet mode becaus
15fb0 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
15fc0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
15fd0 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20  for logging..   
15fe0 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
15ff0 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65  eporting purpose
16000 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
16010 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
16020 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16030 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
16040 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20  th $fileName] > 
16050 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16060 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
16070 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 66  e [appendArgs "f
16080 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66 69  ile name \"" $fi
16090 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20  leName \"]..    
160a0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
160b0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74  nfo exists ::dat
160c0 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20  aSource] && \.. 
160d0 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72 72             ![arr
160e0 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61  ay exists ::data
160f0 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d  Source]} then {.
16100 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64  .          set d
16110 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41  atabase [appendA
16120 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63 65  rgs "data source
16130 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75 72   \"" $::dataSour
16140 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  ce \"]..        
16150 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
16160 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
16170 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20   <unknown>..    
16180 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
16190 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
161a0 20 23 20 4e 4f 54 45 3a 20 45 76 65 6e 20 74 68   # NOTE: Even th
161b0 6f 75 67 68 20 74 68 65 72 65 20 69 73 20 6f 6e  ough there is on
161c0 6c 79 20 6f 6e 65 20 73 6f 75 72 63 65 20 6f 66  ly one source of
161d0 20 66 6c 61 67 73 20 73 6f 20 66 61 72 2c 20 74   flags so far, t
161e0 68 65 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hey..      #    
161f0 20 20 20 6d 75 73 74 20 62 65 20 63 6f 6d 62 69     must be combi
16200 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ned using the co
16210 72 72 65 63 74 20 73 79 6e 74 61 78 20 66 6f 72  rrect syntax for
16220 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
16230 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67 20     #       flag 
16240 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 2e  values for the .
16250 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a  NET Framework...
16260 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
16270 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
16280 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 22 22  eFlags $flags ""
16290 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
162a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
162b0 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
162c0 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
162d0 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
162e0 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
162f0 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
16300 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
16310 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16320 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
16330 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
16340 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16350 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
16360 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
16370 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
16380 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
16390 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e  tLocalFlagsIfNon
163a0 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
163b0 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
163c0 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
163d0 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
163e0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
163f0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16400 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16410 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
16420 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
16430 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
16440 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
16450 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b        " are: " [
16460 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
16470 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  gs flags false] 
16480 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
16490 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
164a0 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
164b0 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
164c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
164d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
164e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
164f0 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
16500 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
16510 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
16520 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
16530 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
16540 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
16550 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
16560 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
16570 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
16580 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
16590 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
165a0 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
165b0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
165c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
165d0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
165e0 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
165f0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
16600 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
16610 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
16620 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e  SharedFlagsIfNon
16630 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
16640 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
16650 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
16660 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b  s true])} then {
16670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
16680 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
16690 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
166a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
166b0 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
166c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
166d0 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
166e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
166f0 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
16700 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
16710 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75   sharedFlags tru
16720 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
16730 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
16740 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c  rgs \" $sharedFl
16750 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
16760 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
16770 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16780 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
16790 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
167a0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
167b0 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
167c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
167d0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
167e0 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
167f0 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29  gsIfUnavailable)
16800 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16810 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16820 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
16830 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16840 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16850 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
16860 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
16870 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
16890 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65  re: <unavailable
168a0 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  >\n"]..         
168b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
168c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
168d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
168e0 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
168f0 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f  the detected glo
16900 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
16910 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  lags, if any... 
16920 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16930 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16940 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
16950 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16960 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
16970 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
16980 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
16990 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
169a0 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  obalFlagsIfNone)
169b0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
169c0 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
169d0 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
169e0 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
169f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16a00 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16a10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16a20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16a30 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
16a40 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
16a50 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20   are: " \..     
16a60 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
16a70 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63  ![hasNoFlags ::c
16a80 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
16a90 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
16aa0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
16ab0 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e  dArgs \" $::conn
16ac0 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d  ection_flags \"]
16ad0 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
16ae0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16af0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
16b00 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16b10 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
16b20 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73   global (per tes
16b30 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f  t run) connectio
16b40 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c  n flags currentl
16b50 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
16b60 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e   set, use them n
16b70 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62  ow (i.e. by comb
16b80 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20  ining them with 
16b90 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69  the ones for thi
16ba0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
16bb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
16bc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16bd0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
16be0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
16bf0 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
16c00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16c10 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
16c20 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
16c30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
16c40 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
16c50 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
16c60 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
16c70 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16c80 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
16c90 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
16ca0 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
16cb0 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
16cc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16cd0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
16ce0 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66   log) the new ef
16cf0 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69  fective connecti
16d00 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
16d10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
16d20 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16d30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
16d40 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
16d50 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
16d60 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
16d70 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
16d80 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16d90 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
16da0 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
16dc0 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
16dd0 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
16de0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
16df0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
16e00 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16e10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16e20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
16e30 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
16e40 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
16e50 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
16e60 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
16e70 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
16e80 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
16e90 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
16ea0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
16eb0 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
16ec0 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
16ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
16ee0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16ef0 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
16f00 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d  n $flags..    }.
16f10 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
16f20 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20  FlagsProperty { 
16f30 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
16f40 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
16f50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16f60 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77  OTE: Determine w
16f70 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  hat the combined
16f80 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63   (global and loc
16f90 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  al) connection..
16fa0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
16fb0 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70  ags should be, p
16fc0 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e  ossibly quietly.
16fd0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16fe0 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
16ff0 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
17000 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  " $flags $quiet]
17010 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
17020 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f     # NOTE: If no
17030 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c   global or local
17040 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
17050 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
17060 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  , the..      #  
17070 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e       default con
17080 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68  nection flags sh
17090 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68  ould be used; th
170a0 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d  erefore, return.
170b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
170c0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
170d0 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20  n that case...  
170e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
170f0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
17100 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
17110 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
17120 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
17130 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
17140 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72     # NOTE: In or
17150 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20  der to check if 
17160 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
17170 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
17180 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20   being used..   
17190 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73     #       it is
171a0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74   necessary to at
171b0 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69  tempt a conversi
171c0 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  on to the actual
171d0 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
171e0 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e     #       type.
171f0 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20    Failing that, 
17200 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73  the check agains
17210 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  t the default va
17220 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  lue will be..   
17230 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
17240 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
17250 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
17260 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72  ..        set er
17270 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
17280 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  RED....        o
17290 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
172a0 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
172b0 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
172c0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
172d0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
172e0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
172f0 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c  s "" $flags null
17300 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20   true \..       
17310 20 20 20 20 20 74 72 75 65 20 74 72 75 65 20 65       true true e
17320 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76 61  rror..      } va
17330 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
17340 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17350 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
17360 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68 65  ing to parse the
17370 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
17380 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69 70  s caused a scrip
17390 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
173a0 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74 20     error.  Emit 
173b0 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68 65  a warning to the
173c0 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 61   test log file a
173d0 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  nd continue..   
173e0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
173f0 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72 69  ng an emtpy stri
17400 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20  ng instead...   
17410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17420 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67 73  tlog [appendArgs
17430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17440 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
17450 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20 63  ailed to parse c
17460 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c  onnection flags,
17470 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
17480 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 76           \n\t $v
17490 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  alue \n]....    
174a0 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22 22      set value ""
174b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
174c0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
174d0 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69  TE: If the combi
174e0 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67  ned flags string
174f0 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61   could not actua
17500 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64  lly be converted
17510 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17520 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  to the enumerate
17530 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68 65  d type it is the
17540 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20   default value, 
17550 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20  then just use.. 
17560 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 20       #       it 
17570 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77  verbatim; otherw
17580 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  ise, just return
17590 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
175a0 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20  .  In that..    
175b0 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c 20    #       case, 
175c0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
175d0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c  ection flags wil
175e0 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  l be used...    
175f0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
17600 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
17610 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76  alue] == 0 || $v
17620 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74  alue ne "Default
17630 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
17640 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17650 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65  WARNING: This re
17660 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
17670 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
17680 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f  mbined flags, no
17690 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
176a0 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72        the enumer
176b0 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69  ated value.  Thi
176c0 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20 61  s is by design a
176d0 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20  nd should not.. 
176e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
176f0 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69 74    be changed wit
17700 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e  hout careful con
17710 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e  sideration (e.g.
17720 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20   it would..     
17730 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70 72     #          pr
17740 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65  event the SQLite
17750 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73  Connection class
17760 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69   from allowing i
17770 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20  nvalid..        
17780 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67  #          ["mag
17790 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67  ical"] meta-flag
177a0 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s)...        #..
177b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
177c0 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67  appendArgs "Flag
177d0 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a  s=" $flags \;]..
177e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
177f0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
17800 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
17810 65 74 54 65 73 74 50 72 6f 70 65 72 74 69 65 73  etTestProperties
17820 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71   { {flags ""} {q
17830 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
17840 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17850 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 77 69  # NOTE: Start wi
17860 74 68 20 22 46 6c 61 67 73 22 20 70 72 6f 70 65  th "Flags" prope
17870 72 74 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  rty for the new 
17880 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 66 20 61  connection, if a
17890 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ny...      #..  
178a0 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
178b0 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72 74 79  getFlagsProperty
178c0 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d   $flags $quiet].
178d0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
178e0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
178f0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
17900 72 72 65 6e 74 20 74 65 73 74 20 66 69 6c 65 2c  rrent test file,
17910 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   if available.  
17920 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20 23  This is..      #
17930 20 20 20 20 20 20 20 6f 6e 6c 79 20 75 73 65 64         only used
17940 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0d   for debugging..
17950 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17960 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
17970 20 3a 3a 74 65 73 74 5f 66 69 6c 65 5d 7d 20 74   ::test_file]} t
17980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
17990 70 70 65 6e 64 20 72 65 73 75 6c 74 20 54 65 73  ppend result Tes
179a0 74 46 69 6c 65 3d 20 24 3a 3a 74 65 73 74 5f 66  tFile= $::test_f
179b0 69 6c 65 20 5c 3b 0d 0a 20 20 20 20 20 20 7d 0d  ile \;..      }.
179c0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
179d0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
179e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
179f0 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20 61  rrent test, if a
17a00 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20  vailable.  This 
17a10 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 23  is only..      #
17a20 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72 20         used for 
17a30 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20  debugging...    
17a40 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
17a50 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61  info exists ::ea
17a60 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e  gle_tests(Curren
17a70 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  tName)]} then {.
17a80 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
17a90 72 65 73 75 6c 74 20 54 65 73 74 4e 61 6d 65 3d  result TestName=
17aa0 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
17ab0 43 75 72 72 65 6e 74 4e 61 6d 65 29 20 5c 3b 0d  CurrentName) \;.
17ac0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17ad0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
17ae0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
17af0 70 72 6f 63 20 65 6e 61 62 6c 65 53 68 61 72 65  proc enableShare
17b00 64 43 61 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c  dCache { channel
17b10 20 65 6e 61 62 6c 65 20 7b 71 75 69 65 74 20 66   enable {quiet f
17b20 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
17b30 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
17b40 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
17b50 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
17b60 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
17b70 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
17b80 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
17b90 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17bb0 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
17bc0 64 5f 63 61 63 68 65 20 5b 65 78 70 72 20 69 6e  d_cache [expr in
17bd0 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20  t($enable)]..   
17be0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
17bf0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17c00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17c10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17c20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17c30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
17c50 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
17c60 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
17c70 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c  ache(" $enable \
17c80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17c90 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ")... ok: " $res
17ca0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17cb0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
17cc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
17cd0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
17ce0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
17cf0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
17d00 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
17d10 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
17d20 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  l sqlite3_enable
17d30 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20  _shared_cache(" 
17d40 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20  $enable \..     
17d50 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 65           ")... e
17d60 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
17d70 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
17d80 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
17d90 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17da0 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20   setupDb {..    
17db0 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
17dc0 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65   {mode ""} {date
17dd0 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b  TimeFormat ""} {
17de0 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d  dateTimeKind ""}
17df0 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20   {flags ""}..   
17e00 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20           {extra 
17e10 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ""} {qualify tru
17e20 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d  e} {delete true}
17e30 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20   {uri false}..  
17e40 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f            {tempo
17e50 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e  rary true} {varN
17e60 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74 20 66  ame db} {quiet f
17e70 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
17e80 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17e90 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
17ea0 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
17eb0 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
17ec0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
17ed0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17ee0 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
17ef0 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
17f00 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
17f10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
17f20 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20  r now, all test 
17f30 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20 62  databases used b
17f40 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
17f50 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20 20   are placed..   
17f60 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
17f70 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
17f80 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64 61  ectory.  Each da
17f90 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61 74  tabase and relat
17fa0 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ed files..      
17fb0 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79 20  #       used by 
17fc0 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65  a test should be
17fd0 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74   cleaned up by t
17fe0 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20 74  hat test using t
17ff0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
18000 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70 72    "cleanupDb" pr
18010 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d  ocedure, below..
18020 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18030 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
18040 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e  & $qualify} then
18050 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
18060 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  fileName [file j
18070 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65  oin [getDatabase
18080 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65  Directory] [file
18090 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
180a0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
180b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
180c0 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c  OTE: By default,
180d0 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
180e0 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
180f0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
18100 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  file..      #   
18110 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20 63      name if it c
18120 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2e  urrently exists.
18130 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18140 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
18150 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66  && $delete && [f
18160 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
18170 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
18180 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18190 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
181a0 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  t to delete any 
181b0 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
181c0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
181d0 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
181e0 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d    #       name..
181f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18200 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
18210 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
18220 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74  eName} error]} t
18230 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18240 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
18250 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
18260 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
18270 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
18280 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
18290 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
182a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
182b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
182c0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
182d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
182e0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
182f0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
18300 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
18310 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  elete database f
18320 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
18330 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
18340 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
18350 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  setup, error: " 
18360 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
18370 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18380 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
18390 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
183a0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
183b0 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
183c0 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
183d0 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
183e0 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
183f0 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
18400 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
18410 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  to the opened da
18420 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73  tabase will be s
18430 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
18440 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
18450 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
18460 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18470 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
18480 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f   building the co
18490 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
184a0 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69    The only requi
184b0 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  red portion..   
184c0 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
184d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
184e0 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20  ing is the data 
184f0 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f  source, which co
18500 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20  ntains the..    
18510 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
18520 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73  se file name its
18530 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c  elf.  If our cal
18540 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ler wants to use
18550 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20   a URI as..     
18560 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74   #       the dat
18570 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68  a source, use th
18580 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63  e FullUri connec
18590 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
185a0 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23  erty to..      #
185b0 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
185c0 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73  he data source s
185d0 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67  tring from being
185e0 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20   mangled...     
185f0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75   #..      if {$u
18600 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ri} then {..    
18610 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
18620 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69  on {FullUri=${fi
18630 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
18640 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18650 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
18660 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b   {Data Source=${
18670 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
18680 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
18690 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
186a0 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75  nce this procedu
186b0 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61  re has no specia
186c0 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77  l knowledge of w
186d0 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d  hat the default.
186e0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
186f0 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68  etting is for th
18700 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e  e ToFullPath con
18710 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
18720 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a  ropery, always..
18730 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
18740 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b  d the value we k
18750 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65  now about to the
18760 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
18770 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
18780 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
18790 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61  ction {;ToFullPa
187a0 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a  th=${qualify}}..
187b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
187c0 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
187d0 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
187e0 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c   a journal mode,
187f0 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
18800 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
18810 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
18820 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
18830 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
18840 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
18850 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65  ing length $mode
18860 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
18870 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
18880 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e  nnection {;Journ
18890 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d  al Mode=${mode}}
188a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
188b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
188c0 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
188d0 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
188e0 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61  teTime format, a
188f0 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
18900 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18910 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
18920 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
18930 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
18940 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18950 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
18960 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  meFormat] > 0} t
18970 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
18980 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
18990 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61   {;DateTimeForma
189a0 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  t=${dateTimeForm
189b0 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  at}}..      }...
189c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
189d0 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
189e0 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
189f0 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20  a DateTimeKind, 
18a00 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
18a10 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
18a20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
18a30 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
18a40 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
18a50 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
18a60 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
18a70 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68  imeKind] > 0} th
18a80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
18a90 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
18aa0 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24  {;DateTimeKind=$
18ab0 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d  {dateTimeKind}}.
18ac0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18ad0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18ae0 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  E: Figure out wh
18af0 61 74 20 74 68 65 20 66 69 6e 61 6c 20 66 6c 61  at the final fla
18b00 67 73 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  gs for this conn
18b10 65 63 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62  ection need to b
18b20 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
18b30 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65     set flags [ge
18b40 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  tConnectionFlags
18b50 20 24 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67   $fileName $flag
18b60 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
18b70 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18b80 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
18b90 72 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  r specified some
18ba0 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
18bb0 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d  nFlags, add the.
18bc0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
18bd0 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
18be0 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
18bf0 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
18c00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
18c10 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
18c20 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  h $flags] > 0} t
18c30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
18c40 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
18c50 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73   {;Flags=${flags
18c60 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
18c70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18c80 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
18c90 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e  ler specified an
18ca0 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74   extra payload t
18cb0 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
18cc0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18cd0 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69  string, append i
18ce0 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  t now...      #.
18cf0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
18d00 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61  ng length $extra
18d10 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
18d20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
18d30 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74  nnection \; $ext
18d40 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ra..      }.... 
18d50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18d60 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61  NOTE: Add the na
18d70 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
18d80 74 20 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20  t test file, if 
18d90 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
18da0 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
18db0 20 20 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72     only used for
18dc0 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
18dd0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
18de0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
18df0 65 73 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20  est_file]} then 
18e00 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
18e10 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54  d connection {;T
18e20 65 73 74 46 69 6c 65 3d 24 7b 3a 3a 74 65 73 74  estFile=${::test
18e30 5f 66 69 6c 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  _file}}..      }
18e40 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
18e50 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
18e60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
18e70 75 72 72 65 6e 74 20 74 65 73 74 2c 20 69 66 20  urrent test, if 
18e80 61 76 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73  available.  This
18e90 20 69 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20   is only..      
18ea0 23 20 20 20 20 20 20 20 75 73 65 64 20 66 6f 72  #       used for
18eb0 20 64 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20   debugging...   
18ec0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
18ed0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
18ee0 61 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65  agle_tests(Curre
18ef0 6e 74 4e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ntName)]} then {
18f00 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
18f10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 65   connection {;Te
18f20 73 74 4e 61 6d 65 3d 24 7b 3a 3a 65 61 67 6c 65  stName=${::eagle
18f30 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61  _tests(CurrentNa
18f40 6d 65 29 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  me)}}..      }..
18f50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18f60 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 63 6c 61   # NOTE: For cla
18f70 72 69 74 79 2c 20 61 70 70 65 6e 64 20 61 20 66  rity, append a f
18f80 69 6e 61 6c 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  inal semicolon t
18f90 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
18fa0 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
18fb0 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
18fc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 0d 0a 0d  connection \;...
18fd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18fe0 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65  # NOTE: Open the
18ff0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19000 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e  tion now, placin
19010 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61 6e  g the opaque han
19020 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 20  dle value..     
19030 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68   #       into th
19040 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63 69  e variable speci
19050 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
19060 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
19070 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c 20      set db [sql 
19080 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69 74  open -type SQLit
19090 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65 63  e [subst $connec
190a0 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tion]]....      
190b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
190c0 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 74   Configure the t
190d0 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
190e0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79  ry for the newly
190f0 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
19100 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
19110 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75  connection now u
19120 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72  nless our caller
19130 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20   forbids it...  
19140 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19150 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20 21  {$temporary && !
19160 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
19170 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44 69  o(setTemporaryDi
19180 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
19190 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65  {..        sql e
191a0 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70 65  xecute $db [appe
191b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
191c0 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74 65        "PRAGMA te
191d0 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
191e0 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d  ry = \"" [getTem
191f0 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d  poraryDirectory]
19200 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\;]..      }.
19210 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19220 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f 72    # NOTE: Perfor
19230 6d 20 61 6e 79 20 65 78 74 72 61 20 70 65 72 2d  m any extra per-
19240 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75 70  connection setup
19250 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f   for the newly o
19260 70 65 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20  pened..      #  
19270 20 20 20 20 20 64 61 74 61 62 61 73 65 20 6e 6f       database no
19280 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
19290 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
192a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
192b0 73 65 74 20 65 78 65 63 75 74 65 4f 6e 53 65 74  set executeOnSet
192c0 75 70 20 5b 67 65 74 45 78 65 63 75 74 65 4f 6e  up [getExecuteOn
192d0 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20 20 20 20  Setup]....      
192e0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
192f0 74 68 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74  th $executeOnSet
19300 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  up] > 0 && \..  
19310 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65          ![info e
19320 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 75  xists ::no(execu
19330 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20 74 68 65  teOnSetup)]} the
19340 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
19350 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19360 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79  This command may
19370 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3b   raise an error;
19380 20 69 66 20 73 6f 2c 20 74 68 61 74 20 69 73 20   if so, that is 
19390 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20 20 20 20  fine, as..      
193a0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65 6e    #       the en
193b0 63 6c 6f 73 69 6e 67 20 74 65 73 74 20 77 69 6c  closing test wil
193c0 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20 20 54 68  l then fail.  Th
193d0 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61 6e  e [subst] comman
193e0 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  d is..        # 
193f0 20 20 20 20 20 20 75 73 65 64 20 6f 6e 20 74 68        used on th
19400 65 20 53 51 4c 20 69 6e 20 63 61 73 65 20 69 74  e SQL in case it
19410 20 6e 65 65 64 73 20 74 6f 20 72 65 66 65 72 20   needs to refer 
19420 74 6f 20 73 74 61 74 65 20 69 6e 20 6f 75 72 0d  to state in our.
19430 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
19440 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20   context...     
19450 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 71     #..        sq
19460 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 73  l execute $db [s
19470 75 62 73 74 20 24 65 78 65 63 75 74 65 4f 6e 53  ubst $executeOnS
19480 65 74 75 70 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  etup]..      }..
19490 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
194a0 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20   # NOTE: Always 
194b0 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65  return the conne
194c0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f  ction handle upo
194d0 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20  n success...    
194e0 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
194f0 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  n $db..    }....
19500 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 43  .    proc getDbC
19510 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
19520 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20  Name db} } {..  
19530 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
19540 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
19550 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
19560 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
19570 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
19580 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
19590 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
195a0 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
195b0 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
195c0 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
195d0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
195e0 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
195f0 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
19600 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
19610 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
19620 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
19630 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
19640 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
19650 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41 44  s returns the AD
19660 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63 74  O.NET IDbConnect
19670 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61  ion object insta
19680 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20 20  nce for the..   
19690 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69     #       speci
196a0 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61 6e  fied databse han
196b0 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74 74  dle.  Since gett
196c0 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ing this object 
196d0 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20  relies upon..   
196e0 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
196f0 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65 61   internals, grea
19700 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65  t care should be
19710 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20   taken to avoid 
19720 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20  disposing of..  
19730 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
19740 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65 72   object or other
19750 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74 20  wise putting it 
19760 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  into an invalid 
19770 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  state...      #.
19780 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
19790 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65   exists db]} the
197a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
197b0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
197c0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
197d0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
197e0 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67  blic -objectflag
197f0 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61 6c  s +NoDispose -al
19800 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
19810 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65 72       Interpreter
19820 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
19830 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62 0d  ctions Item $db.
19840 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
19850 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
19860 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
19870 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19880 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  Success, return 
19890 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
198a0 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
198b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
198c0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
198d0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
198e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
198f0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
19900 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70 6f  E: Failure, repo
19910 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
19920 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19930 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19940 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19950 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19960 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
19970 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
19980 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
19990 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 5c  e for database \
199a0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
199b0 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72      $db "\", err
199c0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
199d0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
199e0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
199f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
19a00 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65  OTE: Failure, re
19a10 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f 75 73 6c  turn an obviousl
19a20 79 20 69 6e 76 61 6c 69 64 20 6f 70 61 71 75 65  y invalid opaque
19a30 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
19a40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19a50 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
19a60 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72  .....    proc fr
19a70 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  eeDbConnection {
19a80 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   {varName connec
19a90 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  tion} } {..     
19aa0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19ab0 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
19ac0 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
19ad0 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74  e (e.g. "connect
19ae0 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20  ion") in the..  
19af0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
19b00 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65  ext of our calle
19b10 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f  r.  The opaque o
19b20 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72  bject handle for
19b30 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20   an ADO.NET..   
19b40 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
19b50 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
19b60 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
19b70 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73  tDbConnection] s
19b80 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20  hould be..      
19b90 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20 74  #       stored t
19ba0 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
19bb0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
19bc0 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
19bd0 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n....      #..  
19be0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
19bf0 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  mpt to remove th
19c00 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
19c10 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20  handle from the 
19c20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
19c30 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20     #       now. 
19c40 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69   This [object di
19c50 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c  spose] call will
19c60 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69   not actually di
19c70 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20  spose of the..  
19c80 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64 65      #       unde
19c90 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65  rlying object be
19ca0 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73  cause the +NoDis
19cb0 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73 65  pose flag was se
19cc0 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23  t on it..      #
19cd0 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63 72         during cr
19ce0 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  eation of the op
19cf0 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
19d00 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
19d10 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
19d20 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d  ists connection]
19d30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
19d40 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20   [catch {object 
19d50 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74  dispose $connect
19d60 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ion} error]} the
19d70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
19d80 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19d90 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
19da0 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
19db0 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77  handle, report w
19dc0 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
19dd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19de0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19df0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19e00 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
19e10 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
19e20 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  o remove connect
19e30 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24  ion handle \"" $
19e40 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20  connection \..  
19e50 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65            "\", e
19e60 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
19e70 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ror \n]..      }
19e80 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
19e90 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63  proc addDbConnec
19ea0 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f  tion { connectio
19eb0 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  n {varName db} }
19ec0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
19ed0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
19ee0 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
19ef0 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
19f00 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
19f10 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
19f20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
19f30 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
19f40 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
19f50 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
19f60 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
19f70 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72 65  : Create a corre
19f80 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e  ctly formatted n
19f90 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  ame for the data
19fa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19fb0 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
19fc0 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68    be added to th
19fd0 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
19fe0 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  y the Eagle inte
19ff0 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
1a000 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20  #..      set db 
1a010 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
1a020 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1a030 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61   \..          Ea
1a040 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e  gle._Components.
1a050 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70  Private.FormatOp
1a060 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74  s DatabaseObject
1a070 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  Name $connection
1a080 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
1a090 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b  LiteConnection [
1a0a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
1a0b0 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1a0c0 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a  ive NextId]]....
1a0d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1a0e0 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64   NOTE: Add the d
1a0f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a100 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
1a110 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65  ur caller to the
1a120 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20   list..      #  
1a130 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e       of those kn
1a140 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65  own to the Eagle
1a150 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1a160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62       #..      ob
1a170 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1a180 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e  gs +NonPublic In
1a190 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
1a1a0 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ive.connections 
1a1b0 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  Add \..         
1a1c0 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   $db $connection
1a1d0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a1e0 70 72 6f 63 20 72 65 6d 6f 76 65 44 62 54 72 61  proc removeDbTra
1a1f0 6e 73 61 63 74 69 6f 6e 20 7b 20 74 72 61 6e 73  nsaction { trans
1a200 61 63 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20  action } {..    
1a210 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1a220 45 3a 20 52 65 6d 6f 76 65 20 74 68 65 20 64 61  E: Remove the da
1a230 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1a240 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  on provided by o
1a250 75 72 20 63 61 6c 6c 65 72 20 66 72 6f 6d 20 74  ur caller from t
1a260 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
1a270 20 20 6c 69 73 74 20 6f 66 20 74 68 6f 73 65 20    list of those 
1a280 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67  known to the Eag
1a290 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
1a2a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a2b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1a2c0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1a2d0 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
1a2e0 63 74 69 76 65 2e 74 72 61 6e 73 61 63 74 69 6f  ctive.transactio
1a2f0 6e 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ns \..          
1a300 52 65 6d 6f 76 65 20 24 74 72 61 6e 73 61 63 74  Remove $transact
1a310 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
1a320 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
1a330 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
1a340 61 74 61 54 61 62 6c 65 20 7b 76 61 6c 75 65 43  ataTable {valueC
1a350 61 6c 6c 62 61 63 6b 20 22 22 7d 20 7d 20 7b 0d  allback ""} } {.
1a360 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73 20  .      set rows 
1a370 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73 65  [list]..      se
1a380 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54 61  t count [$dataTa
1a390 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e  ble Columns.Coun
1a3a0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20  t]....      for 
1a3b0 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24  {set index 0} {$
1a3c0 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20  index < $count} 
1a3d0 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
1a3e0 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
1a3f0 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61 62  Column [$dataTab
1a400 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e  le -alias Column
1a410 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65  s.get_Item $inde
1a420 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  x]..        set 
1a430 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b 24  names($index) [$
1a440 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d  dataColumn Colum
1a450 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  nName]..      }.
1a460 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1a470 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20    # NOTE: Setup 
1a480 73 6f 6d 65 20 54 63 6c 20 72 65 74 75 72 6e 20  some Tcl return 
1a490 63 6f 64 65 20 63 6f 6e 73 74 61 6e 74 73 2e 0d  code constants..
1a4a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a4b0 73 65 74 20 4f 6b 20 30 3b 20 73 65 74 20 45 72  set Ok 0; set Er
1a4c0 72 6f 72 20 31 3b 20 73 65 74 20 52 65 74 75 72  ror 1; set Retur
1a4d0 6e 20 32 3b 20 73 65 74 20 42 72 65 61 6b 20 33  n 2; set Break 3
1a4e0 3b 20 73 65 74 20 43 6f 6e 74 69 6e 75 65 20 34  ; set Continue 4
1a4f0 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
1a500 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
1a510 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74  dataRow [set dat
1a520 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c  aRows [$dataTabl
1a530 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20  e Rows]] {..    
1a540 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73      set row [lis
1a550 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f  t]....        fo
1a560 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
1a570 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
1a580 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
1a590 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1a5a0 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20  value [$dataRow 
1a5b0 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67  -create -alias g
1a5c0 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
1a5d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1a5e0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1a5f0 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 5d 20  $valueCallback] 
1a600 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1a610 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
1a620 65 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  e [catch {..    
1a630 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65            $value
1a640 43 61 6c 6c 62 61 63 6b 20 24 64 61 74 61 54 61  Callback $dataTa
1a650 62 6c 65 20 24 64 61 74 61 52 6f 77 20 24 69 6e  ble $dataRow $in
1a660 64 65 78 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  dex $value..    
1a670 20 20 20 20 20 20 20 20 7d 20 6e 65 77 56 61 6c          } newVal
1a680 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
1a690 20 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20     if {$code == 
1a6a0 24 4f 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  $Ok} then {..   
1a6b0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1a6d0 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1a6e0 69 66 69 65 64 20 28 6e 65 77 3f 29 20 72 6f 77  ified (new?) row
1a6f0 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
1a700 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a710 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1a720 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
1a730 28 24 69 6e 64 65 78 29 20 24 6e 65 77 56 61 6c  ($index) $newVal
1a740 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue]..           
1a750 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65   } elseif {$code
1a760 20 3d 3d 20 24 45 72 72 6f 72 7d 20 74 68 65 6e   == $Error} then
1a770 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a780 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1a790 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
1a7a0 68 65 20 28 6e 65 77 3f 29 20 4e 55 4c 4c 20 72  he (new?) NULL r
1a7b0 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ow value...     
1a7c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a7d0 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
1a7e0 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
1a7f0 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20  es($index)]..   
1a800 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1a810 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 52 65 74  f {$code == $Ret
1a820 75 72 6e 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  urn} then {..   
1a830 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1a840 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1a850 54 45 3a 20 53 6b 69 70 20 72 65 6d 61 69 6e 69  TE: Skip remaini
1a860 6e 67 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ng values for th
1a870 69 73 20 72 6f 77 2e 0d 0a 20 20 20 20 20 20 20  is row...       
1a880 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a890 20 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20          break.. 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1a8b0 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 42  eif {$code == $B
1a8c0 72 65 61 6b 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  reak} then {..  
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1a8f0 4f 54 45 3a 20 53 6b 69 70 20 70 72 6f 63 65 73  OTE: Skip proces
1a900 73 69 6e 67 20 74 68 69 73 20 72 6f 77 20 76 61  sing this row va
1a910 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  lue...          
1a920 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a930 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
1a940 64 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d  de == $Continue}
1a950 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a960 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a970 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a980 55 73 65 20 64 65 66 61 75 6c 74 20 72 6f 77 20  Use default row 
1a990 76 61 6c 75 65 20 68 61 6e 64 6c 69 6e 67 2e 0d  value handling..
1a9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1a9b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1a9c0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1a9d0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1a9e0 20 73 65 74 20 63 6f 64 65 20 24 43 6f 6e 74 69   set code $Conti
1a9f0 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  nue..          }
1aa00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1aa10 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43 6f 6e 74   {$code == $Cont
1aa20 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  inue} then {..  
1aa30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1aa40 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
1aa50 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  lue] > 0 && \.. 
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1aa70 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43  [object invoke C
1aa80 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c 20  onvert IsDBNull 
1aa90 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  $value]} then {.
1aaa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1aab0 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
1aac0 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20   $names($index) 
1aad0 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67  [$value ToString
1aae0 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
1aaf0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1ab00 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
1ab10 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
1ab20 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20  ($index)]..     
1ab30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ab40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ab50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
1ab60 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20  end rows $row.. 
1ab70 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ab80 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20  return $rows..  
1ab90 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1aba0 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74   dumpRowsFromDat
1abb0 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c  aTable { channel
1abc0 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20   rows } {..     
1abd0 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d   set sequence 1.
1abe0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
1abf0 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20   row $rows {..  
1ac00 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1ac10 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1ac20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ac30 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65  [expr {$sequence
1ac40 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22   > 1 ? "\n" : ""
1ac50 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20  }] "---- ROW #" 
1ac60 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a  $sequence :\n]..
1ac70 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1ac80 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20  h pair $row {.. 
1ac90 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
1aca0 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20  ength $pair] >= 
1acb0 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
1acc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1acd0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ace0 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
1acf0 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
1ad00 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
1ad10 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64  ": " [list [lind
1ad20 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d  ex $pair 1]] \n]
1ad30 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1ad40 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
1ad50 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e  pair] == 1} then
1ad60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ad70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1ad80 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
1ad90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ada0 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
1adb0 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c  pair 0]] ": <nul
1adc0 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  l>\n"]..        
1add0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ade0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1adf0 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e  hannel \t<empty>
1ae00 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64  \n; # NOTE: No d
1ae10 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ata?..          
1ae20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1ae30 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65 71          incr seq
1ae40 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  uence..      }..
1ae50 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1ae60 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
1ae70 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
1ae80 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
1ae90 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
1aea0 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
1aeb0 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
1aec0 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
1aed0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1aee0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
1aef0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
1af00 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
1af10 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
1af20 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
1af30 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
1af40 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
1af50 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
1af60 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
1af70 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
1af80 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
1af90 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1afa0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
1afb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1afc0 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
1afd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
1afe0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
1aff0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
1b000 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
1b010 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
1b020 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
1b030 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
1b040 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
1b050 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
1b060 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b070 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
1b080 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
1b090 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
1b0a0 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
1b0b0 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
1b0c0 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
1b0d0 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
1b0e0 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
1b0f0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
1b100 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
1b110 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b120 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
1b130 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
1b140 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
1b150 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
1b160 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
1b170 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
1b180 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
1b190 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
1b1a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1b1b0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
1b1c0 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
1b1d0 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
1b1e0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
1b1f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b200 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
1b210 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
1b220 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
1b230 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1b240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b250 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b260 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b270 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b280 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1b290 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
1b2a0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
1b2b0 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
1b2c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
1b2d0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1b2e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b2f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b300 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
1b310 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
1b320 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
1b330 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
1b340 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b350 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
1b360 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
1b370 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
1b380 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
1b390 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
1b3a0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1b3b0 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
1b3c0 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
1b3d0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
1b3e0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
1b3f0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1b400 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
1b410 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
1b420 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
1b430 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
1b440 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b450 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
1b460 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
1b470 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
1b480 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
1b490 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
1b4a0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1b4b0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1b4c0 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
1b4d0 6c 20 65 78 69 73 74 73 3b 20 69 6e 69 74 69 61  l exists; initia
1b4e0 6c 6c 79 2c 20 61 73 73 75 6d 65 20 61 6c 6c 20  lly, assume all 
1b4f0 66 69 6c 65 73 20 77 69 6c 6c 0d 0a 20 20 20 20  files will..    
1b500 20 20 23 20 20 20 20 20 20 20 62 65 20 64 65 6c    #       be del
1b510 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  eted successfull
1b520 79 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  y, if necessary.
1b530 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b540 20 73 65 74 20 73 75 63 63 65 73 73 20 74 72 75   set success tru
1b550 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  e....      if {!
1b560 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
1b570 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
1b580 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
1b590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b5a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1b5b0 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
1b5c0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  g database files
1b5d0 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74   if somebody set
1b5e0 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20  s the global..  
1b5f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1b600 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e  riable to preven
1b610 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  t it...        #
1b620 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1b630 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b640 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 73 29  (cleanupDbFiles)
1b650 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b660 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b670 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1b680 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
1b690 74 65 73 74 20 57 41 4c 20 66 69 6c 65 2c 20 69  test WAL file, i
1b6a0 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20  f any, now...   
1b6b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b6c0 20 20 20 20 73 65 74 20 77 61 6c 46 69 6c 65 4e      set walFileN
1b6d0 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
1b6e0 24 66 69 6c 65 4e 61 6d 65 20 2d 77 61 6c 5d 0d  $fileName -wal].
1b6f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1b700 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 77  {[file exists $w
1b710 61 6c 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  alFileName]} the
1b720 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1b730 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1b740 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
1b750 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 2c 20   is a WAL file, 
1b760 69 74 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  it should be zer
1b770 6f 20 62 79 74 65 73 20 61 74 20 74 68 69 73 0d  o bytes at this.
1b780 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
1b790 20 20 20 20 20 70 6f 69 6e 74 2e 0d 0a 20 20 20       point...   
1b7a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b7b0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
1b7c0 20 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65   size [file size
1b7d0 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 5d 5d 20   $walFileName]] 
1b7e0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1b810 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1b820 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1b830 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2c 20 72   the WAL file, r
1b840 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
1b850 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b860 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1b870 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
1b880 74 65 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 7d  te $walFileName}
1b890 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1b8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b8c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b8d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b8e0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1b8f0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1b900 74 6f 20 64 65 6c 65 74 65 20 57 41 4c 20 66 69  to delete WAL fi
1b910 6c 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e  le \"" $walFileN
1b920 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1b930 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1b940 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1b950 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1b960 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1b970 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
1b980 75 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20 20  uccess false..  
1b990 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b9a0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1b9b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1b9c0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1b9d0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1b9e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b9f0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1ba00 57 41 52 4e 49 4e 47 3a 20 57 41 4c 20 66 69 6c  WARNING: WAL fil
1ba10 65 20 5c 22 22 20 24 77 61 6c 46 69 6c 65 4e 61  e \"" $walFileNa
1ba20 6d 65 20 22 5c 22 20 69 73 20 22 20 24 73 69 7a  me "\" is " $siz
1ba30 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1ba40 20 20 20 20 20 20 20 22 20 62 79 74 65 73 20 69         " bytes i
1ba50 6e 20 73 69 7a 65 2c 20 73 6b 69 70 70 69 6e 67  n size, skipping
1ba60 20 61 6c 6c 20 66 69 6c 65 20 64 65 6c 65 74 69   all file deleti
1ba70 6f 6e 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20  ons...\n"]....  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1ba90 72 6e 20 31 3b 20 23 20 65 72 72 6f 72 0d 0a 20  rn 1; # error.. 
1baa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1bab0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1bac0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bad0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1bae0 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
1baf0 65 20 74 65 73 74 20 53 48 4d 20 66 69 6c 65 2c  e test SHM file,
1bb00 20 69 66 20 61 6e 79 2c 20 6e 6f 77 2e 0d 0a 20   if any, now... 
1bb10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1bb20 20 20 20 20 20 20 73 65 74 20 73 68 6d 46 69 6c        set shmFil
1bb30 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67  eName [appendArg
1bb40 73 20 24 66 69 6c 65 4e 61 6d 65 20 2d 73 68 6d  s $fileName -shm
1bb50 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
1bb60 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
1bb70 24 73 68 6d 46 69 6c 65 4e 61 6d 65 5d 20 26 26  $shmFileName] &&
1bb80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bb90 20 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64    [catch {file d
1bba0 65 6c 65 74 65 20 24 73 68 6d 46 69 6c 65 4e 61  elete $shmFileNa
1bbb0 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
1bbc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bbd0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1bbe0 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
1bbf0 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
1bc00 74 65 20 74 68 65 20 53 48 4d 20 66 69 6c 65 2c  te the SHM file,
1bc10 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
1bc20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1bc30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1bc40 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1bc50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1bc70 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1bc80 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 53 48  led to delete SH
1bc90 4d 20 66 69 6c 65 20 5c 22 22 20 24 73 68 6d 46  M file \"" $shmF
1bca0 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1bcb0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1bcc0 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1bcd0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1bce0 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ror \n]....     
1bcf0 20 20 20 20 20 20 20 73 65 74 20 73 75 63 63 65         set succe
1bd00 73 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ss false..      
1bd10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1bd20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bd30 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
1bd40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
1bd50 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
1bd60 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
1bd70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1bd80 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
1bd90 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
1bda0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1bdb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1bdd0 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
1bde0 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1bdf0 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
1be00 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
1be10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1be20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1be30 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1be40 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1be50 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1be60 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1be70 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
1be80 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
1be90 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
1bea0 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
1beb0 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a   cleanup, error:
1bec0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1bed0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
1bee0 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66 61    set success fa
1bef0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lse..          }
1bf00 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1bf10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1bf20 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1bf30 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
1bf40 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
1bf50 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
1bf60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1bf70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1bf80 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1bf90 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1bfa0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1bfb0 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
1bfc0 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  eting database f
1bfd0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1bfe0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1bff0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1c000 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
1c010 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1c020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
1c030 78 70 72 20 7b 24 73 75 63 63 65 73 73 20 3f 20  xpr {$success ? 
1c040 30 20 3a 20 31 7d 5d 0d 0a 20 20 20 20 7d 0d 0a  0 : 1}]..    }..
1c050 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
1c060 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1c070 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61  bles { names {va
1c080 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
1c090 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1c0a0 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e  NOTE: For each n
1c0b0 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 6c 69  ame, does the li
1c0c0 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ve environment v
1c0d0 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20  ariable exist?  
1c0e0 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  If..      #     
1c0f0 20 20 73 6f 2c 20 73 61 76 65 20 74 68 65 20 76    so, save the v
1c100 61 6c 75 65 20 66 6f 72 20 6c 61 74 65 72 3b 20  alue for later; 
1c110 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
1c120 73 75 72 65 20 74 68 65 20 73 61 76 65 64 0d 0a  sure the saved..
1c130 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
1c140 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  lue does not exi
1c150 73 74 20 65 69 74 68 65 72 2e 20 20 54 68 65 20  st either.  The 
1c160 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
1c170 20 76 61 72 69 61 62 6c 65 73 0d 0a 20 20 20 20   variables..    
1c180 20 20 23 20 20 20 20 20 20 20 41 52 45 20 4e 4f    #       ARE NO
1c190 54 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69  T changed by thi
1c1a0 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  s procedure...  
1c1b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1c1c0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1c1d0 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  $varName] == 0} 
1c1e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c1f0 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65  set varName save
1c200 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  dEnv..      }...
1c210 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
1c220 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
1c230 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
1c240 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d  h name $names {.
1c250 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
1c260 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
1c270 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  $name)]} then {.
1c280 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
1c290 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 20 24  avedEnv($name) $
1c2a0 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  ::env($name)..  
1c2b0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c2c0 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
1c2d0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
1c2e0 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
1c2f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1c300 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c310 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69    # NOTE: This i
1c320 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e  s self-cleaning.
1c330 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65 6e    If no saved en
1c340 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1c350 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20 23  les now..      #
1c360 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72 65         exist, re
1c370 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e 0d  move the array..
1c380 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c390 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65 20  if {[array size 
1c3a0 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d 20  savedEnv] == 0} 
1c3b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c3c0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1c3d0 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  n savedEnv..    
1c3e0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1c3f0 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 45     proc restoreE
1c400 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1c410 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61 72  les { names {var
1c420 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
1c430 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1c440 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e 61  OTE: For each na
1c450 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 73 61 76  me, does the sav
1c460 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ed environment v
1c470 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20 20  ariable exist?  
1c480 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  If..      #     
1c490 20 20 73 6f 2c 20 72 65 73 74 6f 72 65 20 74 68    so, restore th
1c4a0 65 20 73 61 76 65 64 20 76 61 6c 75 65 20 61 6e  e saved value an
1c4b0 64 20 75 6e 73 65 74 20 69 74 3b 20 6f 74 68 65  d unset it; othe
1c4c0 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
1c4d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1c4e0 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e  the live environ
1c4f0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 64 6f  ment variable do
1c500 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74  es not exist eit
1c510 68 65 72 20 28 69 2e 65 2e 20 69 74 0d 0a 20 20  her (i.e. it..  
1c520 20 20 20 20 23 20 20 20 20 20 20 20 77 61 73 20      #       was 
1c530 6e 6f 74 20 73 65 74 20 74 6f 20 62 65 67 69 6e  not set to begin
1c540 20 77 69 74 68 29 2e 20 20 42 6f 74 68 20 73 61   with).  Both sa
1c550 76 65 64 20 61 6e 64 20 6c 69 76 65 20 65 6e 76  ved and live env
1c560 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20 20  ironment..      
1c570 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
1c580 73 20 41 52 45 20 63 68 61 6e 67 65 64 20 62 79  s ARE changed by
1c590 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
1c5a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c5b0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1c5c0 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d  gth $varName] ==
1c5d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1c5e0 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 20      set varName 
1c5f0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20  savedEnv..      
1c600 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72  }....      upvar
1c610 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76 65   1 $varName save
1c620 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  dEnv....      fo
1c630 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65  reach name $name
1c640 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  s {..        if 
1c650 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73 61  {[info exists sa
1c660 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 5d 7d 20  vedEnv($name)]} 
1c670 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c680 20 20 73 65 74 20 3a 3a 65 6e 76 28 24 6e 61 6d    set ::env($nam
1c690 65 29 20 24 73 61 76 65 64 45 6e 76 28 24 6e 61  e) $savedEnv($na
1c6a0 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 75  me)..          u
1c6b0 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
1c6c0 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29   savedEnv($name)
1c6d0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1c6e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e   {..          un
1c6f0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
1c700 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  ::env($name)..  
1c710 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1c720 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1c730 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
1c740 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67  is self-cleaning
1c750 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65  .  If no saved e
1c760 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1c770 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20  bles now..      
1c780 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72  #       exist, r
1c790 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e  emove the array.
1c7a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c7b0 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65   if {[array size
1c7c0 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d   savedEnv] == 0}
1c7d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c7e0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
1c7f0 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  in savedEnv..   
1c800 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1c810 20 20 20 20 70 72 6f 63 20 73 61 76 65 45 61 67      proc saveEag
1c820 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65  leShellEnvironme
1c830 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1c840 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1c850 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1c860 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1c870 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1c880 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61 76 65   NoMutexes] save
1c890 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1c8a0 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
1c8b0 45 61 67 6c 65 53 68 65 6c 6c 45 6e 76 69 72 6f  EagleShellEnviro
1c8c0 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1c8d0 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1c8e0 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1c8f0 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
1c900 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1c910 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65 78 65 73   [list NoMutexes
1c920 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  ] savedEnv..    
1c930 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1c940 61 76 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69  aveMdaConfigEnvi
1c950 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1c960 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1c970 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1c980 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
1c990 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1c9a0 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44  [list COMPLUS_MD
1c9b0 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  A] savedEnv..   
1c9c0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1c9d0 72 65 73 74 6f 72 65 4d 64 61 43 6f 6e 66 69 67  restoreMdaConfig
1c9e0 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
1c9f0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
1ca00 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
1ca10 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73 74 6f  v....      resto
1ca20 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1ca30 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f 4d  iables [list COM
1ca40 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64 45  PLUS_MDA] savedE
1ca50 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1ca60 20 20 70 72 6f 63 20 73 61 76 65 47 65 74 53 65    proc saveGetSe
1ca70 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69 72 6f  ttingValueEnviro
1ca80 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1ca90 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1caa0 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1cab0 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
1cac0 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1cad0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1cae0 20 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51   No_Expand No_SQ
1caf0 4c 69 74 65 47 65 74 53 65 74 74 69 6e 67 56 61  LiteGetSettingVa
1cb00 6c 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c  lue No_SQLiteXml
1cb10 43 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20  ConfigFile] \.. 
1cb20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e           savedEn
1cb30 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
1cb40 20 70 72 6f 63 20 72 65 73 74 6f 72 65 47 65 74   proc restoreGet
1cb50 53 65 74 74 69 6e 67 56 61 6c 75 65 45 6e 76 69  SettingValueEnvi
1cb60 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1cb70 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1cb80 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1cb90 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1cba0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1cbb0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1cbc0 20 20 20 20 20 20 4e 6f 5f 45 78 70 61 6e 64 20        No_Expand 
1cbd0 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53 65 74 74  No_SQLiteGetSett
1cbe0 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53 51 4c 69  ingValue No_SQLi
1cbf0 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 5d  teXmlConfigFile]
1cc00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1cc10 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1cc20 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53  ..    proc saveS
1cc30 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45  QLiteConnectionE
1cc40 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d  nvironment {} {.
1cc50 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73  .      upvar 1 s
1cc60 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76  avedEnv savedEnv
1cc70 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e  ....      saveEn
1cc80 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1cc90 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1cca0 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61        DefaultFla
1ccb0 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs_SQLiteConnect
1ccc0 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e  ion No_SQLiteCon
1ccd0 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72  nectionNewParser
1cce0 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
1ccf0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
1cd00 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74  ...    proc rest
1cd10 6f 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  oreSQLiteConnect
1cd20 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ionEnvironment {
1cd30 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
1cd40 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
1cd50 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65  dEnv....      re
1cd60 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74  storeEnvironment
1cd70 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1cd80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66  \..          Def
1cd90 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65  aultFlags_SQLite
1cda0 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51  Connection No_SQ
1cdb0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65  LiteConnectionNe
1cdc0 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20  wParser] \..    
1cdd0 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1cde0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1cdf0 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e  oc saveSQLiteCon
1ce00 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  vertEnvironment 
1ce10 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1ce20 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1ce30 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
1ce40 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1ce50 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
1ce60 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f 53  .          Use_S
1ce70 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
1ce80 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53  aultDbType Use_S
1ce90 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66  QLiteConvert_Def
1cea0 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d  aultTypeName] \.
1ceb0 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1cec0 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1ced0 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53     proc restoreS
1cee0 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69  QLiteConvertEnvi
1cef0 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1cf00 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1cf10 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1cf20 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
1cf30 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1cf40 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1cf50 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65        Use_SQLite
1cf60 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44  Convert_DefaultD
1cf70 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65  bType Use_SQLite
1cf80 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54  Convert_DefaultT
1cf90 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20  ypeName] \..    
1cfa0 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1cfb0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1cfc0 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72  oc setupDbInterr
1cfd0 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68  uptCallback { ch
1cfe0 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20  annel log } {.. 
1cff0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1d000 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e  nel "---- settin
1d010 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e  g up debugger in
1d020 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
1d030 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
1d040 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1d050 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e       saveEnviron
1d060 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
1d070 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1d080 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65     quietFindInte
1d090 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20  rpreterTestPath 
1d0a0 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70  quietSetupInterp
1d0b0 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a  reterTestPath]..
1d0c0 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d  ..        try {.
1d0d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d0e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d0f0 50 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e 64  Prevent the vend
1d100 6f 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20 62  or script from b
1d110 65 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e 20  eing noisy when 
1d120 63 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20 20  creating..      
1d130 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1d140 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1d150 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1d160 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1d170 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69 6e  t ::env(quietFin
1d180 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  dInterpreterTest
1d190 50 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20 20  Path) 1..       
1d1a0 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69     set ::env(qui
1d1b0 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
1d1c0 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d  erTestPath) 1...
1d1d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d1e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d1f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  Make sure the sc
1d200 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e  ript debugger an
1d210 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  d the isolated i
1d220 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20  nterpreter..    
1d230 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
1d240 65 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64  e setup and read
1d250 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
1d260 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d270 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74     debug setup t
1d280 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  rue true....    
1d290 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d2a0 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
1d2b0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61  the necessary pa
1d2c0 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20  ckages into the 
1d2d0 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1d2e0 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1d2f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65   #..          de
1d300 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20  bug eval {..    
1d310 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
1d320 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20  require Eagle.. 
1d330 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
1d340 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
1d350 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
1d360 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
1d370 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
1d380 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d390 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d3a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d3b0 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61  Copy the necessa
1d3c0 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74  ry variables int
1d3d0 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
1d3e0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
1d3f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d400 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
1d410 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68   0 set ::test_ch
1d420 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20  annel $channel; 
1d430 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75  # NOTE: For [tpu
1d440 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ts]...          
1d450 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
1d460 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c  et ::test_log $l
1d470 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  og; # NOTE: For 
1d480 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20  [tlog].....     
1d490 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d4a0 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
1d4b0 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
1d4c0 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
1d4d0 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
1d4e0 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20  lated..         
1d4f0 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72   #       interpr
1d500 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69  eter when this i
1d510 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e  nterpreter is in
1d520 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72  terrupted by scr
1d530 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ipt..          #
1d540 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
1d550 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20  ion, etc...     
1d560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d570 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b    debug callback
1d580 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20   apply {{sender 
1d590 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  e} {..          
1d5a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1d5b0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1d5c0 66 20 74 68 69 73 20 64 65 62 75 67 67 65 72 20  f this debugger 
1d5d0 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20  callback is one 
1d5e0 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f  that we care abo
1d5f0 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ut...           
1d600 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1d610 73 65 74 20 69 6e 74 65 72 72 75 70 74 54 79 70  set interruptTyp
1d620 65 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e  es [split [$e In
1d630 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20  terruptType] ", 
1d640 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1d650 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22    if {"Canceled"
1d660 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79   in $interruptTy
1d670 70 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  pes || \..      
1d680 20 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f 75            "Unwou
1d690 6e 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70  nd" in $interrup
1d6a0 74 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a  tTypes} then {..
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1d6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1d6d0 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
1d6e0 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f   the [object] co
1d6f0 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62  mmand is availab
1d700 6c 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20  le.  Since..    
1d710 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1d720 20 20 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f    this is an iso
1d730 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
1d740 72 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20  r, check for it 
1d750 74 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20  the hard..      
1d760 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1d770 77 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  way...          
1d780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d790 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
1d7a0 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73  h [info commands
1d7b0 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74   object]] > 0} t
1d7c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d7d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d7e0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1d7f0 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  : Iterate throug
1d800 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  h all database c
1d810 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
1d820 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
1d830 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1d840 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65   parent interpre
1d850 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
1d860 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d870 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1d880 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
1d890 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  air [object invo
1d8a0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1d8b0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49              $e I
1d8d0 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65  nterpreter.conne
1d8e0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1d920 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20  t to cancel any 
1d930 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
1d940 72 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20  rogress on..    
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d960 20 20 20 20 20 20 74 68 69 73 20 64 61 74 61 62        this datab
1d970 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d  ase connection..
1d980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d990 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d9a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1d9b0 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e  ch {$pair Value.
1d9c0 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20  Cancel} error]} 
1d9d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d9f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1da00 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e  l [appendArgs \n
1da10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1da20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1da30 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1da40 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72  d to cancel quer
1da50 79 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20  y for " \..     
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c     "connection \
1da80 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
1da90 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1daa0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72               $er
1dac0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1dad0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1daf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1db00 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1db10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1db20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1db30 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d  appendArgs \n \.
1db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db50 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1db60 4e 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65  NG: cannot cance
1db70 6c 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22  l any queries: "
1db80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1db90 20 20 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f          "the \"o
1dba0 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20  bject\" command 
1dbb0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1dbc0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1dbd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1dbe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dbf0 7d 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69  }}..        } fi
1dc00 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
1dc10 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
1dc20 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1dc30 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1dc40 20 20 20 20 20 20 71 75 69 65 74 46 69 6e 64 49        quietFindI
1dc50 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
1dc60 74 68 20 71 75 69 65 74 53 65 74 75 70 49 6e 74  th quietSetupInt
1dc70 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
1dc80 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1dc90 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
1dca0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1dcb0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1dcc0 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61   interruptCallba
1dcd0 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20  ck.sqlite3....  
1dce0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1dcf0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
1dd00 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1dd10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1dd20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1dd30 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  no, error: " \n\
1dd40 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1dd50 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1dd60 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
1dd70 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  pFile { fileName
1dd80 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
1dd90 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20  {force false} } 
1dda0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1ddb0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
1ddc0 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
1ddd0 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
1dde0 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
1ddf0 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
1de00 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
1de10 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
1de20 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
1de30 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
1de40 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
1de50 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
1de60 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1de70 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
1de80 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
1de90 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
1dea0 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
1deb0 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
1dec0 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
1ded0 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
1dee0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1def0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1df00 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
1df10 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
1df20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
1df30 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
1df40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1df50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1df60 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74  NOTE: Skip delet
1df70 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69  ing test files i
1df80 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20  f somebody sets 
1df90 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1dfa0 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
1dfb0 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20       to prevent 
1dfc0 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
1dfd0 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72          if {$for
1dfe0 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  ce || ![info exi
1dff0 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
1e000 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  File)]} then {..
1e010 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e020 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
1e030 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
1e040 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e   the test file n
1e050 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
1e060 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1e070 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
1e080 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
1e090 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
1e0a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e0b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e0c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1e0d0 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
1e0e0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
1e0f0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
1e100 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1e110 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e120 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e130 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1e160 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
1e170 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66  test file \"" $f
1e180 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
1e190 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1e1a0 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
1e1b0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1e1c0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1e1d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
1e1e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1e1f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1e200 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74   NOTE: Show that
1e210 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65   we skipped dele
1e220 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a  ting the file...
1e230 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e240 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
1e250 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  0....          t
1e260 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1e270 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e280 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e290 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1e2a0 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
1e2b0 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20  g test file \"" 
1e2c0 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
1e2d0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1e2e0 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
1e2f0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1e300 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1e310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e320 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
1e330 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1e340 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
1e350 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1e360 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
1e370 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1e380 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
1e390 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
1e3a0 61 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72  anupMemory { var
1e3b0 4e 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c 73  Name {quiet fals
1e3c0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
1e3d0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1e3e0 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
1e3f0 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1e400 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
1e410 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
1e420 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e430 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
1e440 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
1e450 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
1e460 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
1e470 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20   in the..       
1e480 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
1e490 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20   of our caller. 
1e4a0 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   The opaque obje
1e4b0 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  ct handle for an
1e4c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1e4d0 20 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63    ADO.NET connec
1e4e0 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
1e4f0 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74  returned by [get
1e500 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20  DbConnection].. 
1e510 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
1e520 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
1e530 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  there...        
1e540 23 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  #..        upvar
1e550 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   1 $varName conn
1e560 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ection....      
1e570 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1e580 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1e590 20 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74   invoke $connect
1e5a0 69 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72  ion ReleaseMemor
1e5b0 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  y..        } res
1e5c0 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
1e5d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1e5e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1e5f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1e600 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1e610 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1e630 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1e640 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 64  led to release d
1e650 61 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20  atabase memory, 
1e660 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
1e670 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
1e680 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1e690 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e6a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1e6b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
1e6c0 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
1e6d0 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20  ds debug]] > 0} 
1e6e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e6f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1e700 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1e710 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70 75  1 [list debug pu
1e720 72 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  rge]..        } 
1e730 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
1e740 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1e750 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e760 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e770 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1e780 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1e790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e7a0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1e7b0 66 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65 20  failed to purge 
1e7c0 63 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f  call frame, erro
1e7d0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1e7e0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
1e7f0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1e800 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1e810 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1e820 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1e830 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1e840 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e 75  ist debug cleanu
1e850 70 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  p]..        } re
1e860 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
1e870 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1e880 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1e890 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1e8a0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1e8b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e8d0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1e8e0 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70 20  iled to cleanup 
1e8f0 69 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72 72  interpreter, err
1e900 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1e910 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1e920 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1e930 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e940 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1e950 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1e960 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
1e970 6c 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c 65  list debug colle
1e980 63 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  ct]..        } r
1e990 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
1e9a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1e9b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e9c0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e9d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e9e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1ea10 61 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74  ailed to collect
1ea20 20 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72 3a   garbage, error:
1ea30 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1ea40 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1ea50 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1ea60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1ea70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1ea80 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
1ea90 70 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20  pMemoryCounters 
1eaa0 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20  { varName } {.. 
1eab0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1eac0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1ead0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1eae0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
1eaf0 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a  Name counter....
1eb00 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e          set coun
1eb10 74 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20 63  ter(1) [object c
1eb20 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  reate -alias \..
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1eb40 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50  em.Diagnostics.P
1eb50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
1eb60 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20  r Process \..   
1eb70 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e           "Workin
1eb80 67 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f  g Set" [file roo
1eb90 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
1eba0 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d   $::bin_file]]].
1ebb0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
1ebc0 6f 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65 63  ounter(2) [objec
1ebd0 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
1ebe0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1ebf0 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
1ec00 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  s.PerformanceCou
1ec10 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a  nter Process \..
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 22 57 6f 72              "Wor
1ec30 6b 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20 5b  king Set Peak" [
1ec40 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
1ec50 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f  ile tail $::bin_
1ec60 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  file]]]....     
1ec70 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 33     set counter(3
1ec80 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65  ) [object create
1ec90 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
1eca0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
1ecb0 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72  agnostics.Perfor
1ecc0 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f  manceCounter Pro
1ecd0 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  cess \..        
1ece0 20 20 20 20 22 50 72 69 76 61 74 65 20 42 79 74      "Private Byt
1ecf0 65 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  es" [file rootna
1ed00 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a  me [file tail $:
1ed10 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20  :bin_file]]]..  
1ed20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
1ed30 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
1ed40 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
1ed50 6f 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72  ortMemoryCounter
1ed60 73 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e  s { channel varN
1ed70 61 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a  ame prefix } {..
1ed80 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1ed90 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1eda0 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
1edb0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1edc0 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d  rName counter...
1edd0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ede0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1edf0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1ee00 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66     "---- " $pref
1ee10 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22  ix " counter \""
1ee20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ee30 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1ee40 63 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e 74  counter(1) Count
1ee50 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75  erName] "\" valu
1ee60 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  e is " \..      
1ee70 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
1ee80 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29  voke $counter(1)
1ee90 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a   RawValue] \n]..
1eea0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1eeb0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1eec0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1eed0 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
1eee0 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
1eef0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ef00 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1ef10 24 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75 6e  $counter(2) Coun
1ef20 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
1ef30 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
1ef40 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
1ef50 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32  nvoke $counter(2
1ef60 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
1ef70 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
1ef80 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1ef90 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1efa0 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72       "---- " $pr
1efb0 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c  efix " counter \
1efc0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1efd0 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1efe0 20 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f 75   $counter(3) Cou
1eff0 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61  nterName] "\" va
1f000 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  lue is " \..    
1f010 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
1f020 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
1f030 33 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d  3) RawValue] \n]
1f040 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1f050 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
1f060 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63  llectGarbage { c
1f070 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63  hannel {millisec
1f080 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65  onds 1000} {quie
1f090 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
1f0a0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1f0b0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1f0c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f0d0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1f0e0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1f0f0 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
1f100 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d  talMemory false.
1f110 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
1f120 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
1f130 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1f140 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1f150 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f160 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f170 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1f180 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1f190 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
1f1a0 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20   the CLR before 
1f1b0 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20  collection... " 
1f1c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f1d0 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74     $result " byt
1f1e0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1f1f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1f200 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1f210 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1f220 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f230 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1f240 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1f270 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
1f280 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
1f290 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1f2a0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
1f2b0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1f2c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f2d0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1f2e0 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
1f2f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1f330 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1f340 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74    # NOTE: Repeat
1f350 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  edly attempt to 
1f360 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20  collect garbage 
1f370 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74  until the allott
1f380 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20  ed number..     
1f390 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c   #       of mill
1f3a0 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61  iseconds has ela
1f3b0 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74  psed.  Always at
1f3c0 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74  tempt to collect
1f3d0 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20   garbage..      
1f3e0 23 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74  #       at least
1f3f0 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d   once...      #.
1f400 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1f410 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1f420 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1f430 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20        set start 
1f440 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
1f450 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f  .        set sto
1f460 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20  p [expr {$start 
1f470 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  + ($milliseconds
1f480 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20   / 1000)}]....  
1f490 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20        do {..    
1f4a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f4b0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1f4c0 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75  pt to force a fu
1f4d0 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
1f4e0 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f  ction now.  Repo
1f4f0 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20  rt any..        
1f500 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
1f510 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  that is encounte
1f520 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d  red if we fail..
1f530 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1f540 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1f550 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1f560 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f570 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
1f580 79 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  y true..        
1f590 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
1f5a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f5b0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f5c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f5d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1f5e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f600 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1f610 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61  : failed full ga
1f620 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
1f630 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1f660 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1f670 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1f680 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77           set now
1f690 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1f6a0 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ..        } whil
1f6b0 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f  e {$start <= $no
1f6c0 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f  w && $now < $sto
1f6d0 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p}..      }.... 
1f6e0 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
1f6f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1f720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1f730 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1f740 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1f750 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1f760 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1f770 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1f780 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
1f790 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
1f7a0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
1f7b0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
1f7c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f7d0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f7e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f7f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1f800 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f820 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
1f830 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66  se by the CLR af
1f840 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e  ter collection..
1f850 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
1f860 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22         $result "
1f870 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1f880 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f890 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f8a0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1f8b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f8c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f8d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f8e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f8f0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1f900 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
1f910 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
1f920 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f940 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1f950 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1f960 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1f970 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1f980 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61  proc getSQLiteHa
1f990 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61  ndleCounts { cha
1f9a0 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73  nnel {quiet fals
1f9b0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
1f9c0 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
1f9d0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1f9e0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1f9f0 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20  mmand] && \..   
1fa00 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
1fa10 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
1fa20 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20   COUNT_HANDLE]} 
1fa30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fa40 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1fa50 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69 74  E: Add each crit
1fa60 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1fa70 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69  t to the resulti
1fa80 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ng list...      
1fa90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
1faa0 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20  each name [list 
1fab0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  \..            c
1fac0 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73  onnectionCount s
1fad0 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61  tatementCount ba
1fae0 63 6b 75 70 43 6f 75 6e 74 20 62 6c 6f 62 43 6f  ckupCount blobCo
1faf0 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  unt] {..        
1fb00 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1fb20 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1fb30 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1fb50 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fb60 65 2e 44 65 62 75 67 44 61 74 61 20 24 6e 61 6d  e.DebugData $nam
1fb70 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76  e..          } v
1fb80 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  alue] == 0} then
1fb90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fba0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1fbb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fbc0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1fbd0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1fbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fbf0 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61     "---- critica
1fc00 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c  l handle count \
1fc10 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20  "" $name "\" is 
1fc20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  " $value \n]..  
1fc30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1fc40 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
1fc50 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65  nd result $value
1fc60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1fc70 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1fc80 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1fc90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1fca0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1fcb0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1fcc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fcd0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1fce0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
1fcf0 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  t critical handl
1fd00 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20  e count \"" \.. 
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 24 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f   $name "\", erro
1fd30 72 3a 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65  r: " \n\t $value
1fd40 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1fd50 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1fd60 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1fd70 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71     } elseif {!$q
1fd80 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1fd90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1fda0 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74   # NOTE: The act
1fdb0 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  ual handle count
1fdc0 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
1fdd0 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ble; therefore, 
1fde0 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  just..        # 
1fdf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20        return an 
1fe00 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20  empty list...   
1fe10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fe20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
1fe30 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
1fe40 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76  ndle counts unav
1fe50 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20  ailable\n"..    
1fe60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
1fe70 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
1fe80 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1fe90 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b  shutdownSQLite {
1fea0 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20   channel {force 
1feb0 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61  false} {quiet fa
1fec0 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
1fed0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1fee0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
1fef0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1ff00 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ary is completel
1ff10 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  y shutdown.  Thi
1ff20 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
1ff30 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74   is used by test
1ff40 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f  s that change co
1ff50 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
1ff60 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65  ons and/or those
1ff70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ff80 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b  that need to mak
1ff90 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69  e sure logging i
1ffa0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69  s initialized (i
1ffb0 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65  .e. just in case
1ffc0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1ffd0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
1ffe0 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74  library was init
1fff0 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70  ialized in the p
20000 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d  rocess prior to.
20010 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
20020 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61  he SQLiteLog cla
20030 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  ss being able to
20040 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69   setup its loggi
20050 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20  ng callback)... 
20060 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72       #       Nor
20070 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75  mally, this shou
20080 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ld only be perfo
20090 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
200a0 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20  s loaded and..  
200b0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64      #       read
200c0 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
200d0 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
200e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
200f0 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51  {$force || [isSQ
20100 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
20110 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
20120 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
20130 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
20140 61 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61  any "leaked" tra
20150 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72  nsactions and/or
20160 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
20170 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
20180 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62  are cleaned up b
20190 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
201a0 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77  e native shutdow
201b0 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20  n function...   
201c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
201d0 66 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63 74  foreach transact
201e0 69 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61  ion [info transa
201f0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
20200 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
20210 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
20220 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44          System#D
20230 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74  ata#SQLite#SQLit
20240 65 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24  eTransaction#* $
20250 74 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68  transaction]} th
20260 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
20270 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
20290 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
202a0 6c 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74  llback $transact
202b0 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
202c0 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
202d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
202e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
202f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
20300 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20310 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
20320 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
20340 2d 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c  -- rolled back l
20350 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
20360 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
20380 61 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  ansaction \"\n].
20390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
203a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
203b0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
203c0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
203d0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
203e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
203f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
20400 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
20420 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
20430 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
20440 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f  eaked transactio
20450 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  n \"" \..       
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72               $tr
20470 61 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65  ansaction "\", e
20480 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
20490 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
204a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
204b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
204c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
204d0 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
204e0 63 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e  ch db [info conn
204f0 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
20500 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
20510 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20  g match \..     
20520 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23           System#
20530 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69  Data#SQLite#SQLi
20540 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24  teConnection#* $
20550 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
20560 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
20570 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
20580 64 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  db} error] == 0}
20590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
205a0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
205b0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
205c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
205d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
205e0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
20600 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65  --- closed leake
20610 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  d database \"" $
20620 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  db \"\n]..      
20630 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20640 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
20660 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
20670 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20680 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
20690 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
206a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
206b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
206c0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
206d0 6c 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61  lose leaked data
206e0 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  base \"" \..    
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
20710 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
20720 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
20730 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
20740 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
20750 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20760 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20770 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
20780 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74   calling the nat
20790 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e  ive shutdown fun
207a0 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65  ction, make sure
207b0 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23   both..        #
207c0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
207d0 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
207e0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
207f0 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
20800 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
20810 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
20820 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c  ctories $channel
20830 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
20840 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
20850 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
20860 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
20870 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
20880 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20890 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
208a0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
208b0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
208c0 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  n..        } res
208d0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
208e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
208f0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
20900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
20910 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
20920 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
20930 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20940 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  - call sqlite3_s
20950 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a  hutdown()... ok:
20960 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
20970 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20980 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
20990 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
209a0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
209b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
209c0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
209d0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
209e0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
209f0 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
20a00 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  own()... error: 
20a10 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
20a20 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
20a30 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
20a40 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
20a50 20 20 20 70 72 6f 63 20 67 65 74 53 65 74 74 69     proc getSetti
20a60 6e 67 52 65 61 64 43 6f 75 6e 74 20 7b 20 6e 61  ngReadCount { na
20a70 6d 65 20 7b 76 69 61 46 69 6c 65 20 66 61 6c 73  me {viaFile fals
20a80 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
20a90 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
20aa0 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
20ab0 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b  tion.Debug] && [
20ac0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
20ad0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
20ae0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
20af0 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
20b00 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
20b10 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
20b20 61 74 61 20 47 65 74 53 65 74 74 69 6e 67 52 65  ata GetSettingRe
20b30 61 64 43 6f 75 6e 74 73 20 24 76 69 61 46 69 6c  adCounts $viaFil
20b40 65 0d 0a 20 20 20 20 20 20 7d 20 73 65 74 74 69  e..      } setti
20b50 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  ngReadCounts] ==
20b60 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20b70 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
20b80 6c 65 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20  length $name] > 
20b90 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
20ba0 20 20 20 20 20 69 66 20 7b 5b 24 73 65 74 74 69       if {[$setti
20bb0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 54 72 79  ngReadCounts Try
20bc0 47 65 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76  GetValue $name v
20bd0 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
20be0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20bf0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20c00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
20c30 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73 20  " $name "\" was 
20c40 72 65 61 64 20 22 20 24 76 61 6c 75 65 20 22 20  read " $value " 
20c50 74 69 6d 65 73 22 20 5c 0d 0a 20 20 20 20 20 20  times" \..      
20c60 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
20c70 7b 24 76 69 61 46 69 6c 65 20 3f 20 22 20 66 72  {$viaFile ? " fr
20c80 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
20c90 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d  tion file" : ""}
20ca0 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
20cb0 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c       return $val
20cc0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ue..          }.
20cd0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
20ce0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
20cf0 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
20d00 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43  tingReadCounts C
20d10 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  ount]..         
20d20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20   set valueCount 
20d30 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  0....          o
20d40 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
20d50 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
20d60 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
20d70 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
20d80 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61   valueCount [$pa
20d90 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20  ir Value]....   
20da0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20db0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
20dc0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
20de0 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20  --- setting \"" 
20df0 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20  [$pair Key] "\" 
20e00 77 61 73 20 72 65 61 64 20 22 20 5b 24 70 61 69  was read " [$pai
20e10 72 20 56 61 6c 75 65 5d 20 5c 0d 0a 20 20 20 20  r Value] \..    
20e20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 74 69              " ti
20e30 6d 65 73 22 20 5b 65 78 70 72 20 7b 24 76 69 61  mes" [expr {$via
20e40 46 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74 68  File ? " from th
20e50 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
20e60 66 69 6c 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20  file" : \..     
20e70 20 20 20 20 20 20 20 20 20 20 20 22 22 7d 5d 20             ""}] 
20e80 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
20e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
20ea0 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65  turn [list $name
20eb0 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e  Count $valueCoun
20ec0 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  t]..        }.. 
20ed0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20ee0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
20ef0 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
20f00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
20f10 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
20f20 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
20f30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20f40 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
20f50 22 20 24 6e 61 6d 65 20 22 5c 22 20 77 61 73 20  " $name "\" was 
20f60 6e 6f 74 20 72 65 61 64 22 20 5b 65 78 70 72 20  not read" [expr 
20f70 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d 0a 20  {$viaFile ? \.. 
20f80 20 20 20 20 20 20 20 20 20 20 20 22 20 66 72 6f             " fro
20f90 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
20fa0 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22 7d 5d  ion file" : ""}]
20fb0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c   \n]..      } el
20fc0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
20fd0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
20fe0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
20ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
21000 2d 2d 2d 2d 20 6e 6f 20 73 65 74 74 69 6e 67 73  ---- no settings
21010 20 77 65 72 65 20 72 65 61 64 22 20 5b 65 78 70   were read" [exp
21020 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 5c 0d  r {$viaFile ? \.
21030 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66  .            " f
21040 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
21050 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20 22 22  ation file" : ""
21060 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  }] \n]..      }.
21070 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
21080 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  -1..    }.....  
21090 20 20 70 72 6f 63 20 67 65 74 4f 74 68 65 72 43    proc getOtherC
210a0 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d  ount { name } {.
210b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
210c0 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
210d0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65  Configuration.De
210e0 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b  bug] && [catch {
210f0 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
21100 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
21110 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
21120 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21130 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
21140 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74  te.DebugData Get
21150 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20  OtherCounts..   
21160 20 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73     } otherCounts
21170 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
21180 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
21190 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
211a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
211b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 24 6f           if {[$o
211c0 74 68 65 72 43 6f 75 6e 74 73 20 54 72 79 47 65  therCounts TryGe
211d0 74 56 61 6c 75 65 20 24 6e 61 6d 65 20 76 61 6c  tValue $name val
211e0 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
211f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21200 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
21210 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
21230 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65  --- other counte
21240 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20  r \"" $name "\" 
21250 68 61 73 20 76 61 6c 75 65 20 22 20 24 76 61 6c  has value " $val
21260 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ue \n]....      
21270 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61        return $va
21280 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lue..          }
21290 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
212a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
212b0 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 6f 74  t nameCount [$ot
212c0 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d  herCounts Count]
212d0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
212e0 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
212f0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
21300 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
21310 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75 6e 74  pair $otherCount
21320 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
21330 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74   incr valueCount
21340 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a   [$pair Value]..
21350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21360 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
21370 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21380 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21390 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63     "---- other c
213a0 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61 69  ounter \"" [$pai
213b0 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20 76  r Key] "\" has v
213c0 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20 20  alue " \..      
213d0 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
213e0 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20   Value] \n]..   
213f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21400 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
21410 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24 76  st $nameCount $v
21420 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  alueCount]..    
21430 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
21440 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
21450 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
21460 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
21470 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
21480 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
21490 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
214a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74          "---- ot
214b0 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  her counter \"" 
214c0 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 6e 6f  $name "\" has no
214d0 20 76 61 6c 75 65 5c 6e 22 5d 0d 0a 20 20 20 20   value\n"]..    
214e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
214f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
21500 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20  t_channel "---- 
21510 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
21520 65 72 20 63 6f 75 6e 74 65 72 73 5c 6e 22 0d 0a  er counters\n"..
21530 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21540 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20 20   return -1..    
21550 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
21560 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
21570 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  rces {..        
21580 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69      channel {qui
21590 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74  et false} {reset
215a0 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20   true} {collect 
215b0 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
215c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
215d0 3a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 61  : If possible, a
215e0 6c 77 61 79 73 20 72 65 73 65 74 20 74 68 65 20  lways reset the 
215f0 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20  cached assembly 
21600 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
21610 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
21620 20 63 61 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66   cached XML conf
21630 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e  iguration file n
21640 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ame...      #.. 
21650 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
21660 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
21670 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
21680 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
21690 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
216a0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
216b0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
216d0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
216e0 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
216f0 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
21700 20 20 20 20 20 52 65 73 65 74 43 61 63 68 65 64       ResetCached
21710 41 73 73 65 6d 62 6c 79 44 69 72 65 63 74 6f 72  AssemblyDirector
21720 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  y..        } err
21730 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
21740 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
21750 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
21760 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21770 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
21780 2d 20 72 65 73 65 74 20 63 61 63 68 65 64 20 61  - reset cached a
21790 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72  ssembly director
217a0 79 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  y\n"..          
217b0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
217c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
217d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
217e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
217f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21800 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
21820 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
21830 6c 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63  led to reset cac
21840 68 65 64 20 61 73 73 65 6d 62 6c 79 20 64 69 72  hed assembly dir
21850 65 63 74 6f 72 79 2c 20 22 20 5c 0d 0a 20 20 20  ectory, " \..   
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 72               "er
21870 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
21880 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
21890 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
218a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
218b0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
218c0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
218d0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
218e0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
218f0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
21900 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
21910 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
21920 20 20 20 20 20 20 20 20 20 20 20 52 65 73 65 74             Reset
21930 43 61 63 68 65 64 58 6d 6c 43 6f 6e 66 69 67 46  CachedXmlConfigF
21940 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
21950 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
21960 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21970 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21990 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
219a0 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 63 61  l "---- reset ca
219b0 63 68 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75  ched XML configu
219c0 72 61 74 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65  ration file name
219d0 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n"..          }
219e0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
219f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
21a00 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21a10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
21a20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21a30 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
21a50 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
21a60 65 64 20 74 6f 20 72 65 73 65 74 20 63 61 63 68  ed to reset cach
21a70 65 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61  ed XML configura
21a80 74 69 6f 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20  tion " \..      
21a90 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 65 20            "file 
21aa0 6e 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  name, error: " \
21ab0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
21ac0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21ad0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
21ae0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
21af0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
21b00 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f  ilable, report o
21b10 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  n (and possibly 
21b20 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69  reset) the runti
21b30 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  me..      #     
21b40 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
21b50 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20  statistics...   
21b60 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
21b70 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
21b80 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
21b90 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
21ba0 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
21bb0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
21bc0 75 67 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ug]} then {..   
21bd0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
21be0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
21bf0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
21c00 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
21c10 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
21c20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
21c30 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
21c40 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64  a GetSettingRead
21c50 43 6f 75 6e 74 73 20 66 61 6c 73 65 0d 0a 20 20  Counts false..  
21c60 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
21c70 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
21c80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21c90 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74     set nameCount
21ca0 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f   [$settingReadCo
21cb0 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20  unts Count]..   
21cc0 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
21cd0 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20  Count 0....     
21ce0 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
21cf0 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
21d00 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
21d10 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
21d20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
21d30 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
21d40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
21d50 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
21d60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21d70 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21d80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21da0 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20    "---- setting 
21db0 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
21dc0 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 5c  "\" was read " \
21dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21de0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
21df0 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
21e00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21e10 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21e20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
21e30 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21e40 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
21e50 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
21e60 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
21e70 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
21e80 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
21ea0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
21eb0 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
21ec0 72 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  rSettingReadCoun
21ed0 74 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ts false..      
21ee0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
21ef0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
21f00 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21f10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f30 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21f40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
21f70 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
21f80 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
21f90 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
21fa0 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
21fb0 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
21fc0 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
21fd0 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c 6e 22  " values read\n"
21fe0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
21ff0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
22000 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
22010 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
22020 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22040 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
22050 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22070 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
22080 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20 73 65  iled to reset se
22090 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
220a0 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
220c0 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e  he previous " $n
220d0 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73  ameCount " names
220e0 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75   and " $valueCou
220f0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
22100 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75            " valu
22110 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20  es read, error: 
22120 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
22130 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
22140 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
22150 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
22160 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22170 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
22180 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
22190 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
221a0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
221b0 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
221c0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
221d0 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74  .SQLite.DebugDat
221e0 61 20 47 65 74 53 65 74 74 69 6e 67 52 65 61 64  a GetSettingRead
221f0 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a 20 20 20  Counts true..   
22200 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 46 69       } settingFi
22210 6c 65 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  leReadCounts] ==
22220 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
22230 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
22240 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 46 69 6c  unt [$settingFil
22250 65 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  eReadCounts Coun
22260 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
22270 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
22280 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
22290 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
222a0 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 46  s pair $settingF
222b0 69 6c 65 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d  ileReadCounts {.
222c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
222d0 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
222e0 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
222f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
22300 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22320 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
22330 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
22350 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b  -- setting \"" [
22360 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77  $pair Key] "\" w
22370 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  as read " \..   
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
22390 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74  $pair Value] " t
223a0 69 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  imes from the co
223b0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
223c0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
223d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
223e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
223f0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
22400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
22410 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
22420 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
22430 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
22440 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73  NonPublic -alias
22450 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22460 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
22470 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61  a.SQLite.DebugDa
22480 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e 67 52  ta ClearSettingR
22490 65 61 64 43 6f 75 6e 74 73 20 74 72 75 65 0d 0a  eadCounts true..
224a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
224b0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
224c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
224d0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
224e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
224f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22500 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22510 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22520 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65          "---- re
22530 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
22540 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70  istics for the p
22550 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20  revious " \..   
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61   $nameCount " na
22580 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65  mes and " $value
22590 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72  Count " values r
225a0 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 72               "fr
225c0 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
225d0 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20  tion file\n"].. 
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
225f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
22600 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
22610 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
22620 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22630 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22640 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22650 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
22660 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
22670 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
22680 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e   to reset settin
22690 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
226a0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
226b0 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70            "the p
226c0 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43  revious " $nameC
226d0 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64  ount " names and
226e0 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c   " $valueCount \
226f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22700 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20 72        " values r
22710 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e  ead from the con
22720 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 2c  figuration file,
22730 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c   error: " \n\t \
22740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22750 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d        $error \n]
22760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22770 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
22780 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22790 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
227a0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
227b0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
227c0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
227d0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
227e0 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
227f0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
22800 53 51 4c 69 74 65 2e 44 65 62 75 67 44 61 74 61  SQLite.DebugData
22810 20 47 65 74 4f 74 68 65 72 43 6f 75 6e 74 73 0d   GetOtherCounts.
22820 0a 20 20 20 20 20 20 20 20 7d 20 6f 74 68 65 72  .        } other
22830 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
22840 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22850 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
22860 6f 74 68 65 72 43 6f 75 6e 74 73 20 43 6f 75 6e  otherCounts Coun
22870 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  t]..          se
22880 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a  t valueCount 0..
22890 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
228a0 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
228b0 73 20 70 61 69 72 20 24 6f 74 68 65 72 43 6f 75  s pair $otherCou
228c0 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nts {..         
228d0 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
228e0 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
228f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22900 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
22910 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22920 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
22930 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
22940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22950 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63     "---- other c
22960 6f 75 6e 74 65 72 20 5c 22 22 20 5b 24 70 61 69  ounter \"" [$pai
22970 72 20 4b 65 79 5d 20 22 5c 22 20 68 61 73 20 76  r Key] "\" has v
22980 61 6c 75 65 20 22 20 5c 0d 0a 20 20 20 20 20 20  alue " \..      
22990 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
229a0 69 72 20 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20  ir Value] \n].. 
229b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
229c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
229d0 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
229e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
229f0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
22a00 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
22a10 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
22a20 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
22a30 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
22a50 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22a60 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61  e.DebugData Clea
22a70 72 4f 74 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20  rOtherCounts..  
22a80 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
22a90 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
22aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22ab0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
22ac0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22ad0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
22ae0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b00 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65        "---- rese
22b10 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 73  t other counters
22b20 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
22b30 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
22b40 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
22b50 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
22b60 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
22b70 22 20 76 61 6c 75 65 73 5c 6e 22 5d 0d 0a 20 20  " values\n"]..  
22b80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22b90 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
22ba0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
22bb0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
22bc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22bd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
22be0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22bf0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22c00 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
22c10 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
22c20 74 6f 20 72 65 73 65 74 20 6f 74 68 65 72 20 63  to reset other c
22c30 6f 75 6e 74 65 72 73 20 66 6f 72 20 22 20 5c 0d  ounters for " \.
22c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c50 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f       "the previo
22c60 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20  us " $nameCount 
22c70 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
22c80 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20  alueCount \..   
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ca0 20 22 20 76 61 6c 75 65 73 2c 20 65 72 72 6f 72   " values, error
22cb0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
22cc0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
22cd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22ce0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
22cf0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
22d00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
22d10 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
22d20 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c  ectCommand] && \
22d30 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
22d40 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  eSQLiteDefineCon
22d50 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 56 49  stant INTEROP_VI
22d60 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
22d70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
22d80 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
22d90 6e 73 74 61 6e 74 20 54 52 41 43 4b 5f 4d 45 4d  nstant TRACK_MEM
22da0 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e  ORY_BYTES]} then
22db0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
22dc0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
22dd0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
22de0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
22df0 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
22e00 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
22e10 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
22e20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22e30 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
22e40 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
22e50 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
22e60 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
22e70 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
22e80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
22e90 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41  iteMemory bytesA
22ea0 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
22eb0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
22ec0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22ed0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
22ee0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22ef0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22f00 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22f10 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
22f20 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
22f30 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
22f40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
22f50 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
22f60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
22f70 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
22f80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
22f90 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
22fa0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
22fb0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
22fc0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
22fd0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
22fe0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
22ff0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23000 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
23010 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
23020 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
23030 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
23040 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
23050 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23060 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
23070 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
23080 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
23090 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
230a0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
230b0 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79  Memory maximumBy
230c0 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
230d0 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
230e0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
230f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
23100 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
23110 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23120 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
23130 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
23140 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
23150 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
23160 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
23170 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
23180 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
23190 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
231a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
231b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
231c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
231d0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
231e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
231f0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
23200 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
23210 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23220 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23230 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
23240 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
23250 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
23260 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
23270 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
23280 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
23290 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
232a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
232b0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
232c0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
232d0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
232e0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
232f0 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
23300 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69  tiveMethods sqli
23310 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d  te3_memory_used.
23320 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
23330 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
23340 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
23350 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
23360 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23370 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
23380 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
23390 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
233a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
233b0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
233c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
233d0 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
233e0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
233f0 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
23400 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
23410 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
23420 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
23430 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
23440 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
23450 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23460 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23470 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
23480 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
23490 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
234a0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
234b0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
234c0 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
234d0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
234e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
234f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23500 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23510 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
23520 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
23530 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
23540 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
23550 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
23560 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
23570 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
23580 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
23590 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
235a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
235b0 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
235c0 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
235d0 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
235e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
235f0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
23600 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
23610 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
23620 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
23630 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
23640 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
23650 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
23660 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
23670 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
23680 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
23690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
236a0 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
236b0 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20  ighwater 0..    
236c0 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
236d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
236e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
236f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
23700 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23710 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23720 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
23730 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
23740 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
23750 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
23760 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
23770 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
23780 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
23790 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
237a0 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e?..          #.
237b0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
237c0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
237d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
237e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
237f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
23800 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
23810 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
23820 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
23830 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
23840 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23850 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
23860 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
23870 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
23880 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
23890 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
238a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
238b0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
238c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
238d0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  ...      if {$co
238e0 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
238f0 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
23900 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a  rbage $channel..
23910 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23920 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
23930 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
23940 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
23950 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
23960 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
23970 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  CLR... "..      
23980 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
23990 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
239a0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
239b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
239c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
239d0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
239e0 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
239f0 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
23a00 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
23a10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23a20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
23a30 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
23a40 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
23a50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23a60 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
23a70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23a80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
23a90 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
23aa0 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
23ab0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
23ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
23ad0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
23ae0 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76    set memory inv
23af0 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20  alid....        
23b00 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
23b10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23b20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23b30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23b40 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
23b50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23b60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23b70 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
23b80 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
23b90 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
23ba0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
23bb0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
23bc0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23bd0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23be0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
23bf0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23c00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
23c10 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
23c20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
23c30 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
23c40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
23c50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23c60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23c70 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
23c80 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
23c90 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
23ca0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
23cb0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
23cc0 20 20 20 70 72 6f 63 20 72 65 73 65 74 53 51 4c     proc resetSQL
23cd0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
23ce0 20 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 20   channel native 
23cf0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
23d00 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
23d10 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 6e  mpt to use the n
23d20 61 74 69 76 65 20 41 50 49 20 28 76 69 61 20 74  ative API (via t
23d30 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
23d40 62 6c 79 29 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  bly)?..      #..
23d50 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
23d60 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
23d70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
23d80 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
23d90 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
23da0 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
23db0 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
23dc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
23dd0 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
23de0 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
23df0 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
23e00 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
23e10 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
23e20 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
23e30 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
23e40 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
23e50 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20  ailable,..      
23e60 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
23e70 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23e80 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
23e90 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
23ea0 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  < 3} {incr index
23eb0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  } {..          i
23ec0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
23ed0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
23ee0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
23ef0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
23f00 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
23f10 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
23f20 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
23f30 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
23f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
23f50 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
23f60 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20  y $index null.. 
23f70 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c           } resul
23f80 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
23fa0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
23fb0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
23fc0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
23fd0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
23fe0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
23ff0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
24000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
24010 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20   null)... ok: " 
24020 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
24030 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
24040 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
24050 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
24060 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
24070 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
24080 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
24090 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
240a0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
240c0 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a   null)... error:
240d0 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
240e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
240f0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
24100 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
24110 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24120 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
24130 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
24140 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
24150 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
24160 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24170 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
24180 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
24190 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
241a0 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
241b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
241c0 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
241d0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
241e0 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
241f0 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
24200 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f         appear to
24210 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   be available, u
24220 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  se the associate
24230 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  d PRAGMA command
24240 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
24250 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
24260 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24270 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
24280 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
24290 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
242a0 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
242b0 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
242c0 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41  set sql [appendA
242d0 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64  rgs "PRAGMA " $d
242e0 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c  irectory " = \"\
242f0 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ";"]....        
24300 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
24310 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72  ecuteSql $sql} r
24320 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
24330 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
24340 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
24350 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24370 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
24380 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
24390 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
243a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
243b0 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
243c0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
243d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
243e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
243f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
24410 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47  --- execute PRAG
24420 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
24430 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "... error: " \.
24440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24450 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
24460 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
24470 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24480 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
24490 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
244a0 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
244b0 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65   { channel {rese
244c0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
244d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
244e0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
244f0 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
24500 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
24510 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
24520 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble...      #.. 
24530 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
24540 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
24550 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
24560 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c  for function sql
24570 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
24580 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d  irectory... "...
24590 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
245a0 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c  # NOTE: This cal
245b0 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  l to the sqlite3
245c0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
245d0 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73  tory function us
245e0 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  es the..      # 
245f0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61        invalid va
24600 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20 66 69  lue 0 for the fi
24610 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  rst argument.  T
24620 68 69 73 20 63 6f 64 65 20 69 73 20 64 65 73 69  his code is desi
24630 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  gned..      #   
24640 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20      to check if 
24650 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63  calling the func
24660 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20  tion will raise 
24670 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e  an exception (i.
24680 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e...      #     
24690 20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73    the actual res
246a0 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
246b0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ion does not mat
246c0 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e  ter as long as n
246d0 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
246e0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68   directory is ch
246f0 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23  anged)...      #
24700 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 57  ..      if {[isW
24710 69 6e 64 6f 77 73 5d 20 26 26 20 5b 63 61 74 63  indows] && [catc
24720 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
24730 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
24740 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
24750 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
24760 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
24770 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
24780 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
24790 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
247a0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
247b0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  null..      }] =
247c0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
247d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
247e0 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20  # NOTE: Calling 
247f0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
24800 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
24810 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
24820 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
24830 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65     cause an exce
24840 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65  ption; therefore
24850 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61  , it must be ava
24860 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20  ilable (i.e...  
24870 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
24880 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  en though it sho
24890 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69  uld return a fai
248a0 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65  lure return code
248b0 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   in this..      
248c0 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e    #       case).
248d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
248e0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
248f0 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
24900 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a  _set_directory..
24910 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
24920 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
24930 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24940 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
24950 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  s our caller wan
24960 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64  t to reset the d
24970 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20  irectories?..   
24980 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24990 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
249a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
249b0 73 65 74 53 51 4c 69 74 65 44 69 72 65 63 74 6f  setSQLiteDirecto
249c0 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72  ries $channel tr
249d0 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ue..        }.. 
249e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
249f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
24a00 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20  annel no\n....  
24a10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24a20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
24a30 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
24a40 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
24a50 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61  tories?  This ca
24a60 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  n only..        
24a70 23 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f  #       be perfo
24a80 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
24a90 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61  s loaded and rea
24aa0 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
24ab0 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
24ac0 23 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a  #       suite...
24ad0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24ae0 20 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26     if {$reset &&
24af0 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
24b00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24b10 20 20 20 20 72 65 73 65 74 53 51 4c 69 74 65 44      resetSQLiteD
24b20 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e  irectories $chan
24b30 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  nel false..     
24b40 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
24b50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
24b60 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
24b70 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   show the curren
24b80 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
24b90 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
24ba0 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
24bb0 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73       directories
24bc0 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
24bd0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
24be0 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
24bf0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
24c00 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
24c10 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
24c20 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
24c30 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c        if {[isSQL
24c40 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
24c50 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
24c60 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
24c70 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
24c80 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
24c90 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
24ca0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
24cb0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
24cc0 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
24cd0 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72  king " $director
24ce0 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  y "... "]....   
24cf0 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
24d00 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
24d10 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
24d20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \;]....         
24d30 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
24d40 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61  cuteSql $sql sca
24d50 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
24d60 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
24d70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
24d80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
24d90 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75  s "ok: \"" $resu
24da0 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
24db0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
24dc0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
24dd0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
24de0 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c  Args "error: " \
24df0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
24e00 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
24e10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
24e20 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
24e30 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54  proc loadSQLiteT
24e40 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68  estSettings { ch
24e50 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22  annel {suffix ""
24e60 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
24e70 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
24e80 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
24e90 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74   loading the set
24ea0 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75  tings if their u
24eb0 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69  sage has been di
24ec0 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  sabled...      #
24ed0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
24ee0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
24ef0 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  qliteTestSetting
24f00 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
24f10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24f20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
24f30 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
24f40 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
24f50 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
24f60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24f70 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24f80 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
24f90 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e  orm(user)]} then
24fa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
24fb0 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69  t userSettingsFi
24fc0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
24fd0 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
24fe0 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
24ff0 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
25000 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
25010 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
25020 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61  atform(user) .ea
25030 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
25040 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
25050 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67  sts $userSetting
25060 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
25070 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25080 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
25090 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
250a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
250b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
250c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
250d0 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
250e0 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
250f0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
25100 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25110 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
25120 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
25130 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
25140 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
25150 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
25160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
25170 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
25180 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69  ource $userSetti
25190 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
251a0 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
251b0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
251c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
251d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
251f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
25200 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
25230 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
25240 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73  er-user settings
25250 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
25280 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
25290 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
252a0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
252b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
252c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
252d0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
252e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
252f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
25300 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
25310 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
25320 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
25330 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
25340 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
25350 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
25360 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
25370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25380 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
25390 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
253a0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
253b0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
253c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
253d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
253e0 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
253f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
25430 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
25440 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
25450 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d  _platform(host)]
25460 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25470 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74      set hostSett
25480 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
25490 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
254a0 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
254c0 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
254d0 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
254e0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
254f0 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  t) .eagle]].... 
25500 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
25510 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53  le exists $hostS
25520 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
25530 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25540 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
25550 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
25560 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
25570 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
25580 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
25590 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
255a0 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
255b0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
255c0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
255d0 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
255e0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
255f0 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
25600 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25610 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
25620 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
25630 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
25640 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73  list source $hos
25650 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
25660 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e]..            
25670 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
25680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25690 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
256a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
256b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
256c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
256d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
256e0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
256f0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
25700 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
25710 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
25720 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
25730 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
25740 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
25750 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
25760 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
25770 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
25780 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
25790 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
257a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
257b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
257c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
257d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
257e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25800 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
25810 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
25820 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
25830 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
25840 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
25850 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
25860 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
25870 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
25880 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
25890 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
258a0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
258b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
258c0 6f 70 79 53 61 6d 70 6c 65 44 61 74 61 62 61 73  opySampleDatabas
258d0 65 46 69 6c 65 73 20 7b 7d 20 7b 0d 0a 20 20 20  eFiles {} {..   
258e0 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a     uplevel 1 {..
258f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25900 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
25910 28 6f 72 20 72 65 2d 63 6f 70 79 29 20 74 68 65  (or re-copy) the
25920 20 72 65 66 65 72 65 6e 63 65 20 64 61 74 61 62   reference datab
25930 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
25940 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
25950 23 20 20 20 20 20 20 20 75 6e 69 74 20 74 65 73  #       unit tes
25960 74 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64  t to the build d
25970 69 72 65 63 74 6f 72 79 20 69 6e 20 63 61 73 65  irectory in case
25980 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 68 61   it has been cha
25990 6e 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  nged..        # 
259a0 20 20 20 20 20 20 62 79 20 61 20 70 72 65 76 69        by a previ
259b0 6f 75 73 20 74 65 73 74 20 72 75 6e 2e 0d 0a 20  ous test run... 
259c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
259d0 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
259e0 63 65 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  ce $northwindEfD
259f0 62 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  bFile \..       
25a00 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
25a10 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
25a20 20 66 61 6c 73 65 5d 20 5b 66 69 6c 65 20 74 61   false] [file ta
25a30 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  il $northwindEfD
25a40 62 46 69 6c 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  bFile]]..      }
25a50 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
25a60 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
25a70 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stPrologue {} {.
25a80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
25a90 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
25aa0 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
25ab0 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20  prologue if the 
25ac0 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
25ad0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
25ae0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
25af0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
25b00 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
25b10 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (prologue.eagle)
25b20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25b30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25b40 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
25b50 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e  before-constrain
25b60 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
25b70 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
25b80 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
25b90 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
25ba0 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
25bb0 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
25bc0 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
25bd0 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
25be0 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
25bf0 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20  el .before].... 
25c00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25c10 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
25c20 69 66 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20  if the [object] 
25c30 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c  command is avail
25c40 61 62 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64  able; if not, ad
25c50 64 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  d some..        
25c60 23 20 20 20 20 20 20 20 73 68 69 6d 73 20 74 6f  #       shims to
25c70 20 6d 61 6b 65 20 74 68 65 20 74 65 73 74 20 73   make the test s
25c80 75 69 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65  uite run smoothe
25c90 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
25ca0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
25cb0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
25cc0 6e 64 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  nd $::test_chann
25cd0 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
25ce0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
25cf0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   Determine the n
25d00 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69  ames of the nati
25d10 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  ve platform and 
25d20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20  architecture... 
25d30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25d40 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
25d50 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
25d60 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20   true]..        
25d70 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
25d80 20 5b 61 72 63 68 69 74 65 63 74 75 72 65 46 6f   [architectureFo
25d90 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  rPlatform $platf
25da0 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  orm]....        
25db0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
25dc0 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74  E: Show the plat
25dd0 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65  form and archite
25de0 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 68 65  cture used to he
25df0 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20  lp locate the.. 
25e00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
25e10 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65  ative build file
25e20 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
25e30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
25e40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
25e50 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
25e60 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c          "---- pl
25e70 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74  atform for locat
25e80 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ing native build
25e90 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d   files is \"" \.
25ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c  .            $pl
25eb0 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a  atform \"\n]....
25ec0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
25ed0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
25ee0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
25ef0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61           "---- a
25f00 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72 20  rchitecture for 
25f10 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
25f20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
25f30 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
25f40 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
25f50 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
25f60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
25f70 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74  TE: Build a list
25f80 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   of configuratio
25f90 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  n files that we 
25fa0 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
25fb0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
25fc0 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
25fd0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
25fe0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
25ff0 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66  .SQLite.dll.conf
26000 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ig]....        #
26010 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26020 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
26030 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61  f auxiliary Mana
26040 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73  ged Debugging As
26050 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a  sistants (MDA)..
26060 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26070 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
26080 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
26090 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
260a0 20 20 20 20 20 20 20 20 73 65 74 20 6d 64 61 43          set mdaC
260b0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b  onfigFileNames [
260c0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
260d0 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32      EagleShell32
260e0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
260f0 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64  Installer.exe.md
26100 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20  a.config \..    
26110 20 20 20 20 20 20 20 20 74 65 73 74 2e 65 78 65          test.exe
26120 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74  .mda.config test
26130 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  linq.exe.mda.con
26140 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  fig \..         
26150 20 20 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d     testef6.exe.m
26160 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20  da.config]....  
26170 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26180 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
26190 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72  he list of exter
261a0 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77  nal files that w
261b0 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20  e handle.  Some 
261c0 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  of..        #   
261d0 20 20 20 20 74 68 65 73 65 20 66 69 6c 65 73 20      these files 
261e0 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e  may be native an
261f0 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73  d/or managed ass
26200 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61 72 65  emblies that are
26210 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
26220 20 20 72 65 71 75 69 72 65 64 20 74 6f 20 70 65    required to pe
26230 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65  rform various te
26240 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
26250 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78 74  .        set ext
26260 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b  ernalFileNames [
26270 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
26280 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45      [file join E
26290 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c  ntityFramework l
262a0 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  ib [string map [
262b0 6c 69 73 74 20 46 78 20 22 22 5d 20 5c 0d 0a 20  list Fx ""] \.. 
262c0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
262d0 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74  ng map [list net
262e0 46 78 34 35 31 20 6e 65 74 46 78 34 35 20 6e 65  Fx451 netFx45 ne
262f0 74 46 78 34 35 32 20 6e 65 74 46 78 34 35 20 6e  tFx452 netFx45 n
26300 65 74 46 78 34 36 20 5c 0d 0a 20 20 20 20 20 20  etFx46 \..      
26310 20 20 20 20 20 20 6e 65 74 46 78 34 35 20 6e 65        netFx45 ne
26320 74 46 78 34 36 31 20 6e 65 74 46 78 34 35 20 6e  tFx461 netFx45 n
26330 65 74 46 78 34 36 32 20 6e 65 74 46 78 34 35 20  etFx462 netFx45 
26340 6e 65 74 46 78 34 37 20 6e 65 74 46 78 34 35 20  netFx47 netFx45 
26350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  \..            n
26360 65 74 46 78 34 37 31 20 6e 65 74 46 78 34 35 20  etFx471 netFx45 
26370 6e 65 74 46 78 34 37 32 20 6e 65 74 46 78 34 35  netFx472 netFx45
26380 20 6e 65 74 53 74 61 6e 64 61 72 64 32 30 20 6e   netStandard20 n
26390 65 74 46 78 34 35 5d 20 5c 0d 0a 20 20 20 20 20  etFx45] \..     
263a0 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
263b0 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46  NetFx]]] EntityF
263c0 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a  ramework.dll]]..
263d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
263e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
263f0 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ld the list of n
26400 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66  ative assembly f
26410 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
26420 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
26430 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
26440 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  iveFileNames [li
26450 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65  st]....        e
26460 76 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69  val lappend nati
26470 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74  veFileNames [get
26480 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
26490 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20  eNamesOnly]..   
264a0 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
264b0 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65  d nativeFileName
264c0 73 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73  s [getInteropAss
264d0 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  emblyFileNamesOn
264e0 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ly]....        #
264f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26500 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
26510 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61   of mixed-mode a
26520 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
26530 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
26540 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26550 20 20 73 65 74 20 6d 69 78 65 64 46 69 6c 65 4e    set mixedFileN
26560 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
26570 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
26580 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
26590 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
265a0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
265b0 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 53  mixedFileNames S
265c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
265d0 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d  e.dll..        }
265e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
265f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
26600 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
26610 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
26620 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
26630 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
26640 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
26650 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
26660 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
26670 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
26680 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
26690 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
266a0 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d  Lite.EF6.dll]...
266b0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
266c0 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
266d0 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d  native]} then {.
266e0 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
266f0 6e 64 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  nd managedFileNa
26700 6d 65 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  mes System.Data.
26710 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20  SQLite.dll..    
26720 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26730 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
26740 54 45 3a 20 53 68 6f 77 20 74 68 65 20 76 61 72  TE: Show the var
26750 69 6f 75 73 20 6c 69 73 74 73 20 6f 66 20 66 69  ious lists of fi
26760 6c 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72  le names that ar
26770 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69  e handled by thi
26780 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
26790 20 20 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20     procedure... 
267a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
267b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
267c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
267d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
267e0 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66     "---- list of
267f0 20 5c 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   \"configuration
26800 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73  \" file names is
26810 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
26820 20 20 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61     $configFileNa
26830 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  mes \n]....     
26840 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
26850 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
26860 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
26870 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f      "---- list o
26880 66 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67 75 72  f \"MDA configur
26890 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e 61 6d  ation\" file nam
268a0 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20 20 20  es is: " \..    
268b0 20 20 20 20 20 20 20 20 24 6d 64 61 43 6f 6e 66          $mdaConf
268c0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  igFileNames \n].
268d0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
268e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
268f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
26900 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
26910 2d 20 6c 69 73 74 20 6f 66 20 5c 22 65 78 74 65  - list of \"exte
26920 72 6e 61 6c 5c 22 20 66 69 6c 65 20 6e 61 6d 65  rnal\" file name
26930 73 20 69 73 3a 20 22 20 24 65 78 74 65 72 6e 61  s is: " $externa
26940 6c 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a  lFileNames \n]..
26950 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
26960 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
26970 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
26980 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
26990 20 6c 69 73 74 20 6f 66 20 5c 22 6e 61 74 69 76   list of \"nativ
269a0 65 5c 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69  e\" file names i
269b0 73 3a 20 22 20 24 6e 61 74 69 76 65 46 69 6c 65  s: " $nativeFile
269c0 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  Names \n]....   
269d0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
269e0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
269f0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
26a00 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
26a10 20 6f 66 20 5c 22 6d 69 78 65 64 5c 22 20 66 69   of \"mixed\" fi
26a20 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24  le names is: " $
26a30 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c  mixedFileNames \
26a40 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
26a50 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
26a60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
26a70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
26a80 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d  ---- list of \"m
26a90 61 6e 61 67 65 64 5c 22 20 66 69 6c 65 20 6e 61  anaged\" file na
26aa0 6d 65 73 20 69 73 3a 20 22 20 24 6d 61 6e 61 67  mes is: " $manag
26ab0 65 64 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d  edFileNames \n].
26ac0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
26ad0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
26ae0 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f  move any test co
26af0 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72  nstraints that r
26b00 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69  efer to the nati
26b10 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20  ve and/or..     
26b20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
26b30 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
26b40 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
26b50 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65   unless forbidde
26b60 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20  n from..        
26b70 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f  #       doing so
26b80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
26b90 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
26ba0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
26bb0 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61  iteRemoveConstra
26bc0 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
26bd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
26be0 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
26bf0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
26c00 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
26c10 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
26c20 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
26c30 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
26c40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26c50 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
26c60 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
26c70 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
26c80 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
26c90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
26ca0 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
26cb0 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
26cc0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
26cd0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
26ce0 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
26cf0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
26d00 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
26d10 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
26d20 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20  ile_ [file tail 
26d30 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
26d40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
26d50 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
26d60 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
26d70 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
26d80 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
26d90 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
26da0 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
26db0 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
26dc0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
26dd0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
26de0 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
26df0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
26e00 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
26e10 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
26e20 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
26e30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
26e40 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
26e50 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
26e60 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
26e70 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
26e80 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
26e90 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
26ea0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
26eb0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
26ec0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
26ed0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
26ee0 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74  p all System.Dat
26ef0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
26f00 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28   file handling (
26f10 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20  deleting,..     
26f20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 69     #       copyi
26f30 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29  ng, and loading)
26f40 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
26f50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26f60 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
26f70 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
26f80 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
26f90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
26fa0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
26fb0 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
26fc0 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73  delete any files
26fd0 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
26fe0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
26ff0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
27000 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
27010 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73  eleteSqliteFiles
27020 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
27030 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
27040 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
27050 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69  eleteSqliteConfi
27060 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  gFiles)]} then {
27070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27080 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
27090 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
270a0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
270b0 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
270c0 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
270d0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
270e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
270f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
27100 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
27110 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
27120 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
27130 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
27140 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
27150 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
27160 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
27170 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27180 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69      tryDeleteBui
27190 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
271a0 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
271b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
271c0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
271d0 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
271e0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27200 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
27210 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
27220 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
27230 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
27240 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
27250 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
27260 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
27270 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
27280 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27290 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
272a0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
272b0 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
272c0 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
272d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
272e0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
272f0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
27300 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
27320 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
27330 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
27340 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
27350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
27360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27370 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
27380 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
27390 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
273a0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
273c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
273d0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
273e0 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
273f0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
27400 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
27410 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
27420 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
27430 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27440 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
27450 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
27460 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
27480 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
27490 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
274a0 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
274b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
274c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
274e0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
274f0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
27500 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
27510 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
27530 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
27540 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
27550 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27560 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
27570 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
27580 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
27590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
275a0 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
275b0 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
275c0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
275f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
27600 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27610 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27620 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
27630 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
27640 65 74 65 53 71 6c 69 74 65 4d 69 78 65 64 46 69  eteSqliteMixedFi
27650 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
27680 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
27690 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
276a0 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 64 65 6c  tion is set, del
276b0 65 74 65 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20  ete implicit..  
276c0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
276d0 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61      mixed-mode a
276e0 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 61 73  ssembly files as
276f0 20 77 65 6c 6c 2e 20 20 54 68 69 73 20 72 75 6e   well.  This run
27700 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20  time option..   
27710 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
27720 20 20 20 63 68 65 63 6b 20 69 73 20 68 61 6e 64     check is hand
27730 6c 65 64 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  led when buildin
27740 67 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 69  g the list of mi
27750 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20  xed-mode..      
27760 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27770 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
27780 6d 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  mes...          
27790 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
277a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
277b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
277c0 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
277d0 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  MixedFiles)]} th
277e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
277f0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
27800 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
27810 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
27820 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
27830 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
27840 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
27850 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
27860 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
27880 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
27890 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
278a0 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
278b0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
278c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
278d0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
278e0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50  no(deleteSqliteP
278f0 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
27900 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
27910 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
27920 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
27930 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
27960 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
27970 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
27980 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
27990 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
279a0 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
279b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
279c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
279d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
279e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
279f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
27a00 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
27a10 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
27a20 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
27a30 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
27a40 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
27a50 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
27a60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27a70 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
27a80 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
27a90 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
27ac0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
27ad0 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
27af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27b00 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
27b10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
27b20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
27b30 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
27b40 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
27b50 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65  qliteManagedFile
27b60 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
27b70 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
27b80 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  ch fileName $man
27b90 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
27ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27bb0 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
27bc0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
27be0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
27bf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
27c00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27c10 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
27c20 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53  k for the "autoS
27c30 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f  elect" runtime o
27c40 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65  ption.  If prese
27c50 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nt,..          #
27c60 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74         attempt t
27c70 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
27c80 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
27c90 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
27ca0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
27cb0 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65  ild (or "release
27cc0 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
27cd0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
27ce0 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ite..          #
27cf0 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77         for use w
27d00 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ith the test sui
27d10 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  te...          #
27d20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
27d30 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
27d40 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74  n autoSelect]} t
27d50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
27d60 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f     if {![checkFo
27d70 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
27d80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
27d90 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
27da0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
27db0 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
27dc0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27dd0 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  l true..        
27de0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
27df0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
27e00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
27e10 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
27e20 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62   to verify the b
27e30 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69  uild directory i
27e40 66 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20  f instructed;.. 
27e50 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
27e60 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65   otherwise, make
27e70 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c   sure it actuall
27e80 79 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74  y exists or halt
27e90 20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20   the entire..   
27ea0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
27eb0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69  esting process i
27ec0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
27ed0 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ist...          
27ee0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
27ef0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
27f00 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44  :no(verifyBuildD
27f10 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
27f20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27f30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
27f40 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70   NOTE: At this p
27f50 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20  oint, the build 
27f60 64 69 72 65 63 74 6f 72 69 65 73 20 4d 55 53 54  directories MUST
27f70 20 65 78 69 73 74 20 66 6f 72 0d 0a 20 20 20 20   exist for..    
27f80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27f90 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
27fa0 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ess to continue.
27fb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
27fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
27fd0 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
27fe0 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61  uildDirectory fa
27ff0 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
28000 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
28010 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79  xists $directory
28020 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
28030 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69          ![file i
28040 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
28050 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
28070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
28080 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f   NOTE: Just prio
28090 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61  r to actually ha
280a0 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  lting the testin
280b0 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20  g process,..    
280c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
280d0 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74    add an error t
280e0 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66  o the test log f
280f0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
28100 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
28110 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
28120 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
28130 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
28140 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
28150 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69  - could not veri
28160 66 79 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20  fy native build 
28170 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d  directory \"" \.
28180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28190 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c     $directory "\
281a0 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
281b0 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  alted\n"]....   
281c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
281d0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
281e0 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63  TE: Raising a sc
281f0 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20  ript error from 
28200 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c  this point shoul
28210 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20  d halt..        
28220 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
28230 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
28240 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
28250 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
28260 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
28270 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
28280 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
28290 20 6e 6f 74 20 76 65 72 69 66 79 20 6e 61 74 69   not verify nati
282a0 76 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  ve build directo
282b0 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  ry \"" \..      
282c0 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
282d0 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20  ectory "\", all 
282e0 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
282f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
28300 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
28310 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
28320 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  tBuildDirectory 
28330 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  true]....       
28340 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
28350 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72  exists $director
28360 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  y] || \..       
28370 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
28380 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
28390 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
283a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
283b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
283c0 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69  # NOTE: Just pri
283d0 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68  or to actually h
283e0 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69  alting the testi
283f0 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20  ng process,..   
28400 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
28410 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20     add an error 
28420 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20  to the test log 
28430 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
28440 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28450 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
28460 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
28470 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28490 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72  -- could not ver
284a0 69 66 79 20 6d 61 6e 61 67 65 64 20 62 75 69 6c  ify managed buil
284b0 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
284c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
284d0 20 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20       $directory 
284e0 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
284f0 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20   halted\n"].... 
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
28520 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20  NOTE: Raising a 
28530 73 63 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f  script error fro
28540 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f  m this point sho
28550 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20  uld halt..      
28560 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28570 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
28580 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ess...          
28590 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
285a0 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65       error [appe
285b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
285c0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75              "cou
285d0 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 6d 61  ld not verify ma
285e0 6e 61 67 65 64 20 62 75 69 6c 64 20 64 69 72 65  naged build dire
285f0 63 74 6f 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20  ctory \"" \..   
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
28610 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2c 20 61  directory "\", a
28620 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
28630 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d"]..           
28640 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
28650 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
28660 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
28670 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
28680 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20   copy any files 
28690 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
286a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
286b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
286c0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
286d0 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  pySqliteFiles)]}
286e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
286f0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
28700 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
28710 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
28720 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
28730 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
28740 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
28750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
28760 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
28770 69 6e 67 20 5c 22 63 6f 6e 66 69 67 75 72 61 74  ing \"configurat
28780 69 6f 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e  ion\" files...\n
28790 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "....           
287a0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
287b0 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e  ame $configFileN
287c0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
287d0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
287e0 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
287f0 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  me false..      
28800 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
28810 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
28820 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
28830 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
28840 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61  opySqliteExterna
28850 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  lFiles)]} then {
28860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28870 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
28880 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
28890 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67  e Managed Debugg
288a0 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28  ing Assistants (
288b0 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69  MDA) configurati
288c0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
288d0 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66    #       file f
288e0 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  or the Eagle she
288f0 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20  ll to the build 
28900 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
28910 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
28920 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75   #       while u
28930 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65  sing each of the
28940 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61   names of the va
28950 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73  rious legacy tes
28960 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
28970 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61   #       executa
28980 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c  bles.  This will
28990 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75   help to make su
289a0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d  re that all the.
289b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
289c0 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65         legacy te
289d0 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61  sts run with exa
289e0 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65  ctly the same se
289f0 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20  t of Managed..  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
28a10 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73      Debugging As
28a20 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75  sistants configu
28a30 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  red...          
28a40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
28a50 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
28a60 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22  "---- copying \"
28a90 4d 44 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  MDA configuratio
28aa0 6e 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d  n\" files...\n".
28ab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
28ac0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
28ad0 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
28ae0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
28af0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
28b00 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65  BinaryFile Eagle
28b10 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
28b20 6e 66 69 67 20 74 72 75 65 20 22 22 20 24 66 69  nfig true "" $fi
28b30 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
28b40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
28b50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
28b60 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
28b70 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74 65 72  : Copy the exter
28b80 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66  nal binaries, if
28b90 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72   any, to the dir
28ba0 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20  ectory that..   
28bb0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
28bc0 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20     contains the 
28bd0 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68  Eagle shell.  Th
28be0 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20  is is typically 
28bf0 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20  used to make..  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
28c10 20 20 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c      sure assembl
28c20 69 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62  ies referenced b
28c30 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67  y the ones being
28c40 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20   tested are..   
28c50 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
28c60 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72     available dur
28c70 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
28c80 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
28c90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
28ca0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
28cb0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22  ::test_channel "
28cc0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 65  ---- copying \"e
28cd0 78 74 65 72 6e 61 6c 5c 22 20 66 69 6c 65 73 2e  xternal\" files.
28ce0 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
28cf0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
28d00 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61  ileName $externa
28d10 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  lFileNames {..  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
28d30 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c  yCopyExternalFil
28d40 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
28d50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
28d60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
28d70 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
28d80 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
28d90 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69  o(copySqliteNati
28da0 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
28db0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
28dc0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
28dd0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
28de0 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69   test platform i
28df0 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66  s likely the def
28e00 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20  ault for this.. 
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
28e20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c       machine, al
28e30 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  so try to copy t
28e40 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20  he native files 
28e50 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
28e60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
28e70 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a  nary location...
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
28e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
28ea0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
28eb0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
28ec0 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46 69  ImplicitNativeFi
28ed0 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69                [i
28ef0 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61  sDefaultBuildPla
28f00 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
28f30 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28f50 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c 69  -- copying impli
28f60 63 69 74 20 5c 22 6e 61 74 69 76 65 5c 22 20 66  cit \"native\" f
28f70 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
28f90 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
28fa0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
28fb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
28fc0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
28fd0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66  mbly $fileName f
28fe0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
28ff0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
29000 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29010 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
29020 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
29030 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d  (copySqliteNonIm
29040 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
29050 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
29060 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
29070 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
29080 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  pySqlitePlatform
29090 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
290c0 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
290d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
290e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
290f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29100 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
29130 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20 66  ing \"native\" f
29140 69 6c 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72  iles for platfor
29150 6d 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  m \"" \..       
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
29170 70 6c 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e  platform \"...\n
29180 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
29190 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
291a0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
291b0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
291e0 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20  $fileName false 
291f0 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
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 20 20                  
29220 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
29230 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
29240 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
29250 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
29260 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
29290 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
292a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
292d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
292e0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
292f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
29300 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69  - copying \"nati
29310 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 61  ve\" files for a
29320 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 22 20  rchitecture \"" 
29330 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
29340 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74           $archit
29350 65 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  ecture \"...\n].
29360 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
29370 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
29380 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
29390 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
293b0 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
293c0 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 61  ileName false $a
293d0 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
293f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29400 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
29410 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
29420 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
29430 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
29440 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
29450 6c 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d  liteMixedFiles)]
29460 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29470 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
29480 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
29490 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
294a0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
294b0 69 73 20 73 65 74 2c 20 63 6f 70 79 20 69 6d 70  is set, copy imp
294c0 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20  licit..         
294d0 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
294e0 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
294f0 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20   files as well. 
29500 20 54 68 65 20 72 75 6e 74 69 6d 65 20 6f 70 74   The runtime opt
29510 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
29520 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b     #       check
29530 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65 6e   is handled when
29540 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c 69   building the li
29550 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64 65  st of mixed-mode
29560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29570 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
29580 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20 20   file names...  
29590 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
295b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
295c0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d  :no(copySqliteIm
295d0 70 6c 69 63 69 74 4d 69 78 65 64 46 69 6c 65 73  plicitMixedFiles
295e0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
295f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
29600 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29610 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
29620 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
29630 6f 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74 20  opying implicit 
29640 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e  \"mixed\" files.
29650 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
29660 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
29670 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64   fileName $mixed
29680 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
29690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
296a0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
296b0 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d 0a  fileName false..
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
296e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
296f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
29700 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
29710 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
29720 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
29730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29740 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
29750 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
29760 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
29770 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
29780 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
29790 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
297a0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
297b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
297c0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
297d0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
297e0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
297f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29800 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22  "---- copying \"
29810 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66 6f  mixed\" files fo
29820 72 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c  r platform \"" \
29830 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29840 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
29850 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20  m \"...\n]....  
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
29880 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
29890 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
298a0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
298b0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
298c0 65 20 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72  e false $platfor
298d0 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
298e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
298f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
29910 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
29920 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72  :no(copySqliteAr
29930 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
29940 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
29950 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
29960 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
29970 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
29980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
29990 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
299a0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
299b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299d0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
299e0 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65  g \"mixed\" file
299f0 73 20 66 6f 72 20 61 72 63 68 69 74 65 63 74 75  s for architectu
29a00 72 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  re \"" \..      
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22  $architecture \"
29a30 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ...\n]....      
29a40 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
29a50 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
29a60 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
29a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a80 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
29a90 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
29aa0 6c 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72  lse $architectur
29ab0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
29ac0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
29ad0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
29ae0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29af0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
29b00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
29b10 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
29b20 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65  copySqliteManage
29b30 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
29b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29b50 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
29b60 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79  annel "---- copy
29b70 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22 20  ing \"managed\" 
29b80 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20  files...\n".... 
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
29ba0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
29bb0 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
29bc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
29bd0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
29be0 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75  ly $fileName tru
29bf0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
29c00 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
29c10 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
29c20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
29c30 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
29c40 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
29c50 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69  load any files i
29c60 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
29c70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
29c80 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
29c90 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
29ca0 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  dSqliteFiles)]} 
29cb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29cc0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
29cd0 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
29ce0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
29cf0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
29d00 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
29d10 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
29d20 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
29d30 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
29d40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
29d50 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
29d60 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
29d70 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74  teLinqFiles)]} t
29d80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
29d90 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
29da0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
29db0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
29dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
29dd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
29de0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
29df0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
29e00 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  Ef6Files)]} then
29e10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29e20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
29e30 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
29e40 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20  Lite.EF6.dll..  
29e50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
29e60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
29e70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
29e80 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49  o(loadSqliteNonI
29e90 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
29ea0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
29eb0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
29ec0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
29ed0 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  dSqlitePlatformF
29ee0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
29f00 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
29f10 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
29f20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
29f30 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
29f40 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
29f50 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
29f60 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
29f70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
29f80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
29f90 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
29fa0 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
29fb0 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
29fc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29fd0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
29fe0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
29ff0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
2a000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a010 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
2a020 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2a030 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
2a040 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
2a050 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2a060 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2a070 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
2a080 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
2a090 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e   fileNameOnly $n
2a0a0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
2a0b0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
2a0c0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2a0d0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2a0e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2a0f0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2a100 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
2a110 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
2a120 6e 61 74 69 76 65 2f 20 24 66 69 6c 65 4e 61 6d  native/ $fileNam
2a130 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20  eOnly \..       
2a140 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
2a150 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
2a160 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2a170 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
2a180 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
2a190 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
2a1a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2a1b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2a1c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2a1d0 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65  eOnly $mixedFile
2a1e0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2a1f0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2a200 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2a210 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2a220 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2a240 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
2a250 6f 66 20 5c 22 22 20 6d 69 78 65 64 2f 20 24 66  of \"" mixed/ $f
2a260 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20  ileNameOnly \.. 
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a280 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20  \"... \"" [file 
2a290 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
2a2a0 72 79 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ryFileName \..  
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66                $f
2a2c0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c 22  ileNameOnly]] \"
2a2d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
2a2e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2a2f0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2a300 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61 6e  ileNameOnly $man
2a310 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
2a320 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
2a330 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a340 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2a350 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2a360 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
2a370 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
2a380 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d  version of \"" m
2a390 61 6e 61 67 65 64 2f 20 24 66 69 6c 65 4e 61 6d  anaged/ $fileNam
2a3a0 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20  eOnly \..       
2a3b0 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
2a3c0 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
2a3d0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2a3e0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
2a3f0 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
2a400 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
2a410 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2a420 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2a430 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
2a440 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
2a450 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2a460 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2a470 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69  leNameOnly $nati
2a480 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
2a490 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
2a4a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a4b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2a4c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2a4d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2a4e0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
2a4f0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
2a500 22 22 20 6e 61 74 69 76 65 2f 70 6c 61 74 66 6f  "" native/platfo
2a510 72 6d 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rm/ \..         
2a520 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
2a530 72 6d 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  rm / $fileNameOn
2a540 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
2a550 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
2a560 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e           version
2a570 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
2a580 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
2a590 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
2a5a0 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
2a5b0 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
2a5c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2a5d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2a5e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2a5f0 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c  meOnly $mixedFil
2a600 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2a610 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
2a630 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2a640 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2a650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a660 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
2a670 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d 69  ersion of \"" mi
2a680 78 65 64 2f 70 6c 61 74 66 6f 72 6d 2f 20 5c 0d  xed/platform/ \.
2a690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6a0 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 20 24     $platform / $
2a6b0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
2a6c0 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 5c 0d  ... \"" [file \.
2a6d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6e0 20 20 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42     version [getB
2a6f0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
2a700 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20  ileNameOnly \.. 
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c   $platform]] \"\
2a730 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
2a740 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2a750 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2a760 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
2a770 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
2a780 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
2a790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
2a7a0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
2a7b0 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  ly $nativeFileNa
2a7c0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
2a7d0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2a7e0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2a7f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2a800 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
2a830 69 6f 6e 20 6f 66 20 5c 22 22 20 6e 61 74 69 76  ion of \"" nativ
2a840 65 2f 61 72 63 68 69 74 65 63 74 75 72 65 2f 20  e/architecture/ 
2a850 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2a860 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
2a870 72 65 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  re / $fileNameOn
2a880 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
2a890 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
2a8a0 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e           version
2a8b0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
2a8c0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
2a8d0 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
2a8e0 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
2a8f0 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  ture]] \"\n]..  
2a900 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2a910 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2a920 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2a930 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65  leNameOnly $mixe
2a940 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
2a950 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
2a960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2a970 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2a980 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2a990 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2a9a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
2a9b0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
2a9c0 22 20 6d 69 78 65 64 2f 61 72 63 68 69 74 65 63  " mixed/architec
2a9d0 74 75 72 65 2f 20 5c 0d 0a 20 20 20 20 20 20 20  ture/ \..       
2a9e0 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
2a9f0 69 74 65 63 74 75 72 65 20 2f 20 24 66 69 6c 65  itecture / $file
2aa00 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
2aa10 5c 22 22 20 5b 66 69 6c 65 20 5c 0d 0a 20 20 20  \"" [file \..   
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
2aa30 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
2aa40 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
2aa50 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20  ameOnly \..     
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72               $ar
2aa70 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c  chitecture]] \"\
2aa80 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
2aa90 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2aaa0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2aab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2aac0 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
2aad0 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64   list of managed
2aae0 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20   assemblies for 
2aaf0 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
2ab00 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ess..        #  
2ab10 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20       and report 
2ab20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
2ab30 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
2ab40 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
2ab50 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
2ab60 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
2ab70 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
2ab80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
2ab90 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
2aba0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
2abb0 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 47 65 74  voke Utility Get
2abc0 41 73 73 65 6d 62 6c 69 65 73 0d 0a 20 20 20 20  Assemblies..    
2abd0 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62 6c 69        } assembli
2abe0 65 73 5d 20 3d 3d 20 30 20 7c 7c 20 5b 63 61 74  es] == 0 || [cat
2abf0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2ac00 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
2ac10 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
2ac20 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d  tDomain GetAssem
2ac30 62 6c 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20  blies..         
2ac40 20 7d 20 61 73 73 65 6d 62 6c 69 65 73 5d 20 3d   } assemblies] =
2ac50 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2ac60 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
2ac70 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79  foreach assembly
2ac80 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a   $assemblies {..
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2aca0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
2acb0 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \{System.Data.SQ
2acc0 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d  Lite* $assembly]
2acd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2ace0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2acf0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2ad00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
2ad30 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
2ad40 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
2ad50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2ad60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2ad70 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2ad80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2ad90 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
2ada0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2adb0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2add0 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  -- define consta
2ade0 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d  nts for \"System
2adf0 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e  .Data.SQLite\"..
2ae00 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
2ae10 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
2ae20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2ae30 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
2ae40 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
2ae60 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2ae70 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
2ae80 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20  onstants..      
2ae90 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
2aea0 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
2aeb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2aec0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2aed0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2aee0 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
2aef0 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
2af00 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65           $define
2af10 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65  Constants] <none
2af20 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
2af30 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2af40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2af50 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
2af60 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
2af70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
2af80 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
2af90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
2afa0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2afb0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
2afc0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
2afd0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
2afe0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2aff0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  e.dll\"... "....
2b000 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
2b010 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
2b020 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
2b030 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
2b040 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
2b050 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
2b060 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
2b070 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
2b080 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20  derVersion..    
2b090 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d        } version]
2b0a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
2b0b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2b0c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
2b0d0 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
2b0e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2b0f0 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
2b100 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
2b110 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2b120 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b130 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2b140 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
2b150 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
2b160 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2b170 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b180 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
2b190 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2b1a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2b1b0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2b1c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2b1d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2b1f0 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
2b200 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
2b210 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
2b220 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
2b230 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2b240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
2b250 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
2b260 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
2b270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b280 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2b290 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
2b2a0 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75  tion ProviderSou
2b2b0 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20  rceId..         
2b2c0 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20   } sourceId] == 
2b2d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
2b2e0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
2b2f0 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
2b300 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
2b310 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2b320 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
2b330 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
2b340 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
2b350 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2b360 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
2b370 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a   $sourceId \n]..
2b380 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2b390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2b3a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2b3b0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
2b3c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2b3d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2b3e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2b3f0 4e 4f 54 45 3a 20 52 65 73 65 74 20 63 61 63 68  NOTE: Reset cach
2b400 65 64 20 22 62 72 65 61 6b 20 69 6e 74 6f 20 64  ed "break into d
2b410 65 62 75 67 67 65 72 22 20 73 65 74 74 69 6e 67  ebugger" setting
2b420 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
2b430 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
2b440 20 20 20 20 75 73 65 64 20 64 75 72 69 6e 67 20      used during 
2b450 74 68 65 20 74 65 73 74 20 66 69 6c 65 2c 20 69  the test file, i
2b460 66 20 6e 65 65 64 65 64 2e 0d 0a 20 20 20 20 20  f needed...     
2b470 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2b480 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2b490 3a 3a 6e 6f 28 72 65 73 65 74 42 72 65 61 6b 49  ::no(resetBreakI
2b4a0 6e 74 6f 44 65 62 75 67 67 65 72 29 5d 20 26 26  ntoDebugger)] &&
2b4b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2b4c0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
2b4d0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
2b4e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
2b4f0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
2b500 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
2b510 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
2b520 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
2b530 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
2b540 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 48 65 6c  .Data.SQLite.Hel
2b550 70 65 72 4d 65 74 68 6f 64 73 20 52 65 73 65 74  perMethods Reset
2b560 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67 65  BreakIntoDebugge
2b570 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 72  r..          } r
2b580 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
2b590 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2b5a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2b5b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2b5c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2b5d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
2b5e0 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f 44   ResetBreakIntoD
2b5f0 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 6f 6b 5c  ebugger()... ok\
2b600 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
2b610 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2b620 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2b630 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2b640 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2b650 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2b660 63 61 6c 6c 20 52 65 73 65 74 42 72 65 61 6b 49  call ResetBreakI
2b670 6e 74 6f 44 65 62 75 67 67 65 72 28 29 2e 2e 2e  ntoDebugger()...
2b680 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
2b6a0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
2b6b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2b6c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2b6d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2b6e0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76  TE: Check the av
2b6f0 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28  ailable builds (
2b700 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20  and "releases") 
2b710 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20  of SQLite and.. 
2b720 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
2b730 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2b740 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
2b750 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
2b760 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
2b770 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
2b780 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2b790 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
2b7a0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
2b7b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2b7c0 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
2b7d0 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
2b7e0 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
2b7f0 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
2b800 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
2b810 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
2b820 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
2b830 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
2b840 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
2b850 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
2b860 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
2b870 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
2b880 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
2b890 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
2b8a0 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
2b8b0 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
2b8c0 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
2b8d0 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
2b8e0 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
2b8f0 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
2b900 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
2b910 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
2b920 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
2b930 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
2b940 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2b950 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a  SQLiteLibrary $:
2b960 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
2b970 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2b980 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2b990 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
2b9a0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
2b9b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
2b9c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2b9d0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
2b9e0 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74  eInterop $::test
2b9f0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
2ba00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ba10 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
2ba20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
2ba30 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
2ba40 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
2ba50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ba60 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
2ba70 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
2ba80 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2ba90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2baa0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
2bab0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2bac0 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
2bad0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
2bae0 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
2baf0 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
2bb00 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
2bb10 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
2bb20 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
2bb30 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
2bb40 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
2bb50 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
2bb60 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
2bb70 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
2bb80 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
2bb90 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
2bba0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2bbb0 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
2bbc0 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
2bbd0 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
2bbe0 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
2bbf0 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
2bc00 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
2bc10 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
2bc20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
2bc30 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
2bc40 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
2bc50 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
2bc60 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
2bc70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2bc80 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
2bc90 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
2bca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
2bcb0 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
2bcc0 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
2bcd0 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
2bce0 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
2bcf0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
2bd00 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
2bd10 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
2bd20 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
2bd30 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
2bd40 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20  P_INCLUDE_CEROD 
2bd50 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
2bd60 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e  EXTRA INTEROP_IN
2bd70 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20  CLUDE_SEE \..   
2bd80 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
2bd90 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20  _INCLUDE_ZIPVFS 
2bda0 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58  INTEROP_JSON1_EX
2bdb0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2bdc0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c         INTEROP_L
2bdd0 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45  EGACY_CLOSE INTE
2bde0 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f  ROP_LOG INTEROP_
2bdf0 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e  PERCENTILE_EXTEN
2be00 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2be10 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45      INTEROP_REGE
2be20 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  XP_EXTENSION INT
2be30 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58 54  EROP_SESSION_EXT
2be40 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
2be50 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53 48        INTEROP_SH
2be60 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  A1_EXTENSION INT
2be70 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
2be80 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
2be90 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50     INTEROP_TOTYP
2bea0 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45  E_EXTENSION INTE
2beb0 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
2bec0 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
2bed0 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 4e   NET_20 NET_35 N
2bee0 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54  ET_40 NET_45 NET
2bef0 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54  _451 NET_452 NET
2bf00 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a 20  _46 NET_461 \.. 
2bf10 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34             NET_4
2bf20 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34 37  62 NET_47 NET_47
2bf30 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  1 NET_COMPACT_20
2bf40 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
2bf50 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
2bf60 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
2bf70 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
2bf80 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
2bf90 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
2bfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
2bfb0 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
2bfc0 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
2bfd0 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54 45  CTION TRACE_DETE
2bfe0 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  CTION \..       
2bff0 20 20 20 20 20 54 52 41 43 45 5f 48 41 4e 44 4c       TRACE_HANDL
2c000 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20  E TRACE_PRELOAD 
2c010 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41  TRACE_SHARED TRA
2c020 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c 0d 0a  CE_STATEMENT \..
2c030 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43              TRAC
2c040 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f  E_WARNING TRACK_
2c050 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45  MEMORY_BYTES USE
2c060 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52  _ENTITY_FRAMEWOR
2c070 4b 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  K_6 \..         
2c080 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44     USE_INTEROP_D
2c090 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f 56  LL USE_PREPARE_V
2c0a0 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20  2 WINDOWS] {..  
2c0b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c0c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
2c0d0 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c  ck if the compil
2c0e0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
2c0f0 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c   listed in the l
2c100 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ist of..        
2c110 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69 6e    #       "defin
2c120 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70  e constants" kep
2c130 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74 68  t track of by th
2c140 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
2c150 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ly...          #
2c160 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
2c170 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65  kForSQLiteDefine
2c180 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74  Constant $::test
2c190 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65  _channel $define
2c1a0 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20 20  Constant..      
2c1b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
2c1c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2c1d0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74  : Attempt to det
2c1e0 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75  ermine if variou
2c1f0 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  s compile-time o
2c200 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f  ptions needed fo
2c210 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
2c220 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69     test constrai
2c230 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64  nts were enabled
2c240 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70   for the interop
2c250 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 2f 6f 72   assembly and/or
2c260 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2c270 20 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65    for the SQLite
2c280 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
2c290 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c2a0 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6d 70 69     foreach compi
2c2b0 6c 65 4f 70 74 69 6f 6e 20 5b 6c 69 73 74 20 5c  leOption [list \
2c2c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 4f  ..            CO
2c2d0 44 45 43 20 45 58 54 45 4e 53 49 4f 4e 5f 46 55  DEC EXTENSION_FU
2c2e0 4e 43 54 49 4f 4e 53 20 48 41 53 5f 43 4f 44 45  NCTIONS HAS_CODE
2c2f0 43 20 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20  C INCLUDE_CEROD 
2c300 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 20 5c 0d  INCLUDE_EXTRA \.
2c310 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 43  .            INC
2c320 4c 55 44 45 5f 53 45 45 20 49 4e 43 4c 55 44 45  LUDE_SEE INCLUDE
2c330 5f 5a 49 50 56 46 53 20 4a 53 4f 4e 31 5f 45 58  _ZIPVFS JSON1_EX
2c340 54 45 4e 53 49 4f 4e 20 4c 45 47 41 43 59 5f 43  TENSION LEGACY_C
2c350 4c 4f 53 45 20 4c 4f 47 20 5c 0d 0a 20 20 20 20  LOSE LOG \..    
2c360 20 20 20 20 20 20 20 20 50 45 52 43 45 4e 54 49          PERCENTI
2c370 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 52 45 47  LE_EXTENSION REG
2c380 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 53 45  EXP_EXTENSION SE
2c390 53 53 49 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e 20  SSION_EXTENSION 
2c3a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
2c3b0 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 54 45  HA1_EXTENSION TE
2c3c0 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 54 4f 54  ST_EXTENSION TOT
2c3d0 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 56 49  YPE_EXTENSION VI
2c3e0 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 7b 0d 0a  RTUAL_TABLE] {..
2c3f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2c400 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2c410 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70  heck if the comp
2c420 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
2c430 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65  is listed in the
2c440 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 20 20 20   list..         
2c450 20 23 20 20 20 20 20 20 20 6b 65 70 74 20 74 72   #       kept tr
2c460 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 69 6e  ack of by the in
2c470 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61  terop assembly a
2c480 6e 64 2f 6f 72 20 74 68 65 20 53 51 4c 69 74 65  nd/or the SQLite
2c490 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2c4a0 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
2c4b0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2c4c0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2c4d0 6f 72 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f  orSQLiteCompileO
2c4e0 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
2c4f0 61 6e 6e 65 6c 20 24 63 6f 6d 70 69 6c 65 4f 70  annel $compileOp
2c500 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tion..        }.
2c510 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2c520 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
2c530 65 63 6b 20 69 66 20 74 68 65 20 53 79 73 74 65  eck if the Syste
2c540 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 70 72  m.Data.SQLite pr
2c550 6f 76 69 64 65 72 20 77 61 73 20 63 6f 6d 70 69  ovider was compi
2c560 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20 20  led with..      
2c570 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f 72    #       suppor
2c580 74 20 66 6f 72 20 61 6e 79 20 65 6e 63 72 79 70  t for any encryp
2c590 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a  ted databases...
2c5a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c5b0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
2c5c0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
2c5d0 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d 20   INTEROP_CODEC] 
2c5e0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
2c5f0 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66    [haveSQLiteDef
2c600 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45  ineConstant INTE
2c610 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d  ROP_INCLUDE_SEE]
2c620 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2c630 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c640 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 63 68 65   # NOTE: Now che
2c650 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6f  ck if the intero
2c660 70 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20 61  p assembly was a
2c670 6c 73 6f 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  lso compiled wit
2c680 68 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  h..          #  
2c690 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72       support for
2c6a0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
2c6b0 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  ases...         
2c6c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
2c6d0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 43 6f 6d   {[haveSQLiteCom
2c6e0 70 69 6c 65 4f 70 74 69 6f 6e 20 43 4f 44 45 43  pileOption CODEC
2c6f0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
2c700 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
2c710 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 49  eCompileOption I
2c720 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65  NCLUDE_SEE]} the
2c730 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2c740 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2c750 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
2c760 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 53 51   check if the SQ
2c770 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
2c780 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0d 0a  y was compiled..
2c790 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2c7a0 20 20 20 20 77 69 74 68 20 73 75 70 70 6f 72 74      with support
2c7b0 20 66 6f 72 20 65 6e 63 72 79 70 74 65 64 20 64   for encrypted d
2c7c0 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20  atabases...     
2c7d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c7e0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
2c7f0 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69  QLiteCompileOpti
2c800 6f 6e 20 48 41 53 5f 43 4f 44 45 43 5d 7d 20 74  on HAS_CODEC]} t
2c810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2c820 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2c830 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
2c840 73 2c 20 61 64 64 20 63 6f 6e 73 74 72 61 69 6e  s, add constrain
2c850 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
2c860 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
2c870 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
2c890 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
2c8a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e  m.Data.SQLite.En
2c8b0 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  cryption..      
2c8c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2c8d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
2c8e0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2c8f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
2c900 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
2c910 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73  build year.  Bas
2c920 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64  ically, this ind
2c930 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20  icates..        
2c940 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76 65  #       which ve
2c950 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64  rsion of MSBuild
2c960 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53   and/or Visual S
2c970 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20 74  tudio was used t
2c980 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  o..        #    
2c990 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61     compile the a
2c9a0 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
2c9b0 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
2c9c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2c9d0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2c9e0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2c9f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
2ca00 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
2ca10 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
2ca20 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20  d year... ".... 
2ca30 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
2ca40 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
2ca50 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
2ca60 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2ca70 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65  s buildYear. $ye
2ca80 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ar]..        tpu
2ca90 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2caa0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2cab0 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d  " $year \"\n]...
2cac0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
2cad0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
2cae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
2caf0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
2cb00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2cb10 69 74 65 20 62 75 69 6c 64 20 6e 61 74 69 76 65  ite build native
2cb20 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   year... "....  
2cb30 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b        set year [
2cb40 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 59 65  getBuildNativeYe
2cb50 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
2cb60 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2cb70 6e 64 41 72 67 73 20 62 75 69 6c 64 4e 61 74 69  ndArgs buildNati
2cb80 76 65 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a  veYear. $year]..
2cb90 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2cba0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2cbb0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65  ppendArgs \" $ye
2cbc0 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ar \"\n]....    
2cbd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2cbe0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
2cbf0 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e   current build .
2cc00 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20  NET Framework.  
2cc10 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d  Basically, this.
2cc20 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2cc30 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   indicates which
2cc40 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
2cc50 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69  .NET Framework i
2cc60 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20  s being..       
2cc70 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
2cc80 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
2cc90 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
2cca0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
2ccb0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2ccc0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2cce0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
2ccf0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2cd00 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  e build .NET Fra
2cd10 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  mework... ".... 
2cd20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46 78         set netFx
2cd30 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
2cd40 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
2cd50 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2cd60 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f  rgs buildFramewo
2cd70 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20  rk. $netFx]..   
2cd80 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2cd90 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2cda0 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78  ndArgs \" $netFx
2cdb0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
2cdc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2cdd0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
2cde0 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e  urrent build con
2cdf0 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69  figuration.  Thi
2ce00 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
2ce10 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
2ce20 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65     be either "De
2ce30 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
2ce40 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
2ce50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2ce60 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2ce80 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
2ce90 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2cea0 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
2ceb0 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ation... "....  
2cec0 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
2ced0 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
2cee0 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  dConfiguration].
2cef0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
2cf00 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2cf10 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  gs buildConfigur
2cf20 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72  ation. $configur
2cf30 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
2cf40 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2cf50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2cf60 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74  s \" $configurat
2cf70 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ion \"\n]....   
2cf80 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2cf90 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2cfa0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2cfb0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
2cfc0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
2cfd0 62 75 69 6c 64 20 65 78 74 72 61 2e 2e 2e 20 22  build extra... "
2cfe0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2cff0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2d000 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
2d010 20 62 75 69 6c 64 20 65 78 74 72 61 20 64 69 72   build extra dir
2d020 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 77 69  ectory.  This wi
2d030 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20  ll normally..   
2d040 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
2d050 65 69 74 68 65 72 20 22 6e 65 74 73 74 61 6e 64  either "netstand
2d060 61 72 64 32 2e 30 22 20 6f 72 20 61 6e 20 65 6d  ard2.0" or an em
2d070 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  pty string...   
2d080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2d090 73 65 74 20 65 78 74 72 61 20 5b 67 65 74 42 75  set extra [getBu
2d0a0 69 6c 64 45 78 74 72 61 5d 0d 0a 0d 0a 20 20 20  ildExtra]....   
2d0b0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
2d0c0 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20   length $extra] 
2d0d0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2d0e0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
2d0f0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2d100 20 62 75 69 6c 64 45 78 74 72 61 2e 20 24 65 78   buildExtra. $ex
2d110 74 72 61 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  tra]..          
2d120 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2d130 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2d140 73 20 5c 22 20 24 65 78 74 72 61 20 5c 22 5c 6e  s \" $extra \"\n
2d150 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ]..        } els
2d160 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61  e {..          a
2d170 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69  ddConstraint bui
2d180 6c 64 45 78 74 72 61 2e 6e 6f 6e 65 0d 0a 20 20  ldExtra.none..  
2d190 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2d1a0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 3c 6e  :test_channel <n
2d1b0 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  one>\n..        
2d1c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
2d1d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2d1e0 54 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20  Try to setup an 
2d1f0 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61  interrupt callba
2d200 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63 72  ck using the scr
2d210 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20  ipt debugger..  
2d220 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
2d230 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61  at will cancel a
2d240 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20 69  ll SQL queries i
2d250 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61  n progress for a
2d260 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ll database..   
2d270 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
2d280 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74  nections known t
2d290 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  o this interpret
2d2a0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
2d2b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2d2c0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
2d2d0 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43 61  qliteInterruptCa
2d2e0 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b  llback)]} then {
2d2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 75  ..          setu
2d300 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  pDbInterruptCall
2d310 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61  back $::test_cha
2d320 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67  nnel $::test_log
2d330 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2d340 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2d350 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
2d360 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20 72  for the native r
2d370 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77  untime option, w
2d380 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20  hich would mean 
2d390 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  we are..        
2d3a0 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74 68  #       using th
2d3b0 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
2d3c0 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
2d3d0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
2d3e0 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
2d3f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2d400 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20   native....     
2d410 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2d420 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
2d430 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
2d440 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e  ould count the n
2d450 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74  umber of connect
2d460 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
2d470 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61        "opened" a
2d480 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d  nd "closed" from
2d490 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64   the pool when d
2d4a0 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20  etermining if a 
2d4b0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
2d4c0 20 20 20 20 20 20 70 61 73 73 65 64 2e 20 20 44        passed.  D
2d4d0 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65  isabling this be
2d4e0 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69  havior is someti
2d4f0 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20 28 65  mes necessary (e
2d500 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  .g...        #  
2d510 20 20 20 20 20 64 75 72 69 6e 67 20 74 68 65 20       during the 
2d520 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20  release testing 
2d530 70 72 6f 63 65 73 73 29 20 62 65 63 61 75 73 65  process) because
2d540 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72   there are sever
2d550 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
2d560 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20 72      tests that r
2d570 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e  ely on the "open
2d580 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f  ed from pool" co
2d590 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74 65  unt being greate
2d5a0 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
2d5b0 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54     than zero.  T
2d5c0 68 65 73 65 20 74 65 73 74 73 20 6d 61 79 20 66  hese tests may f
2d5d0 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e  ail due to the n
2d5e0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
2d5f0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d600 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68    behavior of th
2d610 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77  e CLR GC, even w
2d620 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
2d630 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d  bug in the code.
2d640 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2d650 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a   being tested...
2d660 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2d670 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
2d680 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
2d690 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43  _channel noPoolC
2d6a0 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20  ounts....       
2d6b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2d6c0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
2d6d0 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75   test suite shou
2d6e0 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d 63 61  ld use shared-ca
2d6f0 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20  che mode...     
2d700 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
2d710 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74  eckForRuntimeOpt
2d720 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ion $::test_chan
2d730 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68 65 0d  nel sharedCache.
2d740 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2d750 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
2d760 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
2d770 65 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f  e usage prior to
2d780 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73   running any tes
2d790 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
2d7a0 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
2d7b0 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
2d7c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
2d7d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2d7e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
2d7f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74   the list of nat
2d800 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20  ive modules for 
2d810 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
2d820 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  ess and..       
2d830 20 23 20 20 20 20 20 20 20 72 65 70 6f 72 74 20   #       report 
2d840 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
2d850 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
2d860 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
2d870 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
2d880 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
2d890 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
2d8a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
2d8b0 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74   modules [object
2d8c0 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20   invoke \..     
2d8d0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
2d8e0 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63  Diagnostics.Proc
2d8f0 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72  ess.GetCurrentPr
2d900 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a  ocess Modules]..
2d910 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
2d920 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
2d930 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65  s module $module
2d940 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
2d950 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2d960 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75  # NOTE: The modu
2d970 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72  le file name her
2d980 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c  e must be normal
2d990 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ized...         
2d9a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2d9b0 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
2d9c0 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b  file normalize [
2d9d0 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65  $module FileName
2d9e0 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
2d9f0 73 65 74 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  set fileNameOnly
2da00 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
2da10 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
2da20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
2da30 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
2da40 65 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e -- \..        
2da50 20 20 20 20 20 20 20 20 5b 67 65 74 4e 61 74 69          [getNati
2da60 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d  veLibraryFileNam
2da70 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d  esOnly] $fileNam
2da80 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68  eOnly] != -1} th
2da90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2daa0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2dab0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
2dac0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2dad0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2dae0 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
2daf0 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
2db00 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d  ary module: " \.
2db10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2db20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d     $fileName \n]
2db30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
2db40 65 6c 73 65 69 66 20 7b 5b 6c 73 65 61 72 63 68  elseif {[lsearch
2db50 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
2db60 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  -- \..          
2db70 20 20 20 20 20 20 5b 67 65 74 49 6e 74 65 72 6f        [getIntero
2db80 70 41 73 73 65 6d 62 6c 79 46 69 6c 65 4e 61 6d  pAssemblyFileNam
2db90 65 73 4f 6e 6c 79 5d 20 24 66 69 6c 65 4e 61 6d  esOnly] $fileNam
2dba0 65 4f 6e 6c 79 5d 20 21 3d 20 2d 31 7d 20 74 68  eOnly] != -1} th
2dbb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2dbc0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2dbd0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
2dbe0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2dbf0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2dc00 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
2dc10 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
2dc20 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20  embly module: " 
2dc30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2dc40 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c       $fileName \
2dc50 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
2dc60 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2dc70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2dc80 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
2dc90 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2dca0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2dcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
2dcc0 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
2dcd0 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
2dce0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
2dcf0 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
2dd00 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2dd10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
2dd20 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
2dd30 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
2dd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2dd60 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
2dd70 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  teCompileOptions
2dd80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f  ..          } co
2dd90 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d  mpileOptions] ==
2dda0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2ddb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2ddc0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2ddd0 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61  ppendArgs [forma
2dde0 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a  tList [lsort \..
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d  $compileOptions]
2de10 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20   <none>] \n]..  
2de20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2de30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
2de40 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2de50 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
2de60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2de70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2de80 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
2de90 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2dea0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
2deb0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2dec0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
2ded0 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65  tions for SQLite
2dee0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2def0 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
2df00 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2df10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
2df20 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
2df30 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
2df40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2df50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2df60 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
2df70 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  ropCompileOption
2df80 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63  s..          } c
2df90 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d  ompileOptions] =
2dfa0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2dfb0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2dfc0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2dfd0 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
2dfe0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
2dff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e000 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73   $compileOptions
2e010 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20  ] <none>] \n].. 
2e020 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
2e030 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
2e040 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2e050 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
2e060 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2e070 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e080 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2e090 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63  OTE: Show the ac
2e0a0 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72  tive test constr
2e0b0 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  aints...        
2e0c0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
2e0d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2e0e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
2e0f0 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  -- constraints: 
2e100 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
2e110 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
2e120 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69  ort [getConstrai
2e130 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  nts]] <none>] \n
2e140 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
2e150 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2e160 53 61 76 65 20 74 68 65 20 74 65 73 74 20 63 6f  Save the test co
2e170 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75 73  nstraints for us
2e180 65 20 62 79 20 74 68 72 65 61 64 73 20 63 72 65  e by threads cre
2e190 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20 20  ated in this..  
2e1a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
2e1b0 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
2e1c0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
2e1d0 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6c 6c  sary because all
2e1e0 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
2e1f0 20 20 20 20 23 20 20 20 20 20 20 20 22 74 65 73      #       "tes
2e200 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72  t context" infor
2e210 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74 68  mation is per-th
2e220 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  read...        #
2e230 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
2e240 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
2e250 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d  st_constraints]}
2e260 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2e270 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f     set ::test_co
2e280 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61 67  nstraints $::eag
2e290 6c 65 5f 74 65 73 74 73 28 43 6f 6e 73 74 72 61  le_tests(Constra
2e2a0 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7d  ints)..        }
2e2b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2e2c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
2e2d0 6f 61 64 20 74 68 65 20 22 61 66 74 65 72 2d 63  oad the "after-c
2e2e0 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74  onstraints" cust
2e2f0 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
2e300 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20  or per-host..   
2e310 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
2e320 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
2e330 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2e340 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
2e350 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
2e360 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
2e370 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65  st_channel .afte
2e380 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  r]....        #.
2e390 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2e3a0 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 65   If necessary, e
2e3b0 6e 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63  nable shared-cac
2e3c0 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20  he mode now...  
2e3d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e3e0 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
2e3f0 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63  Option sharedCac
2e400 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  he]} then {..   
2e410 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61         enableSha
2e420 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74  redCache $::test
2e430 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20  _channel true.. 
2e440 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e450 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2e460 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e   NOTE: Show when
2e470 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61   our tests actua
2e480 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e  lly began (now).
2e490 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2e4a0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2e4b0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2e4c0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2e4d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74        "---- Syst
2e4e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
2e4f0 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20  ests began at " 
2e500 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
2e510 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c  clock format [cl
2e520 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e  ock seconds]] \n
2e530 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
2e540 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
2e550 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65  unSQLiteTestFile
2e560 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  sPrologue {} {..
2e570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2e580 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e   NOTE: Skip runn
2e590 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 66  ing our custom f
2e5a0 69 6c 65 73 20 70 72 6f 6c 6f 67 75 65 20 69 66  iles prologue if
2e5b0 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
2e5c0 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
2e5d0 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
2e5e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2e5f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2e600 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65   ::no(prologue.e
2e610 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
2e620 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
2e630 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  1 {..          #
2e640 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2e650 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61  TE: Setup the va
2e660 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66  riables that ref
2e670 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  er to the variou
2e680 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73  s non-data files
2e690 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2e6a0 20 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20      required by 
2e6b0 74 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  the tests in thi
2e6c0 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  s file...       
2e6d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2e6e0 73 65 74 20 65 6e 74 69 74 79 46 72 61 6d 65 77  set entityFramew
2e6f0 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  orkDllFile \..  
2e700 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2e710 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 45 6e  BuildFileName En
2e720 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c  tityFramework.dl
2e730 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20  l false]....    
2e740 20 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c        set instal
2e750 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20  lerExeFile \..  
2e760 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2e770 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e  BuildFileName In
2e780 73 74 61 6c 6c 65 72 2e 65 78 65 20 66 61 6c 73  staller.exe fals
2e790 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
2e7a0 73 65 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e  set sqliteDesign
2e7b0 65 72 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20  erDllFile \..   
2e7c0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
2e7d0 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c  uildFileName SQL
2e7e0 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c  ite.Designer.dll
2e7f0 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20   false]....     
2e800 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
2e810 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
2e820 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2e830 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
2e840 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
2e850 53 51 4c 69 74 65 2e 64 6c 6c 20 66 61 6c 73 65  SQLite.dll false
2e860 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2e870 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
2e880 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c  iteLinqDllFile \
2e890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e8a0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2e8b0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
2e8c0 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 66 61  Lite.Linq.dll fa
2e8d0 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2e8e0 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
2e8f0 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65  SQLiteEf6DllFile
2e900 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2e910 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
2e920 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
2e930 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 20 66  SQLite.EF6.dll f
2e940 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  alse]....       
2e950 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69     set testExeFi
2e960 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
2e970 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 20 66 61  Name test.exe fa
2e980 6c 73 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  lse]..          
2e990 73 65 74 20 74 65 73 74 4c 69 6e 71 45 78 65 46  set testLinqExeF
2e9a0 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
2e9b0 65 4e 61 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65  eName testlinq.e
2e9c0 78 65 20 66 61 6c 73 65 5d 0d 0a 20 20 20 20 20  xe false]..     
2e9d0 20 20 20 20 20 73 65 74 20 74 65 73 74 45 66 36       set testEf6
2e9e0 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
2e9f0 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66  dFileName testef
2ea00 36 2e 65 78 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a  6.exe false]....
2ea10 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2ea20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
2ea30 65 74 75 70 20 74 68 65 20 76 61 72 69 61 62 6c  etup the variabl
2ea40 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
2ea50 20 74 68 65 20 76 61 72 69 6f 75 73 20 64 61 74   the various dat
2ea60 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20  a files..       
2ea70 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
2ea80 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
2ea90 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
2eaa0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2eab0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c         set testL
2eac0 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65  inqOutFile [file
2ead0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2eae0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2eaf0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2eb00 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2eb10 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a  testlinq.out]]..
2eb20 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2eb30 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
2eb40 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2eb50 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2eb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2eb70 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69  file dirname [fi
2eb80 6c 65 20 64 69 72 6e 61 6d 65 20 5b 67 65 74 53  le dirname [getS
2eb90 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2eba0 68 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  h]]] \..        
2ebb0 20 20 20 20 20 20 74 65 73 74 6c 69 6e 71 20 6e        testlinq n
2ebc0 6f 72 74 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d  orthwindEF.db]].
2ebd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2ebe0 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66   nonWalDbFile [f
2ebf0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2ec00 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2ec10 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2ec20 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2ec30 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a  h] nonWal.db]]..
2ec40 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2ec50 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  walDbFile [file 
2ec60 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2ec70 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2ec80 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2ec90 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 77  eTestDataPath] w
2eca0 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  al.db]]....     
2ecb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ecc0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61    # NOTE: The va
2ecd0 72 69 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e  rious install/un
2ece0 69 6e 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65  install log file
2ecf0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
2ed00 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  he..          # 
2ed10 20 20 20 20 20 20 64 65 73 69 67 6e 2d 74 69 6d        design-tim
2ed20 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74  e component inst
2ed30 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  aller...        
2ed40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
2ed50 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
2ed60 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2005LogFile [fil
2ed70 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
2ed80 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
2ed90 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
2eda0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
2edb0 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
2edc0 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2005.log]]....
2edd0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
2ede0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
2edf0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
2ee00 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2ee10 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2ee20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2ee30 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
2ee40 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
2ee50 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  8.log]]....     
2ee60 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
2ee70 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
2ee80 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2ee90 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2eea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2eeb0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2eec0 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
2eed0 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67  _Test_Vs2010.log
2eee0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
2eef0 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
2ef00 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69  s2012LogFile [fi
2ef10 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2ef20 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2ef30 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2ef40 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2ef50 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
2ef60 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2012.log]]...
2ef70 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74  .          set t
2ef80 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33  estInstallVs2013
2ef90 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
2efa0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2efb0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2efc0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2efd0 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
2efe0 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
2eff0 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  13.log]]....    
2f000 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
2f010 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
2f020 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2f030 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2f040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f050 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2f060 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
2f070 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f  r_Test_Vs2015.lo
2f080 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  g]]....         
2f090 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
2f0a0 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66  Vs2017LogFile [f
2f0b0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2f0c0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2f0d0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2f0e0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2f0f0 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
2f100 74 5f 56 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2017.log]]..
2f110 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2f120 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2f130 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  005LogFile [file
2f140 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2f150 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2f160 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2f170 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2f180 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
2f190 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2005.log]]...
2f1a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74  .          set t
2f1b0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
2f1c0 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  08LogFile [file 
2f1d0 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2f1e0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2f1f0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2f200 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
2f210 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
2f220 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2008.log]]....
2f230 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
2f240 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2f250 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  0LogFile [file n
2f260 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
2f270 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
2f280 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
2f290 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
2f2a0 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
2f2b0 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2010.log]].... 
2f2c0 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2f2d0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
2f2e0 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
2f2f0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
2f300 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
2f310 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
2f320 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
2f330 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2f340 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2012.log]]....  
2f350 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2f360 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
2f370 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
2f380 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
2f390 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
2f3a0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
2f3b0 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
2f3c0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
2f3d0 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  013.log]]....   
2f3e0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
2f3f0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  ninstallVs2015Lo
2f400 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
2f410 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2f420 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2f430 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2f440 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
2f450 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
2f460 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  15.log]]....    
2f470 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
2f480 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  installVs2017Log
2f490 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2f4a0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2f4b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f4c0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2f4d0 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
2f4e0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
2f4f0 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  7.log]]....     
2f500 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
2f510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f520 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f530 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2f540 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
2f550 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2f560 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
2f570 68 65 63 6b 46 6f 72 53 71 6c 69 74 65 46 69 6c  heckForSqliteFil
2f580 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
2f590 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2f5a0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2f5b0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2f5c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f5d0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2f5e0 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44  entityFrameworkD
2f5f0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
2f600 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2f610 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2f620 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74  est_channel $ent
2f630 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
2f640 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2f650 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2f660 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2f670 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2f680 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2f690 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2f6a0 65 20 74 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65  e tail $installe
2f6b0 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  rExeFile]]]} the
2f6c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2f6d0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
2f6e0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69  $test_channel $i
2f6f0 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20  nstallerExeFile 
2f700 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20  Installer.exe.. 
2f710 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2f720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2f730 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2f740 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2f750 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2f760 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2f770 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72   $sqliteDesigner
2f780 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
2f790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2f7a0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2f7b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71  test_channel $sq
2f7c0 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46  liteDesignerDllF
2f7d0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2f7e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2f7f0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2f800 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2f810 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2f820 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2f830 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61  e tail $systemDa
2f840 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d  taSQLiteDllFile]
2f850 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2f860 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2f870 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2f880 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
2f890 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20  SQLiteDllFile.. 
2f8a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2f8c0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2f8d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2f8e0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2f8f0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2f900 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
2f910 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d  teLinqDllFile]]]
2f920 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2f930 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2f940 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2f950 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
2f960 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d  LiteLinqDllFile.
2f970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2f980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2f990 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2f9a0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2f9b0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2f9c0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2f9d0 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  il $systemDataSQ
2f9e0 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d  LiteEf6DllFile]]
2f9f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2fa00 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2fa10 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2fa20 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
2fa30 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d  QLiteEf6DllFile.
2fa40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2fa50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2fa60 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2fa70 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2fa80 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2fa90 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2faa0 69 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 5d  il $testExeFile]
2fab0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2fac0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2fad0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2fae0 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c  nnel $testExeFil
2faf0 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20  e test.exe..    
2fb00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2fb10 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68           if {![h
2fb20 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
2fb30 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
2fb40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2fb50 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
2fb60 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d  estLinqExeFile]]
2fb70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2fb80 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2fb90 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2fba0 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65  nel $testLinqExe
2fbb0 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78  File testlinq.ex
2fbc0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2fbd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2fbe0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2fbf0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2fc00 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2fc10 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2fc20 74 61 69 6c 20 24 74 65 73 74 45 66 36 45 78 65  tail $testEf6Exe
2fc30 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2fc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2fc50 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2fc60 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45  t_channel $testE
2fc70 66 36 45 78 65 46 69 6c 65 20 74 65 73 74 65 66  f6ExeFile testef
2fc80 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20  6.exe..         
2fc90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2fca0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2fcb0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2fcc0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2fce0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 4c 69  ile tail $testLi
2fcf0 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68  nqOutFile]]]} th
2fd00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2fd10 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
2fd20 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
2fd30 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d  testLinqOutFile.
2fd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2fd50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2fd60 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2fd70 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2fd80 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2fd90 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2fda0 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  il $northwindEfD
2fdb0 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  bFile]]]} then {
2fdc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2fdd0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2fde0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74  st_channel $nort
2fdf0 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20  hwindEfDbFile.. 
2fe00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2fe20 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2fe30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2fe40 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2fe50 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2fe60 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d   $nonWalDbFile]]
2fe70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2fe80 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2fe90 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2fea0 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c  nel $nonWalDbFil
2feb0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
2fec0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2fed0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
2fee0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
2fef0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
2ff00 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
2ff10 74 61 69 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d  tail $walDbFile]
2ff20 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2ff30 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2ff40 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2ff50 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d  nnel $walDbFile.
2ff60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2ff70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2ff80 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2ff90 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2ffa0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2ffb0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2ffc0 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
2ffd0 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2005LogFile]]]}
2ffe0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2fff0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
30000 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
30010 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
30020 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
30030 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
30040 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
30050 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
30060 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
30070 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30080 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
30090 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
300a0 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  8LogFile]]]} the
300b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
300c0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
300d0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
300e0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
300f0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
30100 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30110 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30120 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30130 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
30140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30150 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
30160 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  InstallVs2010Log
30170 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
30180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
30190 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
301a0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
301b0 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
301c0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
301d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
301e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
301f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30200 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30210 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30220 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
30230 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
30240 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
30250 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
30260 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
30270 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
30280 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d  llVs2012LogFile.
30290 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
302a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
302b0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
302c0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
302d0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
302e0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
302f0 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
30300 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2013LogFile]]]}
30310 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30320 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
30330 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
30340 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
30350 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
30360 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
30370 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
30380 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
30390 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
303a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
303b0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
303c0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
303d0 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
303e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
303f0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
30400 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
30410 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35  estInstallVs2015
30420 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
30430 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
30440 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
30450 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
30460 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30480 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
30490 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67  InstallVs2017Log
304a0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
304b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
304c0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
304d0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
304e0 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46  nstallVs2017LogF
304f0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30500 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
30510 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30520 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30530 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30540 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30550 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
30560 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
30570 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
30590 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
305a0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
305b0 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
305c0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
305d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
305e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
305f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30600 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30610 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30620 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
30630 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69  stallVs2008LogFi
30640 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
30660 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
30670 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
30680 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
30690 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
306a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
306b0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
306c0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
306d0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
306e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
306f0 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
30700 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
30710 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
30730 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
30740 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
30750 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
30760 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30770 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
30780 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30790 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
307a0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
307b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
307c0 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
307d0 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
307e0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
30800 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
30810 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
30820 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
30830 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30840 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
30850 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30860 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30870 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30880 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30890 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
308a0 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
308b0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
308d0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
308e0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
308f0 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
30900 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
30920 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30930 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30940 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30950 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30960 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
30970 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69  stallVs2015LogFi
30980 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
309a0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
309b0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
309c0 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
309d0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
309e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
309f0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
30a00 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
30a10 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
30a20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
30a30 65 20 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e  e tail $testUnin
30a40 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
30a50 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
30a70 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
30a80 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
30a90 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46  nstallVs2017LogF
30aa0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
30ab0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
30ac0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
30ad0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
30ae0 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
30af0 65 54 65 73 74 46 69 6c 65 73 45 70 69 6c 6f 67  eTestFilesEpilog
30b00 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
30b10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
30b20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
30b30 20 63 75 73 74 6f 6d 20 66 69 6c 65 73 20 65 70   custom files ep
30b40 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
30b50 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
30b60 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
30b70 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
30b80 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
30b90 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
30ba0 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
30bb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
30bc0 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20   uplevel 1 {..  
30bd0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
30be0 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
30bf0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
30c00 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  ninstallVs2017Lo
30c10 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
30c20 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
30c30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30c40 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56    testUninstallV
30c50 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 74 65 73  s2013LogFile tes
30c60 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
30c70 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  LogFile \..     
30c80 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
30c90 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
30ca0 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  ile testUninstal
30cb0 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c  lVs2008LogFile \
30cc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30cd0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
30ce0 30 30 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  005LogFile testI
30cf0 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46  nstallVs2017LogF
30d00 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
30d10 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c       testInstall
30d20 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65  Vs2015LogFile te
30d30 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  stInstallVs2013L
30d40 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
30d50 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74          testInst
30d60 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
30d70 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
30d80 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  10LogFile \..   
30d90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
30da0 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
30db0 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
30dc0 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a  s2005LogFile....
30dd0 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
30de0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72               nor
30e00 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74  thwindEfDbFile t
30e10 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c  estLinqOutFile \
30e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30e30 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c  walDbFile nonWal
30e40 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  DbFile....      
30e50 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
30e60 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20  plain \..       
30e70 20 20 20 20 20 20 20 74 65 73 74 45 66 36 45 78         testEf6Ex
30e80 65 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 45 78  eFile testLinqEx
30e90 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  eFile \..       
30ea0 20 20 20 20 20 20 20 74 65 73 74 45 78 65 46 69         testExeFi
30eb0 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  le systemDataSQL
30ec0 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d  iteEf6DllFile \.
30ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30ee0 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
30ef0 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79 73 74 65  inqDllFile syste
30f00 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69  mDataSQLiteDllFi
30f10 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
30f20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69 67 6e      sqliteDesign
30f30 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c  erDllFile instal
30f40 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20  lerExeFile \..  
30f50 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69              enti
30f60 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
30f70 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  le..        }.. 
30f80 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
30f90 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
30fa0 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65  LiteTestEpilogue
30fb0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
30fc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
30fd0 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
30fe0 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69  ustom epilogue i
30ff0 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
31000 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
31010 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
31020 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
31030 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
31040 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e  s ::no(epilogue.
31050 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
31060 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
31070 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
31080 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20   when our tests 
31090 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28  actually ended (
310a0 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  now)...        #
310b0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
310c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
310d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
310e0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
310f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
31100 69 74 65 20 74 65 73 74 73 20 65 6e 64 65 64 20  ite tests ended 
31110 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  at " \..        
31120 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61      [clock forma
31130 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  t [clock seconds
31140 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ]] \n]....      
31150 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
31160 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 65  OTE: Load the "e
31170 70 69 6c 6f 67 75 65 22 20 63 75 73 74 6f 6d 20  pilogue" custom 
31180 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
31190 70 65 72 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20  per-host test.. 
311a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
311b0 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
311c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
311d0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
311e0 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
311f0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
31200 63 68 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75  channel .epilogu
31210 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
31220 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
31230 58 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69  X: Before checki
31240 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
31250 6f 75 72 63 65 73 20 69 6e 20 75 73 65 20 62 79  ources in use by
31260 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20   SQLite, make.. 
31270 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
31280 20 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68   sure both of th
31290 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
312a0 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
312b0 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
312c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
312d0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
312e0 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
312f0 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
31300 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
31310 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73       # NOTE: Als
31320 6f 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73  o report the res
31330 6f 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65  ource usage afte
31340 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
31350 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
31360 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53  .        reportS
31370 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24  QLiteResources $
31380 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
31390 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
313a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
313b0 6f 72 74 20 74 68 65 20 63 72 69 74 69 63 61 6c  ort the critical
313c0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
313d0 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
313e0 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
313f0 20 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53   #..        getS
31400 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74  QLiteHandleCount
31410 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
31420 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
31430 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
31440 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 64 69  If necessary, di
31450 73 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63  sable shared-cac
31460 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20  he mode now...  
31470 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
31480 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
31490 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63  Option sharedCac
314a0 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  he]} then {..   
314b0 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61         enableSha
314c0 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74  redCache $::test
314d0 5f 63 68 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a  _channel false..
314e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
314f0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
31500 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
31510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31520 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31530 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31540 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
31550 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
31560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31570 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20   END Eagle ONLY 
31580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
31590 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
315a0 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
315b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
315c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
315d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
315e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
315f0 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23  .  }....  #..  #
31600 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
31610 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
31620 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
31630 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23   this file...  #
31640 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65  ..  if {![info e
31650 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72  xists common_dir
31660 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
31670 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f  .    set common_
31680 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  directory [file 
31690 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63  dirname [info sc
316a0 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20  ript]]..  }.... 
316b0 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72   #..  # NOTE: Pr
316c0 6f 76 69 64 65 20 74 68 65 20 53 79 73 74 65 6d  ovide the System
316d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
316e0 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65  t package to the
316f0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
31700 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72   #..  package pr
31710 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74  ovide System.Dat
31720 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e  a.SQLite.Test 1.
31730 30 0d 0a 7d 0d 0a                                0..}..