System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1eaab4babc3dba30d90dc58b8b7cff0438b5cd65:


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 23 0d 0a 20 20 20 20  .....    #..    
16a0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
16b0: 63 65 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75  cedure is only u
16c0: 73 65 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20  sed when adding 
16d0: 73 68 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e  shimmed test con
16e0: 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23  straints...    #
16f0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
1700: 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d  ildClrVersion {}
1710: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
1720: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1730: 74 5f 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e  t_clr] && [strin
1740: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  g length $::test
1750: 5f 63 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20  _clr] > 0} then 
1760: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1770: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1780: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1790: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72  test version for
17a0: 20 74 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68   the CLR.  If th
17b0: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
17c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
17d0: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 64 65 66  not set, the def
17e0: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
17f0: 62 65 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74  be based on whet
1800: 68 65 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20  her or not..    
1810: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1820: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69  e has been compi
1830: 6c 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  led against the 
1840: 43 4c 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20  CLR v2.0 or CLR 
1850: 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23  v4.0...        #
1860: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1870: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20   $::test_clr..  
1880: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18a0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
18b0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
18c0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
18d0: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20  t the CLR v4.0. 
18e0: 20 49 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20   If so,..       
18f0: 20 23 20 20 20 20 20 20 20 6a 75 73 74 20 75 73   #       just us
1900: 65 20 74 68 61 74 20 43 4c 52 20 76 65 72 73 69  e that CLR versi
1910: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
1920: 75 73 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20  use the version 
1930: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20  for the..       
1940: 20 23 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e   #       CLR v2.
1950: 30 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d  0.  If another m
1960: 61 6a 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62  ajor [incompatib
1970: 6c 65 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  le] version of t
1980: 68 65 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20  he CLR..        
1990: 23 20 20 20 20 20 20 20 69 73 20 72 65 6c 65 61  #       is relea
19a0: 73 65 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20  sed, this check 
19b0: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20  will have to be 
19c0: 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65  changed.  The de
19d0: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23  fault..        #
19e0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76         version v
19f0: 61 6c 75 65 20 66 6f 72 20 61 20 70 61 72 74 69  alue for a parti
1a00: 63 75 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f  cular CLR versio
1a10: 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64  n may be overrid
1a20: 64 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  den..        #  
1a30: 20 20 20 20 20 62 79 20 73 65 74 74 69 6e 67 20       by setting 
1a40: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
1a50: 62 6c 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24  ble "test_clr_v$
1a60: 58 22 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d  X", where "$X" m
1a70: 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ay..        #   
1a80: 20 20 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20      [currently] 
1a90: 62 65 20 65 69 74 68 65 72 20 22 32 22 20 6f 72  be either "2" or
1aa0: 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23   "4"...        #
1ab0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1ac0: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d  aveConstraint im
1ad0: 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74  ageRuntime40]} t
1ae0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1af0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1b00: 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d  s ::test_clr_v4]
1b10: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1b20: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1b30: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f  gth $::test_clr_
1b40: 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v4] > 0} then {.
1b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1b70: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1b80: 69 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69  ified test versi
1b90: 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76  on for the CLR v
1ba0: 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  4.0...          
1bb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1bc0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1bd0: 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20  clr_v4..        
1be0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1bf0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1c10: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74  se the default t
1c20: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
1c30: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
1c40: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1c50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c60: 20 34 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f   4.0.30319; # TO
1c70: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
1c80: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
1c90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ca0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1cb0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1cc0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
1cd0: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
1ce0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1cf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1d00: 74 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  t_clr_v2] > 0} t
1d10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1d40: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1d50: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1d60: 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
1d70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1d90: 3a 74 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20  :test_clr_v2..  
1da0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1db0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1dd0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66  OTE: Use the def
1de0: 61 75 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f  ault test versio
1df0: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1e00: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
1e10: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1e20: 72 65 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37  return 2.0.50727
1e30: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1e40: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1e50: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1e60: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1e70: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1e80: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
1e90: 59 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20  Years {} {..    
1ea0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1eb0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69  E: See if the li
1ec0: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1ed0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1ee0: 64 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72  dden by the user
1ef0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1f00: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1f10: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1f20: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1f30: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1f40: 65 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c  est_years] && [l
1f50: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79  length $::test_y
1f60: 65 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ears] > 0} then 
1f70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1f80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1f90: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
1fa0: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61  list of test yea
1fb0: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rs...        #..
1fc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1fd0: 3a 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20  ::test_years..  
1fe0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1ff0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2000: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
2010: 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66   default list of
2020: 20 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65   test years (i.e
2030: 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20  . all)...       
2040: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
2050: 72 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30  rn [list 2005 20
2060: 30 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31  08 2010 2012 201
2070: 33 20 32 30 31 35 20 32 30 31 37 20 4e 65 74 53  3 2015 2017 NetS
2080: 74 61 6e 64 61 72 64 32 30 5d 0d 0a 20 20 20 20  tandard20]..    
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: 4e 65 74 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20  NetFx {} {..    
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 74 65  E: See if the te
20e0: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
20f0: 6b 20 73 65 74 74 69 6e 67 20 68 61 73 20 62 65  k setting has be
2100: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  en overridden by
2110: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2120: 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f  the user (e.g. o
2130: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
2140: 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne)...      #.. 
2150: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2160: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74  xists ::test_net
2170: 5f 66 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _fx] && \..     
2180: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2190: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f  gth $::test_net_
21a0: 66 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  fx] > 0} then {.
21b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
21d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
21e0: 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  st .NET Framewor
21f0: 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  k...        #.. 
2200: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2210: 3a 74 65 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20  :test_net_fx..  
2220: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
2230: 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b        set year [
2240: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20  getBuildYear].. 
2250: 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 56         set yearV
2260: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
2270: 67 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  gs ::test_net_fx
2280: 5f 20 24 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20  _ $year]....    
2290: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
22a0: 69 73 74 73 20 24 79 65 61 72 56 61 72 4e 61 6d  ists $yearVarNam
22b0: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
22c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
22d0: 67 74 68 20 5b 73 65 74 20 24 79 65 61 72 56 61  gth [set $yearVa
22e0: 72 4e 61 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65  rName]] > 0} the
22f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
2300: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2310: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
2320: 69 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20  ified test .NET 
2330: 46 72 61 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64  Framework, based
2340: 20 6f 6e 20 74 68 65 20 62 75 69 6c 64 0d 0a 20   on the build.. 
2350: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2360: 20 79 65 61 72 2e 0d 0a 20 20 20 20 20 20 20 20   year...        
2370: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
2380: 65 74 75 72 6e 20 5b 73 65 74 20 24 79 65 61 72  eturn [set $year
2390: 56 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  VarName]..      
23a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23c0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
23d0: 61 63 6b 20 74 6f 20 74 68 65 20 22 77 65 6c 6c  ack to the "well
23e0: 20 6b 6e 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61   known" .NET Fra
23f0: 6d 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74  mework version t
2400: 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hat..          #
2410: 20 20 20 20 20 20 20 69 73 20 6d 6f 73 74 20 63         is most c
2420: 6c 6f 73 65 6c 79 20 61 73 73 6f 63 69 61 74 65  losely associate
2430: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
2440: 6c 61 72 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a  lar version of..
2450: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2460: 20 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 2e    Visual Studio.
2470: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2480: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
2490: 2d 65 78 61 63 74 20 2d 2d 20 24 79 65 61 72 20  -exact -- $year 
24a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  {..            2
24b0: 30 30 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  005 {..         
24c0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
24d0: 78 32 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x20..           
24e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
24f0: 32 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20  2008 {..        
2500: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2510: 46 78 33 35 0d 0a 20 20 20 20 20 20 20 20 20 20  Fx35..          
2520: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2530: 20 32 30 31 30 20 7b 0d 0a 20 20 20 20 20 20 20   2010 {..       
2540: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
2550: 74 46 78 34 30 0d 0a 20 20 20 20 20 20 20 20 20  tFx40..         
2560: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2570: 20 20 32 30 31 32 20 7b 0d 0a 20 20 20 20 20 20    2012 {..      
2580: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
2590: 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20 20  etFx45..        
25a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
25b0: 20 20 20 32 30 31 33 20 7b 0d 0a 20 20 20 20 20     2013 {..     
25c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
25d0: 6e 65 74 46 78 34 35 31 3b 20 23 20 54 4f 44 4f  netFx451; # TODO
25e0: 3a 20 4f 72 20 22 6e 65 74 46 78 34 35 32 22 3f  : Or "netFx452"?
25f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
2610: 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 {..           
2620: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
2630: 36 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e  6; # TODO: Or "n
2640: 65 74 46 78 34 36 31 22 20 2f 20 22 6e 65 74 46  etFx461" / "netF
2650: 78 34 36 32 22 3f 0d 0a 20 20 20 20 20 20 20 20  x462"?..        
2660: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2670: 20 20 20 32 30 31 37 20 7b 0d 0a 20 20 20 20 20     2017 {..     
2680: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2690: 6e 65 74 46 78 34 37 3b 20 23 20 54 4f 44 4f 3a  netFx47; # TODO:
26a0: 20 4f 72 20 22 6e 65 74 46 78 34 37 31 22 3f 0d   Or "netFx471"?.
26b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 65 74 53              NetS
26d0: 74 61 6e 64 61 72 64 32 30 20 7b 0d 0a 20 20 20  tandard20 {..   
26e0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
26f0: 6e 20 6e 65 74 53 74 61 6e 64 61 72 64 32 30 0d  n netStandard20.
2700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2710: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
2720: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
2730: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2740: 78 33 35 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f  x35; # TODO: Goo
2750: 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66  d "fallback" def
2760: 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20  ault?..         
2770: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2780: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
2790: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
27a0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
27b0: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
27c0: 72 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  re should return
27d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
27e0: 20 63 6f 6e 66 69 67 75 72 65 64 20 74 65 73 74   configured test
27f0: 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 70 6c  ..    #       pl
2800: 61 74 66 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c  atform is most l
2810: 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c  ikely the defaul
2820: 74 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69  t for this machi
2830: 6e 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  ne...    #..    
2840: 70 72 6f 63 20 69 73 44 65 66 61 75 6c 74 42 75  proc isDefaultBu
2850: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76  ildPlatform { {v
2860: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
2870: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2880: 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67   # NOTE: Running
2890: 20 6f 6e 20 57 6f 57 36 34 20 69 73 20 6e 65 76   on WoW64 is nev
28a0: 65 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  er the default p
28b0: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
28c0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
28d0: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74  RunningWoW64]} t
28e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
28f0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
2900: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
2910: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2920: 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
2930: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65        "---- dete
2940: 63 74 65 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  cted non-default
2950: 20 70 6c 61 74 66 6f 72 6d 20 28 57 6f 57 36 34   platform (WoW64
2960: 29 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  )\n"..        }.
2970: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
2980: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  n false..      }
2990: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
29a0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
29b0: 68 61 73 20 61 20 67 6f 6f 64 20 63 68 61 6e 63  has a good chanc
29c0: 65 20 6f 66 20 62 65 69 6e 67 20 74 68 65 20 64  e of being the d
29d0: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e  efault platform.
29e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
29f0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
2a00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
2a10: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2a20: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63  nnel "---- detec
2a30: 74 65 64 20 64 65 66 61 75 6c 74 20 70 6c 61 74  ted default plat
2a40: 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  form\n"..      }
2a50: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
2a60: 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d   true..    }....
2a70: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
2a80: 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74  ldPlatform { nat
2a90: 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ive } {..      i
2aa0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2ab0: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d  ::test_platform]
2ac0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
2ad0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2ae0: 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d  $::test_platform
2af0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2b00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2b10: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
2b20: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
2b30: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74   platform.  If t
2b40: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2b50: 6e 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20  not set,..      
2b60: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64 65    #       the de
2b70: 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
2b80: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
2b90: 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65   machine archite
2ba0: 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  cture...        
2bb0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2bc0: 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  n [expr {$native
2bd0: 20 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66   ? $::test_platf
2be0: 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20  orm : ""}]..    
2bf0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
2c00: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
2c10: 6d 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20  machine] && \.. 
2c20: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2c30: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
2c40: 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68  machine] > 0} th
2c50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
2c60: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2c70: 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c   For native buil
2c80: 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ds, return the p
2c90: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72  latform name cor
2ca0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20  responding to.. 
2cb0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2cc0: 68 65 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20  he test machine 
2cd0: 61 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74  architecture; ot
2ce0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2cf0: 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20  an empty..      
2d00: 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67    #       string
2d10: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2d20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
2d30: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
2d40: 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69  $native ? [machi
2d50: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
2d60: 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20  test_machine] : 
2d70: 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a  ""..        }]..
2d80: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
2d90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
2da0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
2db0: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
2dc0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2dd0: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61    # NOTE: For na
2de0: 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65 74  tive builds, ret
2df0: 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  urn the platform
2e00: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
2e10: 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  ing to..        
2e20: 23 20 20 20 20 20 20 20 74 68 65 20 6d 61 63 68  #       the mach
2e30: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
2e40: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74  ; otherwise, ret
2e50: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2e60: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ing...        #.
2e70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e80: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
2e90: 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61     $native ? [ma
2ea0: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
2eb0: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
2ec0: 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a  machine)] : ""..
2ed0: 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20          }]..    
2ee0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2f00: 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e   NOTE: No machin
2f10: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 20 69  e architecture i
2f20: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
2f30: 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
2f40: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  ing...        # 
2f50: 20 20 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f        It is impo
2f60: 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  rtant to return 
2f70: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
2f80: 68 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65  here because the
2f90: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2fa0: 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73    result of this
2fb0: 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62   procedure may b
2fc0: 65 20 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c  e used with [fil
2fd0: 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20  e join]...      
2fe0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2ff0: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
3000: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
3010: 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66  roc getBuildConf
3020: 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a  iguration {} {..
3030: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3040: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
3050: 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  e "configuration
3060: 22 20 73 65 74 74 69 6e 67 20 68 61 73 20 62 65  " setting has be
3070: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  en overridden by
3080: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
3090: 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e 20 6f      user (e.g. o
30a0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
30b0: 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c 70 73  ne).  This helps
30c0: 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79   control exactly
30d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
30e0: 77 68 69 63 68 20 73 65 74 20 6f 66 20 62 69 6e  which set of bin
30f0: 61 72 69 65 73 20 77 65 20 61 72 65 20 74 65 73  aries we are tes
3100: 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f 73 65  ting (i.e. those
3110: 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20   built in the.. 
3120: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 44 65       #       "De
3130: 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
3140: 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  " build configur
3150: 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65  ations).  To ove
3160: 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20 20 20  rride this..    
3170: 20 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20    #       value 
3180: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
3190: 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63 6f  line, enter a co
31a0: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
31b0: 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20 20 23   one of..      #
31c0: 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f         the follo
31d0: 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65  wing (all on one
31e0: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
31f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3200: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
3210: 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73  anyInitialize "s
3220: 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  et test_configur
3230: 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20  ation Debug"..  
3240: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
3250: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3260: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
3270: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3280: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
3290: 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73  anyInitialize "s
32a0: 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  et test_configur
32b0: 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a  ation Release"..
32c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
32d0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
32e0: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
32f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
3300: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
3310: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
3320: 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54  \all.eagle -preT
3330: 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  est..      #    
3340: 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63       "unset -noc
3350: 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e  omplain test_con
3360: 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20  figuration"..   
3370: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3380: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
3390: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
33a0: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
33b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
33c0: 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  h $::test_config
33d0: 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68  uration] > 0} th
33e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
33f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3400: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
3410: 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  ed test configur
3420: 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65 66 61  ation.  The defa
3430: 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64 0d 0a  ult value used..
3440: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3450: 66 6f 72 20 74 68 69 73 20 76 61 72 69 61 62 6c  for this variabl
3460: 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 22  e is typically "
3470: 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73 65 74  Release", as set
3480: 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20   by the test..  
3490: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
34a0: 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20  ite itself...   
34b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
34c0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63  return $::test_c
34d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20  onfiguration..  
34e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
34f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3500: 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c   # NOTE: Normall
3510: 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72  y, we will never
3520: 20 68 69 74 20 74 68 69 73 20 63 61 73 65 20 62   hit this case b
3530: 65 63 61 75 73 65 20 74 68 65 20 76 61 6c 75 65  ecause the value
3540: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20   of the..       
3550: 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
3560: 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61 72 69  nfiguration vari
3570: 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 73  able is always s
3580: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 20 73  et by the test s
3590: 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  uite..        # 
35a0: 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20 68 6f        itself; ho
35b0: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62 65  wever, it can be
35c0: 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
35d0: 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d  g the unset comm
35e0: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
35f0: 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 2d 70       from the -p
3600: 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f  reTest option to
3610: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
3620: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3630: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 65       return $::e
3640: 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f  agle_platform(co
3650: 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20  nfiguration)..  
3660: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3670: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
3680: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  ldConfigurations
3690: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
36a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
36b0: 65 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66  e if the list of
36c0: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
36d0: 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20 6f 76  ions has been ov
36e0: 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20  erridden by..   
36f0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
3700: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
3710: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
3720: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3730: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
3740: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
3750: 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20  ations] && \..  
3760: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
3770: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
3780: 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68  rations] > 0} th
3790: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
37a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
37b0: 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69   Use the specifi
37c0: 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  ed list of test 
37d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d  configurations..
37e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
37f0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
3800: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
3810: 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  s..      } else 
3820: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3830: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
3840: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69  e the default li
3850: 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69  st of test confi
3860: 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20  gurations...    
3870: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
3880: 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65 62 75  eturn [list Debu
3890: 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20  g Release]..    
38a0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
38b0: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
38c0: 42 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d  BaseDirectory {}
38d0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
38e0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
38f0: 65 20 6f 75 74 20 74 68 65 20 62 61 73 65 20 64  e out the base d
3900: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 61  irectory where a
3910: 6c 6c 20 74 68 65 20 62 75 69 6c 64 73 20 73 68  ll the builds sh
3920: 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23  ould be..      #
3930: 20 20 20 20 20 20 20 6c 6f 63 61 74 65 64 2e 20         located. 
3940: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
3950: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
3960: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63   contains the ac
3970: 74 75 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  tual..      #   
3980: 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74      build output
3990: 20 64 69 72 65 63 74 6f 72 79 20 28 65 2e 67 2e   directory (e.g.
39a0: 20 70 61 72 65 6e 74 20 6f 66 20 22 62 69 6e 22   parent of "bin"
39b0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
39c0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
39d0: 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65  sts ::build_base
39e0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
39f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
3a00: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
3a10: 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f  ild_base_directo
3a20: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
3a30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3a40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
3a50: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
3a60: 62 75 69 6c 64 20 62 61 73 65 20 64 69 72 65 63  build base direc
3a70: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
3a80: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
3a90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
3aa0: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
3ab0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
3ac0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
3ad0: 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f  n $::build_base_
3ae0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
3af0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
3b00: 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e   exists ::common
3b10: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
3b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
3b30: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f  ing length $::co
3b40: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
3b50: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
3b60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3b70: 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61  # NOTE: Next, fa
3b80: 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 67 72  llback to the gr
3b90: 61 6e 64 70 61 72 65 6e 74 20 64 69 72 65 63 74  andparent direct
3ba0: 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65 0d 0a  ory of the one..
3bb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3bc0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
3bd0: 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d 6d  file (i.e. "comm
3be0: 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66 20 61  on.eagle"), if a
3bf0: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
3c00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3c10: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
3c20: 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
3c30: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
3c40: 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  tory]]..      } 
3c50: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
3c60: 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26 26 20  ists ::path] && 
3c70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
3c80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 70  ring length $::p
3c90: 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ath] > 0} then {
3ca0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3cb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e       # NOTE: Fin
3cc0: 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b 20 74  ally, fallback t
3cd0: 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72  o the parent dir
3ce0: 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 45 61  ectory of the Ea
3cf0: 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20 20 20  gleTest..       
3d00: 20 23 20 20 20 20 20 20 20 70 61 74 68 2e 20 20   #       path.  
3d10: 54 68 65 20 45 61 67 6c 65 54 65 73 74 20 70 61  The EagleTest pa
3d20: 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65 65 73  ckage guarantees
3d30: 20 74 68 61 74 20 74 68 69 73 20 76 61 72 69 61   that this varia
3d40: 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
3d50: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73 65 74       will be set
3d60: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
3d70: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
3d80: 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f 0d 0a   first file to..
3d90: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3da0: 65 78 65 63 75 74 65 20 74 68 65 20 5b 72 75 6e  execute the [run
3db0: 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63  TestPrologue] sc
3dc0: 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f  ript library pro
3dd0: 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20  cedure...       
3de0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3df0: 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  rn [file dirname
3e00: 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20 20 20   $::path]..     
3e10: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
3e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3e30: 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20 69 73  NOTE: No path is
3e40: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
3e50: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
3e60: 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 0d  ng.  This point.
3e70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3e80: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72   should not be r
3e90: 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20 20 20  eached...       
3ea0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3eb0: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
3ec0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
3ed0: 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65 73 74  oc getSQLiteTest
3ee0: 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d 0a 20  DataPath {} {.. 
3ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3f00: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
3f10: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
3f20: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74 65 73  here all the tes
3f30: 74 20 64 61 74 61 20 66 69 6c 65 73 20 73 68 6f  t data files sho
3f40: 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  uld..      #    
3f50: 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20     be located.  
3f60: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74  This should be t
3f70: 68 65 20 22 64 61 74 61 22 20 64 69 72 65 63 74  he "data" direct
3f80: 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0d  ory beneath the.
3f90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
3fa0: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
3fb0: 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c 20 74  ing the actual t
3fc0: 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a 20 20  est scripts...  
3fd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
3fe0: 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  urn [file join $
3ff0: 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a 20 20  ::path data]..  
4000: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4010: 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 20   isRunningWoW64 
4020: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
4030: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
4040: 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65 20 74   now, just use t
4050: 68 65 20 65 78 69 73 74 69 6e 67 20 74 65 73 74  he existing test
4060: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20   constraint for 
4070: 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20 20 20  detecting..     
4080: 20 23 20 20 20 20 20 20 20 61 20 57 6f 57 36 34   #       a WoW64
4090: 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
40a0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
40b0: 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
40c0: 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d 0d 0a   wow64]..    }..
40d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 69  ...    proc isMi
40e0: 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20  xedModeAssembly 
40f0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e  { fileName {varN
4100: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
4110: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4120: 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b 65 20  TE: First, make 
4130: 73 75 72 65 20 74 68 65 20 74 65 73 74 20 73 75  sure the test su
4140: 69 74 65 20 69 6e 66 72 61 73 74 72 75 63 74 75  ite infrastructu
4150: 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  re is allowed to
4160: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4170: 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d 20 63  use the [exec] c
4180: 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20 20 23  ommand...      #
4190: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
41a0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
41b0: 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66 6f 20  xec)] && ![info 
41c0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 72 46  exists ::no(corF
41d0: 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lags)]} then {..
41e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
41f0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
4200: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 43 6f  e location of Co
4210: 72 46 6c 61 67 73 20 69 73 20 70 72 65 73 65 6e  rFlags is presen
4220: 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e  t in the environ
4230: 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 23  ment,..        #
4240: 20 20 20 20 20 20 20 75 73 65 20 69 74 3b 20 6f         use it; o
4250: 74 68 65 72 77 69 73 65 20 61 73 73 75 6d 65 20  therwise assume 
4260: 69 74 20 69 73 20 69 6e 20 74 68 65 20 50 41 54  it is in the PAT
4270: 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  H...        #.. 
4280: 20 20 20 20 20 20 20 73 65 74 20 63 6f 72 46 6c         set corFl
4290: 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  ags [expr {..   
42a0: 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69         [info exi
42b0: 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46 6c 61  sts ::env(CorFla
42c0: 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28 43 6f  gs)] ? $::env(Co
42d0: 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72 46 6c  rFlags) : "CorFl
42e0: 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  ags"..        }]
42f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
4300: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
4310: 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63 75 74  ttempt to execut
4320: 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20 74 68  e CorFlags on th
4330: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
4340: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4350: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
4360: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 78   {..          ex
4370: 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67 73 20  ec -- $corFlags 
4380: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
4390: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
43a0: 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d 3d 20       } exec] == 
43b0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
43c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
43d0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71    # NOTE: If req
43e0: 75 65 73 74 65 64 20 62 79 20 6f 75 72 20 63 61  uested by our ca
43f0: 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20 74 6f  ller, attempt to
4400: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0d 0a   determine the..
4410: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4420: 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74    platform for t
4430: 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
4440: 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20  e as well...    
4450: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4460: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4470: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
4480: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4490: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
44a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
44b0: 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74 66 6f  Store the platfo
44c0: 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65 64 20  rm in the named 
44d0: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 0d  variable in the.
44e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
44f0: 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
4500: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
4510: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4520: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
4530: 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66 6f 72  $varName platfor
4540: 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m....           
4550: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
4560: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
4570: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 50  to extract the P
4580: 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  E line from the 
4590: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
45a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 75        #       ou
45b0: 74 70 75 74 2e 20 20 49 66 20 74 68 69 73 20 76  tput.  If this v
45c0: 61 6c 75 65 20 69 73 20 22 50 45 33 32 22 20 6f  alue is "PE32" o
45d0: 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65 0d 0a  r "PE32+", the..
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
45f0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66 69 6c      assembly fil
4600: 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72 20 36  e is 32-bit or 6
4610: 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74 69 76  4-bit, respectiv
4620: 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ely;..          
4630: 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77    #       otherw
4640: 69 73 65 2c 20 69 74 73 20 74 79 70 65 20 69 73  ise, its type is
4650: 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20   unknown...     
4660: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4670: 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
4680: 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20 3a 20  n {^PE        : 
4690: 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c 73 2b  (PE32|PE32\+)\s+
46a0: 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  $}....          
46b0: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 6c    if {[regexp -l
46c0: 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20  ine -- $pattern 
46d0: 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65 33 32  $exec dummy pe32
46e0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
46f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
4700: 20 20 20 20 20 20 20 20 20 20 23 20 48 41 43 4b            # HACK
4710: 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68 5d 20  : This [switch] 
4720: 61 73 73 75 6d 65 73 20 74 68 61 74 20 33 32 2d  assumes that 32-
4730: 62 69 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  bit executables 
4740: 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  are..           
4750: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
4760: 73 20 78 38 36 20 61 6e 64 20 74 68 61 74 20 36  s x86 and that 6
4770: 34 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  4-bit executable
4780: 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a 20 20  s are always..  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
47a0: 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20 20 20      x64...      
47b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
47c0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
47d0: 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33 32 20  -exact -- $pe32 
47e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
47f0: 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20 20 20     PE32 {..     
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4810: 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33 32 0d   platform Win32.
4820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4830: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4840: 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20 20 20      PE32+ {..   
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4860: 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36 34 0d  et platform x64.
4870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4880: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4890: 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20      default {.. 
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48b0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22   set platform ""
48c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
48d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
48e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
48f0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4900: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
4910: 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20  atform ""..     
4920: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4930: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
4940: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4950: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
4960: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 49  to extract the I
4970: 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f 6d 20  LONLY line from 
4980: 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20  the captured..  
4990: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
49a0: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
49b0: 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2c 20   value is zero, 
49c0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
49d0: 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20 20 20  le must..       
49e0: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 61 20     #       be a 
49f0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
4a00: 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  bly; otherwise, 
4a10: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  it contains only
4a20: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
4a30: 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70      managed comp
4a40: 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20  onents...       
4a50: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4a60: 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 49 4c  set pattern {^IL
4a70: 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31 29 5c  ONLY    : (0|1)\
4a80: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
4a90: 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70 20 2d    if {![regexp -
4aa0: 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72 6e  line -- $pattern
4ab0: 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69 6c 4f   $exec dummy ilO
4ac0: 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nly]} then {..  
4ad0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4ae0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
4af0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
4b00: 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74   if {!$ilOnly} t
4b10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
4b20: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
4b30: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
4b40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
4b50: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
4b60: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
4b70: 20 74 65 73 74 20 73 75 69 74 65 20 63 61 6e 6e   test suite cann
4b80: 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20 6f 72  ot use [exec] or
4b90: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 43 6f   execution of Co
4ba0: 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 23 20  rFlags..      # 
4bb0: 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20 72 65        failed, re
4bc0: 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20 20 20  turn false...   
4bd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
4be0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
4bf0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
4c00: 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
4c10: 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d  eNamesOnly {} {.
4c20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4c30: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63  # NOTE: First, c
4c40: 68 65 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74  heck if the list
4c50: 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61   of native libra
4c60: 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61  ry file names ha
4c70: 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
4c80: 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f        manually o
4c90: 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20  verridden...    
4ca0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
4cb0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 61  info exists ::na
4cc0: 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c  tive_library_fil
4cd0: 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d 0a 20  e_names] && \.. 
4ce0: 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74           [llengt
4cf0: 68 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72  h $::native_libr
4d00: 61 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20  ary_file_names] 
4d10: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4d20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d30: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 69 73 74  # NOTE: The list
4d40: 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61   of native libra
4d50: 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61  ry file names ha
4d60: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
4d70: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
4d80: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
4d90: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
4da0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4db0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 6e 61      return $::na
4dc0: 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c  tive_library_fil
4dd0: 65 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  e_names..      }
4de0: 20 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64   elseif {[isWind
4df0: 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ows]} then {..  
4e00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4e10: 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69   # NOTE: Otherwi
4e20: 73 65 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  se, on Windows, 
4e30: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 64  always use the d
4e40: 65 66 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65  efault file name
4e50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4e60: 20 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c 22 2e    "sqlite3.dll".
4e70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4e80: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4e90: 74 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a  t sqlite3.dll]..
4ea0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
4eb0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4ec0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72     # NOTE: Other
4ed0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 62 6f 74  wise, return bot
4ee0: 68 20 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f  h the generic PO
4ef0: 53 49 58 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  SIX file name an
4f00: 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  d the..        #
4f10: 20 20 20 20 20 20 20 4d 61 63 20 4f 53 20 58 20         Mac OS X 
4f20: 66 69 6c 65 20 6e 61 6d 65 2c 20 73 69 6e 63 65  file name, since
4f30: 20 77 65 20 64 6f 20 6e 6f 74 20 63 75 72 72 65   we do not curre
4f40: 6e 74 6c 79 20 68 61 76 65 20 61 6e 20 65 61 73  ntly have an eas
4f50: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
4f60: 20 20 20 77 61 79 20 74 6f 20 64 65 74 65 63 74     way to detect
4f70: 20 77 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20   which of those 
4f80: 70 6c 61 74 66 6f 72 6d 73 20 77 65 20 61 72 65  platforms we are
4f90: 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20   running on...  
4fa0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4fb0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69   return [list li
4fc0: 62 73 71 6c 69 74 65 33 2e 64 79 6c 69 62 20 6c  bsqlite3.dylib l
4fd0: 69 62 73 71 6c 69 74 65 33 2e 73 6f 5d 0d 0a 20  ibsqlite3.so].. 
4fe0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
4ff0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 49 6e  ..    proc getIn
5000: 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69 6c  teropAssemblyFil
5010: 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d  eNamesOnly {} {.
5020: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5030: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63  # NOTE: First, c
5040: 68 65 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74  heck if the list
5050: 20 6f 66 20 69 6e 74 65 72 6f 70 20 61 73 73 65   of interop asse
5060: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  mbly file names 
5070: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
5080: 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79  #       manually
5090: 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20   overridden...  
50a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
50b0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
50c0: 69 6e 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79  interop_assembly
50d0: 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20  _file_names] && 
50e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
50f0: 65 6e 67 74 68 20 24 3a 3a 69 6e 74 65 72 6f 70  ength $::interop
5100: 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e  _assembly_file_n
5110: 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ames] > 0} then 
5120: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5130: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5140: 65 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f  e list of intero
5150: 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  p assembly file 
5160: 6e 61 6d 65 73 20 68 61 73 20 62 65 65 6e 20 6f  names has been o
5170: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
5180: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
5190: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
51a0: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
51b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
51c0: 72 6e 20 24 3a 3a 69 6e 74 65 72 6f 70 5f 61 73  rn $::interop_as
51d0: 73 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65  sembly_file_name
51e0: 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  s..      } elsei
51f0: 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 7d 20  f {[isWindows]} 
5200: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5210: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5220: 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20 6f 6e  E: Otherwise, on
5230: 20 57 69 6e 64 6f 77 73 2c 20 61 6c 77 61 79 73   Windows, always
5240: 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   use the default
5250: 20 66 69 6c 65 20 6e 61 6d 65 0d 0a 20 20 20 20   file name..    
5260: 20 20 20 20 23 20 20 20 20 20 20 20 22 53 51 4c      #       "SQL
5270: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22  ite.Interop.dll"
5280: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
52a0: 73 74 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  st SQLite.Intero
52b0: 70 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20 7d 20  p.dll]..      } 
52c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
52d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
52e0: 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  E: Otherwise, re
52f0: 74 75 72 6e 20 62 6f 74 68 20 74 68 65 20 67 65  turn both the ge
5300: 6e 65 72 69 63 20 50 4f 53 49 58 20 66 69 6c 65  neric POSIX file
5310: 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 0d 0a 20   name and the.. 
5320: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4d         #       M
5330: 61 63 20 4f 53 20 58 20 66 69 6c 65 20 6e 61 6d  ac OS X file nam
5340: 65 2c 20 73 69 6e 63 65 20 77 65 20 64 6f 20 6e  e, since we do n
5350: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 76  ot currently hav
5360: 65 20 61 6e 20 65 61 73 79 0d 0a 20 20 20 20 20  e an easy..     
5370: 20 20 20 23 20 20 20 20 20 20 20 77 61 79 20 74     #       way t
5380: 6f 20 64 65 74 65 63 74 20 77 68 69 63 68 20 6f  o detect which o
5390: 66 20 74 68 6f 73 65 20 70 6c 61 74 66 6f 72 6d  f those platform
53a0: 73 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  s we are running
53b0: 20 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   on...        #.
53c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
53d0: 5b 6c 69 73 74 20 6c 69 62 53 51 4c 69 74 65 2e  [list libSQLite.
53e0: 49 6e 74 65 72 6f 70 2e 64 79 6c 69 62 20 6c 69  Interop.dylib li
53f0: 62 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  bSQLite.Interop.
5400: 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  so]..      }..  
5410: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5420: 20 67 65 74 43 6f 72 65 45 78 74 65 6e 73 69 6f   getCoreExtensio
5430: 6e 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  nBinaryFileName 
5440: 7b 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  { {default ""} }
5450: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
5460: 6c 65 4e 61 6d 65 20 5b 67 65 74 43 6f 72 65 42  leName [getCoreB
5470: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 5d 0d 0a  inaryFileName]..
5480: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
5490: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
54a0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
54b0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
54c0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
54d0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
54e0: 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  default..    }..
54f0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 42 75  ...    proc isBu
5500: 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e  ildAvailable { n
5510: 61 74 69 76 65 20 64 69 72 65 63 74 6f 72 79 20  ative directory 
5520: 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
5530: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5540: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
5550: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
5560: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72  ed file name for
5570: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
5580: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
5590: 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20       containing 
55a0: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
55b0: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 63  SQLite managed c
55c0: 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a  omponents.  It..
55d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
55e0: 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 74 68  ould be noted th
55f0: 61 74 20 74 68 69 73 20 61 73 73 65 6d 62 6c 79  at this assembly
5600: 20 66 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63   file may also c
5610: 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20 20 20 20  ontain the..    
5620: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
5630: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20   components, if 
5640: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 69  a native build i
5650: 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20  s in use...     
5660: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   #..      set fi
5670: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
5680: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
5690: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
56a0: 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65  .          Syste
56b0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
56c0: 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  l]]....      if 
56d0: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
56e0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
56f0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
5700: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  n false..      }
5710: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
5720: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
5730: 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  pt to automatica
5740: 6c 6c 79 20 64 65 74 65 63 74 20 69 66 20 74 68  lly detect if th
5750: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
5760: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
5770: 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e    contains any n
5780: 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  ative components
5790: 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d  , if necessary..
57a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
57b0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
57c0: 74 68 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30  th $native] == 0
57d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
57e0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
57f0: 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e  ngth $varName] >
5800: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
5810: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
5820: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
5830: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
5840: 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
5850: 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73   [isMixedModeAss
5860: 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
5870: 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  $varName]..     
5880: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
5890: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
58a0: 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65  the primary asse
58b0: 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69  mbly also contai
58c0: 6e 73 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f  ns the native co
58d0: 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20  mponents,..     
58e0: 20 23 20 20 20 20 20 20 20 77 65 20 68 61 76 65   #       we have
58f0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e   everything we n
5900: 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  eed...      #.. 
5910: 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65       if {$native
5920: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5930: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
5940: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5950: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5960: 20 49 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20   If the machine 
5970: 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61  name is unavaila
5980: 62 6c 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ble, there is no
5990: 74 68 69 67 6e 20 65 6c 73 65 20 77 65 0d 0a 20  thign else we.. 
59a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e       #       can
59b0: 20 64 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   do...      #.. 
59c0: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
59d0: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
59e0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d  tform(machine)]}
59f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5a00: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
5a10: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5a20: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5a30: 20 57 68 61 74 20 69 73 20 74 68 65 20 61 72 63   What is the arc
5a40: 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 74 68  hitecture for th
5a50: 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20  is machine?..   
5a60: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
5a70: 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 6d 61  architecture [ma
5a80: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
5a90: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
5aa0: 6d 61 63 68 69 6e 65 29 20 74 72 75 65 5d 0d 0a  machine) true]..
5ab0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5ac0: 20 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73   # NOTE: What is
5ad0: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 66 6f   the platform fo
5ae0: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
5af0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5b00: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d 61  set platform [ma
5b10: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
5b20: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
5b30: 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20 20  machine)]....   
5b40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5b50: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
5b60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
5b70: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
5b80: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
5b90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5ba0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
5bb0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5bc0: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
5bd0: 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20  nts.  If this.. 
5be0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
5bf0: 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f  e exists, we sho
5c00: 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68  uld have everyth
5c10: 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20  ing we need...  
5c20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72      #..      for
5c30: 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
5c40: 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73  y [getInteropAss
5c50: 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  emblyFileNamesOn
5c60: 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  ly] {..        s
5c70: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
5c80: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
5c90: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
5ca0: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
5cb0: 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
5cc0: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
5cd0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
5ce0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
5cf0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
5d00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5d10: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
5d20: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
5d30: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
5d40: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5d50: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
5d60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
5d70: 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61  platform $fileNa
5d80: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
5d90: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
5da0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
5db0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5dc0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5dd0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5de0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5df0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5e00: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5e10: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
5e20: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
5e30: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
5e40: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
5e50: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
5e60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5e70: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
5e80: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5e90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
5ea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
5eb0: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
5ec0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
5ed0: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20 63  for the SQLite c
5ee0: 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ore..      #    
5ef0: 20 20 20 6c 69 62 72 61 72 79 2e 20 20 49 66 20     library.  If 
5f00: 74 68 69 73 20 66 69 6c 65 20 65 78 69 73 74 73  this file exists
5f10: 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
5f20: 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 0d 0a   everything we..
5f30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
5f40: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
5f50: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
5f60: 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74  NameOnly [getNat
5f70: 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
5f80: 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20  mesOnly] {..    
5f90: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
5fa0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
5fb0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
5fc0: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
5fd0: 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
5fe0: 74 75 72 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  ture $fileNameOn
5ff0: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
6000: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
6010: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
6020: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  n {..          r
6030: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
6040: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
6050: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
6060: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
6070: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
6080: 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
6090: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 24 66      $platform $f
60a0: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
60b0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69  .        if {[fi
60c0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
60d0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
60e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
60f0: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  rue..        }..
6100: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
6110: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
6120: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
6130: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
6140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69  .            $fi
6150: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
6160: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
6170: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
6180: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
6190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
61a0: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ue..        }.. 
61b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
61c0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
61d0: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74   One or more nat
61e0: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e  ive components n
61f0: 65 65 64 65 64 20 62 79 20 53 79 73 74 65 6d 2e  eeded by System.
6200: 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
6210: 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 6d     #       are m
6220: 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  issing...      #
6230: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
6240: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
6250: 20 20 20 20 70 72 6f 63 20 69 73 52 65 6c 65 61      proc isRelea
6260: 73 65 41 76 61 69 6c 61 62 6c 65 20 7b 20 64 69  seAvailable { di
6270: 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65  rectory {varName
6280: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
6290: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
62a0: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
62b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
62c0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
62d0: 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20  me $varName..   
62e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
62f0: 74 75 72 6e 20 5b 69 73 42 75 69 6c 64 41 76 61  turn [isBuildAva
6300: 69 6c 61 62 6c 65 20 22 22 20 24 64 69 72 65 63  ilable "" $direc
6310: 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a  tory $varName]..
6320: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6330: 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  oc joinBuildDire
6340: 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70  ctory { native p
6350: 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72  ath year platfor
6360: 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  m configuration 
6370: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
6380: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
6390: 72 65 20 6f 75 74 20 61 6e 64 20 74 68 65 6e 20  re out and then 
63a0: 72 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 79  return the fully
63b0: 20 71 75 61 6c 69 66 69 65 64 20 70 61 74 68 20   qualified path 
63c0: 74 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20  to the build..  
63d0: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
63e0: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 20 61  ctory based on a
63f0: 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ll the arguments
6400: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
6410: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
6420: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
6430: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
6440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
6450: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69  le join $path bi
6460: 6e 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  n $year $platfor
6470: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
6480: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
6490: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
64a0: 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61  n [file join $pa
64b0: 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f  th bin $year $co
64c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d  nfiguration bin]
64d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
64e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
64f0: 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  tBuildDirectory 
6500: 7b 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7d 20  { managedOnly } 
6510: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6520: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
6530: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
6540: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
6550: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
6560: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
6570: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
6580: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
6590: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
65a0: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
65b0: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
65c0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
65d0: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
65e0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
65f0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
6600: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
6610: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
6620: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
6630: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6640: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
6650: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
6660: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
6670: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
6680: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
6690: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
66a0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
66b0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
66c0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
66d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
66e0: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
66f0: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
6700: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
6710: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
6720: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
6730: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
6740: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
6750: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
6760: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
6770: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
6780: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
6790: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
67a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
67b0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
67c0: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
67d0: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
67e0: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
67f0: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
6800: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
6810: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
6820: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
6830: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
6840: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
6850: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
6860: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
6870: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
6880: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
6890: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
68a0: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
68b0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
68c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
68d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
68e0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
68f0: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
6900: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
6910: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
6920: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
6930: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
6940: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
6950: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
6960: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
6970: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
6980: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
6990: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
69a0: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
69b0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
69c0: 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65  is set, the mixe
69d0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d  d-mode assembly.
69e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
69f0: 20 69 73 20 62 65 69 6e 67 20 74 65 73 74 65 64   is being tested
6a00: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
6a10: 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
6a20: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
6a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6a40: 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74    will contain t
6a50: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
6a60: 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e   and all the bin
6a70: 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
6a80: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6a90: 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73    should be pres
6aa0: 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69 72 65  ent in that dire
6ab0: 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22  ctory.  If the "
6ac0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d  native" runtime.
6ad0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6ae0: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73   option is not s
6af0: 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  et, the build di
6b00: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
6b10: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
6b20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6b30: 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74    "platform-neut
6b40: 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e  ral", with the n
6b50: 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e  otable exception
6b60: 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a   of any native..
6b70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b80: 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22  assembly (e.g. "
6b90: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
6ba0: 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68 65 72  ll") copied ther
6bb0: 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20  e during the..  
6bc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
6bd0: 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74 73 65  ild process itse
6be0: 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c  lf.  If the buil
6bf0: 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f  d process someho
6c00: 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  w does not..    
6c10: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
6c20: 20 74 68 65 20 6e 61 74 69 76 65 20 61 73 73 65   the native asse
6c30: 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c  mbly for this pl
6c40: 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20  atform, most of 
6c50: 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20  the tests..     
6c60: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
6c70: 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d  e suite will sim
6c80: 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ply be skipped. 
6c90: 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b   Generally speak
6ca0: 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20  ing, there..    
6cb0: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
6cc0: 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c  two ways to buil
6cd0: 64 20 74 68 65 20 62 69 6e 61 72 69 65 73 20 77  d the binaries w
6ce0: 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f  hen preparing to
6cf0: 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20   run the..      
6d00: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
6d10: 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23  uite:..        #
6d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6d30: 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73    1. Build the s
6d40: 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20  eparate managed 
6d50: 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d  and native assem
6d60: 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65  blies using some
6d70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6d80: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69       commands si
6d90: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
6da0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6db0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
6dc0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
6dd0: 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  on}ManagedOnly $
6de0: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
6df0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
6e00: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
6e10: 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f  guration}NativeO
6e20: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
6e30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6e40: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
6e50: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
6e60: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
6e70: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
6e80: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
6e90: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
6ea0: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
6eb0: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
6ec0: 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  64"...        #.
6ed0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6ee0: 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69   2. Build the mi
6ef0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
6f00: 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e  y using a comman
6f10: 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  d similar to:.. 
6f20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6f30: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
6f40: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
6f50: 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f  ration} ${Platfo
6f60: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
6f70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6f80: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
6f90: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
6fa0: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
6fb0: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
6fc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
6fd0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
6fe0: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
6ff0: 72 20 22 78 36 34 22 2e 20 20 49 66 20 74 68 69  r "x64".  If thi
7000: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  s command is..  
7010: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
7020: 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74   used, various t
7030: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
7040: 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20  e supplementary 
7050: 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
7060: 20 23 20 20 20 20 20 20 20 20 20 20 61 73 73 65   #          asse
7070: 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e  mblies (e.g. LIN
7080: 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65  Q) may be skippe
7090: 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62  d unless those b
70a0: 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20  inaries..       
70b0: 20 23 20 20 20 20 20 20 20 20 20 20 61 72 65 20   #          are 
70c0: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70  subsequently cop
70d0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  ied into the cor
70e0: 72 65 63 74 20 64 69 72 65 63 74 6f 72 79 20 28  rect directory (
70f0: 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20  i.e. by..       
7100: 20 23 20 20 20 20 20 20 20 20 20 20 22 74 65 73   #          "tes
7110: 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20  t_all.bat")...  
7120: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7130: 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68   #       Note th
7140: 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75  at all of the bu
7150: 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f  ild commands abo
7160: 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20  ve will default 
7170: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
7180: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 61    #       the la
7190: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  test version of 
71a0: 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c  MSBuild availabl
71b0: 65 20 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f  e and the "test_
71c0: 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20  year" may..     
71d0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 20     #       need 
71e0: 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 20 61  to be adjusted a
71f0: 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63  ccordingly to ac
7200: 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74  tually run the t
7210: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
7220: 20 20 20 20 23 20 20 20 20 20 20 20 52 65 66 65      #       Refe
7230: 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  r to the comment
7240: 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65  s in [getBuildYe
7250: 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  ar] for more inf
7260: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20  ormation on..   
7270: 20 20 20 20 20 23 20 20 20 20 20 20 20 68 6f 77       #       how
7280: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
7290: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
72a0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  #..        set n
72b0: 61 74 69 76 65 20 5b 65 78 70 72 20 7b 21 24 6d  ative [expr {!$m
72c0: 61 6e 61 67 65 64 4f 6e 6c 79 20 26 26 20 5b 68  anagedOnly && [h
72d0: 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
72e0: 6e 61 74 69 76 65 5d 7d 5d 0d 0a 0d 0a 20 20 20  native]}]....   
72f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69       return [joi
7300: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
7310: 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75 69 6c  $native [getBuil
7320: 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  dBaseDirectory] 
7330: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
7340: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 67  getBuildYear] [g
7350: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
7360: 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42 75 69  $native] [getBui
7370: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
7380: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
7390: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
73a0: 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e  etReleaseVersion
73b0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
73c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
73d0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 65 6c  gure out the rel
73e0: 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f 72  ease version for
73f0: 20 75 73 65 20 77 69 74 68 20 74 68 65 20 62 75   use with the bu
7400: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
7410: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
7420: 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  n checking for a
7430: 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73 65  vailable release
7440: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
7450: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
7460: 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65  sts ::release_ve
7470: 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  rsion] && \..   
7480: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
7490: 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73 65  ength $::release
74a0: 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74  _version] > 0} t
74b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
74c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
74d0: 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20 76 65  : The release ve
74e0: 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  rsion has been o
74f0: 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72 65  verridden; there
7500: 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20 20  fore, use it..  
7510: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 65        #       ve
7520: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
7530: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
7540: 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65  rn $::release_ve
7550: 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65  rsion..      } e
7560: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
7570: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7580: 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65 72  : No release ver
7590: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
75a0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
75b0: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
75c0: 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69      #       It i
75d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
75e0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
75f0: 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75  tring here becau
7600: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  se the..        
7610: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f  #       result o
7620: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
7630: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
7640: 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a  h [file join]...
7650: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7660: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
7670: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7680: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
7690: 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c  ldFileName { fil
76a0: 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c  eName managedOnl
76b0: 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  y {platform ""} 
76c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
76d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
76e0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
76f0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
7700: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
7710: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
7720: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69  #       build di
7730: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
7740: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
7750: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
7760: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
7770: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
7780: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
7790: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
77a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
77b0: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c   set result [fil
77c0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
77d0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
77e0: 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69  join [getBuildDi
77f0: 72 65 63 74 6f 72 79 20 24 6d 61 6e 61 67 65 64  rectory $managed
7800: 4f 6e 6c 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  Only] $platform 
7810: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
7820: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
7830: 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e]]]....      #.
7840: 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57  .      # HACK: W
7850: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57  hen running on W
7860: 6f 57 36 34 2c 20 61 73 73 75 6d 65 20 74 68 65  oW64, assume the
7870: 20 74 65 73 74 20 65 78 65 63 75 74 61 62 6c 65   test executable
7880: 73 20 61 72 65 20 70 72 65 73 65 6e 74 0d 0a 20  s are present.. 
7890: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74       #       wit
78a0: 68 20 74 68 65 20 22 33 32 22 20 73 75 66 66 69  h the "32" suffi
78b0: 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20 20  x on them...    
78c0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
78d0: 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 20  isRunningWoW64] 
78e0: 26 26 20 5b 66 69 6c 65 20 65 78 74 65 6e 73 69  && [file extensi
78f0: 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65 71 20 22  on $result] eq "
7900: 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  .exe"} then {.. 
7910: 20 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c         set resul
7920: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  t [appendArgs [f
7930: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72 65  ile rootname $re
7940: 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a 20  sult] 32.exe].. 
7950: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7960: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
7970: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7980: 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69  oc getExternalDi
7990: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
79a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
79b0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
79c0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
79d0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
79e0: 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e  the external bin
79f0: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
7a00: 20 20 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63     files are loc
7a10: 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ated...      #..
7a20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
7a30: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
7a40: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c  ile dirname [fil
7a50: 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
7a60: 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20  binary]]]]..    
7a70: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
7a80: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
7a90: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
7aa0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
7ab0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
7ac0: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
7ad0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
7ae0: 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a  st application..
7af0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
7b00: 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45  self (i.e. the E
7b10: 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c  agle shell) is l
7b20: 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69  ocated.  This wi
7b30: 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20  ll be used as.. 
7b40: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
7b50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   destination for
7b60: 20 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74   the copied Syst
7b70: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e  em.Data.SQLite n
7b80: 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20  ative and..     
7b90: 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64   #       managed
7ba0: 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65   assemblies (i.e
7bb0: 2e 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69  . because this i
7bc0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77  s one of the few
7bd0: 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23   places..      #
7be0: 20 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65         where the
7bf0: 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c   CLR will actual
7c00: 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64  ly find and load
7c10: 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e   them properly).
7c20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7c30: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
7c40: 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63  s ::binary_direc
7c50: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
7c60: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
7c70: 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64  ngth $::binary_d
7c80: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
7c90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7ca0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7cb0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
7cc0: 66 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72  f the binary dir
7cd0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
7ce0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
7cf0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
7d00: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
7d10: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
7d20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
7d30: 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  urn $::binary_di
7d40: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
7d50: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7d60: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
7d70: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
7d80: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7d90: 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c 46 69  oc getExternalFi
7da0: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
7db0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  e } {..      #..
7dc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
7dd0: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
7de0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
7df0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
7e00: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
7e10: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
7e20: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
7e30: 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61  he external bina
7e40: 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ries...      #..
7e50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
7e60: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
7e70: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74  ile join [getExt
7e80: 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 5d 20  ernalDirectory] 
7e90: 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
7ea0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
7eb0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
7ec0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
7ed0: 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a  atform ""} } {..
7ee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7ef0: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
7f00: 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
7f10: 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20  e name as if it 
7f20: 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20  were located in 
7f30: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
7f40: 20 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74     binary direct
7f50: 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20  ory, discarding 
7f60: 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e  any directory in
7f70: 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e  formation presen
7f80: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7f90: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d   in the file nam
7fa0: 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62 79  e as provided by
7fb0: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
7fc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
7fd0: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
7fe0: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
7ff0: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
8000: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
8010: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c  ] $platform [fil
8020: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
8030: 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ]]]..    }..... 
8040: 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72 65 42     proc getCoreB
8050: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20  inaryFileName { 
8060: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73  {platform ""} {s
8070: 74 61 6e 64 61 72 64 20 22 22 7d 20 7d 20 7b 0d  tandard ""} } {.
8080: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8090: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
80a0: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f  the full path fo
80b0: 72 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  r the file conta
80c0: 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65  ining the SQLite
80d0: 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20   core..      #  
80e0: 20 20 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72       native libr
80f0: 61 72 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69  ary code for thi
8100: 73 20 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72  s platform.  Fir
8110: 73 74 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65  st, check and se
8120: 65 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20  e if..      #   
8130: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63      the SQLite c
8140: 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ore native libra
8150: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ry has already b
8160: 65 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78  een loaded.  Nex
8170: 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  t,..      #     
8180: 20 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68    fallback to wh
8190: 61 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  at the full path
81a0: 20 73 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65   should be, base
81b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65  d on whether the
81c0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
81d0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
81e0: 62 6c 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  bly is being use
81f0: 64 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  d and the name o
8200: 66 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20  f the current.. 
8210: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61       #       pla
8220: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
8230: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
8240: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
8250: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
8260: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
8270: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
8280: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
8290: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
82a0: 64 73 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65  ds _SQLiteNative
82b0: 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a  ModuleFileName..
82c0: 20 20 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65        } fileName
82d0: 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e  ] == 0 && [strin
82e0: 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61  g length $fileNa
82f0: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
8300: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8310: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
8320: 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69  SQLite core nati
8330: 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61  ve library has a
8340: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
8350: 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20  ed via..        
8360: 23 20 20 20 20 20 20 20 74 68 65 20 6e 61 74 69  #       the nati
8370: 76 65 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c  ve library pre-l
8380: 6f 61 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74  oader.  Return t
8390: 68 61 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f  hat file name no
83a0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
83b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
83c0: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
83d0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
83e0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
83f0: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
8400: 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65  me option has be
8410: 65 6e 20 73 65 74 2c 20 61 6c 77 61 79 73 20 72  en set, always r
8420: 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20  eturn the..     
8430: 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61   #       file na
8440: 6d 65 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64  me for the mixed
8450: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
8460: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8470: 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
8480: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
8490: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
84a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
84b0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78  : Return the mix
84c0: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
84d0: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
84e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
84f0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
8500: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
8510: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
8520: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
8530: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
8540: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
8550: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20  ite.dll]]..     
8560: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
8570: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65       # NOTE: Are
8580: 20 77 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74   we attempting t
8590: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
85a0: 64 65 74 65 63 74 20 77 68 65 74 68 65 72 20 6f  detect whether o
85b0: 72 20 6e 6f 74 20 74 68 65 0d 0a 20 20 20 20 20  r not the..     
85c0: 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 6f 70   #       interop
85d0: 20 61 73 73 65 6d 62 6c 79 20 73 68 6f 75 6c 64   assembly should
85e0: 20 62 65 20 75 73 65 64 3f 0d 0a 20 20 20 20 20   be used?..     
85f0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 75   #..      set au
8600: 74 6f 6d 61 74 69 63 20 5b 65 78 70 72 20 7b 5b  tomatic [expr {[
8610: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
8620: 74 61 6e 64 61 72 64 5d 20 3d 3d 20 30 7d 5d 0d  tandard] == 0}].
8630: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8640: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
8650: 20 69 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f   in either "auto
8660: 6d 61 74 69 63 22 20 6f 72 20 22 6e 6f 6e 2d 73  matic" or "non-s
8670: 74 61 6e 64 61 72 64 22 20 6d 6f 64 65 73 2c 20  tandard" modes, 
8680: 61 74 74 65 6d 70 74 0d 0a 20 20 20 20 20 20 23  attempt..      #
8690: 20 20 20 20 20 20 20 74 6f 20 66 69 6e 64 20 74         to find t
86a0: 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69  he native-only i
86b0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e  nterop assembly.
86c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
86d0: 20 69 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20   if {$automatic 
86e0: 7c 7c 20 21 24 73 74 61 6e 64 61 72 64 7d 20 74  || !$standard} t
86f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
8700: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8710: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74  : Attempt to det
8720: 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 74 69 76  ermine the nativ
8730: 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61  e-only interop a
8740: 73 73 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20  ssembly file..  
8750: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
8760: 6d 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74  me for this plat
8770: 66 6f 72 6d 20 61 6e 64 20 74 68 65 6e 20 72 65  form and then re
8780: 74 75 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20  turn it...      
8790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
87a0: 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
87b0: 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73  y [getInteropAss
87c0: 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  emblyFileNamesOn
87d0: 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ly] {..         
87e0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
87f0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
8800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8810: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
8820: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
8830: 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e  $platform $fileN
8840: 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20  ameOnly]]....   
8850: 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
8860: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
8870: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
8880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8890: 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
88a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
88b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
88c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
88d0: 54 45 3a 20 54 68 65 6e 2c 20 69 6e 20 65 69 74  TE: Then, in eit
88e0: 68 65 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20  her "automatic" 
88f0: 6f 72 20 22 73 74 61 6e 64 61 72 64 22 20 6d 6f  or "standard" mo
8900: 64 65 73 2c 20 61 74 74 65 6d 70 74 20 74 6f 0d  des, attempt to.
8910: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
8920: 69 6e 64 20 74 68 65 20 73 74 61 6e 64 61 72 64  ind the standard
8930: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
8940: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8950: 20 69 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20   if {$automatic 
8960: 7c 7c 20 24 73 74 61 6e 64 61 72 64 7d 20 74 68  || $standard} th
8970: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
8980: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8990: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
89a0: 72 6d 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65  rmine the native
89b0: 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53  -only standard S
89c0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20  QLite library.. 
89d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
89e0: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  ile name for thi
89f0: 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74  s platform and t
8a00: 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a  hen return it...
8a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8a20: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
8a30: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69  ameOnly [getNati
8a40: 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d  veLibraryFileNam
8a50: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
8a60: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
8a70: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
8a80: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
8a90: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
8aa0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
8ab0: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66  ry] $platform $f
8ac0: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
8ad0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
8ae0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
8af0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
8b10: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
8b20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8b30: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
8b40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8b50: 23 20 4e 4f 54 45 3a 20 57 61 73 20 74 68 65 20  # NOTE: Was the 
8b60: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
8b70: 20 63 6f 6d 70 69 6c 65 64 20 65 78 70 65 63 74   compiled expect
8b80: 69 6e 67 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ing to deal with
8b90: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
8ba0: 20 20 20 20 73 74 61 6e 64 61 72 64 20 63 6f 72      standard cor
8bb0: 65 20 6c 69 62 72 61 72 79 3f 0d 0a 20 20 20 20  e library?..    
8bc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
8bd0: 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
8be0: 43 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f  Constant SQLITE_
8bf0: 53 54 41 4e 44 41 52 44 5d 7d 20 74 68 65 6e 20  STANDARD]} then 
8c00: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
8c20: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e  llback to return
8c30: 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ing the native-o
8c40: 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c  nly standard SQL
8c50: 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20  ite library..   
8c60: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
8c70: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70  e name for the p
8c80: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
8c90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
8ca0: 20 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b   fileNamesOnly [
8cb0: 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
8cc0: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a  FileNamesOnly]..
8cd0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
8ce0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
8cf0: 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65  sOnly] == 0} the
8d00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  n {..          r
8d10: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
8d20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72    }....        r
8d30: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
8d40: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
8d50: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
8d60: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
8d70: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
8d80: 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d  [lindex $fileNam
8d90: 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20  esOnly 0]]]..   
8da0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8db0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8dc0: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
8dd0: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 20 74 68   to returning th
8de0: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e  e native-only in
8df0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
8e00: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
8e10: 20 20 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68       name for th
8e20: 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20  e platform...   
8e30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8e40: 73 65 74 20 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c  set fileNamesOnl
8e50: 79 20 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73  y [getInteropAss
8e60: 65 6d 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  emblyFileNamesOn
8e70: 6c 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ly]....        i
8e80: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c  f {[llength $fil
8e90: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30  eNamesOnly] == 0
8ea0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8eb0: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
8ec0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
8ed0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
8ee0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
8ef0: 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
8f00: 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
8f10: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
8f20: 66 6f 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69  form [lindex $fi
8f30: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d  leNamesOnly 0]]]
8f40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8f50: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
8f60: 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79  tCommonDirectory
8f70: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
8f80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8f90: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
8fa0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
8fb0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
8fc0: 74 20 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20  t scripts..     
8fd0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
8fe0: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
8ff0: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
9000: 73 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 45  st returns the E
9010: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  agle..      #   
9020: 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65 63      binary direc
9030: 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tory...      #..
9040: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
9050: 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f  exists ::common_
9060: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
9070: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
9080: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d  ng length $::com
9090: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  mon_directory] >
90a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
90b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
90c0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
90d0: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  ion of the commo
90e0: 6e 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  n directory has 
90f0: 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20  been set;..     
9100: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
9110: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
9120: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9130: 20 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d    return $::comm
9140: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  on_directory..  
9150: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
9160: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e  nfo exists ::ven
9170: 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  dor_directory] &
9180: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
9190: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
91a0: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
91b0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
91c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
91d0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
91e0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ocation of the v
91f0: 65 6e 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20  endor directory 
9200: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
9210: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
9220: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
9230: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9240: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
9250: 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79  vendor_directory
9260: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
9270: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
9280: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26  :tcl_library] &&
9290: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
92a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
92b0: 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30  tcl_library] > 0
92c0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
92d0: 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f   [file isdirecto
92e0: 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  ry $::tcl_librar
92f0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
9300: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9310: 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61   NOTE: The varia
9320: 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ble with the loc
9330: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
9340: 69 70 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a  ipt library is..
9350: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9360: 73 65 74 20 61 6e 64 20 61 70 70 65 61 72 73 20  set and appears 
9370: 74 6f 20 62 65 20 61 20 72 65 61 6c 20 64 69 72  to be a real dir
9380: 65 63 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74  ectory (i.e. not
9390: 20 65 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20   embedded..     
93a0: 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68 69     #       withi
93b0: 6e 20 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65  n a file); there
93c0: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
93d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
93e0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f    return $::tcl_
93f0: 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d  library..      }
9400: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9410: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9420: 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20  TE: Fallback to 
9430: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
9440: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65  ntaining the exe
9450: 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  cutable...      
9460: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
9470: 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79  urn [info binary
9480: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
9490: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
94a0: 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74  etDatabaseDirect
94b0: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
94c0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
94d0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
94e0: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
94f0: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
9500: 74 65 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a  test databases..
9510: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
9520: 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e  ould be located.
9530: 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68    By default, th
9540: 69 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65  is just uses the
9550: 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20   temporary..    
9560: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
9570: 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66  ory configured f
9580: 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d  or this system..
9590: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
95a0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
95b0: 20 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65   ::database_dire
95c0: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
95d0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
95e0: 65 6e 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73  ength $::databas
95f0: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  e_directory] > 0
9600: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9610: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9620: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
9630: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
9640: 65 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  e directory has 
9650: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
9660: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9670: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
9680: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
9690: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
96a0: 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65  $::database_dire
96b0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
96c0: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
96d0: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
96e0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
96f0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
9700: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
9710: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
9720: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9730: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
9740: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
9750: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
9760: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
9770: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
9780: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9790: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
97a0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
97b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
97c0: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
97d0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
97e0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
97f0: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
9800: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
9810: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9820: 70 72 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72  proc getTemporar
9830: 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  yDirectory {} {.
9840: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9850: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
9860: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
9870: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
9880: 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
9890: 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20   files..      # 
98a0: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
98b0: 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66  located.  By def
98c0: 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20  ault, this just 
98d0: 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61  uses the tempora
98e0: 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ry..      #     
98f0: 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66    directory conf
9900: 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20  igured for this 
9910: 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23  system...      #
9920: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9930: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f  o exists ::tempo
9940: 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  rary_directory] 
9950: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
9960: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
9970: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
9980: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
9990: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
99a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
99b0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
99c0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
99d0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
99e0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
99f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
9a00: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
9a10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9a20: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
9a30: 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
9a40: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
9a50: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
9a60: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
9a70: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
9a80: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
9a90: 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  gth $::scratch_d
9aa0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
9ab0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
9ac0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9ad0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
9ae0: 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69  f the scratch di
9af0: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
9b00: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
9b10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
9b20: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
9b30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9b40: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73       return $::s
9b50: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
9b60: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
9b70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9b80: 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61   [getTemporaryPa
9b90: 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  th]..      }..  
9ba0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9bb0: 20 67 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74   getExecuteOnSet
9bc0: 75 70 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69  up {} {..      i
9bd0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
9be0: 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74  ::execute_on_set
9bf0: 75 70 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  up] && \..      
9c00: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
9c10: 74 68 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e  th $::execute_on
9c20: 5f 73 65 74 75 70 5d 20 3e 20 30 7d 20 74 68 65  _setup] > 0} the
9c30: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
9c40: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9c50: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 66 69  Return the confi
9c60: 67 75 72 65 64 20 53 51 4c 20 74 6f 20 65 78 65  gured SQL to exe
9c70: 63 75 74 65 20 64 75 72 69 6e 67 20 74 68 65 20  cute during the 
9c80: 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
9c90: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75      #       setu
9ca0: 70 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65  p procedure (i.e
9cb0: 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65 73 74  . for every test
9cc0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9cd0: 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20  tion)...        
9ce0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9cf0: 6e 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f  n $::execute_on_
9d00: 73 65 74 75 70 0d 0a 20 20 20 20 20 20 7d 20 65  setup..      } e
9d10: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
9d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9d30: 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68  : By default, th
9d40: 65 72 65 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f  ere is no SQL to
9d50: 20 65 78 65 63 75 74 65 20 64 75 72 69 6e 67 20   execute during 
9d60: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
9d70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9d80: 73 65 74 75 70 20 70 72 6f 63 65 64 75 72 65 20  setup procedure 
9d90: 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20  (i.e. for every 
9da0: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  test database co
9db0: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
9dc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
9dd0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
9de0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
9df0: 20 70 72 6f 63 20 67 65 74 53 74 72 69 6e 67 4d   proc getStringM
9e00: 61 70 46 6f 72 54 63 6c 45 73 63 61 70 65 20 7b  apForTclEscape {
9e10: 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72  } {..      retur
9e20: 6e 20 5b 6c 69 73 74 20 5c 5c 20 5c 5c 5c 5c 20  n [list \\ \\\\ 
9e30: 5c 5b 20 5c 5c 5c 5b 20 5c 5d 20 5c 5c 5c 5d 20  \[ \\\[ \] \\\] 
9e40: 5c 24 20 5c 5c 5c 24 5d 0d 0a 20 20 20 20 7d 0d  \$ \\\$]..    }.
9e50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
9e60: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
9e70: 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61  amble { {extraVa
9e80: 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a  rNames ""} } {..
9e90: 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
9ea0: 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
9eb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9ec0: 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
9ed0: 2c 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65  , start with the
9ee0: 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20   master list of 
9ef0: 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20  test override.. 
9f00: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
9f10: 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23  iables...      #
9f20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
9f30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
9f40: 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d  overrides] && \.
9f50: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
9f60: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  gth $::test_over
9f70: 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  rides] > 0} then
9f80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
9f90: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
9fa0: 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  s $::test_overri
9fb0: 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  des..      }....
9fc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9fd0: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
9fe0: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
9ff0: 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74  r, add any addit
a000: 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a  ional variable..
a010: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
a020: 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e  mes to copy now.
a030: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a040: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65   if {[llength $e
a050: 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20  xtraVarNames] > 
a060: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
a070: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
a080: 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56  varNames $extraV
a090: 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  arNames..      }
a0a0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
a0b0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
a0c0: 20 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67   the script frag
a0d0: 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72  ment to be retur
a0e0: 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e  ned by processin
a0f0: 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20  g each..      # 
a100: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
a110: 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74  ame and adding t
a120: 68 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73  he nececessary s
a130: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20  cript fragments 
a140: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
a150: 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20     each one...  
a160: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
a170: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
a180: 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e      foreach varN
a190: 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d  ame $varNames {.
a1a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a1b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
a1c0: 64 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20  d the qualified 
a1d0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
a1e0: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
a1f0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75  ..        set fu
a200: 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e  llVarName [appen
a210: 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d  dArgs :: $varNam
a220: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
a230: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
a240: 20 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62   Does the variab
a250: 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73  le exist in this
a260: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
a270: 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23  text?..        #
a280: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
a290: 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c  nfo exists $full
a2a0: 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  VarName]} then {
a2b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
a2c0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a2d0: 20 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74   Append a script
a2e0: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65   fragment to the
a2f0: 20 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c   result that wil
a300: 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20  l correctly..   
a310: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
a320: 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65  opy any containe
a330: 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68  d value to anoth
a340: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  er interpreter c
a350: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20  ontext...       
a360: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a370: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
a380: 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72   "set " $fullVar
a390: 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 74 72 69  Name " \{" [stri
a3a0: 6e 67 20 6d 61 70 20 5c 0d 0a 20 20 20 20 20 20  ng map \..      
a3b0: 20 20 20 20 20 20 20 20 5b 67 65 74 53 74 72 69          [getStri
a3c0: 6e 67 4d 61 70 46 6f 72 54 63 6c 45 73 63 61 70  ngMapForTclEscap
a3d0: 65 5d 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72  e] [set $fullVar
a3e0: 4e 61 6d 65 5d 5d 20 5c 7d 0d 0a 20 20 20 20 20  Name]] \}..     
a3f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
a400: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a410: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72  # NOTE: If the r
a420: 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f  esult contains o
a430: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70  ne or more scrip
a440: 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70  t fragments, app
a450: 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20  end a..      #  
a460: 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20       newline... 
a470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a480: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
a490: 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74   $result] > 0} t
a4a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
a4b0: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d  ppend result \n.
a4c0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a4d0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
a4e0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
a4f0: 70 72 6f 63 20 6d 6f 76 65 53 79 73 74 65 6d 44  proc moveSystemD
a500: 61 74 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66  ataSQLiteDllConf
a510: 69 67 20 7b 20 7b 72 65 73 74 6f 72 65 20 66 61  ig { {restore fa
a520: 6c 73 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72  lse} {verbose tr
a530: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ue} } {..      s
a540: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
a550: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
a560: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
a570: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
a580: 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20  irectory] == 0} 
a590: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a5a0: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
a5b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a5c0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
a5d0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a5e0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a5f0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
a600: 20 6d 6f 76 69 6e 67 20 5c 22 53 79 73 74 65 6d   moving \"System
a610: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
a620: 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a  .config\", " \..
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
a640: 6f 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f  o binary directo
a650: 72 79 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ry\n"]..        
a660: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
a670: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
a680: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
a690: 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e 6f 72 6d  me(1) [file norm
a6a0: 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20  alize \..       
a6b0: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64     [file join $d
a6c0: 69 72 65 63 74 6f 72 79 20 53 79 73 74 65 6d 2e  irectory System.
a6d0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e  Data.SQLite.dll.
a6e0: 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20  config]]....    
a6f0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32    set fileName(2
a700: 29 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66  ) [appendArgs $f
a710: 69 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65  ileName(1) .move
a720: 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  d]....      if {
a730: 24 72 65 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b  $restore} then {
a740: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
a750: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
a760: 4e 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b  Name(2)]} then {
a770: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ..          file
a780: 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d   rename $fileNam
a790: 65 28 32 29 20 24 66 69 6c 65 4e 61 6d 65 28 31  e(2) $fileName(1
a7a0: 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  )....          i
a7b0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
a7c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
a7d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
a7e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
a7f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a800: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65        "---- move
a810: 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28  d \"" $fileName(
a820: 32 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  2) "\" to \"" \.
a830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a840: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22   $fileName(1) \"
a850: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
a860: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
a870: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
a880: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
a890: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a8a0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
a8b0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a8c0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a8d0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
a8e0: 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66  ed moving \"" $f
a8f0: 69 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20  ileName(2) \..  
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
a910: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
a920: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
a930: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
a940: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
a950: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66  ..        if {[f
a960: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
a970: 4e 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b  Name(1)]} then {
a980: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ..          file
a990: 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d   rename $fileNam
a9a0: 65 28 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32  e(1) $fileName(2
a9b0: 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  )....          i
a9c0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
a9d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
a9e0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
a9f0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
aa00: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
aa10: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65        "---- move
aa20: 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28  d \"" $fileName(
aa30: 31 29 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  1) "\" to \"" \.
aa40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa50: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22   $fileName(2) \"
aa60: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
aa70: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
aa80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
aa90: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
aaa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
aab0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
aac0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
aad0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
aae0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
aaf0: 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66  ed moving \"" $f
ab00: 69 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20  ileName(1) \..  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
ab20: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
ab30: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
ab40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
ab50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
ab60: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 77 72  .....    proc wr
ab70: 69 74 65 53 79 73 74 65 6d 44 61 74 61 53 51 4c  iteSystemDataSQL
ab80: 69 74 65 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 64  iteDllConfig { d
ab90: 61 74 61 20 7b 76 65 72 62 6f 73 65 20 74 72 75  ata {verbose tru
aba0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
abb0: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
abc0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
abd0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
abe0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69  tring length $di
abf0: 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74  rectory] == 0} t
ac00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
ac10: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
ac20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
ac30: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
ac40: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ac50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ac60: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
ac70: 6d 6f 76 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e  moving \"System.
ac80: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e  Data.SQLite.dll.
ac90: 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20  config\", " \.. 
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f               "no
acb0: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
acc0: 79 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y\n"]..        }
acd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
ace0: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
acf0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
ad00: 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a  e [file normaliz
ad10: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  e \..          [
ad20: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
ad30: 74 6f 72 79 20 53 79 73 74 65 6d 2e 44 61 74 61  tory System.Data
ad40: 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66  .SQLite.dll.conf
ad50: 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 77 72  ig]]....      wr
ad60: 69 74 65 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  iteFile $fileNam
ad70: 65 20 24 64 61 74 61 0d 0a 0d 0a 20 20 20 20 20  e $data....     
ad80: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
ad90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
ada0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
adb0: 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
adc0: 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f 74 65 20      "---- wrote 
add0: 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
ade0: 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c  Lite.dll.config\
adf0: 22 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  "\n"..      }...
ae00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66  .      return $f
ae10: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a  ileName..    }..
ae20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65  ...    proc move
ae30: 45 61 67 6c 65 53 68 65 6c 6c 4d 64 61 43 6f 6e  EagleShellMdaCon
ae40: 66 69 67 20 7b 20 7b 72 65 73 74 6f 72 65 20 66  fig { {restore f
ae50: 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73 65 20 74  alse} {verbose t
ae60: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
ae70: 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67  set directory [g
ae80: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
ae90: 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  y]....      if {
aea0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
aeb0: 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d  directory] == 0}
aec0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
aed0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
aee0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
aef0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
af00: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
af10: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
af20: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
af30: 64 20 6d 6f 76 69 6e 67 20 5c 22 45 61 67 6c 65  d moving \"Eagle
af40: 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
af50: 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20  nfig\", " \..   
af60: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62             "no b
af70: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c  inary directory\
af80: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
af90: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
afa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
afb0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28     set fileName(
afc0: 31 29 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69  1) [file normali
afd0: 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ze \..          
afe0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
aff0: 63 74 6f 72 79 20 45 61 67 6c 65 53 68 65 6c 6c  ctory EagleShell
b000: 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d  .exe.mda.config]
b010: 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66  ]....      set f
b020: 69 6c 65 4e 61 6d 65 28 32 29 20 5b 61 70 70 65  ileName(2) [appe
b030: 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61 6d 65  ndArgs $fileName
b040: 28 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20  (1) .moved].... 
b050: 20 20 20 20 20 69 66 20 7b 24 72 65 73 74 6f 72       if {$restor
b060: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
b070: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
b080: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  sts $fileName(2)
b090: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b0a0: 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65       file rename
b0b0: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 24 66   $fileName(2) $f
b0c0: 69 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20  ileName(1)....  
b0d0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
b0e0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
b0f0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b100: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
b110: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b130: 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24  ---- moved \"" $
b140: 66 69 6c 65 4e 61 6d 65 28 32 29 20 22 5c 22 20  fileName(2) "\" 
b150: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
b160: 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
b170: 61 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20  ame(1) \"\n]..  
b180: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b190: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b1a0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b1b0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b1c0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b1d0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b1e0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b200: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69  --- skipped movi
b210: 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  ng \"" $fileName
b220: 28 32 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  (2) \..         
b230: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
b240: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
b250: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
b260: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b270: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b280: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
b290: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  sts $fileName(1)
b2a0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b2b0: 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65       file rename
b2c0: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 24 66   $fileName(1) $f
b2d0: 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20  ileName(2)....  
b2e0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
b2f0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
b300: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b310: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
b320: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b340: 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24  ---- moved \"" $
b350: 66 69 6c 65 4e 61 6d 65 28 31 29 20 22 5c 22 20  fileName(1) "\" 
b360: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
b370: 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
b380: 61 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20  ame(2) \"\n]..  
b390: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b3a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
b3b0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b3c0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b3d0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
b3e0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
b3f0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
b410: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69  --- skipped movi
b420: 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  ng \"" $fileName
b430: 28 31 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  (1) \..         
b440: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
b450: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
b460: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
b470: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b480: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
b490: 20 20 70 72 6f 63 20 77 72 69 74 65 45 61 67 6c    proc writeEagl
b4a0: 65 53 68 65 6c 6c 4d 64 61 43 6f 6e 66 69 67 20  eShellMdaConfig 
b4b0: 7b 20 64 61 74 61 20 7b 76 65 72 62 6f 73 65 20  { data {verbose 
b4c0: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
b4d0: 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
b4e0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
b4f0: 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ry]....      if 
b500: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b510: 24 64 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30  $directory] == 0
b520: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b530: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
b540: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b550: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
b560: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
b570: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
b580: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
b590: 65 64 20 6d 6f 76 69 6e 67 20 5c 22 45 61 67 6c  ed moving \"Eagl
b5a0: 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
b5b0: 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20  onfig\", " \..  
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20              "no 
b5d0: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
b5e0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
b5f0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
b600: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
b610: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
b620: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
b630: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
b640: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
b650: 6f 72 79 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65  ory EagleShell.e
b660: 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d  xe.mda.config]].
b670: 0a 0d 0a 20 20 20 20 20 20 77 72 69 74 65 46 69  ...      writeFi
b680: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 64 61  le $fileName $da
b690: 74 61 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ta....      if {
b6a0: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
b6b0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
b6c0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
b6d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b6e0: 2d 2d 2d 2d 20 77 72 6f 74 65 20 5c 22 45 61 67  ---- wrote \"Eag
b6f0: 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e  leShell.exe.mda.
b700: 63 6f 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20 20 20  config\"\n"..   
b710: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
b720: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
b730: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b740: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
b750: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
b760: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
b770: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
b780: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
b790: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
b7a0: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
b7b0: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
b7c0: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
b7d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
b7e0: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
b7f0: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
b800: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
b810: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
b820: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
b830: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
b840: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
b850: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
b860: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
b870: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
b880: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
b890: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
b8a0: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
b8b0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
b8c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
b8d0: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
b8e0: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
b8f0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
b900: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
b910: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b920: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
b930: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
b940: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
b950: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
b960: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
b970: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
b980: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
b990: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
b9a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
b9b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
b9c0: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
b9d0: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
b9e0: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
b9f0: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
ba00: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
ba10: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
ba20: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
ba30: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
ba40: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
ba50: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
ba60: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
ba70: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
ba80: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
ba90: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
baa0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
bab0: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
bac0: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
bad0: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
bae0: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
baf0: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
bb00: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
bb10: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
bb20: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
bb30: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
bb40: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
bb50: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
bb60: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
bb70: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
bb80: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
bb90: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
bba0: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
bbb0: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
bbc0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
bbd0: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
bbe0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
bbf0: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
bc00: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
bc10: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
bc20: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
bc30: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
bc40: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
bc50: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
bc60: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
bc70: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
bc80: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
bc90: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
bca0: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
bcb0: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
bcc0: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
bcd0: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
bce0: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
bcf0: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
bd00: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
bd10: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
bd20: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
bd30: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
bd40: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
bd50: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
bd60: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
bd70: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
bd80: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
bd90: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
bda0: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
bdb0: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
bdc0: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
bdd0: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
bde0: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
bdf0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
be00: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
be10: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
be20: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
be30: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
be40: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
be50: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
be60: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
be70: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
be80: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
be90: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
bea0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
beb0: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
bec0: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
bed0: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
bee0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
bef0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
bf00: 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61  \[object\] comma
bf10: 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  nd may be missin
bf20: 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20  g in some Eagle 
bf30: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
bf40: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f        library co
bf50: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43  nfigurations.  C
bf60: 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67  loning and using
bf70: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a   the procedure..
bf80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
bf90: 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  \[changeNativeRu
bfa0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61  ntimeOption\] ma
bfb0: 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61  y help to mitiga
bfc0: 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20  te this...      
bfd0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f    #..        pro
bfe0: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
bff0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20  ntimeOption \.. 
c000: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
c010: 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74  o args changeNat
c020: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
c030: 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
c040: 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68    {[info body ch
c050: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
c060: 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20  eOption]}....   
c070: 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
c080: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61          changeNa
c090: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
c0a0: 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  n [hasRuntimeOpt
c0b0: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20  ion native]..   
c0c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
c0d0: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
c0e0: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
c0f0: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
c100: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
c110: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
c120: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
c130: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
c140: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
c150: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
c160: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
c170: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
c180: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
c190: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45  ceFileName [getE
c1a0: 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20  xternalFileName 
c1b0: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
c1c0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
c1d0: 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c  xists $sourceFil
c1e0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
c1f0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
c200: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
c210: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
c220: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
c230: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c240: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c250: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
c260: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c   external file \
c270: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
c280: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
c290: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
c2a0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
c2b0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c2c0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
c2d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
c2e0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
c2f0: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e   $newFileName] >
c300: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c310: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
c320: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
c330: 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69  yFileName $newFi
c340: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
c350: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
c360: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
c370: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
c380: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
c390: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
c3a0: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  form]..      }..
c3b0: 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67  ..      set targ
c3c0: 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  etDirectory [fil
c3d0: 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65  e dirname $targe
c3e0: 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  tFileName]....  
c3f0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
c400: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
c410: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72  file exists $tar
c420: 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74  getDirectory]} t
c430: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
c440: 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72   file mkdir $tar
c450: 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20  getDirectory..  
c460: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
c470: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
c480: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
c490: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
c4a0: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ame..      }] ==
c4b0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c4c0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c4d0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c4e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c4f0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
c500: 64 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  d external file 
c510: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
c520: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
c530: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
c540: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
c550: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
c560: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c570: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c580: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c590: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c5a0: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
c5b0: 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c  to copy external
c5c0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
c5d0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
c5e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
c5f0: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
c600: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
c610: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
c620: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
c630: 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d  opyBinaryFile {.
c640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
c650: 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c  eName managedOnl
c660: 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  y {platform ""} 
c670: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
c680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 76  ..            {v
c690: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
c6a0: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
c6b0: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  ceFileName [getB
c6c0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
c6d0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
c6e0: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
c6f0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73  ![file exists $s
c700: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20  ourceFileName]} 
c710: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c720: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
c730: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c740: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
c750: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c760: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
c770: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
c780: 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20   copying binary 
c790: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
c7a0: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
c7b0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
c7c0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
c7d0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
c7e0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
c7f0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
c800: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
c810: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
c820: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
c830: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
c840: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
c850: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c  tBuildFileName \
c860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 6e  ..            $n
c870: 65 77 46 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  ewFileName $mana
c880: 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72  gedOnly $platfor
c890: 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  m]..      } else
c8a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
c8b0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
c8c0: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
c8d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c8e0: 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67  $fileName $manag
c8f0: 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d  edOnly $platform
c900: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
c910: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69      set targetDi
c920: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
c930: 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  rname $targetFil
c940: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
c950: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
c960: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
c970: 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44   exists $targetD
c980: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
c990: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
c9a0: 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44  e mkdir $targetD
c9b0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
c9c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66    }....        f
c9d0: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
c9e0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
c9f0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d  $targetFileName.
ca00: 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
ca10: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ca20: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ca30: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ca40: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ca50: 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69   "---- copied bi
ca60: 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c  nary file from \
ca70: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
ca80: 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  me "\" to \"" \.
ca90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61  .            $ta
caa0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
cab0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
cac0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
cad0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
cae0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
caf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
cb00: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70  -- failed to cop
cb10: 79 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72  y binary file fr
cb20: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
cb30: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
cb40: 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22        "\" to \""
cb50: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
cb60: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
cb70: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
cb80: 72 6f 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64  roc tryCopyBuild
cb90: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
cba0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e      fileName man
cbb0: 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f  agedOnly {platfo
cbc0: 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e  rm ""} {newFileN
cbd0: 61 6d 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20  ame ""}..       
cbe0: 20 20 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72       {verbose tr
cbf0: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ue} } {..      s
cc00: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
cc10: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
cc20: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d  ame $fileName $m
cc30: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74  anagedOnly $plat
cc40: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
cc50: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
cc60: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
cc70: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
cc80: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
cc90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cca0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
ccb0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
ccc0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ccd0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
cce0: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c  ped copying buil
ccf0: 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  d file \"" $sour
cd00: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
cd20: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
cd30: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
cd40: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
cd50: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
cd60: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
cd70: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
cd80: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
cd90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
cda0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
cdb0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
cdc0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
cdd0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
cde0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
cdf0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
ce00: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
ce10: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
ce20: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
ce30: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ce40: 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74  set targetDirect
ce50: 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
ce60: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
ce70: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
ce80: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
ce90: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
cea0: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
ceb0: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
cec0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b           file mk
ced0: 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63  dir $targetDirec
cee0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tory..        }.
cef0: 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  ...        file 
cf00: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
cf10: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
cf20: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
cf30: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
cf40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
cf50: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
cf60: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
cf70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
cf80: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
cf90: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
cfa0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
cfb0: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
cfc0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
cfd0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
cfe0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
cff0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d000: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
d010: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d020: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
d030: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
d040: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
d050: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
d060: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d070: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
d080: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
d090: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
d0a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
d0b0: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
d0c0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
d0d0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
d0e0: 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ose true} } {.. 
d0f0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
d100: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
d110: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
d120: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
d130: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
d140: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
d150: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d160: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
d170: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
d180: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
d190: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
d1a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d1b0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
d1c0: 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72  d deleting binar
d1d0: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
d1e0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
d1f0: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
d200: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
d210: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d220: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
d230: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d240: 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65  if {[catch {file
d250: 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
d260: 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  e}] == 0} then {
d270: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
d280: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
d290: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d2a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d2b0: 20 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20   deleted binary 
d2c0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
d2d0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
d2e0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
d2f0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
d300: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
d310: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d320: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
d330: 74 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79  to delete binary
d340: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
d350: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
d360: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
d370: 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65    proc tryDelete
d380: 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20  BuildFile {..   
d390: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
d3a0: 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70  e managedOnly {p
d3b0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72  latform ""} {ver
d3c0: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
d3d0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
d3e0: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
d3f0: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
d400: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61  managedOnly $pla
d410: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
d420: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
d430: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
d440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
d450: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
d460: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
d470: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
d480: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
d490: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d4a0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64   "---- skipped d
d4b0: 65 6c 65 74 69 6e 67 20 62 75 69 6c 64 20 66 69  eleting build fi
d4c0: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
d4d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d4e0: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
d4f0: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
d500: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d510: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
d520: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
d530: 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
d540: 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20  ete $fileName}] 
d550: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
d560: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
d570: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
d580: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d590: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c         "---- del
d5a0: 65 74 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20  eted build file 
d5b0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
d5c0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
d5d0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
d5e0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d5f0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
d610: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65  --- failed to de
d620: 6c 65 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20  lete build file 
d630: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
d640: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
d650: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
d660: 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
d670: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d680: 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64  fileName managed
d690: 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Only {platform "
d6a0: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76  "} {pdb true} {v
d6b0: 65 72 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b  erbose true} } {
d6c0: 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42  ..      tryCopyB
d6d0: 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
d6e0: 6d 65 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  me $managedOnly 
d6f0: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
d700: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
d710: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
d720: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
d730: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
d740: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d750: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
d760: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
d770: 70 64 62 5d 20 24 6d 61 6e 61 67 65 64 4f 6e 6c  pdb] $managedOnl
d780: 79 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24  y $platform "" $
d790: 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d  verbose..      }
d7a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d7b0: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73  proc tryDeleteAs
d7c0: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
d7d0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
d7e0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64  platform ""} {pd
d7f0: 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65  b true} {verbose
d800: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
d810: 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
d820: 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  yFile $fileName 
d830: 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f  $platform $verbo
d840: 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  se....      if {
d850: 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $pdb} then {..  
d860: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
d870: 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e  inaryFile [appen
d880: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d890: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
d8a0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
d8b0: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24  pdb] $platform $
d8c0: 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d  verbose..      }
d8d0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d8e0: 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65  proc tryLoadAsse
d8f0: 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20  mbly { fileName 
d900: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20  {platform ""} } 
d910: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
d920: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
d930: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
d940: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
d950: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
d960: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  h {..        set
d970: 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63   assembly [objec
d980: 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65  t load -loadtype
d990: 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69   File -alias $fi
d9a0: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  leName]..      }
d9b0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
d9c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d9d0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
d9e0: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
d9f0: 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  y test constrain
da00: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
da10: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
da20: 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  aint [file rootn
da30: 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
da40: 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20  fileName]]....  
da50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
da60: 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
da70: 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20  e image runtime 
da80: 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  version from the
da90: 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73   assembly becaus
daa0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
dab0: 20 20 20 73 65 76 65 72 61 6c 20 74 65 73 74 73     several tests
dac0: 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69   rely on it havi
dad0: 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c  ng a certain val
dae0: 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ue...        #..
daf0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
db00: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
db10: 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  s [file tail $fi
db20: 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20  leName] _ \..   
db30: 20 20 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d           [$assem
db40: 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65  bly ImageRuntime
db50: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  Version]]....   
db60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
db70: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
db80: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20  he full path of 
db90: 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e  the loaded file.
dba0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
dbb0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
dbc0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
dbd0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
dbe0: 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
dbf0: 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65   proc isSQLiteRe
dc00: 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ady {} {..      
dc10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
dc20: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
dc30: 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  must return non-
dc40: 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65  zero only if the
dc50: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a   SQLite native..
dc60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
dc70: 62 72 61 72 79 20 61 6e 64 20 74 68 65 20 53 79  brary and the Sy
dc80: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
dc90: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
dca0: 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20  y are loaded..  
dcb0: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
dcc0: 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
dcd0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
dce0: 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69    Currently, thi
dcf0: 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20  s procedure..   
dd00: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
dd10: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79  d be called only
dd20: 20 61 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c   after the [tryL
dd30: 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f  oadAssembly] pro
dd40: 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20  cedure has..    
dd50: 20 20 23 20 20 20 20 20 20 20 62 65 65 6e 20 63    #       been c
dd60: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66  alled to probe f
dd70: 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  or the System.Da
dd80: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
dd90: 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  d assembly..    
dda0: 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68    #       and th
ddb0: 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  e [checkForSQLit
ddc0: 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  e] procedure has
ddd0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
dde0: 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20  probe for..     
ddf0: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
de00: 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ite native libra
de10: 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  ry; otherwise, t
de20: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 69  his procedure wi
de30: 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20  ll simply..     
de40: 20 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20   #       always 
de50: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20  return zero...  
de60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
de70: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
de80: 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
de90: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
dea0: 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76  .SQLite] && [hav
deb0: 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69  eConstraint SQLi
dec0: 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20  te]..      }].. 
ded0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
dee0: 63 20 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20  c matchPlatform 
def0: 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a  { platform } {..
df00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
df10: 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20   NOTE: An empty 
df20: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70  string for the p
df30: 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68  latform means th
df40: 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73 20  at the build is 
df50: 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  not..      #    
df60: 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61     [primarily] a
df70: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74   native build; t
df80: 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77  herefore, it alw
df90: 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20  ays matches...  
dfa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
dfb0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
dfc0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
dfd0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
dfe0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
dff0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e000: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e010: 49 66 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e  If the machine n
e020: 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ame is unavailab
e030: 6c 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74  le, there is not
e040: 68 69 67 6e 20 65 6c 73 65 20 77 65 0d 0a 20 20  hign else we..  
e050: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 20      #       can 
e060: 64 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  do...      #..  
e070: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
e080: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
e090: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
e0a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e0b0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
e0c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e0d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e0e0: 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66 69  Does the specifi
e0f0: 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63  ed platform matc
e100: 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72 72  h up to the curr
e110: 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20  ent process?..  
e120: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
e130: 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d  {$platform eq [m
e140: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
e150: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
e160: 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e  (machine)]} then
e170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
e180: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
e190: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
e1a0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73     # NOTE: The s
e1b0: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
e1c0: 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
e1d0: 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c 61   up with the pla
e1e0: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20  tform..      #  
e1f0: 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75 72       for the cur
e200: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20  rent process... 
e210: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
e220: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
e230: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68  }.....    proc h
e240: 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
e250: 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20  ommand {} {..   
e260: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e270: 54 45 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a 65  TE: Is the [obje
e280: 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72  ct] command curr
e290: 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f  ently available?
e2a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e2b0: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b   return [expr {[
e2c0: 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f  llength [info co
e2d0: 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20  mmands object]] 
e2e0: 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  > 0}]..    }....
e2f0: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
e300: 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  orSQLiteObjectCo
e310: 6d 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20  mmand { channel 
e320: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
e330: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
e340: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f  checking for \"o
e350: 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20  bject\" command 
e360: 75 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  usage... "....  
e370: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
e380: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
e390: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d  eObjectCommand)]
e3a0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
e3b0: 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65   [haveSQLiteObje
e3c0: 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
e3d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
e3e0: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
e3f0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
e400: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e410: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c       # NOTE: Unl
e420: 65 73 73 20 77 65 20 61 72 65 20 66 6f 72 62 69  ess we are forbi
e430: 64 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20  dden from doing 
e440: 73 6f 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e  so, add some con
e450: 73 74 72 61 69 6e 74 73 0d 0a 20 20 20 20 20 20  straints..      
e460: 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20 77    #       that w
e470: 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f  ill allow most o
e480: 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
e490: 20 74 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74 68   to run (i.e. th
e4a0: 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ose..        #  
e4b0: 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20       tests that 
e4c0: 64 6f 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 20  do not directly 
e4d0: 72 65 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f  rely upon the [o
e4e0: 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e  bject] command).
e4f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e500: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
e510: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d  exists ::no(shim
e520: 53 51 4c 69 74 65 41 73 73 65 6d 62 6c 79 43 6f  SQLiteAssemblyCo
e530: 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65  nstraints)]} the
e540: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61  n {..          a
e550: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
e560: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ite..          a
e570: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
e580: 69 74 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20  iteInterop..    
e590: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
e5a0: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
e5b0: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
e5c0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e5d0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e5e0: 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20  te.Encryption.. 
e5f0: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
e600: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
e610: 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a  ta.SQLite.Linq..
e620: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
e630: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
e640: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e650: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
e660: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20  ta.SQLite.dll_v 
e670: 5b 67 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73  [getBuildClrVers
e680: 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ion]]..        }
e690: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
e6a0: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
e6b0: 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 44 65 66  no(shimSQLiteDef
e6c0: 69 6e 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74  ineConstantConst
e6d0: 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
e6e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
e6f0: 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61  ach defineConsta
e700: 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  nt [list \..    
e710: 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
e720: 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43  P_EXTENSION_FUNC
e730: 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54  TIONS INTEROP_FT
e740: 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  S5_EXTENSION \..
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
e760: 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45  TEROP_JSON1_EXTE
e770: 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 50 45  NSION INTEROP_PE
e780: 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49  RCENTILE_EXTENSI
e790: 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
e7a0: 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45      INTEROP_REGE
e7b0: 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  XP_EXTENSION INT
e7c0: 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53  EROP_TEST_EXTENS
e7d0: 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
e7e0: 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53 45 53       INTEROP_SES
e7f0: 53 49 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e 20 49  SION_EXTENSION I
e800: 4e 54 45 52 4f 50 5f 53 48 41 31 5f 45 58 54 45  NTEROP_SHA1_EXTE
e810: 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
e820: 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54         INTEROP_T
e830: 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20  OTYPE_EXTENSION 
e840: 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f  INTEROP_VIRTUAL_
e850: 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20  TABLE \..       
e860: 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52         USE_INTER
e870: 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20  OP_DLL] {..     
e880: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
e890: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
e8a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e8b0: 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 44 65      [getSQLiteDe
e8c0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66  fineConstantPref
e8d0: 69 78 5d 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  ix] $defineConst
e8e0: 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ant]..          
e8f0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
e900: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
e910: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
e920: 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61 6c 53  himSQLiteVisualS
e930: 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e 74 73  tudioConstraints
e940: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
e950: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
e960: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
e970: 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b 67 65  visualStudio [ge
e980: 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a 20 20  tBuildYear]]..  
e990: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e9a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e9b0: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  l no\n..      }.
e9c0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
e9d0: 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65  roc changeNative
e9e0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20  RuntimeOption { 
e9f0: 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20  native } {..    
ea00: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b    if {[llength [
ea10: 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65  info commands de
ea20: 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  bug]] > 0 && \..
ea30: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
ea40: 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f 6d 6d  th [info subcomm
ea50: 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e 74 69  ands debug runti
ea60: 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30 20 26  meoption]] > 0 &
ea70: 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  & [catch {..    
ea80: 20 20 20 20 64 65 62 75 67 20 72 75 6e 74 69 6d      debug runtim
ea90: 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24  eoption [expr {$
eaa0: 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a  native ? "add" :
eab0: 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61 74 69   "remove"}] nati
eac0: 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  ve..      }] == 
ead0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
eae0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
eaf0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
eb00: 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
eb10: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26  ObjectCommand] &
eb20: 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  & [catch {..    
eb30: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
eb40: 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
eb50: 74 41 63 74 69 76 65 20 5b 65 78 70 72 20 7b 24  tActive [expr {$
eb60: 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20  native ? \..    
eb70: 20 20 20 20 20 20 20 20 22 41 64 64 52 75 6e 74          "AddRunt
eb80: 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65  imeOption" : "Re
eb90: 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  moveRuntimeOptio
eba0: 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20  n"}] native..   
ebb0: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
ebc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
ebd0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
ebe0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
ebf0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
ec00: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
ec10: 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
ec20: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
ec30: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
ec40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ec50: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65  OTE: Check for e
ec60: 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61  very possible va
ec70: 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lid combination 
ec80: 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 77  of values used w
ec90: 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hen..      #    
eca0: 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20     locating out 
ecb0: 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74  the build output
ecc0: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77   directory, show
ecd0: 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61 62  ing each availab
ece0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
ecf0: 20 20 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f    build variatio
ed00: 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  n along the way.
ed10: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ed20: 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20   foreach native 
ed30: 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75 65  [list false true
ed40: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  ] {..        for
ed50: 65 61 63 68 20 79 65 61 72 20 5b 67 65 74 42 75  each year [getBu
ed60: 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20  ildYears] {..   
ed70: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63         foreach c
ed80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
ed90: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
eda0: 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
edb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
edc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
edd0: 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
ede0: 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74 66  tive build platf
edf0: 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a 20  orm.  This is.. 
ee00: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
ee10: 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74     based on whet
ee20: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72  her or not a [pr
ee30: 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20  imarily] native 
ee40: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
ee50: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62 65     #       is be
ee60: 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b  ing used.  For [
ee70: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e  primarily] non-n
ee80: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20  ative builds,.. 
ee90: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
eea0: 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20     this will be 
eeb0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
eec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
eed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
eee0: 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
eef0: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
ef00: 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ive]....        
ef10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ef20: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ef30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ef40: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
ef50: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
ef60: 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22  .SQLite build \"
ef70: 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20  " [expr \..     
ef80: 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74             {$nat
ef90: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
efa0: 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73  : ""}] [expr {[s
efb0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a  tring length \..
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
efe0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c   [appendArgs $pl
eff0: 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d  atform /] : ""}]
f000: 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20   $year \..      
f010: 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e            / $con
f020: 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e  figuration "\"..
f030: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
f040: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f050: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
f060: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
f070: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
f080: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
f090: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
f0a0: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
f0b0: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
f0c0: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
f0d0: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
f0e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f0f0: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
f100: 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  tory [joinBuildD
f110: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
f120: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f130: 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61 73      [getBuildBas
f140: 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65 61  eDirectory] $yea
f150: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
f160: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20  figuration].... 
f170: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
f180: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
f190: 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73 61  : Do the necessa
f1a0: 72 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f 20  ry files exist? 
f1b0: 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f   Currently, no o
f1c0: 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20 20  ther steps..    
f1d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f1e0: 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72  are taken to ver
f1f0: 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69  ify this build i
f200: 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c  s actually viabl
f210: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
f220: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
f230: 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  f {[isBuildAvail
f240: 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69  able $native $di
f250: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
f260: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f270: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
f280: 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e   # NOTE: When in
f290: 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20   "select" mode, 
f2a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
f2b0: 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a  lect the first..
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
f2d0: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
f2e0: 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e  build of System.
f2f0: 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20  Data.SQLite and 
f300: 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20  then return..   
f310: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
f320: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d     immediately..
f330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
f340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f350: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
f360: 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70  matchPlatform $p
f370: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
f380: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f390: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
f3a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e       # NOTE: Man
f3b0: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61  ually override a
f3c0: 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  ll the build dir
f3d0: 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e  ectory selection
f3e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f3f0: 20 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65    #       relate
f400: 64 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  d test settings 
f410: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63  in order to forc
f420: 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20  e this build..  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
f440: 20 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e        of System.
f450: 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62  Data.SQLite to b
f460: 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20  e used...       
f470: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f480: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
f490: 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  ![changeNativeRu
f4a0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e 61 74  ntimeOption $nat
f4b0: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
f4e0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65 64 20      "no, failed 
f510: 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  to " [expr {$nat
f520: 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72  ive ? "add" : "r
f530: 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20 20 20  emove"}] \..    
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76 65    " the \"native
f560: 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  \" runtime optio
f570: 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  n\n"]....       
f580: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
f590: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  n false..       
f5a0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
f5c0: 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79  t ::test_year $y
f5d0: 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ear..           
f5e0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
f5f0: 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  platform $platfo
f600: 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
f610: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
f620: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63 6f  onfiguration $co
f630: 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20  nfiguration.... 
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
f650: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
f660: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
f690: 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  (" [expr {$nativ
f6a0: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
f6b0: 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ""}] \..        
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
f6d0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
f6e0: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
f6f0: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c   ? [appendArgs \
f700: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f710: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
f720: 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20  /] : ""}] $year 
f730: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
f740: 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
f750: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
f760: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
f770: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
f7a0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  es\n..          
f7b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
f7c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f7d0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
f7e0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
f800: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f810: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
f820: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
f830: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
f840: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
f850: 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
f860: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
f870: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
f880: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
f890: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 70  OTE: Check for p
f8a0: 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66 20  ast releases of 
f8b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
f8c0: 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63 74  te in the direct
f8d0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
f8e0: 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20     contained in 
f8f0: 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61  the "System.Data
f900: 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e  .SQLite" environ
f910: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 69  ment variable, i
f920: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
f930: 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
f940: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
f950: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
f960: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
f970: 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ite)] && \..    
f980: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
f990: 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73 74  ngth $::env(Syst
f9a0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d  em.Data.SQLite)]
f9b0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
f9c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f9d0: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
f9e0: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
f9f0: 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  ed directory whe
fa00: 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  re the necessary
fa10: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
fa20: 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72    components for
fa30: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
fa40: 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f  ite should be fo
fa50: 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  und...        #.
fa60: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72  .        set dir
fa70: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74  ectory [file nat
fa80: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
fa90: 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
faa0: 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e    $::env(System.
fab0: 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67 65  Data.SQLite) [ge
fac0: 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d  tReleaseVersion]
fad0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ]]....        tp
fae0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
faf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
fb00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
fb10: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
fb20: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
fb30: 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  lease \"" \..   
fb40: 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74           $direct
fb50: 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ory "\"... "]...
fb60: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
fb70: 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65  ReleaseAvailable
fb80: 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61 74   $directory plat
fb90: 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
fba0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
fbb0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
fbc0: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
fbd0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
fbe0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e   set platform un
fbf0: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20  known..         
fc00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
fc10: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
fc20: 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70  matchPlatform $p
fc30: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
fc40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
fc50: 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74  t ::build_direct
fc60: 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a  ory $directory..
fc70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
fc80: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
fc90: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
fca0: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
fcb0: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
fcc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
fcd0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
fce0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
fcf0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd00: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
fd10: 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74  gs "yes (" $plat
fd20: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  form ")\n"]..   
fd30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
fd40: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
fd50: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
fd60: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
fd70: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
fd80: 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74  e exists $direct
fd90: 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ory] || \..     
fda0: 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
fdb0: 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
fdc0: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
fdd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
fde0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
fdf0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
fe00: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
fe10: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
fe20: 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
fe30: 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
fe40: 61 6e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  an " \..        
fe50: 20 20 20 20 20 20 20 20 22 69 6e 76 61 6c 69 64          "invalid
fe60: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6b 69 70   directory, skip
fe70: 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72  ping check for r
fe80: 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a  eleases...\n"]..
fe90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
fea0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
feb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
fec0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 74       foreach pat
fed0: 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61  h [lsort -decrea
fee0: 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20  sing [file list 
fef0: 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b  $directory *]] {
ff00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
ff10: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
ff20: 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69  path] && [file i
ff30: 73 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  sdirectory $path
ff40: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
ff50: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
ff60: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ff70: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
ff80: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
ff90: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
ffa0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
ffb0: 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d  $path "\"... "].
ffe0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
fff0: 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41   if {[isReleaseA
10000 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70  vailable $path p
10010 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
10020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10030 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
10040 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
10050 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b  set platform unk
10080 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  nown..          
10090 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
100a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
100b0 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68  select && [match
100c0 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
100d0 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
100f0 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  et ::build_direc
10100 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20  tory $path....  
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10130 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
10140 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
10150 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
10160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10170 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
101a0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
101b0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
101c0 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
101d0 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
101e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
10200 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10210 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10220 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
10230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
10240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
10250 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
10260 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10270 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10280 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10290 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
102a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
102b0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
102c0 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
102d0 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
102e0 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  not " \..       
102f0 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70       "set, skipp
10300 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65  ing check for re
10310 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20  leases...\n"].. 
10320 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10330 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
10340 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10350 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c   checkForSQLiteL
10360 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c  ibrary { channel
10370 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
10380 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
10390 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
103a0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
103b0 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
103c0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
103d0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
103e0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
103f0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
10400 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
10410 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
10420 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20  SQLiteVersion.. 
10430 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
10440 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
10450 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10460 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
10470 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
10480 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
10490 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
104a0 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
104b0 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
104c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
104d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
104e0 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
104f0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10500 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
10510 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
10520 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10530 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10540 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
10550 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
10560 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
10570 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
10580 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10590 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
105a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
105b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
105c0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
105d0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
105e0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
10600 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
10610 51 4c 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75  QLite3 SQLiteSou
10620 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d  rceId..        }
10630 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
10640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
10650 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
10660 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
10670 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
10680 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
10690 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
106a0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
106b0 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
106c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
106d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
106e0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
106f0 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
10700 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
10710 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
10720 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
10730 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
10740 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
10750 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10760 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10770 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
10780 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
10790 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
107a0 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
107b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
107c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
107d0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20   NOTE: Yes, the 
107e0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
107f0 61 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  ary appears to b
10800 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
10810 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10820 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
10830 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20  QLite....       
10840 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
10850 54 45 3a 20 52 65 63 6f 72 64 20 76 65 72 73 69  TE: Record versi
10860 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  on of the SQLite
10870 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 66 6f   core library fo
10880 72 20 6c 61 74 65 72 20 75 73 65 0d 0a 20 20 20  r later use..   
10890 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
108a0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  test constraint 
108b0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 65 74 63  expressions, etc
108c0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
108d0 20 68 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20   has..        # 
108e0 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65        already be
108f0 65 6e 20 73 65 74 20 28 6f 72 20 6f 76 65 72 72  en set (or overr
10900 69 64 64 65 6e 29 2c 20 73 6b 69 70 20 73 65 74  idden), skip set
10910 74 69 6e 67 20 69 74 2e 0d 0a 20 20 20 20 20 20  ting it...      
10920 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
10930 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
10940 3a 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f 76 65  :core_library_ve
10950 72 73 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rsion]} then {..
10960 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
10970 63 6f 72 65 5f 6c 69 62 72 61 72 79 5f 76 65 72  core_library_ver
10980 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e 0d 0a 20  sion $version.. 
10990 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
109a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
109b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
109c0 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
109d0 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
109e0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
109f0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
10a00 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
10a10 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
10a20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
10a30 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
10a40 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
10a50 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
10a60 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
10a70 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
10a80 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
10a90 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
10aa0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
10ab0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
10ac0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10ad0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
10ae0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
10af0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
10b00 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e  3 InteropVersion
10b10 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f  ..      } versio
10b20 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
10b30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10b40 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
10b50 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
10b60 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
10b70 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
10b80 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
10b90 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
10ba0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
10bb0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
10bc0 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
10bd0 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
10be0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
10bf0 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
10c00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10c10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10c20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
10c30 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
10c40 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
10c50 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
10c60 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
10c70 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
10c80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10c90 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
10cb0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
10cc0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
10cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
10ce0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10cf0 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f  e.SQLite3 Intero
10d00 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  pSourceId..     
10d10 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
10d20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10d30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
10d40 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
10d50 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
10d60 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
10d70 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
10d80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
10d90 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
10da0 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
10db0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10dc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
10dd0 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
10de0 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
10df0 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
10e00 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
10e10 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
10e20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
10e30 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
10e40 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
10e50 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
10e60 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
10e70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10e80 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
10e90 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
10ea0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10eb0 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f 72     # NOTE: Befor
10ec0 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69 6e  e actually addin
10ed0 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74  g the test const
10ee0 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72 65  raint, make sure
10ef0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
10f00 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69 73        version is
10f10 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f 74   valid (i.e. not
10f20 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63 6f   just that we co
10f30 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d 0a  uld query it)...
10f40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10f50 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e 20     if {$version 
10f60 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  ne "null"} then 
10f70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
10f80 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
10f90 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74  : Yes, the SQLit
10fa0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
10fb0 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ly appears to be
10fc0 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
10fd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10fe0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
10ff0 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d  t SQLiteInterop.
11000 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
11010 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20 20   answer yes..   
11020 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11030 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73           set ans
11040 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20 20  wer no..        
11050 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
11060 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11070 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72 20  endArgs $answer 
11080 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  " (" $version " 
11090 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
110a0 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
110b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
110c0 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
110d0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
110e0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
110f0 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
11100 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
11110 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
11120 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11130 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11140 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
11150 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
11160 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11170 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
11180 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
11190 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
111a0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
111b0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
111c0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
111d0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
111e0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
111f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
11200 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
11210 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
11220 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
11230 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
11240 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11250 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
11260 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
11270 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
11280 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
11290 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
112a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
112b0 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
112c0 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
112d0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
112e0 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
112f0 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
11300 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
11310 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11320 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
11330 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
11340 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e   [getSQLiteDefin
11350 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 5d  eConstantPrefix]
11360 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20   $name]....     
11370 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11380 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
11390 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
113a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
113b0 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
113c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
113d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
113e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72  puts $channel er
113f0 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ror\n..      }..
11400 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11410 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
11420 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 7b  eCompileOption {
11430 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20   channel name } 
11440 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
11450 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11460 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11470 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
11480 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72  for SQLite inter
11490 6f 70 20 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70  op assembly comp
114a0 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20 5c  ile option \"" \
114b0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d  ..          $nam
114c0 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  e "\"... "].... 
114d0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
114e0 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
114f0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11500 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
11510 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11520 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
11530 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70  ite3 InteropComp
11540 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
11550 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
11560 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
11570 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
11580 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
11590 6f 63 61 73 65 20 24 63 6f 6d 70 69 6c 65 4f 70  ocase $compileOp
115a0 74 69 6f 6e 73 20 24 6e 61 6d 65 5d 20 21 3d 20  tions $name] != 
115b0 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
115c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
115d0 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
115e0 74 68 69 73 20 63 6f 6d 70 69 6c 65 20 6f 70 74  this compile opt
115f0 69 6f 6e 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ion was enabled 
11600 77 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6f 70  when the interop
11610 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
11620 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
11630 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
11640 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11650 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
11660 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65   [appendArgs [ge
11670 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70  tSQLiteCompileOp
11680 74 69 6f 6e 50 72 65 66 69 78 5d 20 24 6e 61 6d  tionPrefix] $nam
11690 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
116a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
116b0 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
116c0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
116d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
116e0 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
116f0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
11700 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
11710 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
11720 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11730 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11740 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
11750 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
11760 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
11770 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
11780 79 20 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e  y compile option
11790 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
117a0 20 20 24 6e 61 6d 65 20 22 5c 22 2e 2e 2e 20 22    $name "\"... "
117b0 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
117c0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
117d0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
117e0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
117f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11800 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11810 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
11820 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d  eCompileOptions.
11830 0a 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65  .      } compile
11840 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74  Options] == 0} t
11850 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
11860 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
11870 63 74 20 2d 6e 6f 63 61 73 65 20 24 63 6f 6d 70  ct -nocase $comp
11880 69 6c 65 4f 70 74 69 6f 6e 73 20 24 6e 61 6d 65  ileOptions $name
11890 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d  ] != -1} then {.
118a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
118b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
118c0 59 65 73 2c 20 74 68 69 73 20 63 6f 6d 70 69 6c  Yes, this compil
118d0 65 20 6f 70 74 69 6f 6e 20 77 61 73 20 65 6e 61  e option was ena
118e0 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 53 51  bled when the SQ
118f0 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
11900 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
11910 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
11920 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
11930 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
11940 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
11950 41 72 67 73 20 5b 67 65 74 53 51 4c 69 74 65 43  Args [getSQLiteC
11960 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66  ompileOptionPref
11970 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ix] $name]....  
11980 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11990 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
119a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
119b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
119c0 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
119d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
119e0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
119f0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11a00 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
11a10 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
11a20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
11a30 65 46 6f 72 6d 61 74 20 7b 20 7b 74 69 6d 65 5a  eFormat { {timeZ
11a40 6f 6e 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  one true} } {.. 
11a50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11a60 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
11a70 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
11a80 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
11a90 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
11aa0 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
11ab0 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
11ac0 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
11ad0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
11ae0 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
11af0 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
11b00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
11b10 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
11b20 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
11b30 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11b40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11b50 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
11b60 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
11b70 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
11b80 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
11b90 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
11ba0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
11bb0 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
11bc0 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
11bd0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
11be0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11bf0 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
11c00 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
11c10 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
11c20 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
11c30 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
11c40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
11c50 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
11c60 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
11c70 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
11c80 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
11c90 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
11ca0 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
11cb0 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
11cc0 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
11cd0 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
11ce0 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
11cf0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11d00 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
11d10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
11d20 20 20 20 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20      "yyyy-MM-dd 
11d30 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
11d40 22 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 5a 6f  " [expr {$timeZo
11d50 6e 65 20 3f 20 22 4b 22 20 3a 20 22 22 7d 5d 5d  ne ? "K" : ""}]]
11d60 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11d70 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
11d80 74 44 61 74 65 54 69 6d 65 54 69 63 6b 73 20 7b  tDateTimeTicks {
11d90 20 76 61 6c 75 65 20 7b 6c 6f 63 61 6c 20 22 22   value {local ""
11da0 7d 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20 7d  } {default ""} }
11db0 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
11dc0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
11dd0 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
11de0 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
11df0 6e 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  n $default..    
11e00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
11e10 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
11e20 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
11e30 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
11e40 63 72 65 61 74 65 20 5c 0d 0a 20 20 20 20 20 20  create \..      
11e50 20 20 20 20 20 20 2d 70 61 72 61 6d 65 74 65 72        -parameter
11e60 74 79 70 65 73 20 5b 6c 69 73 74 20 53 74 72 69  types [list Stri
11e70 6e 67 20 53 74 72 69 6e 67 20 49 46 6f 72 6d 61  ng String IForma
11e80 74 50 72 6f 76 69 64 65 72 20 5c 0d 0a 20 20 20  tProvider \..   
11e90 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
11ea0 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 2e 44 61  Globalization.Da
11eb0 74 65 54 69 6d 65 53 74 79 6c 65 73 5d 20 44 61  teTimeStyles] Da
11ec0 74 65 54 69 6d 65 20 50 61 72 73 65 45 78 61 63  teTime ParseExac
11ed0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
11ee0 20 24 76 61 6c 75 65 20 5b 67 65 74 44 61 74 65   $value [getDate
11ef0 54 69 6d 65 46 6f 72 6d 61 74 5d 20 6e 75 6c 6c  TimeFormat] null
11f00 20 41 64 6a 75 73 74 54 6f 55 6e 69 76 65 72 73   AdjustToUnivers
11f10 61 6c 5d 0d 0a 20 20 20 20 20 20 7d 5d 7d 20 74  al]..      }]} t
11f20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
11f30 65 74 75 72 6e 20 24 64 65 66 61 75 6c 74 0d 0a  eturn $default..
11f40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11f50 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
11f60 62 6f 6f 6c 65 61 6e 20 2d 73 74 72 69 63 74 20  boolean -strict 
11f70 24 6c 6f 63 61 6c 5d 7d 20 74 68 65 6e 20 7b 0d  $local]} then {.
11f80 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
11f90 65 54 69 6d 65 20 5b 6f 62 6a 65 63 74 20 69 6e  eTime [object in
11fa0 76 6f 6b 65 20 2d 63 72 65 61 74 65 20 44 61 74  voke -create Dat
11fb0 65 54 69 6d 65 20 53 70 65 63 69 66 79 4b 69 6e  eTime SpecifyKin
11fc0 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d \..           
11fd0 20 24 64 61 74 65 54 69 6d 65 20 55 74 63 5d 0d   $dateTime Utc].
11fe0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11ff0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12000 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
12010 64 61 74 65 54 69 6d 65 20 54 69 63 6b 73 5d 0d  dateTime Ticks].
12020 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12030 20 20 69 66 20 7b 24 6c 6f 63 61 6c 7d 20 74 68    if {$local} th
12040 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
12050 74 75 72 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  turn [object inv
12060 6f 6b 65 20 24 64 61 74 65 54 69 6d 65 20 54 6f  oke $dateTime To
12070 4c 6f 63 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  LocalTime.Ticks]
12080 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
12090 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
120a0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
120b0 24 64 61 74 65 54 69 6d 65 20 54 6f 55 6e 69 76  $dateTime ToUniv
120c0 65 72 73 61 6c 54 69 6d 65 2e 54 69 63 6b 73 5d  ersalTime.Ticks]
120d0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
120e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
120f0 74 50 72 6f 70 65 72 74 69 65 73 20 7b 20 6f 62  tProperties { ob
12100 6a 65 63 74 20 76 61 72 4e 61 6d 65 20 7d 20 7b  ject varName } {
12110 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
12120 24 76 61 72 4e 61 6d 65 20 70 72 6f 70 65 72 74  $varName propert
12130 69 65 73 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74  ies....      set
12140 20 63 6f 75 6e 74 20 30 0d 0a 20 20 20 20 20 20   count 0..      
12150 73 65 74 20 6e 61 6d 65 73 20 5b 6c 69 73 74 5d  set names [list]
12160 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69  ....      if {[i
12170 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 6f  sObjectHandle $o
12180 62 6a 65 63 74 5d 20 26 26 20 24 6f 62 6a 65 63  bject] && $objec
12190 74 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65  t ne "null"} the
121a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61  n {..        eva
121b0 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73 20  l lappend names 
121c0 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73 20  [object members 
121d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  \..            -
121e0 6d 65 6d 62 65 72 74 79 70 65 73 20 50 72 6f 70  membertypes Prop
121f0 65 72 74 79 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24  erty -nameonly $
12200 6f 62 6a 65 63 74 5d 0d 0a 0d 0a 20 20 20 20 20  object]....     
12210 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
12220 6e 61 6d 65 73 20 5b 6f 62 6a 65 63 74 20 6d 65  names [object me
12230 6d 62 65 72 73 20 5c 0d 0a 20 20 20 20 20 20 20  mbers \..       
12240 20 20 20 20 20 2d 6d 65 6d 62 65 72 74 79 70 65       -membertype
12250 73 20 46 69 65 6c 64 20 2d 6e 61 6d 65 6f 6e 6c  s Field -nameonl
12260 79 20 24 6f 62 6a 65 63 74 5d 0d 0a 20 20 20 20  y $object]..    
12270 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72    }....      for
12280 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
12290 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
122a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
122b0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
122c0 65 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b  e -objectflags +
122d0 4e 6f 44 69 73 70 6f 73 65 20 24 6f 62 6a 65 63  NoDispose $objec
122e0 74 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20  t $name..       
122f0 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
12300 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12310 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65 63 74 48    if {[isObjectH
12320 61 6e 64 6c 65 20 24 76 61 6c 75 65 5d 20 26 26  andle $value] &&
12330 20 24 76 61 6c 75 65 20 6e 65 20 22 6e 75 6c 6c   $value ne "null
12340 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
12350 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f 72         set error
12360 20 6e 75 6c 6c 3b 20 6f 62 6a 65 63 74 20 69 6e   null; object in
12370 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
12380 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
12390 20 20 20 20 20 20 20 20 20 20 2d 6d 61 72 73 68            -marsh
123a0 61 6c 66 6c 61 67 73 20 2b 4e 6f 48 61 6e 64 6c  alflags +NoHandl
123b0 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
123c0 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  tActive \..     
123d0 20 20 20 20 20 20 20 20 20 20 20 41 64 64 4f 62             AddOb
123e0 6a 65 63 74 52 65 66 65 72 65 6e 63 65 20 4f 6b  jectReference Ok
123f0 20 24 76 61 6c 75 65 20 65 72 72 6f 72 0d 0a 0d   $value error...
12400 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
12410 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73 28  pend properties(
12420 6f 62 6a 65 63 74 73 29 20 5b 6c 69 73 74 20 24  objects) [list $
12430 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
12440 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
12460 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65 73  ppend properties
12470 28 76 61 6c 75 65 73 29 20 5b 6c 69 73 74 20 24  (values) [list $
12480 6e 61 6d 65 20 24 76 61 6c 75 65 5d 0d 0a 20 20  name $value]..  
12490 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
124a0 20 20 20 20 20 20 20 69 6e 63 72 20 63 6f 75 6e         incr coun
124b0 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
124c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  e {..          l
124d0 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
124e0 73 28 65 72 72 6f 72 73 29 20 5b 6c 69 73 74 20  s(errors) [list 
124f0 24 6e 61 6d 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $name $::errorCo
12500 64 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  de]..        }..
12510 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12520 20 72 65 74 75 72 6e 20 24 63 6f 75 6e 74 0d 0a   return $count..
12530 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12540 6f 63 20 67 65 74 41 6c 6c 50 72 6f 70 65 72 74  oc getAllPropert
12550 69 65 73 20 7b 20 6f 62 6a 65 63 74 20 76 61 72  ies { object var
12560 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
12570 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
12580 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   properties..   
12590 20 20 20 73 65 74 20 76 61 6c 75 65 20 24 6f 62     set value $ob
125a0 6a 65 63 74 0d 0a 0d 0a 20 20 20 20 20 20 77 68  ject....      wh
125b0 69 6c 65 20 7b 74 72 75 65 7d 20 7b 0d 0a 20 20  ile {true} {..  
125c0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
125d0 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
125e0 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
125f0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
12600 20 20 20 24 76 61 6c 75 65 20 6e 69 20 24 70 72     $value ni $pr
12610 6f 70 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a  operties(seenObj
12620 65 63 74 73 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  ects)} then {.. 
12630 20 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 70           getProp
12640 65 72 74 69 65 73 20 24 76 61 6c 75 65 20 70 72  erties $value pr
12650 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
12660 20 20 20 20 6c 61 70 70 65 6e 64 20 70 72 6f 70      lappend prop
12670 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
12680 74 73 29 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ts) $value..    
12690 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
126a0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
126b0 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62  ts properties(ob
126c0 6a 65 63 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  jects)]} then {.
126d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
126e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
126f0 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
12700 67 74 68 20 24 70 72 6f 70 65 72 74 69 65 73 28  gth $properties(
12710 6f 62 6a 65 63 74 73 29 5d 20 3d 3d 20 30 7d 20  objects)] == 0} 
12720 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12730 20 20 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69    unset properti
12740 65 73 28 6f 62 6a 65 63 74 73 29 3b 20 62 72 65  es(objects); bre
12750 61 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ak..        }...
12760 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c  .        set val
12770 75 65 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e 64  ue [lindex [lind
12780 65 78 20 24 70 72 6f 70 65 72 74 69 65 73 28 6f  ex $properties(o
12790 62 6a 65 63 74 73 29 20 30 5d 20 65 6e 64 5d 0d  bjects) 0] end].
127a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 72 6f  .        set pro
127b0 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73 29  perties(objects)
127c0 20 5b 6c 72 61 6e 67 65 20 24 70 72 6f 70 65 72   [lrange $proper
127d0 74 69 65 73 28 6f 62 6a 65 63 74 73 29 20 31 20  ties(objects) 1 
127e0 65 6e 64 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  end]..      }...
127f0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
12800 20 65 78 69 73 74 73 20 70 72 6f 70 65 72 74 69   exists properti
12810 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 5d  es(seenObjects)]
12820 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12830 20 20 66 6f 72 65 61 63 68 20 76 61 6c 75 65 20    foreach value 
12840 24 70 72 6f 70 65 72 74 69 65 73 28 73 65 65 6e  $properties(seen
12850 4f 62 6a 65 63 74 73 29 20 7b 0d 0a 20 20 20 20  Objects) {..    
12860 20 20 20 20 20 20 69 66 20 7b 24 76 61 6c 75 65        if {$value
12870 20 65 71 20 24 6f 62 6a 65 63 74 7d 20 63 6f 6e   eq $object} con
12880 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20  tinue..         
12890 20 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64   catch {object d
128a0 69 73 70 6f 73 65 20 24 76 61 6c 75 65 7d 0d 0a  ispose $value}..
128b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
128c0 20 20 20 20 20 75 6e 73 65 74 20 70 72 6f 70 65       unset prope
128d0 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74  rties(seenObject
128e0 73 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s)..      }..   
128f0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12900 67 65 74 56 61 72 69 61 62 6c 65 73 20 7b 20 76  getVariables { v
12910 61 72 4e 61 6d 65 73 20 7b 6f 62 6a 65 63 74 73  arNames {objects
12920 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
12930 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
12940 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  ist]....      fo
12950 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76  reach varName $v
12960 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  arNames {..     
12970 20 20 20 69 66 20 7b 5b 75 70 6c 65 76 65 6c 20     if {[uplevel 
12980 31 20 5b 6c 69 73 74 20 61 72 72 61 79 20 65 78  1 [list array ex
12990 69 73 74 73 20 24 76 61 72 4e 61 6d 65 5d 5d 7d  ists $varName]]}
129a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
129b0 20 20 20 73 65 74 20 61 72 72 61 79 4e 61 6d 65     set arrayName
129c0 20 24 76 61 72 4e 61 6d 65 0d 0a 0d 0a 20 20 20   $varName....   
129d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 65         foreach e
129e0 6c 65 6d 65 6e 74 4e 61 6d 65 20 5b 75 70 6c 65  lementName [uple
129f0 76 65 6c 20 31 20 5b 6c 69 73 74 20 61 72 72 61  vel 1 [list arra
12a00 79 20 6e 61 6d 65 73 20 24 61 72 72 61 79 4e 61  y names $arrayNa
12a10 6d 65 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  me]] {..        
12a20 20 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 61 70      set name [ap
12a30 70 65 6e 64 41 72 67 73 20 24 61 72 72 61 79 4e  pendArgs $arrayN
12a40 61 6d 65 20 28 20 24 65 6c 65 6d 65 6e 74 4e 61  ame ( $elementNa
12a50 6d 65 20 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  me )]..         
12a60 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20     set varValue 
12a70 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
12a80 20 73 65 74 20 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a   set $name]]....
12a90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
12aa0 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73 4f  $objects && [isO
12ab0 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61 72  bjectHandle $var
12ac0 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Value]} then {..
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
12ae0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
12af0 70 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20  properties..    
12b00 20 20 20 20 20 20 20 20 20 20 67 65 74 41 6c 6c            getAll
12b10 50 72 6f 70 65 72 74 69 65 73 20 24 76 61 72 56  Properties $varV
12b20 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65 73 0d  alue properties.
12b30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
12b40 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
12b50 5b 6c 69 73 74 20 24 6e 61 6d 65 20 5b 61 72 72  [list $name [arr
12b60 61 79 20 67 65 74 20 70 72 6f 70 65 72 74 69 65  ay get propertie
12b70 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s]]..           
12b80 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
12b90 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
12ba0 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 6e   result [list $n
12bb0 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a  ame $varValue]..
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12bd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12be0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
12bf0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 56          set varV
12c00 61 6c 75 65 20 5b 75 70 6c 65 76 65 6c 20 31 20  alue [uplevel 1 
12c10 5b 6c 69 73 74 20 73 65 74 20 24 76 61 72 4e 61  [list set $varNa
12c20 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
12c30 20 20 69 66 20 7b 24 6f 62 6a 65 63 74 73 20 26    if {$objects &
12c40 26 20 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c  & [isObjectHandl
12c50 65 20 24 76 61 72 56 61 6c 75 65 5d 7d 20 74 68  e $varValue]} th
12c60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12c70 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
12c80 61 69 6e 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ain properties..
12c90 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 41              getA
12ca0 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 24 76 61  llProperties $va
12cb0 72 56 61 6c 75 65 20 70 72 6f 70 65 72 74 69 65  rValue propertie
12cc0 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s....           
12cd0 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20   lappend result 
12ce0 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65 20 5b  [list $varName [
12cf0 61 72 72 61 79 20 67 65 74 20 70 72 6f 70 65 72  array get proper
12d00 74 69 65 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ties]]..        
12d10 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12d20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
12d30 72 65 73 75 6c 74 20 5b 6c 69 73 74 20 24 76 61  result [list $va
12d40 72 4e 61 6d 65 20 24 76 61 72 56 61 6c 75 65 5d  rName $varValue]
12d50 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
12d60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12d70 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
12d80 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
12d90 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
12da0 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b  umerableToList {
12db0 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d   enumerable } {.
12dc0 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
12dd0 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
12de0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
12df0 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65  ngth $enumerable
12e00 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65  ] == 0 || $enume
12e10 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d  rable eq "null"}
12e20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12e30 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
12e40 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12e50 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
12e60 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e   -alias item $en
12e70 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20  umerable {..    
12e80 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
12e90 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
12ea0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12eb0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
12ec0 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72  ult [$item ToStr
12ed0 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing]..        }.
12ee0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12ef0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
12f00 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
12f10 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74  proc catchAndRet
12f20 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74  urn { script {st
12f30 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20  ackTrace false} 
12f40 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20  {strict true} } 
12f50 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
12f60 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
12f70 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
12f80 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
12f90 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
12fa0 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20  ntext,..      # 
12fb0 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20        capturing 
12fc0 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  both the result 
12fd0 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
12fe0 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
12ff0 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
13000 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
13010 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d  $script} result]
13020 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
13030 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74     # NOTE: Did t
13040 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
13050 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
13060 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72   NOT raise an er
13070 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ror?..      #.. 
13080 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74       if {$strict
13090 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c   && $code == 0 |
130a0 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63  | !$strict && $c
130b0 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b  ode != 1} then {
130c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
130d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
130e0 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20  cess.  Return a 
130f0 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
13100 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
13110 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
13120 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
13130 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
13140 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
13150 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63   } elseif {$stac
13160 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  kTrace} then {..
13170 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13180 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
13190 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
131a0 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61  wants a full sta
131b0 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70  ck trace (if app
131c0 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20  licable),..     
131d0 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
131e0 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
131f0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
13200 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72  d the result ver
13210 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
13220 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
13230 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72  n [list $code $r
13240 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20  esult]..      } 
13250 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13260 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13270 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
13280 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
13290 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61   want a full sta
132a0 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20  ck trace (if..  
132b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
132c0 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72  plicable), retur
132d0 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
132e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74  e return code, t
132f0 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  he error..      
13300 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
13310 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  or the interpret
13320 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f  er, and the erro
13330 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20  r message up to 
13340 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
13350 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65       point where
13360 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65   the stack trace
13370 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a   should start...
13380 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13390 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
133a0 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $code $::errorCo
133b0 64 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  de \..          
133c0 20 20 5b 65 78 74 72 61 63 74 53 79 73 74 65 6d    [extractSystem
133d0 44 61 74 61 53 51 4c 69 74 65 45 78 63 65 70 74  DataSQLiteExcept
133e0 69 6f 6e 4d 65 73 73 61 67 65 20 24 72 65 73 75  ionMessage $resu
133f0 6c 74 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  lt]]..      }.. 
13400 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
13410 63 20 72 65 73 65 74 45 78 63 65 70 74 69 6f 6e  c resetException
13420 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
13430 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
13440 73 65 74 20 65 78 63 65 70 74 69 6f 6e 20 61 73  set exception as
13450 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13460 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 28  is interpreter (
13470 74 6f 20 6e 75 6c 6c 29 2e 0d 0a 20 20 20 20 20  to null)...     
13480 20 23 20 20 20 20 20 20 20 54 68 69 73 20 28 70   #       This (p
13490 72 69 76 61 74 65 29 20 70 72 6f 70 65 72 74 79  rivate) property
134a0 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 6f   is maintained o
134b0 6e 20 61 20 70 65 72 2d 74 68 72 65 61 64 20 62  n a per-thread b
134c0 61 73 69 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  asis...      #..
134d0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
134e0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
134f0 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
13500 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63 65  r.GetActive Exce
13510 70 74 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  ption null..    
13520 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
13530 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13540 63 61 74 63 68 41 6e 64 53 65 74 45 78 63 65 70  catchAndSetExcep
13550 74 69 6f 6e 20 7b 20 73 63 72 69 70 74 20 7b 76  tion { script {v
13560 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
13570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13580 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20   NOTE: Evaluate 
13590 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
135a0 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
135b0 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65  r in their conte
135c0 78 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  xt...      #..  
135d0 20 20 20 20 63 61 74 63 68 20 7b 75 70 6c 65 76      catch {uplev
135e0 65 6c 20 31 20 24 73 63 72 69 70 74 7d 0d 0a 0d  el 1 $script}...
135f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13600 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
13610 20 28 70 72 69 76 61 74 65 29 20 65 78 63 65 70   (private) excep
13620 74 69 6f 6e 20 70 72 6f 70 65 72 74 79 20 66 72  tion property fr
13630 6f 6d 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  om this interpre
13640 74 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ter,..      #   
13650 20 20 20 20 66 6f 72 20 74 68 69 73 20 74 68 72      for this thr
13660 65 61 64 2c 20 61 6e 64 20 61 64 64 20 61 73 20  ead, and add as 
13670 61 6e 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  an opaque object
13680 20 68 61 6e 64 6c 65 20 69 6e 20 74 68 65 0d 0a   handle in the..
13690 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
136a0 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
136b0 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
136c0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
136d0 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
136e0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
136f0 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
13700 76 61 72 4e 61 6d 65 20 65 78 63 65 70 74 69 6f  varName exceptio
13710 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
13720 20 20 20 20 73 65 74 20 65 78 63 65 70 74 69 6f      set exceptio
13730 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
13740 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 2d 61   \..          -a
13750 6c 69 61 73 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  lias -flags +Non
13760 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
13770 65 72 2e 47 65 74 41 63 74 69 76 65 20 45 78 63  er.GetActive Exc
13780 65 70 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  eption]....     
13790 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
137a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
137b0 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68  ompileCSharpWith
137c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
137d0 74 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62  text memory symb
137e0 6f 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c  ols strict resul
137f0 74 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  tsVarName errors
13800 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65  VarName fileName
13810 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  s..            a
13820 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  rgs } {..      #
13830 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13840 53 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69  Since we are goi
13850 6e 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d  ng to use this m
13860 65 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74  ethod name a lot
13870 2c 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61  , assign it to a
13880 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13890 76 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d  variable first..
138a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
138b0 73 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63  set add Referenc
138c0 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64  edAssemblies.Add
138d0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
138e0 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
138f0 65 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61  e the base comma
13900 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  nd to evaluate a
13910 6e 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65  nd add the prope
13920 72 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20  rty settings..  
13930 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
13940 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
13950 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
13960 20 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65   unit tests (i.e
13970 2e 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20  . the System..  
13980 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
13990 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65  System.Data asse
139a0 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29  mbly references)
139b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
139c0 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c    set command [l
139d0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
139e0 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24   compileCSharp $
139f0 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79  text $memory $sy
13a00 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65  mbols $strict re
13a10 73 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a  sults errors \..
13a20 20 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53            $add S
13a30 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53  ystem.dll $add S
13a40 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24  ystem.Data.dll $
13a50 61 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73  add System.Trans
13a60 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20  actions.dll \.. 
13a70 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
13a80 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d  stem.Xml.dll]...
13a90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13aa0 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
13ab0 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
13ac0 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
13ad0 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
13ae0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13af0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
13b00 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20   $fileNames {.. 
13b10 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63         lappend c
13b20 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74  ommand $add [get
13b30 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
13b40 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
13b50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
13b60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
13b70 20 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d   the extra argum
13b80 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f  ents, if any, to
13b90 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   the command to 
13ba0 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20  evaluate...     
13bb0 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c   #..      eval l
13bc0 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
13bd0 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  args....      #.
13be0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
13bf0 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
13c00 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
13c10 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
13c20 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  bles to the..   
13c30 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
13c40 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64  ble names provid
13c50 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
13c60 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13c70 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
13c80 6e 67 74 68 20 24 72 65 73 75 6c 74 73 56 61 72  ngth $resultsVar
13c90 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
13ca0 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
13cb0 20 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61   1 $resultsVarNa
13cc0 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20  me results..    
13cd0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
13ce0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
13cf0 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 5d 20  $errorsVarName] 
13d00 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
13d10 20 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72       upvar 1 $er
13d20 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f  rorsVarName erro
13d30 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rs..      }.... 
13d40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13d50 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
13d60 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b  he constructed [
13d70 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63  compileCSharp] c
13d80 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72  ommand and retur
13d90 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
13da0 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20       result...  
13db0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
13dc0 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20  l $command..    
13dd0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
13de0 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65  sMemoryDb { file
13df0 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
13e00 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
13e10 20 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65   Is the specifie
13e20 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
13e30 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69  name really an i
13e40 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13e50 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
13e60 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
13e70 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a  {$fileName eq ":
13e80 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20  memory:" || \.. 
13e90 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
13ea0 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65   range $fileName
13eb0 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a   0 12] eq "file:
13ec0 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20  :memory:"}]..   
13ed0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13ee0 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61  isTableInDb { na
13ef0 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  me {varName db} 
13f00 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13f10 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
13f20 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
13f30 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
13f40 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
13f50 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
13f60 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
13f70 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e  ler.  It contain
13f80 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
13f90 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
13fa0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20   that will be.. 
13fb0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
13fc0 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
13fd0 20 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64   query used to d
13fe0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
13ff0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
14000 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
14010 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61  esent in that da
14020 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
14030 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
14040 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
14050 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
14060 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 71  NOTE: Use the sq
14070 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
14080 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  e to determine i
14090 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
140a0 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
140b0 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
140c0 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  he database...  
140d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
140e0 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20   sql {..        
140f0 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20  SELECT COUNT(*) 
14100 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
14110 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
14120 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65  'table' AND name
14130 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a   = ?;..      }..
14140 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14150 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
14160 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
14170 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70  named table is p
14180 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23  resent...      #
14190 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
141a0 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
141b0 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
141c0 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
141d0 20 24 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61   $sql [list para
141e0 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d  m1 String $name]
141f0 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d  ] > 0..      }].
14200 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
14210 72 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74  roc getDbDefault
14220 50 61 67 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20  PageSize {} {.. 
14230 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
14240 7b 65 78 65 63 75 74 65 53 71 6c 20 22 50 52 41  {executeSql "PRA
14250 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 20  GMA page_size;" 
14260 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20  scalar} result] 
14270 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14280 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
14290 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c  sult..      } el
142a0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
142b0 74 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d  turn 0..      }.
142c0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
142d0 72 6f 63 20 67 65 74 44 62 44 65 66 61 75 6c 74  roc getDbDefault
142e0 43 61 63 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a  CacheSize {} {..
142f0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14300 20 7b 65 78 65 63 75 74 65 53 71 6c 20 22 50 52   {executeSql "PR
14310 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b  AGMA cache_size;
14320 22 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74  " scalar} result
14330 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
14340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
14350 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20  result..      } 
14360 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
14370 72 65 74 75 72 6e 20 30 0d 0a 20 20 20 20 20 20  return 0..      
14380 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
14390 20 70 72 6f 63 20 75 73 65 4c 65 67 61 63 79 44   proc useLegacyD
143a0 62 50 61 67 65 41 6e 64 43 61 63 68 65 53 69 7a  bPageAndCacheSiz
143b0 65 73 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b  es { varName } {
143c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
143d0 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
143e0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
143f0 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
14400 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
14410 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
14420 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
14430 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74  .  It contains t
14440 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
14450 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68  ection handle th
14460 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20  at will be..    
14470 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74    #       used t
14480 6f 20 65 78 65 63 75 74 65 20 71 75 65 72 69 65  o execute querie
14490 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
144a0 65 20 70 61 67 65 20 61 6e 64 20 63 61 63 68 65  e page and cache
144b0 20 73 69 7a 65 73 2e 0d 0a 20 20 20 20 20 20 23   sizes...      #
144c0 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
144d0 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
144e0 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
144f0 20 24 64 62 20 7b 0d 0a 20 20 20 20 20 20 20 20   $db {..        
14500 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
14510 20 3d 20 31 30 32 34 3b 0d 0a 20 20 20 20 20 20   = 1024;..      
14520 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
14530 69 7a 65 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20  ize = 2000;..   
14540 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
14550 74 75 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  turn [list \..  
14560 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65          [sql exe
14570 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
14580 61 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d 41  alar $db "PRAGMA
14590 20 70 61 67 65 5f 73 69 7a 65 3b 22 5d 20 5c 0d   page_size;"] \.
145a0 0a 20 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20  .          [sql 
145b0 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
145c0 20 73 63 61 6c 61 72 20 24 64 62 20 22 50 52 41   scalar $db "PRA
145d0 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22  GMA cache_size;"
145e0 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
145f0 20 20 70 72 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65    proc normalize
14600 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65  ExceptionMessage
14610 20 7b 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20 20   { value } {..  
14620 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
14630 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
14640 3d 20 30 7d 20 74 68 65 6e 20 7b 72 65 74 75 72  = 0} then {retur
14650 6e 20 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20  n $value}..     
14660 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20   return [string 
14670 6d 61 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 22  map [list \r\n "
14680 20 3d 3d 3e 20 22 20 5c 6e 20 22 20 3d 3d 3e 20   ==> " \n " ==> 
14690 22 5d 20 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20  "] $value]..    
146a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
146b0 78 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61  xtractSystemData
146c0 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d  SQLiteExceptionM
146d0 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
146e0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
146f0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
14700 65 20 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d  e string conform
14710 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74  s to format of t
14720 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74  he normal except
14730 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
14740 20 20 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73     error strings
14750 2c 20 65 78 74 72 61 63 74 20 61 6e 64 20 72 65  , extract and re
14760 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72  turn only the er
14770 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20  ror message..   
14780 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
14790 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  on itself...    
147a0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
147b0 61 74 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d  atterns [list \.
147c0 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
147d0 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
147e0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28  LiteException \(
147f0 30 78 28 3f 3a 30 7c 38 29 5b 30 2d 39 41 2d 46  0x(?:0|8)[0-9A-F
14800 61 2d 66 5d 7b 37 7d 5c 29 3a 5c 0d 0a 20 20 20  a-f]{7}\):\..   
14810 20 20 20 20 20 20 20 28 2e 2b 3f 29 20 20 28 3f         (.+?)  (?
14820 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20  : )?at} \..     
14830 20 7b 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c 2e   {System\.Data\.
14840 53 51 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45 78  SQLite\.SQLiteEx
14850 63 65 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20  ception: (.+?)  
14860 28 3f 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20  (?: )?at} \..   
14870 20 20 20 7b 45 61 67 6c 65 5c 2e 5f 43 6f 6d 70     {Eagle\._Comp
14880 6f 6e 65 6e 74 73 5c 2e 50 75 62 6c 69 63 5c 2e  onents\.Public\.
14890 53 63 72 69 70 74 45 78 63 65 70 74 69 6f 6e 3a  ScriptException:
148a0 20 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74   (.+?)  (?: )?at
148b0 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65  }]....      fore
148c0 61 63 68 20 70 61 74 74 65 72 6e 20 24 70 61 74  ach pattern $pat
148d0 74 65 72 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20  terns {..       
148e0 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20   if {[regexp -- 
148f0 24 70 61 74 74 65 72 6e 20 24 76 61 6c 75 65 20  $pattern $value 
14900 64 75 6d 6d 79 20 6d 65 73 73 61 67 65 5d 7d 20  dummy message]} 
14910 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14920 20 20 73 65 74 20 6d 65 73 73 61 67 65 20 5b 73    set message [s
14930 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
14940 5c 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69 6e 67  \r\n \n] [string
14950 20 74 72 69 6d 20 24 6d 65 73 73 61 67 65 5d 5d   trim $message]]
14960 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
14970 6c 69 6e 65 73 20 5b 73 70 6c 69 74 20 24 6d 65  lines [split $me
14980 73 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  ssage \n]....   
14990 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
149a0 67 74 68 20 24 6c 69 6e 65 73 5d 20 3d 3d 20 32  gth $lines] == 2
149b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
149c0 20 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65        if {[linde
149d0 78 20 24 6c 69 6e 65 73 20 30 5d 20 65 71 20 5b  x $lines 0] eq [
149e0 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d  lindex $lines 1]
149f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14a00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
14a10 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d  lindex $lines 0]
14a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
14a30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
14a40 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67  eturn [appendArg
14a50 73 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73  s [lindex $lines
14a60 20 30 5d 20 22 20 2d 2d 20 22 20 5b 6c 69 6e 64   0] " -- " [lind
14a70 65 78 20 24 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20  ex $lines 1]].. 
14a80 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14a90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
14aa0 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 20  message..       
14ab0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
14ac0 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c       return $val
14ad0 75 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ue..    }.....  
14ae0 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b    proc trimSql {
14af0 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20   sql } {..      
14b00 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d  return [regsub -
14b10 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74  all -- {\s+} [st
14b20 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20  ring trim $sql] 
14b30 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  " "]..    }.....
14b40 20 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65      proc execute
14b50 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75  Sql { sql {execu
14b60 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74  te none} {format
14b70 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65   none} {fileName
14b80 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
14b90 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
14ba0 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  th $fileName] ==
14bb0 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69   0} then {set fi
14bc0 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d  leName :memory:}
14bd0 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
14be0 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20  $fileName "" "" 
14bf0 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66  "" "" "" false f
14c00 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
14c10 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20   db true....    
14c20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
14c30 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c   return [uplevel
14c40 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20   1 [list \..    
14c50 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
14c60 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78  ute -execute $ex
14c70 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66  ecute -format $f
14c80 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d  ormat $db $sql]]
14c90 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c  ..      } finall
14ca0 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  y {..        set
14cb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74   connection [get
14cc0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d  DbConnection]...
14cd0 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  .        try {..
14ce0 20 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75            cleanu
14cf0 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62  pDb $fileName db
14d00 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
14d10 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69  se..        } fi
14d20 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
14d30 20 20 20 6f 62 6a 65 63 74 20 66 6c 61 67 73 20     object flags 
14d40 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d 4e 6f 44  $connection -NoD
14d50 69 73 70 6f 73 65 3b 20 66 72 65 65 44 62 43 6f  ispose; freeDbCo
14d60 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
14d70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
14d80 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14d90 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61   hasNoFlags { va
14da0 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a  rName none } {..
14db0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
14dc0 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a  arName flags....
14dd0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
14de0 20 65 78 69 73 74 73 20 66 6c 61 67 73 5d 7d 20   exists flags]} 
14df0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14e00 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
14e10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
14e20 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
14e30 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74   $flags] == 0} t
14e40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
14e50 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
14e60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
14e70 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67 73  {$none && $flags
14e80 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e   eq "None"} then
14e90 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
14ea0 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
14eb0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
14ec0 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
14ed0 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f  ..    proc getCo
14ee0 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20  nnectionFlags { 
14ef0 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b  fileName flags {
14f00 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
14f10 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14f20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
14f30 6f 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61  out which databa
14f40 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20  se file name or 
14f50 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
14f60 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23  g these..      #
14f70 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
14f80 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74  n flags will act
14f90 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20  ually apply to. 
14fa0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63   This is not nec
14fb0 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20  essary..      # 
14fc0 20 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d        in quiet m
14fd0 6f 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73  ode because this
14fe0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
14ff0 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  only used for lo
15000 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20  gging..      #  
15010 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69       and reporti
15020 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20  ng purposes...  
15030 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
15040 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
15050 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
15060 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
15070 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
15080 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
15090 65 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70  et database [app
150a0 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61  endArgs "file na
150b0 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  me \"" $fileName
150c0 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20   \"]..        } 
150d0 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
150e0 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63  ists ::dataSourc
150f0 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
15100 20 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69       ![array exi
15110 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
15120 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15130 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
15140 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64  e [appendArgs "d
15150 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24  ata source \"" $
15160 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d  ::dataSource \"]
15170 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
15180 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
15190 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e  t database <unkn
151a0 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  own>..        }.
151b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
151c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
151d0 45 3a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  E: Even though t
151e0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
151f0 20 73 6f 75 72 63 65 20 6f 66 20 66 6c 61 67 73   source of flags
15200 20 73 6f 20 66 61 72 2c 20 74 68 65 79 0d 0a 20   so far, they.. 
15210 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 75 73       #       mus
15220 74 20 62 65 20 63 6f 6d 62 69 6e 65 64 20 75 73  t be combined us
15230 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20  ing the correct 
15240 73 79 6e 74 61 78 20 66 6f 72 20 65 6e 75 6d 65  syntax for enume
15250 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  rated..      #  
15260 20 20 20 20 20 66 6c 61 67 20 76 61 6c 75 65 73       flag values
15270 20 66 6f 72 20 74 68 65 20 2e 4e 45 54 20 46 72   for the .NET Fr
15280 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20  amework...      
15290 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61  #..      set fla
152a0 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73  gs [combineFlags
152b0 20 24 66 6c 61 67 73 20 22 22 5d 0d 0a 0d 0a 20   $flags ""].... 
152c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
152d0 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
152e0 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61 6c 20 63  log) the local c
152f0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
15300 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74  and the associat
15310 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
15320 20 20 64 61 74 61 20 73 6f 75 72 63 65 20 6f 72    data source or
15330 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
15340 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15350 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
15360 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
15370 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
15380 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 29 5d  emitLocalFlags)]
15390 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
153a0 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74     (![info exist
153b0 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c  s ::no(emitLocal
153c0 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c  FlagsIfNone)] ||
153d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
153e0 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c   ![hasNoFlags fl
153f0 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65  ags false])} the
15400 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
15410 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
15420 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15440 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f    "---- local co
15450 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66  nnection flags f
15460 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c  or " $database \
15470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15480 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b  " are: " [expr {
15490 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61  ![hasNoFlags fla
154a0 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20  gs false] ? \.. 
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
154c0 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61  pendArgs \" $fla
154d0 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e  gs \"] : "<none>
154e0 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "}] \n]..       
154f0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
15500 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15510 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
15520 6c 6f 67 29 20 74 68 65 20 73 68 61 72 65 64 20  log) the shared 
15530 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
15540 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15550 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15560 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
15570 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
15580 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
15590 76 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61  voke System.Data
155a0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
155b0 6e 6e 65 63 74 69 6f 6e 20 53 68 61 72 65 64 46  nnection SharedF
155c0 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20 7d 20  lags..        } 
155d0 73 68 61 72 65 64 46 6c 61 67 73 5d 20 3d 3d 20  sharedFlags] == 
155e0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
155f0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
15600 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
15610 53 68 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26  SharedFlags)] &&
15620 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15630 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
15640 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64   ::no(emitShared
15650 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c  FlagsIfNone)] ||
15660 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15670 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
15680 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75 65  sharedFlags true
15690 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ])} then {..    
156a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
156b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
156c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
156e0 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  -- shared connec
156f0 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
15700 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
15720 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b  are: " [expr {![
15730 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65  hasNoFlags share
15740 64 46 6c 61 67 73 20 74 72 75 65 5d 20 3f 20 5c  dFlags true] ? \
15750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15760 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
15770 20 24 73 68 61 72 65 64 46 6c 61 67 73 20 5c 22   $sharedFlags \"
15780 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
15790 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
157a0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
157b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
157c0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
157d0 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c  :no(emitSharedFl
157e0 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ags)] && \..    
157f0 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f            ![info
15800 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
15810 74 53 68 61 72 65 64 46 6c 61 67 73 49 66 55 6e  tSharedFlagsIfUn
15820 61 76 61 69 6c 61 62 6c 65 29 5d 7d 20 74 68 65  available)]} the
15830 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15840 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
15850 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15860 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
15870 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72        "---- shar
15880 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
15890 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
158a0 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
158b0 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 3c 75         " are: <u
158c0 6e 61 76 61 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d  navailable>\n"].
158d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
158e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
158f0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15900 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
15910 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 64 65  (and log) the de
15920 74 65 63 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f  tected global co
15930 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20  nnection flags, 
15940 69 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23  if any...      #
15950 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
15960 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15970 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
15980 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
15990 47 6c 6f 62 61 6c 46 6c 61 67 73 29 5d 20 26 26  GlobalFlags)] &&
159a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
159b0 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  (![info exists :
159c0 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c  :no(emitGlobalFl
159d0 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c  agsIfNone)] || \
159e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21  ..             !
159f0 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f  [hasNoFlags ::co
15a00 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66  nnection_flags f
15a10 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  alse])} then {..
15a20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15a30 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
15a40 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
15a60 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  -- global connec
15a70 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20  tion flags are: 
15a80 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15a90 20 20 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e     [expr {![hasN
15aa0 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74  oFlags ::connect
15ab0 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d  ion_flags false]
15ac0 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
15ad0 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
15ae0 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  \" $::connection
15af0 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  _flags \"] : "<n
15b00 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
15b10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
15b20 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15b30 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
15b40 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61  re are any globa
15b50 6c 20 28 70 65 72 20 74 65 73 74 20 72 75 6e 29  l (per test run)
15b60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
15b70 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20  s currently..   
15b80 20 20 20 23 20 20 20 20 20 20 20 73 65 74 2c 20     #       set, 
15b90 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e  use them now (i.
15ba0 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20  e. by combining 
15bb0 74 68 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e  them with the on
15bc0 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20  es for this..   
15bd0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
15be0 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23  ction)...      #
15bf0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
15c00 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65  o exists ::conne
15c10 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20 74 68  ction_flags]} th
15c20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
15c30 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15c40 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20   Combine and/or 
15c50 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e  replace the conn
15c60 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64  ection flags and
15c70 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a   then show the..
15c80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15c90 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  new value...    
15ca0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
15cb0 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
15cc0 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a  eFlags $flags $:
15cd0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
15ce0 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  s]....        #.
15cf0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15d00 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
15d10 74 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76  the new effectiv
15d20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
15d30 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  gs...        #..
15d40 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
15d50 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15d60 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
15d70 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
15d80 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 29  itCombinedFlags)
15d90 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
15da0 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
15db0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f  ists ::no(emitCo
15dc0 6d 62 69 6e 65 64 46 6c 61 67 73 49 66 4e 6f 6e  mbinedFlagsIfNon
15dd0 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
15de0 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
15df0 46 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73  Flags flags fals
15e00 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e])} then {..   
15e10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15e20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
15e30 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
15e50 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e  --- combined con
15e60 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
15e70 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
15e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15e90 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20   " are: " [expr 
15ea0 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c  {![hasNoFlags fl
15eb0 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a  ags false] ? \..
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
15ee0 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
15ef0 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
15f00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15f10 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
15f20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61       return $fla
15f30 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  gs..    }.....  
15f40 20 20 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50    proc getFlagsP
15f50 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73  roperty { {flags
15f60 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   ""} {quiet fals
15f70 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
15f80 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
15f90 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68  etermine what th
15fa0 65 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62  e combined (glob
15fb0 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f  al and local) co
15fc0 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
15fd0 23 20 20 20 20 20 20 20 66 6c 61 67 73 20 73 68  #       flags sh
15fe0 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c  ould be, possibl
15ff0 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20  y quietly...    
16000 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
16010 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74  lags [getConnect
16020 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61  ionFlags "" $fla
16030 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20  gs $quiet]....  
16040 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16050 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61  OTE: If no globa
16060 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65  l or local conne
16070 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65  ction flags were
16080 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d   specified, the.
16090 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
160a0 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f  efault connectio
160b0 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62  n flags should b
160c0 65 20 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72  e used; therefor
160d0 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20  e, return..     
160e0 20 23 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74   #       an empt
160f0 79 20 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74  y string in that
16100 20 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d   case...      #.
16110 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
16120 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
16130 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
16140 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
16150 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
16160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16170 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f  OTE: In order to
16180 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 64 65   check if the de
16190 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  fault connection
161a0 20 66 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67   flags are being
161b0 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
161c0 20 20 20 20 20 69 74 20 69 73 20 6e 65 63 65 73       it is neces
161d0 73 61 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20  sary to attempt 
161e0 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  a conversion to 
161f0 74 68 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65  the actual enume
16200 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  rated..      #  
16210 20 20 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c       type.  Fail
16220 69 6e 67 20 74 68 61 74 2c 20 74 68 65 20 63 68  ing that, the ch
16230 65 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20  eck against the 
16240 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
16250 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ll be..      #  
16260 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
16270 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
16280 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
16290 20 20 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75      set error nu
162a0 6c 6c 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d  ll; # IGNORED...
162b0 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
162c0 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54  invoke Utility T
162d0 72 79 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d  ryParseFlagsEnum
162e0 20 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   "" \..         
162f0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
16300 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
16310 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24  ectionFlags "" $
16320 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20  flags null true 
16330 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
16340 72 75 65 20 74 72 75 65 20 65 72 72 6f 72 0d 0a  rue true error..
16350 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d 20        } value]} 
16360 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16370 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
16380 45 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f  E: Attempting to
16390 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e 65   parse the conne
163a0 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75 73  ction flags caus
163b0 65 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20 20  ed a script..   
163c0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72       #       err
163d0 6f 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72 6e  or.  Emit a warn
163e0 69 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74 20  ing to the test 
163f0 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f 6e  log file and con
16400 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 23  tinue..        #
16410 20 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e 20         using an 
16420 65 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e 73  emtpy string ins
16430 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  tead...        #
16440 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20 5b  ..        tlog [
16450 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16460 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
16470 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
16480 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63 74  to parse connect
16490 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f 72  ion flags, error
164a0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
164b0 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c     \n\t $value \
164c0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  n]....        se
164d0 74 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20 20  t value ""..    
164e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
164f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
16500 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c   the combined fl
16510 61 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64  ags string could
16520 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
16530 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20   converted..    
16540 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65    #       to the
16550 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65   enumerated type
16560 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61 75   it is the defau
16570 6c 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a  lt value, then j
16580 75 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23  ust use..      #
16590 20 20 20 20 20 20 20 69 74 20 76 65 72 62 61 74         it verbat
165a0 69 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a  im; otherwise, j
165b0 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  ust return an em
165c0 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20  pty string.  In 
165d0 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20  that..      #   
165e0 20 20 20 20 63 61 73 65 2c 20 74 68 65 20 64 65      case, the de
165f0 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  fault connection
16600 20 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75   flags will be u
16610 73 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sed...      #.. 
16620 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
16630 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20   length $value] 
16640 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e  == 0 || $value n
16650 65 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65  e "Default"} the
16660 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
16670 20 20 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e          # WARNIN
16680 47 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  G: This returns 
16690 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65  the string value
166a0 20 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64   of the combined
166b0 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20   flags, not..   
166c0 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
166d0 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76  the enumerated v
166e0 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 62  alue.  This is b
166f0 79 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f  y design and sho
16700 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  uld not..       
16710 20 23 20 20 20 20 20 20 20 20 20 20 62 65 20 63   #          be c
16720 68 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63  hanged without c
16730 61 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61  areful considera
16740 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f  tion (e.g. it wo
16750 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  uld..        #  
16760 20 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20          prevent 
16770 74 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  the SQLiteConnec
16780 74 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20  tion class from 
16790 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64  allowing invalid
167a0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
167b0 20 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d       ["magical"]
167c0 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20   meta-flags)... 
167d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
167e0 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64    return [append
167f0 41 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66  Args "Flags=" $f
16800 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20  lags \;]..      
16810 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
16820 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
16830 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74      proc getTest
16840 50 72 6f 70 65 72 74 69 65 73 20 7b 20 7b 66 6c  Properties { {fl
16850 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66  ags ""} {quiet f
16860 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
16870 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
16880 3a 20 53 74 61 72 74 20 77 69 74 68 20 22 46 6c  : Start with "Fl
16890 61 67 73 22 20 70 72 6f 70 65 72 74 79 20 66 6f  ags" property fo
168a0 72 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  r the new connec
168b0 74 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  tion, if any... 
168c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
168d0 74 20 72 65 73 75 6c 74 20 5b 67 65 74 46 6c 61  t result [getFla
168e0 67 73 50 72 6f 70 65 72 74 79 20 24 66 6c 61 67  gsProperty $flag
168f0 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
16900 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16910 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65  TE: Add the name
16920 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
16930 74 65 73 74 20 66 69 6c 65 2c 20 69 66 20 61 76  test file, if av
16940 61 69 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69  ailable.  This i
16950 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
16960 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64   only used for d
16970 65 62 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20  ebugging...     
16980 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
16990 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
169a0 74 5f 66 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  t_file]} then {.
169b0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
169c0 72 65 73 75 6c 74 20 54 65 73 74 46 69 6c 65 3d  result TestFile=
169d0 20 24 3a 3a 74 65 73 74 5f 66 69 6c 65 20 5c 3b   $::test_file \;
169e0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
169f0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16a00 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65  TE: Add the name
16a10 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
16a20 74 65 73 74 2c 20 69 66 20 61 76 61 69 6c 61 62  test, if availab
16a30 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c  le.  This is onl
16a40 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
16a50 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
16a60 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
16a70 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
16a80 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65  xists ::eagle_te
16a90 73 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29  sts(CurrentName)
16aa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16ab0 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
16ac0 20 54 65 73 74 4e 61 6d 65 3d 20 24 3a 3a 65 61   TestName= $::ea
16ad0 67 6c 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e  gle_tests(Curren
16ae0 74 4e 61 6d 65 29 20 5c 3b 0d 0a 20 20 20 20 20  tName) \;..     
16af0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
16b00 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
16b10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
16b20 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
16b30 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c   { channel enabl
16b40 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  e {quiet false} 
16b50 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
16b60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
16b70 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
16b80 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
16b90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16ba0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16bb0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
16bc0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
16bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e        sqlite3_en
16be0 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
16bf0 65 20 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61  e [expr int($ena
16c00 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72  ble)]..      } r
16c10 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
16c20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
16c30 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
16c40 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
16c50 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16c60 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16c70 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
16c80 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  ll sqlite3_enabl
16c90 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 22  e_shared_cache("
16ca0 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20   $enable \..    
16cb0 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20            ")... 
16cc0 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
16cd0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
16ce0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
16cf0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
16d00 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
16d10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16d20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16d40 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
16d50 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
16d60 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c  d_cache(" $enabl
16d70 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
16d80 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20     ")... error: 
16d90 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
16da0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
16db0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
16dc0 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
16dd0 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  Db {..          
16de0 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65    fileName {mode
16df0 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f   ""} {dateTimeFo
16e00 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69  rmat ""} {dateTi
16e10 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67  meKind ""} {flag
16e20 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  s ""}..         
16e30 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71     {extra ""} {q
16e40 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65  ualify true} {de
16e50 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20  lete true} {uri 
16e60 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20  false}..        
16e70 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74      {temporary t
16e80 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62  rue} {varName db
16e90 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
16ea0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
16eb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
16ec0 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
16ed0 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
16ee0 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
16ef0 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
16f00 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
16f10 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
16f20 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
16f30 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
16f40 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
16f50 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61   all test databa
16f60 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ses used by the 
16f70 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70  test suite are p
16f80 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20  laced..      #  
16f90 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61       into the da
16fa0 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
16fb0 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65  .  Each database
16fc0 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c   and related fil
16fd0 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
16fe0 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74    used by a test
16ff0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e   should be clean
17000 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65  ed up by that te
17010 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20  st using the..  
17020 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65      #       "cle
17030 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72  anupDb" procedur
17040 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20  e, below...     
17050 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
17060 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61  isMemory && $qua
17070 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lify} then {..  
17080 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
17090 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
170a0 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74  etDatabaseDirect
170b0 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ory] [file tail 
170c0 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
170d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
170e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
170f0 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74  y default, delet
17100 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
17110 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
17120 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
17130 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
17140 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74  me if it current
17150 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ly exists...    
17160 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
17170 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
17180 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
17190 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
171a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
171b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
171c0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
171d0 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
171e0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
171f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
17200 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
17210 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20      name...     
17220 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
17230 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
17240 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
17250 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
17260 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17270 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17280 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
17290 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
172a0 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
172b0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
172c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
172d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
172e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
172f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17300 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
17330 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
17340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
17350 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17370 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c  \" during setup,
17380 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
17390 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
173a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
173b0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
173c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
173d0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
173e0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
173f0 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
17400 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
17410 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
17420 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
17430 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
17440 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
17450 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
17460 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
17470 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
17480 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
17490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
174a0 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64  OTE: Start build
174b0 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
174c0 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  on string.  The 
174d0 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f  only required po
174e0 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
174f0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
17500 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73  ection string is
17510 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
17520 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  , which contains
17530 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
17540 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
17550 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20  e name itself.  
17560 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  If our caller wa
17570 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49  nts to use a URI
17580 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
17590 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72     the data sour
175a0 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c  ce, use the Full
175b0 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  Uri connection s
175c0 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74  tring property t
175d0 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
175e0 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74   prevent the dat
175f0 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20  a source string 
17600 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c  from being mangl
17610 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
17620 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68      if {$uri} th
17630 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
17640 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75  t connection {Fu
17650 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65  llUri=${fileName
17660 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }}..      } else
17670 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
17680 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61  connection {Data
17690 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61   Source=${fileNa
176a0 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me}}..      }...
176b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
176c0 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
176d0 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  is procedure has
176e0 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77   no special know
176f0 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68  ledge of what th
17700 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
17710 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
17720 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75   is for the ToFu
17730 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f  llPath connectio
17740 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79  n string propery
17750 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  , always..      
17760 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
17770 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62  value we know ab
17780 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  out to the conne
17790 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20  ction string... 
177a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70       #..      ap
177b0 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
177c0 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71  {;ToFullPath=${q
177d0 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20  ualify}}....    
177e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
177f0 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
17800 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75   specified a jou
17810 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74  rnal mode, add t
17820 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
17830 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
17840 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
17850 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
17860 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
17870 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
17880 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d  ngth $mode] > 0}
17890 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
178a0 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
178b0 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64  on {;Journal Mod
178c0 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20  e=${mode}}..    
178d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
178e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
178f0 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
17900 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
17910 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65   format, add the
17920 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
17930 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
17940 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
17950 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
17960 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17970 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
17980 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  th $dateTimeForm
17990 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
179a0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
179b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
179c0 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61  eTimeFormat=${da
179d0 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a  teTimeFormat}}..
179e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
179f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
17a00 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
17a10 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
17a20 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68  TimeKind, add th
17a30 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
17a40 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
17a50 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
17a60 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
17a70 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17a80 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
17a90 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e  gth $dateTimeKin
17aa0 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  d] > 0} then {..
17ab0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
17ac0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
17ad0 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54  TimeKind=${dateT
17ae0 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20  imeKind}}..     
17af0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
17b00 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
17b10 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
17b20 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72   final flags for
17b30 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
17b40 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20   need to be...  
17b50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
17b60 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65   flags [getConne
17b70 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65  ctionFlags $file
17b80 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69  Name $flags $qui
17b90 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  et]....      #..
17ba0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
17bb0 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
17bc0 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74  ified some SQLit
17bd0 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  eConnectionFlags
17be0 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20  , add the..     
17bf0 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73 61   #       necessa
17c00 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ry portion of th
17c10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
17c20 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
17c30 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
17c40 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
17c50 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
17c60 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
17c70 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61  connection {;Fla
17c80 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20  gs=${flags}}..  
17c90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
17ca0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17cb0 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
17cc0 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72 61  ecified an extra
17cd0 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20   payload to the 
17ce0 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
17cf0 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67    #       string
17d00 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e  , append it now.
17d10 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17d20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
17d30 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d  gth $extra] > 0}
17d40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17d50 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
17d60 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20  on \; $extra..  
17d70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
17d80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17d90 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Add the name of 
17da0 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 73 74  the current test
17db0 20 66 69 6c 65 2c 20 69 66 20 61 76 61 69 6c 61   file, if availa
17dc0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0d 0a 20  ble.  This is.. 
17dd0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 6e 6c       #       onl
17de0 79 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  y used for debug
17df0 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ging...      #..
17e00 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
17e10 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 66 69  exists ::test_fi
17e20 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  le]} then {..   
17e30 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
17e40 65 63 74 69 6f 6e 20 7b 3b 54 65 73 74 46 69 6c  ection {;TestFil
17e50 65 3d 24 7b 3a 3a 74 65 73 74 5f 66 69 6c 65 7d  e=${::test_file}
17e60 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
17e70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
17e80 4f 54 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d  OTE: Add the nam
17e90 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  e of the current
17ea0 20 74 65 73 74 2c 20 69 66 20 61 76 61 69 6c 61   test, if availa
17eb0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  ble.  This is on
17ec0 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
17ed0 20 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67    used for debug
17ee0 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ging...      #..
17ef0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
17f00 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74  exists ::eagle_t
17f10 65 73 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65  ests(CurrentName
17f20 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
17f30 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
17f40 63 74 69 6f 6e 20 7b 3b 54 65 73 74 4e 61 6d 65  ction {;TestName
17f50 3d 24 7b 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  =${::eagle_tests
17f60 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 7d 7d 0d  (CurrentName)}}.
17f70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17f80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
17f90 45 3a 20 46 6f 72 20 63 6c 61 72 69 74 79 2c 20  E: For clarity, 
17fa0 61 70 70 65 6e 64 20 61 20 66 69 6e 61 6c 20 73  append a final s
17fb0 65 6d 69 63 6f 6c 6f 6e 20 74 6f 20 74 68 65 20  emicolon to the 
17fc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
17fd0 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
17fe0 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
17ff0 74 69 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20 20 20 20  tion \;....     
18000 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18010 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62  : Open the datab
18020 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  ase connection n
18030 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20  ow, placing the 
18040 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61  opaque handle va
18050 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  lue..      #    
18060 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69     into the vari
18070 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
18080 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
18090 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
180a0 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
180b0 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62  type SQLite [sub
180c0 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d  st $connection]]
180d0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
180e0 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69     # NOTE: Confi
180f0 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  gure the tempora
18100 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  ry directory for
18110 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65   the newly opene
18120 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20  d database..    
18130 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
18140 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20  tion now unless 
18150 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69  our caller forbi
18160 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ds it...      #.
18170 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70  .      if {$temp
18180 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20  orary && ![info 
18190 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54  exists ::no(setT
181a0 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
181b0 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  y)]} then {..   
181c0 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
181d0 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73   $db [appendArgs
181e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
181f0 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f  "PRAGMA temp_sto
18200 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c  re_directory = \
18210 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  "" [getTemporary
18220 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d  Directory] \"\;]
18230 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18240 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18250 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79 20  TE: Perform any 
18260 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63  extra per-connec
18270 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20 74  tion setup for t
18280 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d  he newly opened.
18290 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
182a0 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65  atabase now unle
182b0 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f  ss our caller fo
182c0 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20  rbids it...     
182d0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78   #..      set ex
182e0 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67 65  ecuteOnSetup [ge
182f0 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  tExecuteOnSetup]
18300 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
18310 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
18320 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20  ecuteOnSetup] > 
18330 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
18340 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20    ![info exists 
18350 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53 65  ::no(executeOnSe
18360 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tup)]} then {.. 
18370 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18380 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63    # NOTE: This c
18390 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73 65  ommand may raise
183a0 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73 6f   an error; if so
183b0 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c 20  , that is fine, 
183c0 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
183d0 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e      the enclosin
183e0 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65 6e  g test will then
183f0 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75 62   fail.  The [sub
18400 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a  st] command is..
18410 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18420 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c 20  used on the SQL 
18430 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64 73  in case it needs
18440 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74 61   to refer to sta
18450 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20  te in our..     
18460 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65     #       conte
18470 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  xt...        #..
18480 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
18490 75 74 65 20 24 64 62 20 5b 73 75 62 73 74 20 24  ute $db [subst $
184a0 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d  executeOnSetup].
184b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
184c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
184d0 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  E: Always return
184e0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
184f0 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63  handle upon succ
18500 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ess...      #.. 
18510 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d       return $db.
18520 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18530 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74  roc getDbConnect
18540 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64  ion { {varName d
18550 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
18560 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
18570 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
18580 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
18590 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
185a0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
185b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
185c0 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
185d0 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
185e0 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
185f0 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
18600 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
18610 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
18620 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
18630 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
18640 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
18650 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
18660 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
18670 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75   NOTE: This retu
18680 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20  rns the ADO.NET 
18690 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  IDbConnection ob
186a0 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f  ject instance fo
186b0 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  r the..      #  
186c0 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 64       specified d
186d0 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20  atabse handle.  
186e0 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68  Since getting th
186f0 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73  is object relies
18700 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20   upon..      #  
18710 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72       Eagle inter
18720 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65  nals, great care
18730 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e   should be taken
18740 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73   to avoid dispos
18750 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  ing of..      # 
18760 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63        this objec
18770 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70  t or otherwise p
18780 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61  utting it into a
18790 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e  n invalid state.
187a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
187b0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
187c0 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  s db]} then {.. 
187d0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
187e0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
187f0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
18800 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d  ags +NonPublic -
18810 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44  objectflags +NoD
18820 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d  ispose -alias \.
18830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
18840 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
18850 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
18860 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20 20   Item $db..     
18870 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
18880 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
18890 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
188a0 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73    # NOTE: Succes
188b0 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70  s, return the op
188c0 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
188d0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
188e0 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
188f0 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
18900 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
18910 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18920 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
18930 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79  lure, report why
18940 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
18950 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18960 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
18970 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
18990 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
189a0 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63  ed to get connec
189b0 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
189c0 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a  database \"" \..
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
189e0 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
189f0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
18a00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
18a10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
18a20 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
18a30 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 61  ailure, return a
18a40 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76 61  n obviously inva
18a50 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  lid opaque objec
18a60 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
18a70 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
18a80 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
18a90 20 20 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f     proc freeDbCo
18aa0 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e  nnection { {varN
18ab0 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20  ame connection} 
18ac0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
18ad0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
18ae0 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
18af0 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
18b00 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20  . "connection") 
18b10 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
18b20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66        context of
18b30 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68   our caller.  Th
18b40 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
18b50 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44  handle for an AD
18b60 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20  O.NET..      #  
18b70 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
18b80 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72  previously retur
18b90 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e  ned by [getDbCon
18ba0 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20  nection] should 
18bb0 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
18bc0 20 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d    stored there..
18bd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18be0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
18bf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20   connection.... 
18c00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18c10 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
18c20 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71   remove the opaq
18c30 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
18c40 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70   from the interp
18c50 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20  reter..      #  
18c60 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20       now.  This 
18c70 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d  [object dispose]
18c80 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61   call will not a
18c90 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20  ctually dispose 
18ca0 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
18cb0 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67        underlying
18cc0 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65 20   object because 
18cd0 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66  the +NoDispose f
18ce0 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69  lag was set on i
18cf0 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
18d00 20 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e   during creation
18d10 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f   of the opaque o
18d20 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20  bject handle... 
18d30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
18d40 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63   {[info exists c
18d50 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d  onnection] && \.
18d60 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63  .          [catc
18d70 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73  h {object dispos
18d80 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65  e $connection} e
18d90 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
18da0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18db0 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
18dc0 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72  ehow failed to r
18dd0 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65  emove the handle
18de0 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
18df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18e00 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18e10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18e20 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18e30 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
18e40 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f  : failed to remo
18e50 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  ve connection ha
18e60 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63  ndle \"" $connec
18e70 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
18e80 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20      "\", error: 
18e90 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
18ea0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
18eb0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61  }.....    proc a
18ec0 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  ddDbConnection {
18ed0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72   connection {var
18ee0 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20  Name db} } {..  
18ef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
18f00 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
18f10 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
18f20 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
18f30 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
18f40 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
18f50 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20        caller... 
18f60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
18f70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
18f80 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
18f90 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61      # NOTE: Crea
18fa0 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66  te a correctly f
18fb0 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f  ormatted name fo
18fc0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  r the database c
18fd0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20  onnection to..  
18fe0 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 61      #       be a
18ff0 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74  dded to the list
19000 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20   managed by the 
19010 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65  Eagle interprete
19020 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
19030 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63     set db [objec
19040 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
19050 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
19060 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43          Eagle._C
19070 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74  omponents.Privat
19080 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61  e.FormatOps Data
19090 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24  baseObjectName $
190a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20  connection \..  
190b0 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f          SQLiteCo
190c0 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74  nnection [object
190d0 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
190e0 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65  ter.GetActive Ne
190f0 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  xtId]]....      
19100 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
19110 20 41 64 64 20 74 68 65 20 64 61 74 61 62 61 73   Add the databas
19120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f  e connection pro
19130 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
19140 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d  ler to the list.
19150 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
19160 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f  f those known to
19170 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72   the Eagle inter
19180 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23  preter...      #
19190 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69  ..      object i
191a0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
191b0 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65  nPublic Interpre
191c0 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
191d0 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d  nnections Add \.
191e0 0a 20 20 20 20 20 20 20 20 20 20 24 64 62 20 24  .          $db $
191f0 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
19200 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
19210 65 6d 6f 76 65 44 62 54 72 61 6e 73 61 63 74 69  emoveDbTransacti
19220 6f 6e 20 7b 20 74 72 61 6e 73 61 63 74 69 6f 6e  on { transaction
19230 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
19240 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d       # NOTE: Rem
19250 6f 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ove the database
19260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 70 72 6f   transaction pro
19270 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
19280 6c 65 72 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20  ler from the..  
19290 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 73 74      #       list
192a0 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20   of those known 
192b0 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  to the Eagle int
192c0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
192d0 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74   #..      object
192e0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
192f0 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
19300 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
19310 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 5c 0d 0a  transactions \..
19320 20 20 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65            Remove
19330 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20   $transaction.. 
19340 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
19350 63 20 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74  c getRowsFromDat
19360 61 54 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62  aTable { dataTab
19370 6c 65 20 7b 76 61 6c 75 65 43 61 6c 6c 62 61 63  le {valueCallbac
19380 6b 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  k ""} } {..     
19390 20 73 65 74 20 72 6f 77 73 20 5b 6c 69 73 74 5d   set rows [list]
193a0 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e  ..      set coun
193b0 74 20 5b 24 64 61 74 61 54 61 62 6c 65 20 43 6f  t [$dataTable Co
193c0 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a  lumns.Count]....
193d0 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
193e0 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78 20  ndex 0} {$index 
193f0 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20  < $count} {incr 
19400 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
19410 20 20 73 65 74 20 64 61 74 61 43 6f 6c 75 6d 6e    set dataColumn
19420 20 5b 24 64 61 74 61 54 61 62 6c 65 20 2d 61 6c   [$dataTable -al
19430 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67 65 74 5f  ias Columns.get_
19440 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 20 20  Item $index]..  
19450 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73 28        set names(
19460 24 69 6e 64 65 78 29 20 5b 24 64 61 74 61 43 6f  $index) [$dataCo
19470 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65 5d  lumn ColumnName]
19480 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
19490 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
194a0 54 45 3a 20 53 65 74 75 70 20 73 6f 6d 65 20 54  TE: Setup some T
194b0 63 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 63  cl return code c
194c0 6f 6e 73 74 61 6e 74 73 2e 0d 0a 20 20 20 20 20  onstants...     
194d0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 4f 6b   #..      set Ok
194e0 20 30 3b 20 73 65 74 20 45 72 72 6f 72 20 31 3b   0; set Error 1;
194f0 20 73 65 74 20 52 65 74 75 72 6e 20 32 3b 20 73   set Return 2; s
19500 65 74 20 42 72 65 61 6b 20 33 3b 20 73 65 74 20  et Break 3; set 
19510 43 6f 6e 74 69 6e 75 65 20 34 0d 0a 0d 0a 20 20  Continue 4....  
19520 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
19530 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61 52 6f  ch -alias dataRo
19540 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77 73 20  w [set dataRows 
19550 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f 77 73  [$dataTable Rows
19560 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ]] {..        se
19570 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  t row [list]....
19580 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74          for {set
19590 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65   index 0} {$inde
195a0 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63  x < $count} {inc
195b0 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
195c0 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
195d0 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65 61 74  [$dataRow -creat
195e0 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49 74 65  e -alias get_Ite
195f0 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20  m $index]....   
19600 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
19610 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
19620 43 61 6c 6c 62 61 63 6b 5d 20 3e 20 30 7d 20 74  Callback] > 0} t
19630 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19640 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74     set code [cat
19650 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19660 20 20 20 20 24 76 61 6c 75 65 43 61 6c 6c 62 61      $valueCallba
19670 63 6b 20 24 64 61 74 61 54 61 62 6c 65 20 24 64  ck $dataTable $d
19680 61 74 61 52 6f 77 20 24 69 6e 64 65 78 20 24 76  ataRow $index $v
19690 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alue..          
196a0 20 20 7d 20 6e 65 77 56 61 6c 75 65 5d 0d 0a 0d    } newValue]...
196b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
196c0 7b 24 63 6f 64 65 20 3d 3d 20 24 4f 6b 7d 20 74  {$code == $Ok} t
196d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
196e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
196f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
19700 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
19710 28 6e 65 77 3f 29 20 72 6f 77 20 76 61 6c 75 65  (new?) row value
19720 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19730 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19740 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
19750 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
19760 78 29 20 24 6e 65 77 56 61 6c 75 65 5d 0d 0a 20  x) $newValue].. 
19770 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
19780 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 45  eif {$code == $E
19790 72 72 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rror} then {..  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
197c0 4f 54 45 3a 20 55 73 65 20 74 68 65 20 28 6e 65  OTE: Use the (ne
197d0 77 3f 29 20 4e 55 4c 4c 20 72 6f 77 20 76 61 6c  w?) NULL row val
197e0 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue...           
197f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19800 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20      lappend row 
19810 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e  [list $names($in
19820 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20  dex)]..         
19830 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
19840 64 65 20 3d 3d 20 24 52 65 74 75 72 6e 7d 20 74  de == $Return} t
19850 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19860 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19870 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
19880 69 70 20 72 65 6d 61 69 6e 69 6e 67 20 76 61 6c  ip remaining val
19890 75 65 73 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ues for this row
198a0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
198b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
198c0 20 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20    break..       
198d0 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24       } elseif {$
198e0 63 6f 64 65 20 3d 3d 20 24 42 72 65 61 6b 7d 20  code == $Break} 
198f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19900 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19910 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
19920 6b 69 70 20 70 72 6f 63 65 73 73 69 6e 67 20 74  kip processing t
19930 68 69 73 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a  his row value...
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
19950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
19960 6c 73 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20  lseif {$code == 
19970 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68 65 6e 20  $Continue} then 
19980 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19990 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
199a0 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 64 65    # NOTE: Use de
199b0 66 61 75 6c 74 20 72 6f 77 20 76 61 6c 75 65 20  fault row value 
199c0 68 61 6e 64 6c 69 6e 67 2e 0d 0a 20 20 20 20 20  handling...     
199d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
199e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
199f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
19a00 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
19a10 6f 64 65 20 24 43 6f 6e 74 69 6e 75 65 0d 0a 20  ode $Continue.. 
19a20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
19a30 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64          if {$cod
19a40 65 20 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20  e == $Continue} 
19a50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19a60 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
19a70 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3e  length $value] >
19a80 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
19a90 20 20 20 20 20 20 20 20 20 21 5b 6f 62 6a 65 63           ![objec
19aa0 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76 65 72 74  t invoke Convert
19ab0 20 49 73 44 42 4e 75 6c 6c 20 24 76 61 6c 75 65   IsDBNull $value
19ac0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19ad0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
19ae0 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65   row [list $name
19af0 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c 75  s($index) [$valu
19b00 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20 20  e ToString]]..  
19b10 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
19b20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19b30 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
19b40 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
19b50 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x)]..           
19b60 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
19b70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
19b80 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f        lappend ro
19b90 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d  ws $row..      }
19ba0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
19bb0 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c   $rows..    }...
19bc0 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52  ..    proc dumpR
19bd0 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65  owsFromDataTable
19be0 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20   { channel rows 
19bf0 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73  } {..      set s
19c00 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20  equence 1....   
19c10 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24     foreach row $
19c20 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  rows {..        
19c30 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
19c40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
19c50 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
19c60 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f  {$sequence > 1 ?
19c70 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d   "\n" : ""}] "--
19c80 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71 75 65  -- ROW #" $seque
19c90 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  nce :\n]....    
19ca0 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 69 72      foreach pair
19cb0 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20   $row {..       
19cc0 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
19cd0 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65  $pair] >= 2} the
19ce0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19cf0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19d00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c  [appendArgs \t \
19d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19d20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20    [list [lindex 
19d30 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b  $pair 0]] ": " [
19d40 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61  list [lindex $pa
19d50 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ir 1]] \n]..    
19d60 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
19d70 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20  [llength $pair] 
19d80 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 1} then {..  
19d90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19da0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19db0 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20  Args \t \..     
19dc0 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74             [list
19dd0 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30   [lindex $pair 0
19de0 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d  ]] ": <null>\n"]
19df0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
19e00 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
19e10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19e20 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20   \t<empty>\n; # 
19e30 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a  NOTE: No data?..
19e40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19e50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19e60 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d    incr sequence.
19e70 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
19e80 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
19e90 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d  anupDb { fileNam
19ea0 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b  e {varName db} {
19eb0 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71  collect true} {q
19ec0 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20  ualify true}..  
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d     {delete true}
19ef0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
19f00 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
19f10 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c  empt to force al
19f20 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61  l pending "garba
19f30 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62  ge" objects to b
19f40 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20  e collected,..  
19f50 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c      #       incl
19f60 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61  uding SQLite sta
19f70 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b  tements and back
19f80 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73  up objects; this
19f90 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20   should allow.. 
19fa0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
19fb0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
19fc0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20  base file to be 
19fd0 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20  deleted...      
19fe0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  #..      if {$co
19ff0 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
1a000 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
1a010 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68  rbage $::test_ch
1a020 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
1a030 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a040 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
1a050 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
1a060 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
1a070 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
1a080 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
1a090 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
1a0a0 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
1a0b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72   the database pr
1a0c0 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
1a0d0 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23  via the..      #
1a0e0 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d         [setupDb]
1a0f0 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c   procedure shoul
1a100 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
1a110 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
1a120 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1a130 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
1a140 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a150 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   Close the conne
1a160 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
1a170 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73  abase now.  This
1a180 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73   should allow us
1a190 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1a1a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e  to delete the un
1a1b0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1a1c0 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23  e file...      #
1a1d0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
1a1e0 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26 26 20  o exists db] && 
1a1f0 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73  [catch {sql clos
1a200 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74  e $db} error]} t
1a210 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1a220 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1a230 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
1a240 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  led to close the
1a250 20 64 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72   database, repor
1a260 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
1a270 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1a280 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a290 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1a2b0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1a2c0 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62  d to close datab
1a2d0 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c  ase \"" $db "\",
1a2e0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
1a2f0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65           \n\t $e
1a300 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
1a310 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
1a320 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
1a330 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
1a340 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
1a350 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
1a360 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
1a370 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
1a380 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
1a390 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
1a3a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a3b0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
1a3c0 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74  e full path to t
1a3d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a3e0 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c   name.  For now,
1a3f0 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20   all test..     
1a400 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73   #       databas
1a410 65 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72  e files are stor
1a420 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ed in the tempor
1a430 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a  ary directory...
1a440 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1a450 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26  f {!$isMemory &&
1a460 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20   $qualify} then 
1a470 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  {..        set f
1a480 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
1a490 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44  in [getDatabaseD
1a4a0 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20  irectory] [file 
1a4b0 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
1a4c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1a4d0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1a4e0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
1a4f0 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
1a500 74 73 3b 20 69 6e 69 74 69 61 6c 6c 79 2c 20 61  ts; initially, a
1a510 73 73 75 6d 65 20 61 6c 6c 20 66 69 6c 65 73 20  ssume all files 
1a520 77 69 6c 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  will..      #   
1a530 20 20 20 20 62 65 20 64 65 6c 65 74 65 64 20 73      be deleted s
1a540 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 66 20  uccessfully, if 
1a550 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20  necessary...    
1a560 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73    #..      set s
1a570 75 63 63 65 73 73 20 74 72 75 65 0d 0a 0d 0a 20  uccess true.... 
1a580 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
1a590 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
1a5a0 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
1a5b0 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
1a5c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1a5d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1a5e0 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61  ip deleting data
1a5f0 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f  base files if so
1a600 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
1a610 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
1a620 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
1a630 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
1a640 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a650 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1a660 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e  xists ::no(clean
1a670 75 70 44 62 46 69 6c 65 73 29 5d 7d 20 74 68 65  upDbFiles)]} the
1a680 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
1a690 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1a6a0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
1a6b0 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 57  elete the test W
1a6c0 41 4c 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c  AL file, if any,
1a6d0 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
1a6e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1a6f0 74 20 77 61 6c 46 69 6c 65 4e 61 6d 65 20 5b 61  t walFileName [a
1a700 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e  ppendArgs $fileN
1a710 61 6d 65 20 2d 77 61 6c 5d 0d 0a 0d 0a 20 20 20  ame -wal]....   
1a720 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
1a730 20 65 78 69 73 74 73 20 24 77 61 6c 46 69 6c 65   exists $walFile
1a740 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
1a750 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1a760 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1a770 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  : If there is a 
1a780 57 41 4c 20 66 69 6c 65 2c 20 69 74 20 73 68 6f  WAL file, it sho
1a790 75 6c 64 20 62 65 20 7a 65 72 6f 20 62 79 74 65  uld be zero byte
1a7a0 73 20 61 74 20 74 68 69 73 0d 0a 20 20 20 20 20  s at this..     
1a7b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
1a7c0 6f 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  oint...         
1a7d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a7e0 20 20 69 66 20 7b 5b 73 65 74 20 73 69 7a 65 20    if {[set size 
1a7f0 5b 66 69 6c 65 20 73 69 7a 65 20 24 77 61 6c 46  [file size $walF
1a800 69 6c 65 4e 61 6d 65 5d 5d 20 3d 3d 20 30 7d 20  ileName]] == 0} 
1a810 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a820 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a830 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
1a840 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
1a850 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 57   to delete the W
1a860 41 4c 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  AL file, report 
1a870 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
1a880 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a890 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1a8a0 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 77 61  {file delete $wa
1a8b0 6c 46 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  lFileName} error
1a8c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a8d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1a8e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a8f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1a920 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
1a930 65 74 65 20 57 41 4c 20 66 69 6c 65 20 5c 22 22  ete WAL file \""
1a940 20 24 77 61 6c 46 69 6c 65 4e 61 6d 65 20 5c 0d   $walFileName \.
1a950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a960 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
1a970 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20  cleanup, error: 
1a980 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1a990 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1a9a0 20 20 20 20 20 73 65 74 20 73 75 63 63 65 73 73       set success
1a9b0 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
1a9c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1a9d0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1a9f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1aa00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1aa10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aa20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1aa30 47 3a 20 57 41 4c 20 66 69 6c 65 20 5c 22 22 20  G: WAL file \"" 
1aa40 24 77 61 6c 46 69 6c 65 4e 61 6d 65 20 22 5c 22  $walFileName "\"
1aa50 20 69 73 20 22 20 24 73 69 7a 65 20 5c 0d 0a 20   is " $size \.. 
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 22 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   " bytes in size
1aa80 2c 20 73 6b 69 70 70 69 6e 67 20 61 6c 6c 20 66  , skipping all f
1aa90 69 6c 65 20 64 65 6c 65 74 69 6f 6e 73 2e 2e 2e  ile deletions...
1aaa0 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
1aab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20        return 1; 
1aac0 23 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  # error..       
1aad0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1aae0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1aaf0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1ab00 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1ab10 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
1ab20 20 53 48 4d 20 66 69 6c 65 2c 20 69 66 20 61 6e   SHM file, if an
1ab30 79 2c 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  y, now...       
1ab40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1ab50 73 65 74 20 73 68 6d 46 69 6c 65 4e 61 6d 65 20  set shmFileName 
1ab60 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c  [appendArgs $fil
1ab70 65 4e 61 6d 65 20 2d 73 68 6d 5d 0d 0a 0d 0a 20  eName -shm].... 
1ab80 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
1ab90 6c 65 20 65 78 69 73 74 73 20 24 73 68 6d 46 69  le exists $shmFi
1aba0 6c 65 4e 61 6d 65 5d 20 26 26 20 5c 0d 0a 20 20  leName] && \..  
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 61 74              [cat
1abc0 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
1abd0 24 73 68 6d 46 69 6c 65 4e 61 6d 65 7d 20 65 72  $shmFileName} er
1abe0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1abf0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ac00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ac10 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
1ac20 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
1ac30 20 53 48 4d 20 66 69 6c 65 2c 20 72 65 70 6f 72   SHM file, repor
1ac40 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
1ac50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1ac60 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1ac70 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1ac80 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1ac90 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1aca0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1acb0 20 64 65 6c 65 74 65 20 53 48 4d 20 66 69 6c 65   delete SHM file
1acc0 20 5c 22 22 20 24 73 68 6d 46 69 6c 65 4e 61 6d   \"" $shmFileNam
1acd0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1ace0 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
1acf0 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20  cleanup, error: 
1ad00 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1ad10 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1ad20 20 73 65 74 20 73 75 63 63 65 73 73 20 66 61 6c   set success fal
1ad30 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  se..          }.
1ad40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1ad50 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1ad60 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
1ad70 65 74 65 20 74 68 65 20 74 65 73 74 20 64 61 74  ete the test dat
1ad80 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d  abase file now..
1ad90 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1ada0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1adb0 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
1adc0 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
1add0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ade0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1adf0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
1ae00 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
1ae10 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
1ae20 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
1ae30 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1ae50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1ae60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1ae70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae80 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1ae90 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1aea0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c   database file \
1aeb0 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
1aee0 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
1aef0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a  t $error \n]....
1af00 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1af10 73 75 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20  success false.. 
1af20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1af30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1af40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1af50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
1af60 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
1af70 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
1af80 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
1af90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  #..          tpu
1afa0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1afb0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1afc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1afd0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
1afe0 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
1aff0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
1b000 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
1b020 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
1b030 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
1b040 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b050 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
1b060 73 75 63 63 65 73 73 20 3f 20 30 20 3a 20 31 7d  success ? 0 : 1}
1b070 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
1b080 20 70 72 6f 63 20 73 61 76 65 45 6e 76 69 72 6f   proc saveEnviro
1b090 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b  nmentVariables {
1b0a0 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20   names {varName 
1b0b0 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
1b0c0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1b0d0 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64  For each name, d
1b0e0 6f 65 73 20 74 68 65 20 6c 69 76 65 20 65 6e 76  oes the live env
1b0f0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
1b100 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20  e exist?  If..  
1b110 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
1b120 73 61 76 65 20 74 68 65 20 76 61 6c 75 65 20 66  save the value f
1b130 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68 65 72 77  or later; otherw
1b140 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ise, make sure t
1b150 68 65 20 73 61 76 65 64 0d 0a 20 20 20 20 20 20  he saved..      
1b160 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 64 6f  #       value do
1b170 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74  es not exist eit
1b180 68 65 72 2e 20 20 54 68 65 20 6c 69 76 65 20 65  her.  The live e
1b190 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
1b1a0 62 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  bles..      #   
1b1b0 20 20 20 20 41 52 45 20 4e 4f 54 20 63 68 61 6e      ARE NOT chan
1b1c0 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ged by this proc
1b1d0 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  edure...      #.
1b1e0 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
1b1f0 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
1b200 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  me] == 0} then {
1b210 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61  ..        set va
1b220 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a  rName savedEnv..
1b230 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b240 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
1b250 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  e savedEnv....  
1b260 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
1b270 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20   $names {..     
1b280 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1b290 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29  sts ::env($name)
1b2a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b2b0 20 20 20 20 20 73 65 74 20 73 61 76 65 64 45 6e       set savedEn
1b2c0 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28  v($name) $::env(
1b2d0 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
1b2e0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1b2f0 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
1b300 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24  plain savedEnv($
1b310 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d  name)..        }
1b320 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1b330 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1b340 54 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66  TE: This is self
1b350 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e  -cleaning.  If n
1b360 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d  o saved environm
1b370 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f  ent variables no
1b380 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
1b390 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74   exist, remove t
1b3a0 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20  he array...     
1b3b0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61   #..      if {[a
1b3c0 72 72 61 79 20 73 69 7a 65 20 73 61 76 65 64 45  rray size savedE
1b3d0 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  nv] == 0} then {
1b3e0 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
1b3f0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
1b400 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  dEnv..      }.. 
1b410 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1b420 63 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e  c restoreEnviron
1b430 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20  mentVariables { 
1b440 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22  names {varName "
1b450 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
1b460 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
1b470 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f  or each name, do
1b480 65 73 20 74 68 65 20 73 61 76 65 64 20 65 6e 76  es the saved env
1b490 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
1b4a0 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20  e exist?  If..  
1b4b0 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
1b4c0 72 65 73 74 6f 72 65 20 74 68 65 20 73 61 76 65  restore the save
1b4d0 64 20 76 61 6c 75 65 20 61 6e 64 20 75 6e 73 65  d value and unse
1b4e0 74 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65 2c  t it; otherwise,
1b4f0 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20 20 20   make sure..    
1b500 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 69    #       the li
1b510 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ve environment v
1b520 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  ariable does not
1b530 20 65 78 69 73 74 20 65 69 74 68 65 72 20 28 69   exist either (i
1b540 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20 20 23 20  .e. it..      # 
1b550 20 20 20 20 20 20 77 61 73 20 6e 6f 74 20 73 65        was not se
1b560 74 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 29  t to begin with)
1b570 2e 20 20 42 6f 74 68 20 73 61 76 65 64 20 61 6e  .  Both saved an
1b580 64 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65  d live environme
1b590 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
1b5a0 20 20 76 61 72 69 61 62 6c 65 73 20 41 52 45 20    variables ARE 
1b5b0 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20  changed by this 
1b5c0 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20  procedure...    
1b5d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1b5e0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
1b5f0 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68  arName] == 0} th
1b600 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
1b610 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45  t varName savedE
1b620 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  nv..      }.... 
1b630 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1b640 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a  rName savedEnv..
1b650 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
1b660 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20  name $names {.. 
1b670 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
1b680 20 65 78 69 73 74 73 20 73 61 76 65 64 45 6e 76   exists savedEnv
1b690 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ($name)]} then {
1b6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1b6b0 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24 73 61  ::env($name) $sa
1b6c0 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20  vedEnv($name).. 
1b6d0 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
1b6e0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64  nocomplain saved
1b6f0 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20  Env($name)..    
1b700 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1b710 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1b720 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28  ocomplain ::env(
1b730 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
1b740 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
1b750 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1b760 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c  OTE: This is sel
1b770 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20  f-cleaning.  If 
1b780 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e  no saved environ
1b790 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e  ment variables n
1b7a0 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
1b7b0 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20    exist, remove 
1b7c0 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20  the array...    
1b7d0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1b7e0 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65 64  array size saved
1b7f0 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  Env] == 0} then 
1b800 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
1b810 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
1b820 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
1b830 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1b840 6f 63 20 73 61 76 65 45 61 67 6c 65 53 68 65 6c  oc saveEagleShel
1b850 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20  lEnvironment {} 
1b860 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  {..      upvar 1
1b870 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45   savedEnv savedE
1b880 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65  nv....      save
1b890 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
1b8a0 62 6c 65 73 20 5b 6c 69 73 74 20 4e 6f 4d 75 74  bles [list NoMut
1b8b0 65 78 65 73 5d 20 73 61 76 65 64 45 6e 76 0d 0a  exes] savedEnv..
1b8c0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1b8d0 6f 63 20 72 65 73 74 6f 72 65 45 61 67 6c 65 53  oc restoreEagleS
1b8e0 68 65 6c 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  hellEnvironment 
1b8f0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1b900 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1b910 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
1b920 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1b930 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1b940 20 4e 6f 4d 75 74 65 78 65 73 5d 20 73 61 76 65   NoMutexes] save
1b950 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
1b960 20 20 20 20 70 72 6f 63 20 73 61 76 65 4d 64 61      proc saveMda
1b970 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e 6d 65 6e  ConfigEnvironmen
1b980 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
1b990 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
1b9a0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1b9b0 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74   saveEnvironment
1b9c0 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20  Variables [list 
1b9d0 43 4f 4d 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76  COMPLUS_MDA] sav
1b9e0 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  edEnv..    }....
1b9f0 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72  .    proc restor
1ba00 65 4d 64 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f  eMdaConfigEnviro
1ba10 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20  nment {} {..    
1ba20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45    upvar 1 savedE
1ba30 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  nv savedEnv.... 
1ba40 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69       restoreEnvi
1ba50 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
1ba60 20 5b 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d   [list COMPLUS_M
1ba70 44 41 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  DA] savedEnv..  
1ba80 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1ba90 20 73 61 76 65 47 65 74 53 65 74 74 69 6e 67 56   saveGetSettingV
1baa0 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  alueEnvironment 
1bab0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1bac0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1bad0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
1bae0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1baf0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
1bb00 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 5f 45 78  .          No_Ex
1bb10 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65  pand No_SQLiteGe
1bb20 74 53 65 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f  tSettingValue No
1bb30 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67  _SQLiteXmlConfig
1bb40 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  File] \..       
1bb50 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
1bb60 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1bb70 72 65 73 74 6f 72 65 47 65 74 53 65 74 74 69 6e  restoreGetSettin
1bb80 67 56 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e  gValueEnvironmen
1bb90 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
1bba0 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
1bbb0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1bbc0 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
1bbd0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
1bbe0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1bbf0 4e 6f 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c  No_Expand No_SQL
1bc00 69 74 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c  iteGetSettingVal
1bc10 75 65 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43  ue No_SQLiteXmlC
1bc20 6f 6e 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20  onfigFile] \..  
1bc30 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
1bc40 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1bc50 70 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43  proc saveSQLiteC
1bc60 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e  onnectionEnviron
1bc70 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ment {} {..     
1bc80 20 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e   upvar 1 savedEn
1bc90 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20  v savedEnv....  
1bca0 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
1bcb0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
1bcc0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1bcd0 44 65 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c  DefaultFlags_SQL
1bce0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f  iteConnection No
1bcf0 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  _SQLiteConnectio
1bd00 6e 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20  nNewParser] \.. 
1bd10 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e           savedEn
1bd20 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  v..    }.....   
1bd30 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c   proc restoreSQL
1bd40 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76  iteConnectionEnv
1bd50 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
1bd60 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
1bd70 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
1bd80 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
1bd90 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
1bda0 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
1bdb0 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c         DefaultFl
1bdc0 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ags_SQLiteConnec
1bdd0 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f  tion No_SQLiteCo
1bde0 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65  nnectionNewParse
1bdf0 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  r] \..          
1be00 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
1be10 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76  ....    proc sav
1be20 65 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e  eSQLiteConvertEn
1be30 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a  vironment {} {..
1be40 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61        upvar 1 sa
1be50 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d  vedEnv savedEnv.
1be60 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76  ...      saveEnv
1be70 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1be80 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1be90 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43       Use_SQLiteC
1bea0 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62  onvert_DefaultDb
1beb0 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43  Type Use_SQLiteC
1bec0 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79  onvert_DefaultTy
1bed0 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20  peName] \..     
1bee0 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
1bef0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1bf00 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43  c restoreSQLiteC
1bf10 6f 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e  onvertEnvironmen
1bf20 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  t {} {..      up
1bf30 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73  var 1 savedEnv s
1bf40 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
1bf50 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d   restoreEnvironm
1bf60 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
1bf70 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1bf80 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72  Use_SQLiteConver
1bf90 74 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65 20  t_DefaultDbType 
1bfa0 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72  Use_SQLiteConver
1bfb0 74 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d  t_DefaultTypeNam
1bfc0 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e] \..          
1bfd0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
1bfe0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
1bff0 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
1c000 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
1c010 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
1c020 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1c030 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
1c040 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
1c050 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
1c060 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
1c070 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
1c080 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1c090 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
1c0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69  .            qui
1c0b0 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65  etFindInterprete
1c0c0 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53  rTestPath quietS
1c0d0 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54  etupInterpreterT
1c0e0 65 73 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20  estPath]....    
1c0f0 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20      try {..     
1c100 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c110 20 20 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e    # NOTE: Preven
1c120 74 20 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72  t the vendor scr
1c130 69 70 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e  ipt from being n
1c140 6f 69 73 79 20 77 68 65 6e 20 63 72 65 61 74 69  oisy when creati
1c150 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ng..          # 
1c160 20 20 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74        the isolat
1c170 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
1c180 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c190 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e          set ::en
1c1a0 76 28 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72  v(quietFindInter
1c1b0 70 72 65 74 65 72 54 65 73 74 50 61 74 68 29 20  preterTestPath) 
1c1c0 31 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  1..          set
1c1d0 20 3a 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75   ::env(quietSetu
1c1e0 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  pInterpreterTest
1c1f0 50 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20  Path) 1....     
1c200 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c210 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
1c220 75 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ure the script d
1c230 65 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20  ebugger and the 
1c240 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1c250 65 74 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20  eter..          
1c260 23 20 20 20 20 20 20 20 61 72 65 20 73 65 74 75  #       are setu
1c270 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  p and ready for 
1c280 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  use...          
1c290 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
1c2a0 75 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72  ug setup true tr
1c2b0 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ue....          
1c2c0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1c2d0 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65  OTE: Load the ne
1c2e0 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73  cessary packages
1c2f0 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
1c300 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
1c310 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1c320 20 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76          debug ev
1c330 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  al {..          
1c340 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
1c350 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
1c360 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
1c370 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61  uire Eagle.Libra
1c380 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
1c390 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
1c3a0 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20  Eagle.Test..    
1c3b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c3c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c3d0 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
1c3e0 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72  he necessary var
1c3f0 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20  iables into the 
1c400 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
1c410 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
1c420 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65   #..          de
1c430 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74  bug invoke 0 set
1c440 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20   ::test_channel 
1c450 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45  $channel; # NOTE
1c460 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a  : For [tputs]...
1c470 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
1c480 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
1c490 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20  est_log $log; # 
1c4a0 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d  NOTE: For [tlog]
1c4b0 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  .....          #
1c4c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1c4d0 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20  TE: Install the 
1c4e0 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20  callback script 
1c4f0 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
1c500 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d  in the isolated.
1c510 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1c520 20 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77     interpreter w
1c530 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72  hen this interpr
1c540 65 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70  eter is interrup
1c550 74 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20  ted by script.. 
1c560 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1c570 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
1c580 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tc...          #
1c590 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
1c5a0 67 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79  g callback apply
1c5b0 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a   {{sender e} {..
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1c5d0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1c5e0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  E: Check if this
1c5f0 20 64 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61   debugger callba
1c600 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77  ck is one that w
1c610 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20  e care about... 
1c620 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1c630 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e            set in
1c640 74 65 72 72 75 70 74 54 79 70 65 73 20 5b 73 70  terruptTypes [sp
1c650 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70  lit [$e Interrup
1c660 74 54 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a  tType] ", "]....
1c670 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c680 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69  "Canceled" in $i
1c690 6e 74 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c  nterruptTypes ||
1c6a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c6b0 20 20 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e      "Unwound" in
1c6c0 20 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73   $interruptTypes
1c6d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c6e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c6f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1c700 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b   Make sure the [
1c710 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
1c720 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53  is available.  S
1c730 69 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ince..          
1c740 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
1c750 20 69 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20   is an isolated 
1c760 69 6e 74 65 72 70 72 65 74 65 72 2c 20 63 68 65  interpreter, che
1c770 63 6b 20 66 6f 72 20 69 74 20 74 68 65 20 68 61  ck for it the ha
1c780 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd..            
1c790 20 20 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a    #       way...
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1c7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1c7c0 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
1c7d0 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
1c7e0 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  t]] > 0} then {.
1c7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c800 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1c810 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72      # NOTE: Iter
1c820 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
1c830 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c840 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  ions known to th
1c850 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1c860 20 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e     #       paren
1c870 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  t interpreter...
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1c8a0 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
1c8b0 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f  h -alias pair [o
1c8c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1c8d0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1c8e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c8f0 20 20 20 20 20 20 24 65 20 49 6e 74 65 72 70 72        $e Interpr
1c900 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  eter.connections
1c910 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
1c920 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c930 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1c940 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63  TE: Attempt to c
1c950 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75  ancel any SQL qu
1c960 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
1c970 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  s on..          
1c980 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c990 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
1c9a0 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  nnection...     
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70    if {[catch {$p
1c9e0 61 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c  air Value.Cancel
1c9f0 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
1ca00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ca10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1ca20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1ca30 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20  endArgs \n \..  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1ca60 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63  ING: failed to c
1ca70 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20  ancel query for 
1ca80 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1caa0 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70  nnection \"" [$p
1cab0 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72  air Key] "\", er
1cac0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20  ror: " \n\t \.. 
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e         $error \n
1caf0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1cb00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1cb10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1cb20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1cb30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1cb40 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1cb50 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1cb60 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cb80 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61  ==== WARNING: ca
1cb90 6e 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20  nnot cancel any 
1cba0 71 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20  queries: " \..  
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c    "the \"object\
1cbd0 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74  " command is not
1cbe0 20 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a   available\n"]..
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1cc00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1cc10 20 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20            }}..  
1cc20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
1cc30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  {..          res
1cc40 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
1cc50 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
1cc60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cc70 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
1cc80 65 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69  eterTestPath qui
1cc90 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74  etSetupInterpret
1cca0 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20  erTestPath]..   
1ccb0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1ccc0 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
1ccd0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  n {..        add
1cce0 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72  Constraint inter
1ccf0 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c  ruptCallback.sql
1cd00 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ite3....        
1cd10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
1cd20 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
1cd30 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1cd40 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1cd50 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72  pendArgs "no, er
1cd60 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1cd70 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
1cd80 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1cd90 72 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20  roc cleanupFile 
1cda0 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c  { fileName {coll
1cdb0 65 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65  ect true} {force
1cdc0 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
1cdd0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1cde0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
1cdf0 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
1ce00 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
1ce10 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
1ce20 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
1ce30 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
1ce40 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
1ce50 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
1ce60 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
1ce70 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
1ce80 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
1ce90 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1cea0 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
1ceb0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1cec0 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
1ced0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
1cee0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a  llectGarbage $::
1cef0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
1cf00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1cf10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1cf20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
1cf30 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
1cf40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1cf50 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
1cf60 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
1cf70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1cf80 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1cf90 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65  Skip deleting te
1cfa0 73 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65  st files if some
1cfb0 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c  body sets the gl
1cfc0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  obal variable.. 
1cfd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1cfe0 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20  o prevent it... 
1cff0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d000 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
1d010 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1d020 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d  no(cleanupFile)]
1d030 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d040 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d050 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
1d060 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
1d070 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  est file now... 
1d080 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1d090 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
1d0a0 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
1d0b0 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
1d0c0 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
1d0d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d0e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1d0f0 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
1d100 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
1d110 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
1d120 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
1d130 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d140 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1d150 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1d160 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d170 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1d180 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1d190 74 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66  to delete test f
1d1a0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1d1b0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1d1c0 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
1d1d0 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20  cleanup, error: 
1d1e0 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1d1f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1d200 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1d210 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1d220 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1d230 20 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b   Show that we sk
1d240 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
1d250 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  he file...      
1d260 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d270 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20   set code 0.... 
1d280 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d290 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1d2a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1d2c0 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70  = WARNING: skipp
1d2d0 65 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ed deleting test
1d2e0 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
1d2f0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
1d300 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
1d310 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
1d320 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1d330 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d340 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1d350 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
1d360 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
1d370 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
1d380 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
1d390 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
1d3a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
1d3b0 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
1d3c0 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65    proc cleanupMe
1d3d0 6d 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b  mory { varName {
1d3e0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1d3f0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1d400 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1d410 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20  mand] && \..    
1d420 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1d430 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e  ngth $varName] >
1d440 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1d450 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1d460 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
1d470 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
1d480 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
1d490 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
1d4a0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1d4b0 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
1d4c0 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f  r caller.  The o
1d4d0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
1d4e0 64 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20  dle for an..    
1d4f0 20 20 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e      #       ADO.
1d500 4e 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  NET connection p
1d510 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e  reviously return
1d520 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e  ed by [getDbConn
1d530 65 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ection]..       
1d540 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
1d550 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
1d560 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d570 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
1d580 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
1d590 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1d5a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1d5b0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1d5c0 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65  e $connection Re
1d5d0 6c 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20  leaseMemory..   
1d5e0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
1d5f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d600 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1d610 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d620 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d630 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d640 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d650 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1d660 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1d670 20 72 65 6c 65 61 73 65 20 64 61 74 61 62 61 73   release databas
1d680 65 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a  e memory, error:
1d690 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1d6a0 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
1d6b0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
1d6c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1d6d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d6e0 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69   if {[llength [i
1d6f0 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62  nfo commands deb
1d700 75 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ug]] > 0} then {
1d710 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1d720 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1d730 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1d740 74 20 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a  t debug purge]..
1d750 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1d760 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1d770 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1d780 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d790 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d7a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1d7b0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d7c0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1d7d0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1d7e0 20 74 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66   to purge call f
1d7f0 72 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  rame, error: " \
1d800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d810 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1d820 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1d830 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1d840 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1d850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70   {..          up
1d860 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
1d870 62 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20  bug cleanup]..  
1d880 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1d890 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d8a0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1d8b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d8c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1d8d0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1d8e0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d8f0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1d900 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1d910 6f 20 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70  o cleanup interp
1d920 72 65 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20  reter, error: " 
1d930 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d940 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
1d950 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1d960 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1d970 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1d980 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  h {..          u
1d990 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64  plevel 1 [list d
1d9a0 65 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20  ebug collect].. 
1d9b0 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
1d9c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d9d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1d9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d9f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1da00 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1da10 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1da20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1da30 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1da40 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
1da50 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1da80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1da90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1daa0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1dab0 20 70 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72   proc setupMemor
1dac0 79 43 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e  yCounters { varN
1dad0 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ame } {..      i
1dae0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1daf0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1db00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
1db10 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
1db20 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  ounter....      
1db30 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29    set counter(1)
1db40 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
1db50 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
1db60 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
1db70 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d  gnostics.Perform
1db80 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63  anceCounter Proc
1db90 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ess \..         
1dba0 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22     "Working Set"
1dbb0 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
1dbc0 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69  [file tail $::bi
1dbd0 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20  n_file]]]....   
1dbe0 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72       set counter
1dbf0 28 32 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61  (2) [object crea
1dc00 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  te -alias \..   
1dc10 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1dc20 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66  Diagnostics.Perf
1dc30 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50  ormanceCounter P
1dc40 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20  rocess \..      
1dc50 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53        "Working S
1dc60 65 74 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72  et Peak" [file r
1dc70 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
1dc80 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d  il $::bin_file]]
1dc90 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
1dca0 20 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a   counter(3) [obj
1dcb0 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61  ect create -alia
1dcc0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1dcd0 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
1dce0 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43  ics.PerformanceC
1dcf0 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c  ounter Process \
1dd00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50  ..            "P
1dd10 72 69 76 61 74 65 20 42 79 74 65 73 22 20 5b 66  rivate Bytes" [f
1dd20 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
1dd30 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66  le tail $::bin_f
1dd40 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  ile]]]..      }.
1dd50 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
1dd60 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
1dd70 20 20 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d    proc reportMem
1dd80 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68  oryCounters { ch
1dd90 61 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72  annel varName pr
1dda0 65 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20  efix } {..      
1ddb0 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
1ddc0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
1ddd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
1dde0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
1ddf0 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20  counter....     
1de00 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1de10 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1de20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1de30 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
1de40 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
1de50 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
1de60 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
1de70 72 28 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(1) CounterName
1de80 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
1de90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dea0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
1deb0 63 6f 75 6e 74 65 72 28 31 29 20 52 61 77 56 61  counter(1) RawVa
1dec0 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lue] \n]....    
1ded0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1dee0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1def0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1df00 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20  --- " $prefix " 
1df10 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20  counter \"" \.. 
1df20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
1df30 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74  ct invoke $count
1df40 65 72 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d  er(2) CounterNam
1df50 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20  e] "\" value is 
1df60 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1df70 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1df80 24 63 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56  $counter(2) RawV
1df90 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  alue] \n]....   
1dfa0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1dfb0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1dfc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
1dfd0 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22  ---- " $prefix "
1dfe0 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a   counter \"" \..
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
1e000 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e  ect invoke $coun
1e010 74 65 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61  ter(3) CounterNa
1e020 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73  me] "\" value is
1e030 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1e040 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
1e050 20 24 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77   $counter(3) Raw
1e060 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20  Value] \n]..    
1e070 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1e080 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47     proc collectG
1e090 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c  arbage { channel
1e0a0 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31   {milliseconds 1
1e0b0 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65  000} {quiet true
1e0c0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
1e0d0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
1e0e0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
1e0f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
1e100 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1e110 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
1e120 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
1e130 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ory false..     
1e140 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1e150 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1e160 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1e170 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e180 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1e190 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1e1a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e1b0 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
1e1c0 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
1e1d0 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63  LR before collec
1e1e0 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  tion... " \..   
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
1e200 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d  sult " bytes\n"]
1e210 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1e220 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1e230 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1e240 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1e250 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e260 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1e270 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e280 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1e290 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1e2a0 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
1e2b0 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
1e2c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1e2d0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1e2e0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1e2f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1e300 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e310 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e350 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
1e360 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1e370 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
1e380 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
1e390 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
1e3a0 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
1e3b0 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
1e3c0 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
1e3d0 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
1e3e0 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
1e3f0 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
1e400 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
1e410 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
1e420 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1e430 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1e440 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1e450 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e460 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b  set start [clock
1e470 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
1e480 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70     set stop [exp
1e490 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69  r {$start + ($mi
1e4a0 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  lliseconds / 100
1e4b0 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  0)}]....        
1e4c0 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  do {..          
1e4d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1e4e0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
1e4f0 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72  force a full gar
1e500 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  bage collection 
1e510 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79  now.  Report any
1e520 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1e530 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69      error that i
1e540 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
1e550 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20   we fail...     
1e560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
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 20 20 6f 62 6a 65              obje
1e590 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
1e5a0 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65  TotalMemory true
1e5b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 72  ..          } er
1e5c0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1e5d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1e5e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1e600 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1e610 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1e630 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
1e640 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
1e650 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
1e660 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
1e670 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
1e680 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1e690 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e6a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1e6b0 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63     set now [cloc
1e6c0 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
1e6d0 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74      } while {$st
1e6e0 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24  art <= $now && $
1e6f0 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20  now < $stop}..  
1e700 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1e710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e730 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e750 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
1e760 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1e770 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1e780 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e790 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1e7a0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1e7b0 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
1e7c0 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
1e7d0 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
1e7e0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1e7f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1e800 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1e810 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e820 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1e830 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1e840 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
1e850 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1e860 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f  the CLR after co
1e870 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d  llection... " \.
1e880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e890 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73   $result " bytes
1e8a0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1e8b0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1e8c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
1e8d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1e8e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e8f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1e900 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1e920 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
1e930 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
1e940 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
1e950 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
1e960 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
1e970 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1e980 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e990 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1e9a0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
1e9b0 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
1e9c0 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  unts { channel {
1e9d0 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
1e9e0 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
1e9f0 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
1ea00 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1ea10 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1ea20 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1ea30 20 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69   [haveSQLiteDefi
1ea40 6e 65 43 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54  neConstant COUNT
1ea50 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b  _HANDLE]} then {
1ea60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ea70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
1ea80 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20 68   each critical h
1ea90 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74  andle count to t
1eaa0 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73  he resulting lis
1eab0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1eac0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e         foreach n
1ead0 61 6d 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ame [list \..   
1eae0 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
1eaf0 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65  ionCount stateme
1eb00 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f  ntCount backupCo
1eb10 75 6e 74 20 62 6c 6f 62 43 6f 75 6e 74 5d 20 7b  unt blobCount] {
1eb20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1eb30 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1eb40 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1eb50 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1eb60 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1eb70 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1eb80 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75  Data.SQLite.Debu
1eb90 67 44 61 74 61 20 24 6e 61 6d 65 0d 0a 20 20 20  gData $name..   
1eba0 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20         } value] 
1ebb0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1ebc0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1ebd0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1ebf0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1ec00 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1ec20 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  -- critical hand
1ec30 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61  le count \"" $na
1ec40 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c  me "\" is " $val
1ec50 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ue \n]..        
1ec60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1ec70 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
1ec80 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  ult $value..    
1ec90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1ecb0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1ecc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1ecd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1ece0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ed00 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1ed10 69 6c 65 64 20 74 6f 20 67 65 74 20 63 72 69 74  iled to get crit
1ed20 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1ed30 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  t \"" \..       
1ed40 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
1ed50 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1ed60 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  n\t $value \n]..
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ed80 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ed90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
1eda0 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20  lseif {!$quiet} 
1edb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1edc0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1edd0 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61  E: The actual ha
1ede0 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20  ndle counts are 
1edf0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74  not available; t
1ee00 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a  herefore, just..
1ee10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ee20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
1ee30 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
1ee40 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1ee50 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
1ee60 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
1ee70 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c  ounts unavailabl
1ee80 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e\n"..      }...
1ee90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
1eea0 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
1eeb0 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f  .    proc shutdo
1eec0 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e  wnSQLite { chann
1eed0 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d  el {force false}
1eee0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
1eef0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1ef00 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20     # NOTE: Make 
1ef10 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65  sure that SQLite
1ef20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
1ef30 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74   completely shut
1ef40 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20  down.  This..   
1ef50 20 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73     #       is us
1ef60 65 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74  ed by tests that
1ef70 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72   change configur
1ef80 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e  ation options an
1ef90 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20  d/or those..    
1efa0 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e    #       that n
1efb0 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
1efc0 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74   logging is init
1efd0 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75  ialized (i.e. ju
1efe0 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20  st in case..    
1eff0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
1f000 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
1f010 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  y was initialize
1f020 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73  d in the process
1f030 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20   prior to..     
1f040 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
1f050 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69  iteLog class bei
1f060 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70  ng able to setup
1f070 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c   its logging cal
1f080 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23  lback)...      #
1f090 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c         Normally,
1f0a0 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c   this should onl
1f0b0 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
1f0c0 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64  f SQLite is load
1f0d0 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20  ed and..      # 
1f0e0 20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20        ready for 
1f0f0 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
1f100 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
1f110 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63  .      if {$forc
1f120 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65  e || [isSQLiteRe
1f130 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
1f140 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f150 20 23 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20   # BUGFIX: Make 
1f160 73 75 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c  sure that any "l
1f170 65 61 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69  eaked" transacti
1f180 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65  ons and/or conne
1f190 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
1f1a0 23 20 20 20 20 20 20 20 20 20 61 72 65 20 63 6c  #         are cl
1f1b0 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20  eaned up before 
1f1c0 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69  calling the nati
1f1d0 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63  ve shutdown func
1f1e0 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23  tion...        #
1f1f0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
1f200 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69  h transaction [i
1f210 6e 66 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  nfo transactions
1f220 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
1f230 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1f240 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f250 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51    System#Data#SQ
1f260 4c 69 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73  Lite#SQLiteTrans
1f270 61 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61  action#* $transa
1f280 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ction]} then {..
1f290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1f2a0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1f2b0 20 20 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e          sql tran
1f2c0 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
1f2d0 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20   $transaction.. 
1f2e0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
1f2f0 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
1f300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f310 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f330 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f340 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f360 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c         "---- rol
1f370 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20  led back leaked 
1f380 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20  transaction \"" 
1f390 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f3a0 20 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74         $transact
1f3b0 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ion \"\n]..     
1f3c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f3d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1f3e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f3f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1f400 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f410 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1f420 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1f430 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f440 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
1f450 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
1f460 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20  rollback leaked 
1f470 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20  transaction \"" 
1f480 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f490 20 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74         $transact
1f4a0 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ion "\", error: 
1f4b0 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e  " \n\t $error \n
1f4c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
1f4d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1f4e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1f4f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f500 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 62 20       foreach db 
1f510 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e  [info connection
1f520 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
1f530 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
1f540 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
1f550 20 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53     System#Data#S
1f560 51 4c 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e  QLite#SQLiteConn
1f570 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74  ection#* $db]} t
1f580 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f590 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73     if {[catch {s
1f5a0 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72  ql close $db} er
1f5b0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1f5c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f5d0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1f5e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f5f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1f600 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1f610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f620 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c          "---- cl
1f630 6f 73 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61  osed leaked data
1f640 62 61 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c  base \"" $db \"\
1f650 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1f660 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1f670 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f680 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1f690 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1f6b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1f6c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
1f6f0 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c  ailed to close l
1f700 65 61 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c  eaked database \
1f710 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1f720 20 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c            $db "\
1f730 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
1f740 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
1f750 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1f760 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f770 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f780 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1f790 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
1f7a0 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69  IX: Before calli
1f7b0 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
1f7c0 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c  utdown function,
1f7d0 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d   make sure both.
1f7e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f7f0 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41     of the PRAGMA
1f800 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
1f810 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
1f820 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
1f830 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1f840 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
1f850 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
1f860 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1f870 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1f880 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1f890 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1f8a0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1f8b0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1f8c0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
1f8d0 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74  iveMethods sqlit
1f8e0 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20  e3_shutdown..   
1f8f0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
1f900 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1f910 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1f920 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1f930 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1f940 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f950 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1f960 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
1f970 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
1f980 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  n()... ok: " $re
1f990 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1f9a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1f9b0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1f9c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1f9d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f9e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1f9f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1fa00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fa10 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
1fa20 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e  ite3_shutdown().
1fa30 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
1fa40 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
1fa50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fa60 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1fa70 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1fa80 63 20 67 65 74 53 65 74 74 69 6e 67 52 65 61 64  c getSettingRead
1fa90 43 6f 75 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 69  Count { name {vi
1faa0 61 46 69 6c 65 20 66 61 6c 73 65 7d 20 7d 20 7b  aFile false} } {
1fab0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
1fac0 65 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c  eConstraint buil
1fad0 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44  dConfiguration.D
1fae0 65 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20  ebug] && [catch 
1faf0 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
1fb00 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1fb10 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
1fb20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1fb30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1fb40 69 74 65 2e 44 65 62 75 67 44 61 74 61 20 47 65  ite.DebugData Ge
1fb50 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  tSettingReadCoun
1fb60 74 73 20 24 76 69 61 46 69 6c 65 0d 0a 20 20 20  ts $viaFile..   
1fb70 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64     } settingRead
1fb80 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
1fb90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
1fba0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
1fbb0 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65   $name] > 0} the
1fbc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1fbd0 66 20 7b 5b 24 73 65 74 74 69 6e 67 52 65 61 64  f {[$settingRead
1fbe0 43 6f 75 6e 74 73 20 54 72 79 47 65 74 56 61 6c  Counts TryGetVal
1fbf0 75 65 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d  ue $name value]}
1fc00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fc10 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1fc20 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1fc30 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1fc40 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1fc50 73 65 74 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d  setting \"" $nam
1fc60 65 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22  e "\" was read "
1fc70 20 24 76 61 6c 75 65 20 22 20 74 69 6d 65 73 22   $value " times"
1fc80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fc90 20 20 20 20 5b 65 78 70 72 20 7b 24 76 69 61 46      [expr {$viaF
1fca0 69 6c 65 20 3f 20 22 20 66 72 6f 6d 20 74 68 65  ile ? " from the
1fcb0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
1fcc0 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d  ile" : ""}] \n].
1fcd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
1fce0 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20  eturn $value..  
1fcf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fd00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1fd10 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43         set nameC
1fd20 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 52 65  ount [$settingRe
1fd30 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d  adCounts Count].
1fd40 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
1fd50 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20  alueCount 0.... 
1fd60 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1fd70 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70  foreach -alias p
1fd80 61 69 72 20 24 73 65 74 74 69 6e 67 52 65 61 64  air $settingRead
1fd90 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20  Counts {..      
1fda0 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65        incr value
1fdb0 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c  Count [$pair Val
1fdc0 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
1fdd0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1fde0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1fdf0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1fe00 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65          "---- se
1fe10 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72  tting \"" [$pair
1fe20 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65   Key] "\" was re
1fe30 61 64 20 22 20 5b 24 70 61 69 72 20 56 61 6c 75  ad " [$pair Valu
1fe40 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e] \..          
1fe50 20 20 20 20 20 20 22 20 74 69 6d 65 73 22 20 5b        " times" [
1fe60 65 78 70 72 20 7b 24 76 69 61 46 69 6c 65 20 3f  expr {$viaFile ?
1fe70 20 22 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66   " from the conf
1fe80 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 22 20  iguration file" 
1fe90 3a 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  : \..           
1fea0 20 20 20 20 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20       ""}] \n].. 
1feb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1fec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1fed0 6c 69 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20  list $nameCount 
1fee0 24 76 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20  $valueCount]..  
1fef0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1ff00 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
1ff10 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61  tring length $na
1ff20 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
1ff30 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ff40 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ff50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ff60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1ff70 73 65 74 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d  setting \"" $nam
1ff80 65 20 22 5c 22 20 77 61 73 20 6e 6f 74 20 72 65  e "\" was not re
1ff90 61 64 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46  ad" [expr {$viaF
1ffa0 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  ile ? \..       
1ffb0 20 20 20 20 20 22 20 66 72 6f 6d 20 74 68 65 20       " from the 
1ffc0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
1ffd0 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a  le" : ""}] \n]..
1ffe0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1fff0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
20000 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
20010 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
20020 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6e           "---- n
20030 6f 20 73 65 74 74 69 6e 67 73 20 77 65 72 65 20  o settings were 
20040 72 65 61 64 22 20 5b 65 78 70 72 20 7b 24 76 69  read" [expr {$vi
20050 61 46 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20  aFile ? \..     
20060 20 20 20 20 20 20 20 22 20 66 72 6f 6d 20 74 68         " from th
20070 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
20080 66 69 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d  file" : ""}] \n]
20090 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
200a0 20 20 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20     return -1..  
200b0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
200c0 20 67 65 74 4f 74 68 65 72 43 6f 75 6e 74 20 7b   getOtherCount {
200d0 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20   name } {..     
200e0 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
200f0 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67  aint buildConfig
20100 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26  uration.Debug] &
20110 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20  & [catch {..    
20120 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
20130 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
20140 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
20150 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20160 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62  .Data.SQLite.Deb
20170 75 67 44 61 74 61 20 47 65 74 4f 74 68 65 72 43  ugData GetOtherC
20180 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 6f  ounts..      } o
20190 74 68 65 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30  therCounts] == 0
201a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
201b0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
201c0 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d  ngth $name] > 0}
201d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
201e0 20 20 20 69 66 20 7b 5b 24 6f 74 68 65 72 43 6f     if {[$otherCo
201f0 75 6e 74 73 20 54 72 79 47 65 74 56 61 6c 75 65  unts TryGetValue
20200 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74   $name value]} t
20210 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20220 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20230 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
20240 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20250 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74          "---- ot
20260 68 65 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  her counter \"" 
20270 24 6e 61 6d 65 20 22 5c 22 20 68 61 73 20 76 61  $name "\" has va
20280 6c 75 65 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d  lue " $value \n]
20290 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
202a0 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20  return $value.. 
202b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
202c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
202d0 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
202e0 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75  Count [$otherCou
202f0 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  nts Count]..    
20300 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
20310 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
20320 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
20330 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
20340 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20  otherCounts {.. 
20350 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
20360 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69  valueCount [$pai
20370 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20  r Value]....    
20380 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
20390 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
203a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
203c0 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72  -- other counter
203d0 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d   \"" [$pair Key]
203e0 20 22 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22   "\" has value "
203f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20400 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
20410 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
20420 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20430 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61  return [list $na
20440 6d 65 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f  meCount $valueCo
20450 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  unt]..        }.
20460 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
20470 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
20480 6e 67 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d  ngth $name] > 0}
20490 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
204a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
204b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
204c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
204d0 20 20 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f    "---- other co
204e0 75 6e 74 65 72 20 5c 22 22 20 24 6e 61 6d 65 20  unter \"" $name 
204f0 22 5c 22 20 68 61 73 20 6e 6f 20 76 61 6c 75 65  "\" has no value
20500 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
20510 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
20520 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
20530 6e 65 6c 20 22 2d 2d 2d 2d 20 74 68 65 72 65 20  nel "---- there 
20540 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 75  are no other cou
20550 6e 74 65 72 73 5c 6e 22 0d 0a 20 20 20 20 20 20  nters\n"..      
20560 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
20570 6e 20 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n -1..    }.....
20580 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53      proc reportS
20590 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b  QLiteResources {
205a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ..            ch
205b0 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c  annel {quiet fal
205c0 73 65 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d  se} {reset true}
205d0 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
205e0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
205f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 70      # NOTE: If p
20600 6f 73 73 69 62 6c 65 2c 20 61 6c 77 61 79 73 20  ossible, always 
20610 72 65 73 65 74 20 74 68 65 20 63 61 63 68 65 64  reset the cached
20620 20 61 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74   assembly direct
20630 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
20640 20 20 20 61 6e 64 20 74 68 65 20 63 61 63 68 65     and the cache
20650 64 20 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74  d XML configurat
20660 69 6f 6e 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  ion file name...
20670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
20680 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
20690 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
206a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
206b0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
206c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
206d0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
206e0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
206f0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
20700 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
20710 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
20720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52  .              R
20730 65 73 65 74 43 61 63 68 65 64 41 73 73 65 6d 62  esetCachedAssemb
20740 6c 79 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  lyDirectory..   
20750 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
20760 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20770 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
20780 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
20790 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
207a0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65  annel "---- rese
207b0 74 20 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c  t cached assembl
207c0 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22 0d 0a  y directory\n"..
207d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
207e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
207f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
20800 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20810 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20820 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20830 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20840 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
20850 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
20860 20 72 65 73 65 74 20 63 61 63 68 65 64 20 61 73   reset cached as
20870 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79  sembly directory
20880 2c 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  , " \..         
20890 20 20 20 20 20 20 20 22 65 72 72 6f 72 3a 20 22         "error: "
208a0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
208b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
208c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
208d0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
208e0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
208f0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
20900 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
20920 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20930 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
20940 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
20950 20 20 20 20 20 52 65 73 65 74 43 61 63 68 65 64       ResetCached
20960 58 6d 6c 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  XmlConfigFileNam
20970 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72  e..        } err
20980 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
20990 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
209a0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
209b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
209c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
209d0 2d 20 72 65 73 65 74 20 63 61 63 68 65 64 20 58  - reset cached X
209e0 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ML configuration
209f0 20 66 69 6c 65 20 6e 61 6d 65 5c 6e 22 0d 0a 20   file name\n".. 
20a00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
20a10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
20a20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20a30 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20a40 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20a50 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20a60 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20a70 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
20a80 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
20a90 72 65 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c  reset cached XML
20aa0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
20ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20ac0 20 20 20 20 22 66 69 6c 65 20 6e 61 6d 65 2c 20      "file name, 
20ad0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
20ae0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
20af0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
20b00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
20b10 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
20b20 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
20b30 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64  , report on (and
20b40 20 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29   possibly reset)
20b50 20 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20   the runtime..  
20b60 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66      #       conf
20b70 69 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73  iguration statis
20b80 74 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tics...      #..
20b90 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
20ba0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
20bb0 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
20bc0 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
20bd0 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  int buildConfigu
20be0 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74  ration.Debug]} t
20bf0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
20c00 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
20c10 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
20c20 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
20c30 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
20c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
20c50 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
20c60 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 53  e.DebugData GetS
20c70 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
20c80 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
20c90 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  } settingReadCou
20ca0 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
20cb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
20cc0 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
20cd0 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43  tingReadCounts C
20ce0 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  ount]..         
20cf0 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20   set valueCount 
20d00 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  0....          o
20d10 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
20d20 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
20d30 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
20d40 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
20d50 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61   valueCount [$pa
20d60 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20  ir Value]....   
20d70 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
20d80 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20d90 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20da0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
20db0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20dd0 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24  - setting \"" [$
20de0 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61  pair Key] "\" wa
20df0 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20  s read " \..    
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24                [$
20e10 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69  pair Value] " ti
20e20 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  mes\n"]..       
20e30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20e40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20e50 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
20e60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
20e70 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
20e90 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
20ea0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
20eb0 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
20ec0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
20ed0 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75  Data.SQLite.Debu
20ee0 67 44 61 74 61 20 43 6c 65 61 72 53 65 74 74 69  gData ClearSetti
20ef0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 66 61 6c  ngReadCounts fal
20f00 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
20f10 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
20f20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20f30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
20f40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20f50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20f60 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20f70 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20f80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20f90 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20  - reset setting 
20fa0 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 74  statistics for t
20fb0 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d  he previous " \.
20fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20fd0 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20       $nameCount 
20fe0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
20ff0 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75  alueCount " valu
21000 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20  es read\n"]..   
21010 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21020 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
21030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21040 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
21050 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21060 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
21070 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21080 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21090 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
210a0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
210b0 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20  o reset setting 
210c0 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 22  statistics for "
210d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
210e0 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65          "the pre
210f0 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75  vious " $nameCou
21100 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
21110 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a   $valueCount \..
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21130 20 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61      " values rea
21140 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  d, error: " \n\t
21150 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
21160 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
21170 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
21180 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21190 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
211a0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
211b0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
211c0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
211d0 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d  Public -alias \.
211e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
211f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
21200 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 53  e.DebugData GetS
21210 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
21220 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
21230 20 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64   settingFileRead
21240 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  Counts] == 0} th
21250 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21260 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
21270 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
21280 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
21290 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
212a0 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
212b0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
212c0 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
212d0 20 24 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61   $settingFileRea
212e0 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20  dCounts {..     
212f0 20 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75         incr valu
21300 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61  eCount [$pair Va
21310 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lue]....        
21320 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
21330 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21340 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
21350 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21360 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21370 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
21380 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20  ting \"" [$pair 
21390 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61  Key] "\" was rea
213a0 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
213b0 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
213c0 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 20 66  Value] " times f
213d0 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72  rom the configur
213e0 61 74 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a  ation file\n"]..
213f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21400 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21410 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
21420 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21430 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
21440 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
21450 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
21460 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
21470 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21490 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
214a0 74 65 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65  te.DebugData Cle
214b0 61 72 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75  arSettingReadCou
214c0 6e 74 73 20 74 72 75 65 0d 0a 20 20 20 20 20 20  nts true..      
214d0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
214e0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
214f0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
21500 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
21510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21520 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
21530 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
21560 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
21570 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
21580 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
21590 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65             $name
215a0 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e  Count " names an
215b0 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20  d " $valueCount 
215c0 22 20 76 61 6c 75 65 73 20 72 65 61 64 20 22 20  " values read " 
215d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
215e0 20 20 20 20 20 20 20 22 66 72 6f 6d 20 74 68 65         "from the
215f0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
21600 69 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ile\n"]..       
21610 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21620 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21640 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21660 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21670 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21690 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
216a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
216b0 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
216c0 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a  istics for " \..
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f 75      "the previou
216f0 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22  s " $nameCount "
21700 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61   names and " $va
21710 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20  lueCount \..    
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 22 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  " values read fr
21740 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  om the configura
21750 74 69 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72  tion file, error
21760 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20  : " \n\t \..    
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
21790 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
217a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
217b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
217c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
217d0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
217e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
217f0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
21800 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
21820 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
21830 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 4f 74  .DebugData GetOt
21840 68 65 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20  herCounts..     
21850 20 20 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73     } otherCounts
21860 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
21870 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 61            set na
21880 6d 65 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43  meCount [$otherC
21890 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
218a0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
218b0 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
218c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
218d0 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
218e0 20 24 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d   $otherCounts {.
218f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63  .            inc
21900 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
21910 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
21920 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
21930 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
21950 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21960 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
21980 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72  -- other counter
21990 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d   \"" [$pair Key]
219a0 20 22 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22   "\" has value "
219b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
219c0 20 20 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c        [$pair Val
219d0 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ue] \n]..       
219e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
219f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21a00 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
21a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21a20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
21a40 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
21a50 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c  s +NonPublic -al
21a60 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
21a70 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
21a80 44 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75  Data.SQLite.Debu
21a90 67 44 61 74 61 20 43 6c 65 61 72 4f 74 68 65 72  gData ClearOther
21aa0 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  Counts..        
21ab0 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
21ac0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
21ad0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
21ae0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
21b00 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
21b10 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 22 2d 2d 2d 2d 20 72 65 73 65 74 20 6f 74 68 65  "---- reset othe
21b40 72 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 74  r counters for t
21b50 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d  he previous " \.
21b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b70 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20       $nameCount 
21b80 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
21b90 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75  alueCount " valu
21ba0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
21bb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21bc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21be0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21c00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
21c10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
21c40 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73  G: failed to res
21c50 65 74 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72  et other counter
21c60 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20  s for " \..     
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
21c80 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24  the previous " $
21c90 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
21ca0 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
21cb0 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  unt \..         
21cc0 20 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c             " val
21cd0 75 65 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  ues, error: " \n
21ce0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
21cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
21d00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21d10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21d20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
21d30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
21d40 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
21d50 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20  mand] && \..    
21d60 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
21d70 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
21d80 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f  INTEROP_VIRTUAL_
21d90 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20  TABLE] && \..   
21da0 20 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69         [haveSQLi
21db0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
21dc0 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59   TRACK_MEMORY_BY
21dd0 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  TES]} then {..  
21de0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
21df0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
21e00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
21e10 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
21e20 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
21e30 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
21e40 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
21e50 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
21e60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
21e70 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
21e80 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
21e90 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
21ea0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
21eb0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
21ec0 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74  ory bytesAllocat
21ed0 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65  ed..        } me
21ee0 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
21ef0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
21f00 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21f10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
21f20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
21f30 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
21f40 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
21f50 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21f60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
21f70 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
21f80 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
21f90 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
21fa0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
21fb0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21fc0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21fd0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
21fe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
21ff0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22000 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
22010 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22020 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22030 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
22040 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
22050 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
22060 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
22070 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
22080 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
22090 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
220a0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
220b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
220c0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
220d0 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
220e0 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c   maximumBytesAll
220f0 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  ocated..        
22100 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
22110 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22120 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
22130 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22140 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
22150 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
22160 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
22170 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
22180 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
22190 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
221a0 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
221b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
221c0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
221d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
221e0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
221f0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
22200 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
22210 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
22220 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
22230 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
22240 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
22250 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
22260 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
22270 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
22280 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
22290 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
222a0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
222b0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
222c0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
222d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
222e0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
222f0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
22300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
22310 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22320 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
22330 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65  thods sqlite3_me
22340 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20  mory_used..     
22350 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
22360 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22370 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22380 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22390 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
223a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
223b0 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
223c0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
223d0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
223e0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
223f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
22400 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
22410 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
22420 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
22430 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ?..          #..
22440 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
22450 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
22460 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
22470 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
22480 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22490 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
224a0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
224b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
224c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
224d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
224e0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
224f0 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20  available....   
22500 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22510 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22520 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
22530 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
22540 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
22550 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
22560 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
22570 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f  lt $memory; # NO
22580 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72  TE: Return memor
22590 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20  y in-use to our 
225a0 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20  caller.....     
225b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
225c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
225d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
225e0 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72  -- maximum memor
225f0 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
22600 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
22610 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
22620 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
22630 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
22640 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
22650 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
22660 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
22670 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
22680 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22690 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
226a0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
226b0 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
226c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
226d0 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
226e0 65 72 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20  er 0..        } 
226f0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
22700 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22710 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
22720 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22730 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
22740 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
22750 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
22760 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
22770 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
22780 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22790 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
227a0 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20  aybe the SQLite 
227b0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
227c0 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20  unavailable?..  
227d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
227e0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
227f0 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
22800 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22810 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22820 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22830 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22840 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
22850 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22860 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
22870 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
22880 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c  t memory unavail
22890 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  able....        
228a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
228b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
228c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
228d0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
228e0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
228f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
22900 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
22910 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22920 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
22930 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  $channel..      
22940 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
22950 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
22960 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
22970 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
22980 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
22990 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e  se by the CLR...
229a0 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
229b0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
229c0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
229d0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
229e0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
229f0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
22a00 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
22a10 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
22a20 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  e..        } mem
22a30 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
22a40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
22a50 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65  {[string is inte
22a60 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d  ger -strict $mem
22a70 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
22a80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
22a90 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
22ab0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
22ac0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
22ad0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
22ae0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
22af0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
22b00 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
22b10 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a  memory invalid..
22b20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
22b30 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
22b40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22b50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
22b60 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
22b70 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
22b80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
22b90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
22ba0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
22bb0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
22bc0 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
22bd0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
22be0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22bf0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22c00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
22c10 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
22c20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
22c30 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
22c40 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
22c50 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65  mory unavailable
22c60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
22c70 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
22c80 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
22c90 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
22ca0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
22cb0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
22cc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
22cd0 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
22ce0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
22cf0 63 20 72 65 73 65 74 53 51 4c 69 74 65 44 69 72  c resetSQLiteDir
22d00 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e  ectories { chann
22d10 65 6c 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20  el native } {.. 
22d20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
22d30 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
22d40 20 75 73 65 20 74 68 65 20 6e 61 74 69 76 65 20   use the native 
22d50 41 50 49 20 28 76 69 61 20 74 68 65 20 6d 61 6e  API (via the man
22d60 61 67 65 64 20 61 73 73 65 6d 62 6c 79 29 3f 0d  aged assembly)?.
22d70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
22d80 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
22d90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
22da0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
22db0 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
22dc0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
22dd0 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
22de0 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
22df0 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
22e00 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
22e10 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
22e20 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
22e30 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  oth...        # 
22e40 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20        Since the 
22e50 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
22e60 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
22e70 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
22e80 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e,..        #   
22e90 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20      use it...   
22ea0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22eb0 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
22ec0 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b  } {$index < 3} {
22ed0 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
22ee0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
22ef0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
22f00 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
22f10 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
22f20 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
22f30 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
22f40 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
22f50 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
22f80 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64  t_directory $ind
22f90 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  ex null..       
22fa0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
22fb0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22fc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
22fd0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
22fe0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
22ff0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
23000 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
23010 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
23020 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
23030 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
23040 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
23050 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
23060 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
23070 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23080 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23090 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
230a0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
230b0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
230c0 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
230d0 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
230e0 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
230f0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
23100 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
23110 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23120 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
23130 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
23140 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23150 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
23160 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
23170 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
23180 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
23190 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
231a0 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
231b0 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
231c0 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
231d0 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
231e0 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68  #       Since th
231f0 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
23200 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
23210 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
23220 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
23230 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 76   appear to be av
23240 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65  ailable, use the
23250 20 61 73 73 6f 63 69 61 74 65 64 20 50 52 41 47   associated PRAG
23260 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20  MA commands..   
23270 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73       #       ins
23280 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  tead...        #
23290 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
232a0 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
232b0 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
232c0 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
232d0 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
232e0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
232f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
23300 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
23310 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
23320 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
23330 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
23340 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d  ql $sql} result]
23350 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
23360 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
23370 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
23380 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
23390 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
233a0 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20  xecute PRAGMA " 
233b0 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
233c0 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ok: \"" \..     
233d0 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
233e0 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
233f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
23400 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
23410 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
23420 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
23430 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78          "---- ex
23440 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24  ecute PRAGMA " $
23450 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65  directory "... e
23460 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
23470 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
23480 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
23490 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
234a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
234b0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
234c0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
234d0 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61  irectories { cha
234e0 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73  nnel {reset fals
234f0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
23500 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
23510 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69  heck if the sqli
23520 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
23530 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
23540 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
23550 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
23560 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
23570 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
23580 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
23590 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77  nction sqlite3_w
235a0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
235b0 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
235c0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
235d0 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74  : This call to t
235e0 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
235f0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
23600 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
23610 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
23620 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20  invalid value 0 
23630 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72  for the first ar
23640 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  gument.  This co
23650 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a  de is designed..
23660 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
23670 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e   check if callin
23680 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  g the function w
23690 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63  ill raise an exc
236a0 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20  eption (i.e...  
236b0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
236c0 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66  actual result of
236d0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
236e0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73  es not matter as
236f0 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20   long as no..   
23700 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
23710 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29  tory is changed)
23720 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
23730 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73    if {[isWindows
23740 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20  ] && [catch {.. 
23750 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
23760 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
23770 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
23780 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
23790 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
237a0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
237b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
237c0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
237d0 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a  rectory 0 null..
237e0 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
237f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
23800 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23810 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71  : Calling the sq
23820 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
23830 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
23840 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20  on does not..   
23850 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 75       #       cau
23860 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b  se an exception;
23870 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d   therefore, it m
23880 75 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65  ust be available
23890 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20   (i.e...        
238a0 23 20 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f  #       even tho
238b0 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
238c0 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72  turn a failure r
238d0 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68  eturn code in th
238e0 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
238f0 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20      case)...    
23900 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
23910 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c  ddConstraint sql
23920 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
23930 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20  irectory....    
23940 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23950 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20  el yes\n....    
23960 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
23970 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20   NOTE: Does our 
23980 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72  caller want to r
23990 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f  eset the directo
239a0 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23  ries?..        #
239b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
239c0 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
239d0 20 20 20 20 20 20 20 20 72 65 73 65 74 53 51 4c          resetSQL
239e0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
239f0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20  channel true..  
23a00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
23a10 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
23a20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23a30 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  no\n....        
23a40 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
23a50 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c  E: Does our call
23a60 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74  er want to reset
23a70 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73   the directories
23a80 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  ?  This can only
23a90 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23aa0 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69    be performed i
23ab0 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64  f SQLite is load
23ac0 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72  ed and ready for
23ad0 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
23ae0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
23af0 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20    suite...      
23b00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
23b10 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53 51  {$reset && [isSQ
23b20 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
23b30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
23b40 73 65 74 53 51 4c 69 74 65 44 69 72 65 63 74 6f  setSQLiteDirecto
23b50 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 66 61  ries $channel fa
23b60 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lse..        }..
23b70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23b80 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
23b90 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
23ba0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
23bb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
23bc0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
23bd0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
23be0 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
23bf0 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
23c00 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
23c10 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
23c20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
23c30 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
23c40 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
23c50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
23c60 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
23c70 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
23c80 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
23c90 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
23ca0 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
23cb0 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
23cc0 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
23cd0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23ce0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23cf0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
23d00 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
23d10 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
23d20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
23d30 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
23d40 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
23d50 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
23d60 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
23d70 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
23d80 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
23d90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23da0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23db0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
23dc0 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
23dd0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
23de0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
23df0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
23e00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
23e10 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
23e20 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
23e30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23e40 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
23e50 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
23e60 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
23e70 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
23e80 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
23e90 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
23ea0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
23eb0 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
23ec0 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
23ed0 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
23ee0 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
23ef0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
23f00 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
23f10 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
23f20 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
23f30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
23f40 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23f50 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
23f60 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
23f70 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
23f80 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
23f90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
23fa0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
23fb0 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
23fc0 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
23fd0 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
23fe0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
23ff0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
24000 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
24010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24020 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
24030 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
24040 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
24050 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
24060 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
24070 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
24080 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
24090 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
240a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
240b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
240d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
240e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
24100 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
24110 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
24120 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
24150 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
24160 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
24170 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
24180 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
24190 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
241a0 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
241b0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
241c0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
241d0 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
241e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
241f0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
24200 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24210 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24220 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24230 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
24240 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
24250 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
24260 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65   to load per-use
24270 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  r settings file 
24280 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
24290 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
242a0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
242b0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
242c0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
242e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
242f0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
24300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24310 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
24320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
24330 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
24340 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
24350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24360 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
24370 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
24380 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
24390 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
243b0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
243c0 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73  ame "\", it does
243d0 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
243e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
243f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
24400 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24410 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
24420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24450 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
24460 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
24470 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
24480 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e  orm(host)]} then
24490 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
244a0 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69  t hostSettingsFi
244b0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
244c0 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
244d0 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
244e0 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
244f0 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
24500 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
24510 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61  atform(host) .ea
24520 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
24530 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
24540 73 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67  sts $hostSetting
24550 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
24560 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24570 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
24580 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
24590 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
245a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
245b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
245c0 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
245d0 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
245e0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
245f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24600 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
24610 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
24620 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
24630 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
24640 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
24650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
24660 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
24670 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69  ource $hostSetti
24680 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
24690 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
246a0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
246b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
246c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
246e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
246f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
24720 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
24730 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73  er-host settings
24740 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
24770 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
24780 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
24790 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
247a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
247b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
247c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
247d0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
247e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
247f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24800 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24810 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
24820 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
24830 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
24840 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
24850 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
24860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24870 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
24880 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
24890 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
248a0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
248b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
248c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
248d0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
248e0 20 20 20 20 70 72 6f 63 20 63 6f 70 79 53 61 6d      proc copySam
248f0 70 6c 65 44 61 74 61 62 61 73 65 46 69 6c 65 73  pleDatabaseFiles
24900 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c   {} {..      upl
24910 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20  evel 1 {..      
24920 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
24930 4f 54 45 3a 20 43 6f 70 79 20 28 6f 72 20 72 65  OTE: Copy (or re
24940 2d 63 6f 70 79 29 20 74 68 65 20 72 65 66 65 72  -copy) the refer
24950 65 6e 63 65 20 64 61 74 61 62 61 73 65 20 66 69  ence database fi
24960 6c 65 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  le used for this
24970 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24980 20 20 75 6e 69 74 20 74 65 73 74 20 74 6f 20 74    unit test to t
24990 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
249a0 72 79 20 69 6e 20 63 61 73 65 20 69 74 20 68 61  ry in case it ha
249b0 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 0d 0a  s been changed..
249c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
249d0 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 74 65  by a previous te
249e0 73 74 20 72 75 6e 2e 0d 0a 20 20 20 20 20 20 20  st run...       
249f0 20 23 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65   #..        file
24a00 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 6e 6f   copy -force $no
24a10 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
24a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
24a30 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c  le join [getBuil
24a40 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c 73 65  dDirectory false
24a50 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f  ] [file tail $no
24a60 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d  rthwindEfDbFile]
24a70 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
24a80 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
24a90 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c  unSQLiteTestProl
24aa0 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
24ab0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
24ac0 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
24ad0 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67  ur custom prolog
24ae0 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
24af0 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
24b00 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
24b10 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
24b20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
24b30 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f  xists ::no(prolo
24b40 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
24b50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
24b60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
24b70 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65  Load the "before
24b80 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
24b90 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
24ba0 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
24bb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
24bc0 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
24bd0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24be0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
24bf0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
24c00 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
24c10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65  test_channel .be
24c20 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fore]....       
24c30 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
24c40 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
24c50 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
24c60 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 3b 20  d is available; 
24c70 69 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65  if not, add some
24c80 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
24c90 20 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20    shims to make 
24ca0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 72  the test suite r
24cb0 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20  un smoother...  
24cc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24cd0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f   checkForSQLiteO
24ce0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a  bjectCommand $::
24cf0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
24d00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24d10 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
24d20 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  mine the names o
24d30 66 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61  f the native pla
24d40 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74  tform and archit
24d50 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20  ecture...       
24d60 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
24d70 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69  platform [getBui
24d80 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d  ldPlatform true]
24d90 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 72  ..        set ar
24da0 63 68 69 74 65 63 74 75 72 65 20 5b 61 72 63 68  chitecture [arch
24db0 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66  itectureForPlatf
24dc0 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  orm $platform]..
24dd0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
24de0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
24df0 77 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 61  w the platform a
24e00 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65 20  nd architecture 
24e10 75 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63  used to help loc
24e20 61 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ate the..       
24e30 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20   #       native 
24e40 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20  build files...  
24e50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24e60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
24e70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
24e80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
24e90 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d    "---- platform
24ea0 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61   for locating na
24eb0 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
24ec0 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   is \"" \..     
24ed0 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
24ee0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
24ef0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
24f00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24f10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
24f20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65     "---- archite
24f30 63 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74 69  cture for locati
24f40 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20  ng native build 
24f50 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a  files is \"" \..
24f60 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63              $arc
24f70 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d  hitecture \"\n].
24f80 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24f90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
24fa0 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f  ild a list of co
24fb0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
24fc0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
24fd0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
24fe0 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
24ff0 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
25000 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
25010 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
25020 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d  e.dll.config]...
25030 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25040 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
25050 64 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69  d a list of auxi
25060 6c 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65  liary Managed De
25070 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e  bugging Assistan
25080 74 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20  ts (MDA)..      
25090 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67    #       config
250a0 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68  uration files th
250b0 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
250c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
250d0 20 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46    set mdaConfigF
250e0 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
250f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 61  ..            Ea
25100 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d  gleShell32.exe.m
25110 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c  da.config Instal
25120 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ler.exe.mda.conf
25130 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ig \..          
25140 20 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63    test.exe.mda.c
25150 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65  onfig testlinq.e
25160 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
25170 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
25180 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  tef6.exe.mda.con
25190 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fig]....        
251a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
251b0 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
251c0 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69  t of external fi
251d0 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
251e0 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20  le.  Some of..  
251f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
25200 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65  ese files may be
25210 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d   native and/or m
25220 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
25230 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20  s that are..    
25240 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
25250 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  ired to perform 
25260 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a  various tests...
25270 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25280 20 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46     set externalF
25290 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
252a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
252b0 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46  ile join EntityF
252c0 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74  ramework lib [st
252d0 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46  ring map [list F
252e0 78 20 22 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20  x ""] \..       
252f0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6d 61 70       [string map
25300 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20   [list netFx451 
25310 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 35 32  netFx45 netFx452
25320 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36   netFx45 netFx46
25330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25340 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36 31  netFx45 netFx461
25350 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 36   netFx45 netFx46
25360 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34  2 netFx45 netFx4
25370 37 20 6e 65 74 46 78 34 35 20 5c 0d 0a 20 20 20  7 netFx45 \..   
25380 20 20 20 20 20 20 20 20 20 6e 65 74 46 78 34 37           netFx47
25390 31 20 6e 65 74 46 78 34 35 20 6e 65 74 53 74 61  1 netFx45 netSta
253a0 6e 64 61 72 64 32 30 20 6e 65 74 46 78 34 35 5d  ndard20 netFx45]
253b0 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
253c0 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
253d0 20 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72    EntityFramewor
253e0 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  k.dll]]....     
253f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25400 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
25410 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61  list of native a
25420 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
25430 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
25440 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25450 20 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65    set nativeFile
25460 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  Names [list]....
25470 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
25480 70 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e  pend nativeFileN
25490 61 6d 65 73 20 5b 67 65 74 4e 61 74 69 76 65 4c  ames [getNativeL
254a0 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
254b0 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 65 76  nly]..        ev
254c0 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76  al lappend nativ
254d0 65 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 49  eFileNames [getI
254e0 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79 46 69  nteropAssemblyFi
254f0 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a  leNamesOnly]....
25500 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25510 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
25520 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78   the list of mix
25530 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
25540 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
25550 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
25560 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
25570 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  ixedFileNames [l
25580 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ist]....        
25590 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
255a0 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
255b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
255c0 20 6c 61 70 70 65 6e 64 20 6d 69 78 65 64 46 69   lappend mixedFi
255d0 6c 65 4e 61 6d 65 73 20 53 79 73 74 65 6d 2e 44  leNames System.D
255e0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a  ata.SQLite.dll..
255f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25600 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25610 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
25620 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
25630 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  d assembly files
25640 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
25650 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25660 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67 65 64       set managed
25670 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
25680 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
25690 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
256a0 65 2e 4c 69 6e 71 2e 64 6c 6c 20 53 79 73 74 65  e.Linq.dll Syste
256b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
256c0 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  6.dll]....      
256d0 20 20 69 66 20 7b 21 5b 68 61 73 52 75 6e 74 69    if {![hasRunti
256e0 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
256f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25700 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 61 6e 61      lappend mana
25710 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73  gedFileNames Sys
25720 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
25730 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  dll..        }..
25740 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
25750 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
25760 77 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 69  w the various li
25770 73 74 73 20 6f 66 20 66 69 6c 65 20 6e 61 6d 65  sts of file name
25780 73 20 74 68 61 74 20 61 72 65 20 68 61 6e 64 6c  s that are handl
25790 65 64 20 62 79 20 74 68 69 73 0d 0a 20 20 20 20  ed by this..    
257a0 20 20 20 20 23 20 20 20 20 20 20 20 70 72 6f 63      #       proc
257b0 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20  edure...        
257c0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
257d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
257e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
257f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
25800 2d 20 6c 69 73 74 20 6f 66 20 5c 22 63 6f 6e 66  - list of \"conf
25810 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65  iguration\" file
25820 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a   names is: " \..
25830 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6e              $con
25840 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5c 6e 5d  figFileNames \n]
25850 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
25860 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
25870 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
25880 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
25890 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 4d 44 41  -- list of \"MDA
258a0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22   configuration\"
258b0 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
258c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
258d0 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
258e0 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ames \n]....    
258f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
25900 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
25910 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
25920 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20       "---- list 
25930 6f 66 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20  of \"external\" 
25940 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
25950 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
25960 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  mes \n]....     
25970 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
25980 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
25990 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
259a0 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f      "---- list o
259b0 66 20 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c  f \"native\" fil
259c0 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 24 6e  e names is: " $n
259d0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5c  ativeFileNames \
259e0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  n]....        tp
259f0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
25a00 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
25a10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
25a20 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c 22 6d  ---- list of \"m
25a30 69 78 65 64 5c 22 20 66 69 6c 65 20 6e 61 6d 65  ixed\" file name
25a40 73 20 69 73 3a 20 22 20 24 6d 69 78 65 64 46 69  s is: " $mixedFi
25a50 6c 65 4e 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20  leNames \n].... 
25a60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
25a70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
25a80 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
25a90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69          "---- li
25aa0 73 74 20 6f 66 20 5c 22 6d 61 6e 61 67 65 64 5c  st of \"managed\
25ab0 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a  " file names is:
25ac0 20 22 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e   " $managedFileN
25ad0 61 6d 65 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ames \n]....    
25ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25af0 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e   NOTE: Remove an
25b00 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  y test constrain
25b10 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  ts that refer to
25b20 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f   the native and/
25b30 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
25b40 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
25b50 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
25b60 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73  we handle unless
25b70 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d   forbidden from.
25b80 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25b90 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20   doing so...    
25ba0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
25bb0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
25bc0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f   ::no(sqliteRemo
25bd0 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  veConstraints)]}
25be0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25bf0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
25c00 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e  ame $configFileN
25c10 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
25c20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
25c30 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
25c40 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
25c50 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
25c60 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
25c70 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
25c80 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
25c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25ca0 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
25cb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
25cc0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
25cd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
25ce0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
25cf0 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e  fileName $extern
25d00 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  alFileNames {.. 
25d10 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
25d20 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
25d30 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66  endArgs file_ [f
25d40 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
25d50 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  me]]..          
25d60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
25d70 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
25d80 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
25d90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25da0 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
25db0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
25dc0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
25dd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
25de0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
25df0 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46  fileName $mixedF
25e00 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
25e10 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
25e20 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
25e30 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
25e40 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
25e50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
25e60 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
25e70 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
25e80 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
25e90 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
25ea0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
25eb0 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
25ec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
25ed0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25ee0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
25ef0 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53  NOTE: Skip all S
25f00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
25f10 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68  e related file h
25f20 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e  andling (deletin
25f30 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g,..        #   
25f40 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64      copying, and
25f50 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73   loading) if ins
25f60 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
25f70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
25f80 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
25f90 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29  :no(sqliteFiles)
25fa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25fb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25fc0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
25fd0 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  rying to delete 
25fe0 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
25ff0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
26000 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
26010 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
26020 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
26030 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
26040 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26050 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
26060 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
26070 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29  liteConfigFiles)
26080 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26090 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
260a0 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
260b0 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
260d0 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
260e0 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
260f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
26100 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
26110 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
26120 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
26130 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78  o(deleteSqliteEx
26140 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
26150 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26160 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
26170 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
26180 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
261a0 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
261b0 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d  $fileName false.
261c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
261d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
261e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
261f0 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
26200 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
26210 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
26220 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
26230 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
26240 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
26250 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
26260 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
26270 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
26280 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46  eteSqliteNativeF
26290 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
262b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
262c0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
262d0 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65 46  eImplicitNativeF
262e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
26310 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
26320 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
26330 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
26340 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
26350 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
26360 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26370 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
26380 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
26390 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
263a0 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d  eleteSqliteNonIm
263b0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
263c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
263d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
263e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
263f0 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f  leteSqlitePlatfo
26400 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
26430 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
26440 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
26460 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
26470 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
26480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26490 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
264a0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
264b0 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
264d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
264e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
264f0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
26500 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
26510 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69 74  leteSqliteArchit
26520 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
26530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
26540 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
26550 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
26560 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
26570 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26580 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
26590 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
265a0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
265c0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
265d0 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
265e0 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
265f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
26600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
26610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26630 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
26640 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
26650 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
26660 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20  teMixedFiles)]} 
26670 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
26680 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
26690 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
266a0 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
266b0 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
266c0 20 73 65 74 2c 20 64 65 6c 65 74 65 20 69 6d 70   set, delete imp
266d0 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20 20  licit..         
266e0 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
266f0 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
26700 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e 20   files as well. 
26710 20 54 68 69 73 20 72 75 6e 74 69 6d 65 20 6f 70   This runtime op
26720 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
26730 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63      #       chec
26740 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68 65  k is handled whe
26750 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 6c  n building the l
26760 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f 64  ist of mixed-mod
26770 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
26780 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
26790 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a 20  y file names... 
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
267c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
267d0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
267e0 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46 69  eImplicitMixedFi
267f0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
26800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
26810 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
26820 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
26830 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26840 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
26850 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
26860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26870 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
26880 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
26890 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
268a0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
268b0 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  eteSqliteNonImpl
268c0 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
268d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
268e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
268f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
26900 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  teSqlitePlatform
26910 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26930 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
26940 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
26950 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26960 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
26970 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
26980 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
269b0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
269c0 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
269d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
269f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26a00 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
26a10 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
26a20 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
26a30 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
26a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a50 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
26a60 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
26a70 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
26aa0 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d  me $mixedFileNam
26ab0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
26ac0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
26ad0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
26ae0 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74  eName $architect
26af0 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
26b00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26b10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
26b20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
26b30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
26b40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
26b50 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
26b60 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61  o(deleteSqliteMa
26b70 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  nagedFiles)]} th
26b80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26b90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
26ba0 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
26bb0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
26bc0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
26bd0 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
26be0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
26bf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26c00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26c10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
26c20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
26c30 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74  OTE: Check for t
26c40 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20  he "autoSelect" 
26c50 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20  runtime option. 
26c60 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20   If present,..  
26c70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26c80 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d  attempt to autom
26c90 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20  atically select 
26ca0 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61  the first availa
26cb0 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ble..          #
26cc0 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72         build (or
26cd0 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53   "release") of S
26ce0 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d  QLite and System
26cf0 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20  .Data.SQLite..  
26d00 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26d10 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
26d20 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
26d30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26d40 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
26d50 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53  timeOption autoS
26d60 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  elect]} then {..
26d70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
26d80 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  ![checkForSQLite
26d90 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
26da0 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68  hannel true]} th
26db0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
26dc0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
26dd0 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
26de0 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  st_channel true.
26df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
26e00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
26e10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
26e20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
26e30 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72  ip trying to ver
26e40 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64 69  ify the build di
26e50 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72  rectory if instr
26e60 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20  ucted;..        
26e70 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77    #       otherw
26e80 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69  ise, make sure i
26e90 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  t actually exist
26ea0 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e  s or halt the en
26eb0 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  tire..          
26ec0 23 20 20 20 20 20 20 20 74 65 73 74 69 6e 67 20  #       testing 
26ed0 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f  process if it do
26ee0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20  es not exist... 
26ef0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
26f00 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
26f10 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72   exists ::no(ver
26f20 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72  ifyBuildDirector
26f30 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  y)]} then {..   
26f40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
26f50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26f60 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
26f70 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
26f80 72 79 20 4d 55 53 54 20 65 78 69 73 74 20 61 73  ry MUST exist as
26f90 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   a..            
26fa0 23 20 20 20 20 20 20 20 76 61 6c 69 64 20 64 69  #       valid di
26fb0 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20  rectory for the 
26fc0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20  testing process 
26fd0 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20  to continue...  
26fe0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
26ff0 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
27000 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64  ectory [getBuild
27010 44 69 72 65 63 74 6f 72 79 20 66 61 6c 73 65 5d  Directory false]
27020 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
27030 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
27040 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c  s $directory] ||
27050 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27060 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
27070 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
27080 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
27090 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
270a0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
270b0 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f  E: Just prior to
270c0 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e   actually haltin
270d0 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
270e0 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20  ocess,..        
270f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
27100 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68  d an error to th
27110 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e  e test log file.
27120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27130 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
27140 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
27150 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
27160 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
27170 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
27180 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
27190 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
271a0 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
271b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
271c0 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
271d0 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a  ing halted\n"]..
271e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
271f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
27200 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67   # NOTE: Raising
27210 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20   a script error 
27220 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20  from this point 
27230 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20  should halt..   
27240 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
27250 20 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70     the testing p
27260 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
27270 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27280 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61          error [a
27290 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
272b0 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
272c0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
272d0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
272e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
272f0 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
27300 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a  sting halted"]..
27310 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
27320 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
27330 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
27340 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
27350 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  p trying to copy
27360 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
27370 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
27380 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27390 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
273a0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
273b0 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
273c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
273d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
273e0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
273f0 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
27400 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
27410 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27420 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27440 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
27450 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22  "configuration\"
27460 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
27480 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
27490 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
274a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
274b0 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
274c0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  ile $fileName fa
274d0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
274e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
274f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
27500 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
27510 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
27520 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65  liteExternalFile
27530 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
27540 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
27550 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
27560 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 61 6e  TE: Copy the Man
27570 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41  aged Debugging A
27580 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 20  ssistants (MDA) 
27590 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
275b0 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20 74 68       file for th
275c0 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f  e Eagle shell to
275d0 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75   the build outpu
275e0 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20  t directory,..  
275f0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
27600 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e 67 20      while using 
27610 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61 6d 65  each of the name
27620 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  s of the various
27630 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a 20 20   legacy test..  
27640 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
27650 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 73 2e      executables.
27660 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70    This will help
27670 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
27680 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20  at all the..    
27690 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
276a0 20 20 6c 65 67 61 63 79 20 74 65 73 74 73 20 72    legacy tests r
276b0 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c 79 20  un with exactly 
276c0 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
276d0 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  Managed..       
276e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 44         #       D
276f0 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
27700 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d  nts configured..
27710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
27720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27730 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
27740 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
27750 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
27760 20 63 6f 70 79 69 6e 67 20 5c 22 4d 44 41 20 63   copying \"MDA c
27770 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66  onfiguration\" f
27780 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
27790 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
277a0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64  ach fileName $md
277b0 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
277c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
277d0 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72      tryCopyBinar
277e0 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c  yFile EagleShell
277f0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
27800 74 72 75 65 20 22 22 20 24 66 69 6c 65 4e 61 6d  true "" $fileNam
27810 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
27820 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
27830 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
27840 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
27850 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  y the external b
27860 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79 2c  inaries, if any,
27870 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
27880 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  y that..        
27890 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
278a0 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c 65  ntains the Eagle
278b0 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69 73   shell.  This is
278c0 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64 20   typically used 
278d0 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  to make..       
278e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
278f0 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20 72  ure assemblies r
27900 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
27910 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73 74   ones being test
27920 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  ed are..        
27930 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76        #       av
27940 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20 74  ailable during t
27950 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
27960 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
27970 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
27980 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
27990 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20  t_channel "---- 
279a0 63 6f 70 79 69 6e 67 20 5c 22 65 78 74 65 72 6e  copying \"extern
279b0 61 6c 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  al\" files...\n"
279c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
279d0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
279e0 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
279f0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
27a00 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
27a10 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24 66 69  ExternalFile $fi
27a20 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
27a30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27a40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27a50 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
27a60 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
27a70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c  ySqliteNativeFil
27a80 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
27a90 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
27ab0 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73 74  OTE: If the test
27ac0 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c 69 6b   platform is lik
27ad0 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74 20  ely the default 
27ae0 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20  for this..      
27af0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
27b00 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20 74 72  machine, also tr
27b10 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6e 61  y to copy the na
27b20 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20 74 68  tive files to th
27b30 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
27b40 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
27b50 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  location...     
27b60 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
27b70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
27b80 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
27b90 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69  (copySqliteImpli
27ba0 63 69 74 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  citNativeFiles)]
27bb0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
27bc0 20 20 20 20 20 20 20 20 20 5b 69 73 44 65 66 61           [isDefa
27bd0 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
27be0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
27bf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
27c00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
27c10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27c20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
27c30 70 79 69 6e 67 20 69 6d 70 6c 69 63 69 74 20 5c  pying implicit \
27c40 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 73 2e  "native\" files.
27c50 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
27c60 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
27c70 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
27c80 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ca0 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
27cb0 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 0d  $fileName false.
27cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27cd0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
27ce0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
27cf0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
27d00 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
27d10 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
27d20 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
27d30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27d40 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
27d50 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
27d60 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
27d70 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
27d90 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
27da0 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
27db0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
27dc0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
27dd0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
27de0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
27e10 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 73 20  "native\" files 
27e20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20 5c 22 22  for platform \""
27e30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
27e40 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
27e50 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a  orm \"...\n]....
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
27e80 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
27e90 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
27ea0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
27eb0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
27ec0 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c 61 74  Name false $plat
27ed0 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
27ee0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
27ef0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
27f20 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
27f30 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
27f40 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
27f60 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
27f70 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
27f80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
27f90 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
27fa0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
27fb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
27fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27fd0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
27fe0 79 69 6e 67 20 5c 22 6e 61 74 69 76 65 5c 22 20  ying \"native\" 
27ff0 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68 69 74  files for archit
28000 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20 20  ecture \"" \..  
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28020 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
28030 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20  e \"...\n]....  
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28050 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
28060 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
28070 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
28080 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
28090 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
280a0 6d 65 20 66 61 6c 73 65 20 24 61 72 63 68 69 74  me false $archit
280b0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
280c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
280f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
28100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
28110 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
28120 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d  ::no(copySqliteM
28130 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  ixedFiles)]} the
28140 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
28150 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
28160 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
28170 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
28180 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65  ime option is se
28190 74 2c 20 63 6f 70 79 20 69 6d 70 6c 69 63 69 74  t, copy implicit
281a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
281b0 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f  #       mixed-mo
281c0 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  de assembly file
281d0 73 20 61 73 20 77 65 6c 6c 2e 20 20 54 68 65 20  s as well.  The 
281e0 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 0d 0a  runtime option..
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
28200 20 20 20 20 20 20 63 68 65 63 6b 20 69 73 20 68        check is h
28210 61 6e 64 6c 65 64 20 77 68 65 6e 20 62 75 69 6c  andled when buil
28220 64 69 6e 67 20 74 68 65 20 6c 69 73 74 20 6f 66  ding the list of
28230 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a 20 20 20   mixed-mode..   
28240 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
28250 20 20 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65     assembly file
28260 20 6e 61 6d 65 73 2e 0d 0a 20 20 20 20 20 20 20   names...       
28270 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28280 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
28290 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
282a0 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  opySqliteImplici
282b0 74 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d 20 74  tMixedFiles)]} t
282c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
282d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
282e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e      "---- copyin
28310 67 20 69 6d 70 6c 69 63 69 74 20 5c 22 6d 69 78  g implicit \"mix
28320 65 64 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  ed\" files...\n"
28330 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
28340 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
28350 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e  Name $mixedFileN
28360 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
28370 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
28380 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
28390 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  ame false..     
283a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
283b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
283c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
283d0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
283e0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
283f0 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
28400 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
28410 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
28420 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
28430 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61  no(copySqlitePla
28440 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
28450 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28460 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
28470 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
28480 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
284b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
284c0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
284d0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
284e0 20 63 6f 70 79 69 6e 67 20 5c 22 6d 69 78 65 64   copying \"mixed
284f0 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70 6c 61  \" files for pla
28500 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20 20 20  tform \"" \..   
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 2e     $platform \".
28530 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n]....       
28540 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
28550 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
28560 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
28590 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
285a0 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  se $platform..  
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
285d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
285e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
285f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
28600 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65  opySqliteArchite
28610 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
28620 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28630 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
28640 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
28650 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
28660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28670 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
28680 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
28690 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
286b0 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6d  ---- copying \"m
286c0 69 78 65 64 5c 22 20 66 69 6c 65 73 20 66 6f 72  ixed\" files for
286d0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22   architecture \"
286e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
286f0 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68             $arch
28700 69 74 65 63 74 75 72 65 20 5c 22 2e 2e 2e 5c 6e  itecture \"...\n
28710 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
28720 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
28730 69 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69  ileName $mixedFi
28740 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
28760 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
28770 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24  fileName false $
28780 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
287b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
287c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
287d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
287e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
287f0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
28800 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65  qliteManagedFile
28810 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
28820 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
28830 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
28840 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 5c   "---- copying \
28850 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c 65 73  "managed\" files
28860 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20  ...\n"....      
28870 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
28880 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
28890 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
288b0 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
288c0 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d 0a 20 20  ileName true..  
288d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
288e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
288f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
28900 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
28910 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
28920 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20   trying to load 
28930 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
28940 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
28950 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
28960 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
28970 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
28980 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
28990 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
289a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
289b0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
289c0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
289d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
289e0 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
289f0 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
28a00 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
28a10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
28a20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
28a30 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
28a40 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e  no(loadSqliteLin
28a50 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  qFiles)]} then {
28a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28a70 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
28a80 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
28a90 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20  te.Linq.dll..   
28aa0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28ab0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
28ac0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
28ad0 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36 46 69  (loadSqliteEf6Fi
28ae0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
28b00 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
28b10 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
28b20 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  EF6.dll..       
28b30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
28b40 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
28b50 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
28b60 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63  dSqliteNonImplic
28b70 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
28b80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
28b90 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
28ba0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
28bb0 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
28bc0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
28bd0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
28be0 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
28bf0 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
28c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c10 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
28c20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
28c30 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  ite.dll $platfor
28c40 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
28c50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
28c60 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
28c70 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
28c80 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
28c90 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
28cc0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
28cd0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
28cf0 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
28d00 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
28d10 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
28d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28d30 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
28d40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
28d50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
28d60 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
28d70 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74 69 76 65  NameOnly $native
28d80 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
28d90 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
28da0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
28db0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
28dc0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
28dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28de0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
28df0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 66 69 6c 65  ion of \"" $file
28e00 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20  NameOnly "\"... 
28e10 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
28e20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
28e30 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
28e40 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
28e50 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  eOnly]] \"\n].. 
28e60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
28e70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
28e80 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
28e90 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c 65  eOnly $mixedFile
28ea0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
28eb0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
28ec0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
28ed0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
28ee0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
28f00 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
28f10 6f 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  of \"" $fileName
28f20 4f 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20  Only "\"... \"" 
28f30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
28f40 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
28f50 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
28f60 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
28f70 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  y]] \"\n]..     
28f80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
28f90 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  }....        for
28fa0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
28fb0 79 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  y $managedFileNa
28fc0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
28fd0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
28fe0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
28ff0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
29000 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
29010 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
29020 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
29030 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f 6e   \"" $fileNameOn
29040 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c 0d  ly "\"... \"" \.
29050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29060 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
29070 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
29080 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d  e $fileNameOnly]
29090 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ] \"\n]..       
290a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
290b0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
290c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
290d0 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
290e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
290f0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
29100 4f 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65  Only $nativeFile
29110 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
29120 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
29130 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
29140 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29150 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
29160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29170 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
29180 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
29190 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
291a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66              / $f
291b0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
291c0 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
291d0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
291e0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
291f0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
29200 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74  leNameOnly $plat
29210 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  form]] \"\n]..  
29220 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
29230 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29240 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29250 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65  leNameOnly $mixe
29260 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
29270 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
29280 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
29290 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
292a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
292b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
292c0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
292d0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
292e0 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79   / $fileNameOnly
29310 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c   "\"... \"" [fil
29320 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
29340 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
29350 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
29360 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e  $platform]] \"\n
29370 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
29380 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
29390 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
293a0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
293b0 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
293c0 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
293d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
293e0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c  each fileNameOnl
293f0 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  y $nativeFileNam
29400 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
29410 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
29420 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
29430 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
29440 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
29470 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
29480 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
29490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24               / $
294a0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22  fileNameOnly "\"
294b0 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65  ... \"" [file ve
294c0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
294d0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
294e0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
294f0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63  ileNameOnly $arc
29500 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e  hitecture]] \"\n
29510 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
29520 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
29530 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
29540 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
29550 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20  $mixedFileNames 
29560 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
29570 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
29580 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
29590 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
295a0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
295c0 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
295d0 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63  of \"" $architec
295e0 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  ture \..        
295f0 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69 6c            / $fil
29600 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
29610 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
29620 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
29630 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
29640 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
29650 4e 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69 74  NameOnly $archit
29660 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a  ecture]] \"\n]..
29670 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
29680 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29690 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
296a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
296b0 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73  TE: Grab the lis
296c0 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73  t of managed ass
296d0 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68 65 20  emblies for the 
296e0 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 0d  current process.
296f0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29700 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20 74   and report on t
29710 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
29720 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e  QLite related on
29730 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
29740 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
29750 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
29760 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
29770 20 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73           set ass
29780 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20  emblies [object 
29790 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e  invoke AppDomain
297a0 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47  .CurrentDomain G
297b0 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d  etAssemblies]...
297c0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
297d0 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62  t foreach assemb
297e0 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b  ly $assemblies {
297f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
29800 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
29810 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \{System.Data.SQ
29820 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d  Lite* $assembly]
29830 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29840 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
29850 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
29860 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29880 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
29890 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61  d assembly: " $a
298a0 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20  ssembly \n]..   
298b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
298c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
298d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
298e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
298f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
29900 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
29910 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
29920 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 66  fine constants f
29930 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  or \"System.Data
29940 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a  .SQLite\"... "..
29950 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
29960 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
29970 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
29980 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
29990 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
299a0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
299b0 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
299c0 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61  te3 DefineConsta
299d0 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  nts..          }
299e0 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
299f0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
29a00 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
29a10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29a20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
29a30 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
29a40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29a50 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74      $defineConst
29a60 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ants] <none>] \n
29a70 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
29a80 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
29a90 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
29aa0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
29ab0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
29ac0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
29ad0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
29ae0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
29af0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
29b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29b10 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65 72  "---- source ver
29b20 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
29b30 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
29b40 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
29b50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
29b60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
29b70 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
29b80 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
29b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29ba0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
29bb0 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
29bc0 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 56 65  ction ProviderVe
29bd0 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  rsion..         
29be0 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30   } version] == 0
29bf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
29c00 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
29c10 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f  g length $versio
29c20 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
29c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
29c40 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
29c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
29c60 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
29c70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29c80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 76  l [appendArgs $v
29c90 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20  ersion \n]..    
29ca0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
29cc0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
29cd0 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
29ce0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
29cf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
29d00 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
29d10 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
29d20 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
29d30 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
29d40 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20 6f  ource checkout o
29d50 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
29d60 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
29d70 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
29d80 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
29d90 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
29da0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
29db0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
29dd0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
29de0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
29df0 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49 64  ProviderSourceId
29e00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 73 6f  ..          } so
29e10 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
29e20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
29e30 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
29e40 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20  ngth $sourceId] 
29e50 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
29e60 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
29e70 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
29e80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
29e90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
29ea0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
29eb0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f 75  [appendArgs $sou
29ec0 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20  rceId \n]..     
29ed0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
29ee0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
29ef0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
29f00 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
29f10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
29f20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
29f30 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
29f40 20 52 65 73 65 74 20 63 61 63 68 65 64 20 22 62   Reset cached "b
29f50 72 65 61 6b 20 69 6e 74 6f 20 64 65 62 75 67 67  reak into debugg
29f60 65 72 22 20 73 65 74 74 69 6e 67 20 73 6f 20 74  er" setting so t
29f70 68 61 74 20 69 74 20 63 61 6e 20 62 65 0d 0a 20  hat it can be.. 
29f80 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
29f90 73 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 74  sed during the t
29fa0 65 73 74 20 66 69 6c 65 2c 20 69 66 20 6e 65 65  est file, if nee
29fb0 64 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ded...        #.
29fc0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
29fd0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
29fe0 72 65 73 65 74 42 72 65 61 6b 49 6e 74 6f 44 65  resetBreakIntoDe
29ff0 62 75 67 67 65 72 29 5d 20 26 26 20 5c 0d 0a 20  bugger)] && \.. 
2a000 20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65             [have
2a010 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
2a020 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
2a030 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
2a040 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2a050 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
2a060 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
2a070 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
2a080 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
2a090 2e 53 51 4c 69 74 65 2e 48 65 6c 70 65 72 4d 65  .SQLite.HelperMe
2a0a0 74 68 6f 64 73 20 52 65 73 65 74 42 72 65 61 6b  thods ResetBreak
2a0b0 49 6e 74 6f 44 65 62 75 67 67 65 72 0d 0a 20 20  IntoDebugger..  
2a0c0 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
2a0d0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2a0f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2a100 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
2a110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a120 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 52 65 73 65   "---- call Rese
2a130 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67  tBreakIntoDebugg
2a140 65 72 28 29 2e 2e 2e 20 6f 6b 5c 6e 22 5d 0d 0a  er()... ok\n"]..
2a150 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2a160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a170 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2a180 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2a190 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
2a1a0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
2a1b0 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f 44 65  ResetBreakIntoDe
2a1c0 62 75 67 67 65 72 28 29 2e 2e 2e 20 65 72 72 6f  bugger()... erro
2a1d0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
2a1e0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
2a1f0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
2a200 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2a210 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2a220 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2a230 68 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62  heck the availab
2a240 6c 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22  le builds (and "
2a250 72 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51  releases") of SQ
2a260 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  Lite and..      
2a270 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
2a280 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20  .Data.SQLite... 
2a290 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a2a0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
2a2b0 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
2a2c0 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20  hannel..        
2a2d0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
2a2e0 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
2a2f0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
2a300 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a310 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65  OTE: Now, we nee
2a320 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65  d to know if the
2a330 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
2a340 72 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  rary is availabl
2a350 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
2a360 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65     (i.e. because
2a370 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c   the managed-onl
2a380 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
2a390 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61  Lite assembly ca
2a3a0 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
2a3b0 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20     load without 
2a3c0 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  it; however, it 
2a3d0 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69  cannot do anythi
2a3e0 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75  ng useful withou
2a3f0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
2a400 20 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61     it).  If we a
2a410 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78  re using the mix
2a420 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
2a430 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d   and we already.
2a440 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2a450 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65   found it (above
2a460 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  ), this should a
2a470 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a  lways succeed...
2a480 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a490 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
2a4a0 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74  eLibrary $::test
2a4b0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
2a4c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2a4d0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
2a4e0 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72  the SQLite inter
2a4f0 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61  op assembly is a
2a500 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
2a510 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
2a520 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65  eckForSQLiteInte
2a530 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  rop $::test_chan
2a540 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
2a550 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2a560 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69  : Check the SQLi
2a570 74 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  te database and 
2a580 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
2a590 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  ories...        
2a5a0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
2a5b0 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
2a5c0 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ries $::test_cha
2a5d0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
2a5e0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2a5f0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
2a600 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f  termine if vario
2a610 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  us compile-time 
2a620 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66  options needed f
2a630 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
2a640 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61      test constra
2a650 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65  ints were enable
2a660 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
2a670 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65  d assembly.  The
2a680 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
2a690 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d      are some com
2a6a0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2a6b0 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f  s that must also
2a6c0 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c   have been enabl
2a6d0 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
2a6e0 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65      for the inte
2a6f0 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20  rop assembly in 
2a700 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65  order to be effe
2a710 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73  ctive.  For thos
2a720 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
2a730 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77     options, it w
2a740 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74  ill be assumed t
2a750 68 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c  hat it was enabl
2a760 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  ed for the inter
2a770 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  op..        #   
2a780 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20      assembly if 
2a790 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66  it was enabled f
2a7a0 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  or the managed a
2a7b0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
2a7c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
2a7d0 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74  each defineConst
2a7e0 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ant [list \..   
2a7f0 20 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53           CHECK_S
2a800 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c  TATE COUNT_HANDL
2a810 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f  E DEBUG INTEROP_
2a820 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45  CODEC INTEROP_DE
2a830 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  BUG \..         
2a840 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e     INTEROP_EXTEN
2a850 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49  SION_FUNCTIONS I
2a860 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45  NTEROP_FTS5_EXTE
2a870 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
2a880 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43       INTEROP_INC
2a890 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 54 45 52  LUDE_CEROD INTER
2a8a0 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OP_INCLUDE_EXTRA
2a8b0 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
2a8c0 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20 20 20 20  _SEE \..        
2a8d0 20 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c      INTEROP_INCL
2a8e0 55 44 45 5f 5a 49 50 56 46 53 20 49 4e 54 45 52  UDE_ZIPVFS INTER
2a8f0 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49  OP_JSON1_EXTENSI
2a900 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
2a910 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59    INTEROP_LEGACY
2a920 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
2a930 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45  OG INTEROP_PERCE
2a940 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20  NTILE_EXTENSION 
2a950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
2a960 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58  NTEROP_REGEXP_EX
2a970 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
2a980 53 45 53 53 49 4f 4e 5f 45 58 54 45 4e 53 49 4f  SESSION_EXTENSIO
2a990 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
2a9a0 20 49 4e 54 45 52 4f 50 5f 53 48 41 31 5f 45 58   INTEROP_SHA1_EX
2a9b0 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
2a9c0 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TEST_EXTENSION \
2a9d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
2a9e0 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54  TEROP_TOTYPE_EXT
2a9f0 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56  ENSION INTEROP_V
2aa00 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a  IRTUAL_TABLE \..
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
2aa20 32 30 20 4e 45 54 5f 33 35 20 4e 45 54 5f 34 30  20 NET_35 NET_40
2aa30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20   NET_45 NET_451 
2aa40 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34 36 20 4e  NET_452 NET_46 N
2aa50 45 54 5f 34 36 31 20 5c 0d 0a 20 20 20 20 20 20  ET_461 \..      
2aa60 20 20 20 20 20 20 4e 45 54 5f 34 36 32 20 4e 45        NET_462 NE
2aa70 54 5f 34 37 20 4e 45 54 5f 34 37 31 20 4e 45 54  T_47 NET_471 NET
2aa80 5f 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c 41 54  _COMPACT_20 PLAT
2aa90 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d  FORM_COMPACTFRAM
2aaa0 45 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20  EWORK \..       
2aab0 20 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54       PRELOAD_NAT
2aac0 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41  IVE_LIBRARY RETA
2aad0 52 47 45 54 41 42 4c 45 20 53 51 4c 49 54 45 5f  RGETABLE SQLITE_
2aae0 53 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20  STANDARD \..    
2aaf0 20 20 20 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e          THROW_ON
2ab00 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43 45 20  _DISPOSED TRACE 
2ab10 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e  TRACE_CONNECTION
2ab20 20 54 52 41 43 45 5f 44 45 54 45 43 54 49 4f 4e   TRACE_DETECTION
2ab30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ab40 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 54 52 41  TRACE_HANDLE TRA
2ab50 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45  CE_PRELOAD TRACE
2ab60 5f 53 48 41 52 45 44 20 54 52 41 43 45 5f 53 54  _SHARED TRACE_ST
2ab70 41 54 45 4d 45 4e 54 20 5c 0d 0a 20 20 20 20 20  ATEMENT \..     
2ab80 20 20 20 20 20 20 20 54 52 41 43 45 5f 57 41 52         TRACE_WAR
2ab90 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52  NING TRACK_MEMOR
2aba0 59 5f 42 59 54 45 53 20 55 53 45 5f 45 4e 54 49  Y_BYTES USE_ENTI
2abb0 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 20 5c  TY_FRAMEWORK_6 \
2abc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 53  ..            US
2abd0 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53  E_INTEROP_DLL US
2abe0 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e  E_PREPARE_V2 WIN
2abf0 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20  DOWS] {..       
2ac00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2ac10 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
2ac20 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   the compile-tim
2ac30 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74  e option is list
2ac40 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ed in the list o
2ac50 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  f..          #  
2ac60 20 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e       "define con
2ac70 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61  stants" kept tra
2ac80 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e  ck of by the man
2ac90 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
2aca0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2acb0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
2acc0 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
2acd0 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ant $::test_chan
2ace0 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  nel $defineConst
2acf0 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ant..        }..
2ad00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2ad10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
2ad20 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
2ad30 65 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d  e if various com
2ad40 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2ad50 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20  s needed for..  
2ad60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
2ad70 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  st constraints w
2ad80 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ere enabled for 
2ad90 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
2ada0 6d 62 6c 79 20 61 6e 64 2f 6f 72 0d 0a 20 20 20  mbly and/or..   
2adb0 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
2adc0 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
2add0 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20   library...     
2ade0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
2adf0 72 65 61 63 68 20 63 6f 6d 70 69 6c 65 4f 70 74  reach compileOpt
2ae00 69 6f 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ion [list \..   
2ae10 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 20 45           CODEC E
2ae20 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
2ae30 4e 53 20 48 41 53 5f 43 4f 44 45 43 20 49 4e 43  NS HAS_CODEC INC
2ae40 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e 43 4c 55  LUDE_CEROD INCLU
2ae50 44 45 5f 45 58 54 52 41 20 5c 0d 0a 20 20 20 20  DE_EXTRA \..    
2ae60 20 20 20 20 20 20 20 20 49 4e 43 4c 55 44 45 5f          INCLUDE_
2ae70 53 45 45 20 49 4e 43 4c 55 44 45 5f 5a 49 50 56  SEE INCLUDE_ZIPV
2ae80 46 53 20 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49  FS JSON1_EXTENSI
2ae90 4f 4e 20 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20  ON LEGACY_CLOSE 
2aea0 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  LOG \..         
2aeb0 20 20 20 50 45 52 43 45 4e 54 49 4c 45 5f 45 58     PERCENTILE_EX
2aec0 54 45 4e 53 49 4f 4e 20 52 45 47 45 58 50 5f 45  TENSION REGEXP_E
2aed0 58 54 45 4e 53 49 4f 4e 20 53 45 53 53 49 4f 4e  XTENSION SESSION
2aee0 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
2aef0 20 20 20 20 20 20 20 20 20 20 53 48 41 31 5f 45            SHA1_E
2af00 58 54 45 4e 53 49 4f 4e 20 54 45 53 54 5f 45 58  XTENSION TEST_EX
2af10 54 45 4e 53 49 4f 4e 20 54 4f 54 59 50 45 5f 45  TENSION TOTYPE_E
2af20 58 54 45 4e 53 49 4f 4e 20 56 49 52 54 55 41 4c  XTENSION VIRTUAL
2af30 5f 54 41 42 4c 45 5d 20 7b 0d 0a 20 20 20 20 20  _TABLE] {..     
2af40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2af50 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
2af60 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74  if the compile-t
2af70 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69  ime option is li
2af80 73 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74  sted in the list
2af90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2afa0 20 20 20 20 6b 65 70 74 20 74 72 61 63 6b 20 6f      kept track o
2afb0 66 20 62 79 20 74 68 65 20 69 6e 74 65 72 6f 70  f by the interop
2afc0 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 2f 6f 72   assembly and/or
2afd0 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20   the SQLite..   
2afe0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
2aff0 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
2b000 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2b010 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2b020 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
2b030 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2b040 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 0d   $compileOption.
2b050 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2b060 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b070 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
2b080 66 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  f the System.Dat
2b090 61 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65  a.SQLite provide
2b0a0 72 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  r was compiled w
2b0b0 69 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ith..        #  
2b0c0 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72       support for
2b0d0 20 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64   any encrypted d
2b0e0 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20  atabases...     
2b0f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
2b100 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66   {[haveSQLiteDef
2b110 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45  ineConstant INTE
2b120 52 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d  ROP_CODEC] || \.
2b130 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61  .            [ha
2b140 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
2b150 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49  nstant INTEROP_I
2b160 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65  NCLUDE_SEE]} the
2b170 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
2b180 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2b190 54 45 3a 20 4e 6f 77 20 63 68 65 63 6b 20 69 66  TE: Now check if
2b1a0 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73   the interop ass
2b1b0 65 6d 62 6c 79 20 77 61 73 20 61 6c 73 6f 20 63  embly was also c
2b1c0 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a 20 20  ompiled with..  
2b1d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2b1e0 73 75 70 70 6f 72 74 20 66 6f 72 20 65 6e 63 72  support for encr
2b1f0 79 70 74 65 64 20 64 61 74 61 62 61 73 65 73 2e  ypted databases.
2b200 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2b210 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61           if {[ha
2b220 76 65 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f  veSQLiteCompileO
2b230 70 74 69 6f 6e 20 43 4f 44 45 43 5d 20 7c 7c 20  ption CODEC] || 
2b240 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2b250 20 5b 68 61 76 65 53 51 4c 69 74 65 43 6f 6d 70   [haveSQLiteComp
2b260 69 6c 65 4f 70 74 69 6f 6e 20 49 4e 43 4c 55 44  ileOption INCLUD
2b270 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a  E_SEE]} then {..
2b280 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2b290 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
2b2a0 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 63 68 65 63  E: Finally, chec
2b2b0 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
2b2c0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
2b2d0 20 63 6f 6d 70 69 6c 65 64 0d 0a 20 20 20 20 20   compiled..     
2b2e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
2b2f0 69 74 68 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ith support for 
2b300 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
2b310 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ses...          
2b320 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2b330 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
2b340 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 48 41  CompileOption HA
2b350 53 5f 43 4f 44 45 43 5d 7d 20 74 68 65 6e 20 7b  S_CODEC]} then {
2b360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b370 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
2b380 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64   # NOTE: Yes, ad
2b390 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72  d constraint for
2b3a0 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
2b3b0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
2b3c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2b3d0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
2b3e0 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
2b3f0 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74  a.SQLite.Encrypt
2b400 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
2b410 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2b420 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2b430 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2b440 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
2b450 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
2b460 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c   year.  Basicall
2b470 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  y, this indicate
2b480 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
2b490 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e     which version
2b4a0 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f   of MSBuild and/
2b4b0 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  or Visual Studio
2b4c0 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20   was used to..  
2b4d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
2b4e0 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62  mpile the assemb
2b4f0 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
2b500 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
2b510 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
2b520 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2b530 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2b540 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
2b550 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
2b560 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61  SQLite build yea
2b570 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
2b580 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42    set year [getB
2b590 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20  uildYear]..     
2b5a0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
2b5b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
2b5c0 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a  ldYear. $year]..
2b5d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2b5e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
2b5f0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65  ppendArgs \" $ye
2b600 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ar \"\n]....    
2b610 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2b620 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
2b630 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e   current build .
2b640 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20  NET Framework.  
2b650 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d  Basically, this.
2b660 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2b670 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   indicates which
2b680 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
2b690 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69  .NET Framework i
2b6a0 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20  s being..       
2b6b0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
2b6c0 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
2b6d0 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
2b6e0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
2b6f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2b700 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2b710 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2b720 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
2b730 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2b740 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  e build .NET Fra
2b750 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  mework... ".... 
2b760 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46 78         set netFx
2b770 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
2b780 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
2b790 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
2b7a0 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f  rgs buildFramewo
2b7b0 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20  rk. $netFx]..   
2b7c0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2b7d0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2b7e0 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78  ndArgs \" $netFx
2b7f0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
2b800 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2b810 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
2b820 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e  urrent build con
2b830 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69  figuration.  Thi
2b840 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
2b850 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
2b860 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65     be either "De
2b870 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
2b880 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
2b890 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2b8a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2b8c0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
2b8d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2b8e0 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
2b8f0 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ation... "....  
2b900 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
2b910 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
2b920 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  dConfiguration].
2b930 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
2b940 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2b950 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  gs buildConfigur
2b960 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72  ation. $configur
2b970 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
2b980 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2b990 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2b9a0 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74  s \" $configurat
2b9b0 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ion \"\n]....   
2b9c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2b9d0 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73  # NOTE: Try to s
2b9e0 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70  etup an interrup
2b9f0 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  t callback using
2ba00 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
2ba10 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  gger..        # 
2ba20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20        that will 
2ba30 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71  cancel all SQL q
2ba40 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
2ba50 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ss for all datab
2ba60 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ase..        #  
2ba70 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
2ba80 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69   known to this i
2ba90 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
2baa0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bab0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2bac0 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74  s ::no(sqliteInt
2bad0 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d  erruptCallback)]
2bae0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2baf0 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72      setupDbInter
2bb00 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a  ruptCallback $::
2bb10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a  test_channel $::
2bb20 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20  test_log..      
2bb30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
2bb40 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2bb50 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
2bb60 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f  native runtime o
2bb70 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75  ption, which wou
2bb80 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a  ld mean we are..
2bb90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2bba0 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
2bbb0 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  mode assembly...
2bbc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2bbd0 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
2bbe0 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
2bbf0 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d  _channel native.
2bc00 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2bc10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
2bc20 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
2bc30 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75  suite should cou
2bc40 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
2bc50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
2bc60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f        #       "o
2bc70 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73  pened" and "clos
2bc80 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f  ed" from the poo
2bc90 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  l when determini
2bca0 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20  ng if a test..  
2bcb0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
2bcc0 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67  ssed.  Disabling
2bcd0 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69   this behavior i
2bce0 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65  s sometimes nece
2bcf0 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20  ssary (e.g...   
2bd00 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
2bd10 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20  ing the release 
2bd20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29  testing process)
2bd30 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61   because there a
2bd40 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20  re several..    
2bd50 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
2bd60 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74  s that rely on t
2bd70 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20  he "opened from 
2bd80 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e  pool" count bein
2bd90 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20  g greater..     
2bda0 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20     #       than 
2bdb0 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73  zero.  These tes
2bdc0 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20  ts may fail due 
2bdd0 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72  to the non-deter
2bde0 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20  ministic..      
2bdf0 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69    #       behavi
2be00 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43  or of the CLR GC
2be10 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  , even when ther
2be20 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74  e is no bug in t
2be30 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20  he code..       
2be40 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74   #       being t
2be50 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ested...        
2be60 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
2be70 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
2be80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2be90 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d   noPoolCounts...
2bea0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2beb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
2bec0 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
2bed0 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73  ite should use s
2bee0 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
2bef0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2bf00 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
2bf10 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
2bf20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72  est_channel shar
2bf30 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20  edCache....     
2bf40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
2bf50 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
2bf60 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
2bf70 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67  prior to running
2bf80 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20   any tests...   
2bf90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bfa0 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
2bfb0 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
2bfc0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
2bfd0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2bfe0 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73  TE: Grab the lis
2bff0 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75  t of native modu
2c000 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  les for the curr
2c010 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d  ent process and.
2c020 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2c030 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53   report on the S
2c040 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2c050 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d  e related ones..
2c060 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2c070 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
2c080 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
2c090 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2c0a0 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73       set modules
2c0b0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
2c0c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2c0d0 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
2c0e0 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43  ics.Process.GetC
2c0f0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f  urrentProcess Mo
2c100 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  dules]....      
2c110 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
2c120 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65  ch -alias module
2c130 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20   $modules {..   
2c140 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2c150 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2c160 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20  The module file 
2c170 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62  name here must b
2c180 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20  e normalized... 
2c190 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2c1a0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
2c1b0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
2c1c0 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20  malize [$module 
2c1d0 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  FileName]]..    
2c1e0 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
2c1f0 4e 61 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74  NameOnly [file t
2c200 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ail $fileName]..
2c210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2c220 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
2c230 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a  t -nocase -- \..
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72  [getNativeLibrar
2c260 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
2c270 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21  $fileNameOnly] !
2c280 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
2c290 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2c2a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2c2b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
2c2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c2d0 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
2c2e0 6f 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74  oaded SQLite nat
2c2f0 69 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75  ive library modu
2c300 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  le: " \..       
2c310 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
2c320 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  Name \n]..      
2c330 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
2c340 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
2c350 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20  -nocase -- \..  
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2c370 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c  etInteropAssembl
2c380 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
2c390 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21  $fileNameOnly] !
2c3a0 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  = -1} then {..  
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2c3c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2c3d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
2c3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c3f0 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
2c400 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74  oaded SQLite int
2c410 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f  erop assembly mo
2c420 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20  dule: " \..     
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
2c440 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
2c450 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2c460 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2c470 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
2c480 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2c490 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2c4a0 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
2c4b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
2c4c0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2c4d0 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72  s for SQLite cor
2c4e0 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a  e library... "..
2c4f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2c500 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
2c510 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
2c520 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
2c530 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
2c540 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
2c550 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
2c560 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c  te3 SQLiteCompil
2c570 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
2c580 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
2c590 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
2c5a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c5b0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2c5c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2c5d0 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
2c5e0 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
2c5f0 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
2c600 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
2c610 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
2c620 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2c630 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c640 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
2c650 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
2c660 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
2c670 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
2c680 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
2c690 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2c6a0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2c6b0 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
2c6c0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
2c6d0 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  r SQLite interop
2c6e0 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a   assembly... "..
2c6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2c700 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
2c710 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
2c720 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
2c730 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
2c740 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
2c750 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
2c760 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69  te3 InteropCompi
2c770 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
2c780 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
2c790 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
2c7a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2c7b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2c7c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2c7d0 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
2c7e0 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
2c7f0 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c           $compil
2c800 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e  eOptions] <none>
2c810 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
2c820 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
2c830 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2c840 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
2c850 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
2c860 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2c870 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2c880 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
2c890 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73  w the active tes
2c8a0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a  t constraints...
2c8b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2c8c0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2c8d0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2c8e0 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74  Args "---- const
2c8f0 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20  raints: " \..   
2c900 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74           [format
2c910 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74  List [lsort [get
2c920 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e  Constraints]] <n
2c930 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  one>] \n]....   
2c940 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2c950 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
2c960 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
2c970 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72  s for use by thr
2c980 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20  eads created in 
2c990 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
2c9a0 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f        applicatio
2c9b0 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20  n domain.  This 
2c9c0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
2c9d0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67  ause all the Eag
2c9e0 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
2c9f0 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78      "test contex
2ca00 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  t" information i
2ca10 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20  s per-thread... 
2ca20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2ca30 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2ca40 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  sts ::test_const
2ca50 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d  raints]} then {.
2ca60 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
2ca70 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
2ca80 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  s $::eagle_tests
2ca90 28 43 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20  (Constraints).. 
2caa0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2cab0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2cac0 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
2cad0 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e  "after-constrain
2cae0 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
2caf0 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
2cb00 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
2cb10 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
2cb20 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
2cb30 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
2cb40 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
2cb50 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
2cb60 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
2cb70 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20  el .after]....  
2cb80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2cb90 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65   # NOTE: If nece
2cba0 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68  ssary, enable sh
2cbb0 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
2cbc0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2cbd0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2cbe0 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
2cbf0 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
2cc00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
2cc10 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
2cc20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2cc30 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
2cc40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
2cc50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
2cc60 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
2cc70 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61  ts actually bega
2cc80 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  n (now)...      
2cc90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
2cca0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
2ccb0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
2ccc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
2ccd0 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
2cce0 53 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67  SQLite tests beg
2ccf0 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  an at " \..     
2cd00 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
2cd10 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
2cd20 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  nds]] \n]..     
2cd30 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2cd40 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
2cd50 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75  TestFilesPrologu
2cd60 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
2cd70 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
2cd80 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20  kip running our 
2cd90 63 75 73 74 6f 6d 20 66 69 6c 65 73 20 70 72 6f  custom files pro
2cda0 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
2cdb0 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
2cdc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
2cdd0 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
2cde0 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
2cdf0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72  o exists ::no(pr
2ce00 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ologue.eagle)]} 
2ce10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2ce20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20  uplevel 1 {..   
2ce30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2ce40 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75      # NOTE: Setu
2ce50 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  p the variables 
2ce60 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
2ce70 65 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64 61  e various non-da
2ce80 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ta files..      
2ce90 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
2cea0 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
2ceb0 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
2cec0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2ced0 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69          set enti
2cee0 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
2cef0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2cf00 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
2cf10 65 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d  eName EntityFram
2cf20 65 77 6f 72 6b 2e 64 6c 6c 20 66 61 6c 73 65 5d  ework.dll false]
2cf30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2cf40 74 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69  t installerExeFi
2cf50 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2cf60 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
2cf70 65 4e 61 6d 65 20 49 6e 73 74 61 6c 6c 65 72 2e  eName Installer.
2cf80 65 78 65 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20  exe false]....  
2cf90 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 69          set sqli
2cfa0 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
2cfb0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
2cfc0 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
2cfd0 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69  Name SQLite.Desi
2cfe0 67 6e 65 72 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d  gner.dll false].
2cff0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2d000 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
2d010 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
2d020 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
2d030 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
2d040 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
2d050 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a 20 20 20  ll false]....   
2d060 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65         set syste
2d070 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44  mDataSQLiteLinqD
2d080 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
2d090 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
2d0a0 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  dFileName System
2d0b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
2d0c0 71 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d 0a  q.dll false]....
2d0d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 79            set sy
2d0e0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66  stemDataSQLiteEf
2d0f0 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  6DllFile \..    
2d100 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
2d110 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
2d120 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
2d130 46 36 2e 64 6c 6c 20 66 61 6c 73 65 5d 0d 0a 0d  F6.dll false]...
2d140 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74  .          set t
2d150 65 73 74 45 78 65 46 69 6c 65 20 5b 67 65 74 42  estExeFile [getB
2d160 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73  uildFileName tes
2d170 74 2e 65 78 65 20 66 61 6c 73 65 5d 0d 0a 20 20  t.exe false]..  
2d180 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2d190 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65 74  LinqExeFile [get
2d1a0 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65  BuildFileName te
2d1b0 73 74 6c 69 6e 71 2e 65 78 65 20 66 61 6c 73 65  stlinq.exe false
2d1c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ]..          set
2d1d0 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
2d1e0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
2d1f0 65 20 74 65 73 74 65 66 36 2e 65 78 65 20 66 61  e testef6.exe fa
2d200 6c 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse]....        
2d210 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2d220 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
2d230 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
2d240 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
2d250 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
2d260 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2d270 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20 74     required by t
2d280 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  he tests in this
2d290 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
2d2a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
2d2b0 65 74 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69  et testLinqOutFi
2d2c0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2d2d0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2d2e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d2f0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2d300 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69 6e 71  taPath] testlinq
2d310 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .out]]....      
2d320 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e      set northwin
2d330 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  dEfDbFile [file 
2d340 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2d350 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2d360 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72         [file dir
2d370 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
2d380 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73  me [getSQLiteTes
2d390 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a  tDataPath]]] \..
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2d3b0 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64  stlinq northwind
2d3c0 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  EF.db]]....     
2d3d0 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
2d3e0 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
2d3f0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2d400 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2d410 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2d420 74 44 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61  tDataPath] nonWa
2d430 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  l.db]]....      
2d440 20 20 20 20 73 65 74 20 77 61 6c 44 62 46 69 6c      set walDbFil
2d450 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2d460 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2d470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2d480 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2d490 61 50 61 74 68 5d 20 77 61 6c 2e 64 62 5d 5d 0d  aPath] wal.db]].
2d4a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2d4b0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2d4c0 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e  : The various in
2d4d0 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20  stall/uninstall 
2d4e0 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74  log files used t
2d4f0 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20  o test the..    
2d500 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
2d510 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e  sign-time compon
2d520 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a  ent installer...
2d530 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2d540 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
2d550 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
2d560 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
2d570 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
2d580 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2d590 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
2d5a0 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
2d5b0 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c  er_Test_Vs2005.l
2d5c0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2d5d0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
2d5e0 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b  lVs2008LogFile [
2d5f0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2d600 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2d610 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2d620 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2d630 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
2d640 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d  st_Vs2008.log]].
2d650 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
2d660 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
2d670 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  10LogFile [file 
2d680 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
2d690 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
2d6a0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
2d6b0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
2d6c0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
2d6d0 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2010.log]]....  
2d6e0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
2d6f0 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
2d700 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
2d710 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
2d720 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2d730 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
2d740 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
2d750 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e  ler_Test_Vs2012.
2d760 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2d770 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
2d780 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
2d790 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2d7a0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2d7c0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2d7d0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
2d7e0 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d  est_Vs2013.log]]
2d7f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2d800 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
2d810 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  015LogFile [file
2d820 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
2d830 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
2d840 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
2d850 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
2d860 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
2d870 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2015.log]].... 
2d880 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
2d890 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f  tInstallVs2017Lo
2d8a0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
2d8b0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
2d8c0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2d8d0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
2d8e0 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
2d8f0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37  ller_Test_Vs2017
2d900 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
2d910 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
2d920 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2d930 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
2d940 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
2d950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d960 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
2d970 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
2d980 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e  ler_Test_Vs2005.
2d990 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
2d9a0 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
2d9b0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
2d9c0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
2d9d0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
2d9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2d9f0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
2da00 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
2da10 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
2da20 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
2da30 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
2da40 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
2da50 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
2da60 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
2da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
2da80 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
2da90 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
2daa0 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f  r_Test_Vs2010.lo
2dab0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  g]]....         
2dac0 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
2dad0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
2dae0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
2daf0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
2db10 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
2db20 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
2db30 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
2db40 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
2db50 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
2db60 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
2db70 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
2db80 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
2db90 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2dba0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
2dbb0 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
2dbc0 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d  Test_Vs2013.log]
2dbd0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
2dbe0 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
2dbf0 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2015LogFile [f
2dc00 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
2dc10 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
2dc20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
2dc30 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
2dc40 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
2dc50 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
2dc60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
2dc70 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
2dc80 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69  s2017LogFile [fi
2dc90 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
2dca0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
2dcb0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
2dcc0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2dcd0 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
2dce0 73 74 5f 56 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d  st_Vs2017.log]].
2dcf0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 23 23  ...          ###
2dd00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2dd40 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ##....          
2dd50 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2dd60 73 20 3a 3a 6e 6f 28 63 68 65 63 6b 46 6f 72 53  s ::no(checkForS
2dd70 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
2dd80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2dd90 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2dda0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2ddb0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2ddd0 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
2dde0 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
2ddf0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2de00 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
2de10 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
2de20 6e 65 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65  nel $entityFrame
2de30 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  workDllFile..   
2de40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2de50 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2de60 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2de70 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2de80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2de90 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2dea0 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
2deb0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2dec0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2ded0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2dee0 61 6e 6e 65 6c 20 24 69 6e 73 74 61 6c 6c 65 72  annel $installer
2def0 45 78 65 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65  ExeFile Installe
2df00 72 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20  r.exe..         
2df10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2df20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2df30 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2df40 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2df60 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
2df70 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
2df80 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
2df90 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
2dfa0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
2dfb0 6e 6e 65 6c 20 24 73 71 6c 69 74 65 44 65 73 69  nnel $sqliteDesi
2dfc0 67 6e 65 72 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  gnerDllFile..   
2dfd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2dfe0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2dff0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2e000 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2e010 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2e020 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2e030 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
2e040 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
2e050 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e060 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2e070 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79  test_channel $sy
2e080 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
2e090 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lFile..         
2e0a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2e0b0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2e0c0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2e0d0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2e0f0 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
2e100 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
2e110 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
2e120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e130 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
2e140 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74  st_channel $syst
2e150 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
2e160 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
2e170 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e180 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2e190 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2e1a0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1c0 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
2e1d0 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
2e1e0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
2e1f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2e200 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2e210 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73  est_channel $sys
2e220 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
2e230 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
2e240 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e250 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2e260 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2e270 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e290 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2e2a0 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
2e2b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e2c0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2e2d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
2e2e0 73 74 45 78 65 46 69 6c 65 20 74 65 73 74 2e 65  stExeFile test.e
2e2f0 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xe..            
2e300 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2e310 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
2e320 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
2e330 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
2e340 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
2e350 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
2e360 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
2e370 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2e380 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2e390 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
2e3a0 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 74 65 73  tLinqExeFile tes
2e3b0 74 6c 69 6e 71 2e 65 78 65 0d 0a 20 20 20 20 20  tlinq.exe..     
2e3c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e3d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2e3e0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2e3f0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2e400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e410 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
2e420 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
2e430 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2e440 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2e450 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2e460 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
2e470 65 20 74 65 73 74 65 66 36 2e 65 78 65 0d 0a 20  e testef6.exe.. 
2e480 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2e490 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2e4a0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
2e4b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
2e4c0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
2e4d0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
2e4e0 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
2e4f0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
2e500 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
2e510 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
2e520 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71  hannel $testLinq
2e530 4f 75 74 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  OutFile..       
2e540 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e550 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2e560 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2e570 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e590 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
2e5a0 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
2e5b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2e5c0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2e5d0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
2e5e0 65 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  el $northwindEfD
2e5f0 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  bFile..         
2e600 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2e610 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
2e620 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
2e630 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
2e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
2e650 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
2e660 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
2e670 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2e680 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
2e690 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e  est_channel $non
2e6a0 57 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20  WalDbFile..     
2e6b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e6c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
2e6d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
2e6e0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
2e6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e700 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
2e710 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
2e720 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e730 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
2e740 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 77 61  test_channel $wa
2e750 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  lDbFile..       
2e760 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2e770 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2e780 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2e790 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7b0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2e7c0 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
2e7d0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2e7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2e7f0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2e800 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
2e810 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
2e820 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2e830 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2e840 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2e850 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2e860 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2e870 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2e880 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
2e890 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
2e8a0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2e8b0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2e8c0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2e8d0 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
2e8e0 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 0d  llVs2008LogFile.
2e8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2e900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2e910 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2e920 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2e930 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2e940 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2e950 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
2e960 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
2e970 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2e980 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2e990 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2e9a0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
2e9b0 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
2e9c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2e9d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2e9e0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2e9f0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2ea00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ea10 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2ea20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2ea30 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
2ea40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2ea50 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
2ea60 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
2ea70 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
2ea80 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
2ea90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2eaa0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
2eab0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
2eac0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
2eaf0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
2eb00 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
2eb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2eb20 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
2eb30 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
2eb40 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
2eb50 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ile..           
2eb60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2eb70 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
2eb80 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
2eb90 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
2ebb0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
2ebc0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
2ebd0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
2ebe0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
2ebf0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
2ec00 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
2ec10 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 0d  llVs2015LogFile.
2ec20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2ec30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2ec40 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
2ec50 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
2ec60 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
2ec70 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
2ec80 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
2ec90 73 32 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2017LogFile]]]}
2eca0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2ecb0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
2ecc0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
2ecd0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
2ece0 32 30 31 37 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2017LogFile..   
2ecf0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2ed00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2ed10 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2ed20 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2ed30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ed40 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2ed50 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2ed60 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  005LogFile]]]} t
2ed70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ed80 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2ed90 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2eda0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2edb0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
2edc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2edd0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2ede0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2edf0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2ee00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2ee10 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2ee20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2ee30 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
2ee40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ee50 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2ee60 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2ee70 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2ee80 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
2ee90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2eea0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2eeb0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2eec0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2eed0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2eee0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2eef0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2ef00 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  010LogFile]]]} t
2ef10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ef20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2ef30 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2ef40 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2ef50 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
2ef60 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2ef70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2ef80 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2ef90 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2efa0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2efb0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2efc0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2efd0 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  012LogFile]]]} t
2efe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2eff0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2f000 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2f010 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2f020 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
2f030 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2f040 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2f050 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2f060 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2f070 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f080 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2f090 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2f0a0 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  013LogFile]]]} t
2f0b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f0c0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2f0d0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2f0e0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2f0f0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
2f100 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2f110 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2f120 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2f130 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2f140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f150 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2f160 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2f170 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  015LogFile]]]} t
2f180 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f190 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2f1a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2f1b0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2f1c0 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
2f1d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2f1e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2f1f0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
2f200 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
2f210 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2f220 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
2f230 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
2f240 30 31 37 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  017LogFile]]]} t
2f250 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f260 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
2f270 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
2f280 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
2f290 32 30 31 37 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2017LogFile..   
2f2a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2f2b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2f2c0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
2f2d0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2f2e0 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c  runSQLiteTestFil
2f2f0 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  esEpilogue {} {.
2f300 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f310 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
2f320 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
2f330 66 69 6c 65 73 20 65 70 69 6c 6f 67 75 65 20 69  files epilogue i
2f340 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
2f350 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
2f360 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
2f370 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f380 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2f390 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e  s ::no(epilogue.
2f3a0 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
2f3b0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
2f3c0 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   1 {..          
2f3d0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
2f3e0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
2f3f0 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c     testUninstall
2f400 56 73 32 30 31 37 4c 6f 67 46 69 6c 65 20 74 65  Vs2017LogFile te
2f410 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
2f420 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20  5LogFile \..    
2f430 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
2f440 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
2f450 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61  File testUninsta
2f460 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
2f470 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2f480 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
2f490 32 30 31 30 4c 6f 67 46 69 6c 65 20 74 65 73 74  2010LogFile test
2f4a0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
2f4b0 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
2f4c0 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e          testUnin
2f4d0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
2f4e0 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
2f4f0 32 30 31 37 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2017LogFile \.. 
2f500 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2f510 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
2f520 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
2f530 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
2f540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f550 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
2f560 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  2LogFile testIns
2f570 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
2f580 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
2f590 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73     testInstallVs
2f5a0 32 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74  2008LogFile test
2f5b0 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
2f5c0 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
2f5d0 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
2f5e0 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
2f5f0 20 20 20 20 20 6e 6f 72 74 68 77 69 6e 64 45 66       northwindEf
2f600 44 62 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 4f  DbFile testLinqO
2f610 75 74 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  utFile \..      
2f620 20 20 20 20 20 20 20 20 77 61 6c 44 62 46 69 6c          walDbFil
2f630 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a  e nonWalDbFile..
2f640 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65  ..          unse
2f650 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
2f660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2f670 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
2f680 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d  stLinqExeFile \.
2f690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2f6a0 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
2f6b0 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
2f6c0 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
2f6d0 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61 74         systemDat
2f6e0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
2f6f0 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  le systemDataSQL
2f700 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
2f710 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2f720 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
2f730 65 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69  e installerExeFi
2f740 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
2f750 20 20 20 20 65 6e 74 69 74 79 46 72 61 6d 65 77      entityFramew
2f760 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  orkDllFile..    
2f770 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
2f780 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2f790 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
2f7a0 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
2f7b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2f7c0 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
2f7d0 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
2f7e0 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
2f7f0 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
2f800 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
2f810 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
2f820 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
2f830 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
2f840 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
2f850 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2f860 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2f870 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
2f880 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
2f890 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
2f8a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2f8b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2f8c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2f8d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2f8e0 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
2f8f0 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
2f900 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
2f910 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
2f920 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
2f930 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
2f940 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2f950 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
2f960 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22  d the "epilogue"
2f970 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
2f980 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
2f990 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
2f9a0 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20         settings 
2f9b0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2f9c0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
2f9d0 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
2f9e0 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
2f9f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2fa00 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20  .epilogue]....  
2fa10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2fa20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72   # BUGFIX: Befor
2fa30 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66  e checking the f
2fa40 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69  inal resources i
2fa50 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c  n use by SQLite,
2fa60 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23   make..        #
2fa70 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f           sure bo
2fa80 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41  th of the PRAGMA
2fa90 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
2faa0 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
2fab0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
2fac0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2fad0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
2fae0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2faf0 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  l true....      
2fb00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fb10 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74  OTE: Also report
2fb20 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
2fb30 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  age after runnin
2fb40 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
2fb50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2fb60 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
2fb70 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
2fb80 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
2fb90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2fba0 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
2fbb0 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
2fbc0 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e  counts after run
2fbd0 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
2fbe0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2fbf0 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e      getSQLiteHan
2fc00 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73  dleCounts $::tes
2fc10 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2fc20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fc30 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
2fc40 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68  sary, disable sh
2fc50 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
2fc60 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
2fc70 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
2fc80 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
2fc90 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
2fca0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
2fcb0 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
2fcc0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2fcd0 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20   false..        
2fce0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2fcf0 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23  }.....    ######
2fd00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fd10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fd20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fd30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fd40 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
2fd50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fd60 23 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67  ######## END Eag
2fd70 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23  le ONLY ########
2fd80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fd90 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
2fda0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fdb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fdc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fdd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2fde0 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a  #######..  }....
2fdf0 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53    #..  # NOTE: S
2fe00 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ave the name of 
2fe10 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
2fe20 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
2fe30 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b  le...  #..  if {
2fe40 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  ![info exists co
2fe50 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d  mmon_directory]}
2fe60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74   then {..    set
2fe70 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
2fe80 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
2fe90 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a  [info script]]..
2fea0 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
2feb0 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68  NOTE: Provide th
2fec0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
2fed0 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67  Lite test packag
2fee0 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  e to the interpr
2fef0 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61  eter...  #..  pa
2ff00 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79  ckage provide Sy
2ff10 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
2ff20 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a        .Test 1.0..}..